Add structure for sizes

This commit is contained in:
Alex Kotov 2021-11-21 02:56:08 +05:00
parent 87872079a7
commit 7bb6abbacd
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
5 changed files with 165 additions and 125 deletions

182
src/dwm.c
View File

@ -46,36 +46,36 @@
Mod3Mask | Mod4Mask | Mod5Mask) \
)
#define INTERSECT(x,y,w,h,window_area_geometry) ( \
MAX( \
0, \
MIN( \
(x) + (w), \
window_area_geometry.position.x \
+ \
window_area_geometry.w \
) \
- \
MAX( \
(x), \
window_area_geometry.position.x \
) \
) \
* \
MAX( \
0, \
MIN( \
(y) + (h), \
window_area_geometry.position.y \
+ \
window_area_geometry.h \
) \
- \
MAX( \
(y), \
window_area_geometry.position.y \
) \
) \
#define INTERSECT(x,y,w,h,window_area_geometry) ( \
MAX( \
0, \
MIN( \
(x) + (w), \
window_area_geometry.position.x \
+ \
window_area_geometry.sizes.w \
) \
- \
MAX( \
(x), \
window_area_geometry.position.x \
) \
) \
* \
MAX( \
0, \
MIN( \
(y) + (h), \
window_area_geometry.position.y \
+ \
window_area_geometry.sizes.h \
) \
- \
MAX( \
(y), \
window_area_geometry.position.y \
) \
) \
)
/*********
@ -334,24 +334,24 @@ int applysizehints(
if (
*x
>=
m->window_area_geometry.position.x + m->window_area_geometry.w
m->window_area_geometry.position.x + m->window_area_geometry.sizes.w
) {
*x =
m->window_area_geometry.position.x
+
m->window_area_geometry.w
m->window_area_geometry.sizes.w
-
client_geometry_total_width(&c->state.geometry);
}
if (
*y
>=
m->window_area_geometry.position.y + m->window_area_geometry.h
m->window_area_geometry.position.y + m->window_area_geometry.sizes.h
) {
*y =
m->window_area_geometry.position.y
+
m->window_area_geometry.h
m->window_area_geometry.sizes.h
-
client_geometry_total_height(&c->state.geometry);
}
@ -424,9 +424,9 @@ int applysizehints(
||
*y != c->state.geometry.basic.position.y
||
*w != c->state.geometry.basic.w
*w != c->state.geometry.basic.sizes.w
||
*h != c->state.geometry.basic.h
*h != c->state.geometry.basic.sizes.h
||
bw != c->state.geometry.border_width
);
@ -569,8 +569,8 @@ void configure(Client *c)
.window = c->win,
.x = c->state.geometry.basic.position.x,
.y = c->state.geometry.basic.position.y,
.width = c->state.geometry.basic.w,
.height = c->state.geometry.basic.h,
.width = c->state.geometry.basic.sizes.w,
.height = c->state.geometry.basic.sizes.h,
.border_width = c->state.geometry.border_width,
.above = None,
.override_redirect = False,
@ -890,8 +890,8 @@ void manage(Window w, XWindowAttributes *wa)
c->win = w;
c->state.geometry.basic.position.x = wa->x;
c->state.geometry.basic.position.y = wa->y;
c->state.geometry.basic.w = wa->width;
c->state.geometry.basic.h = wa->height;
c->state.geometry.basic.sizes.w = wa->width;
c->state.geometry.basic.sizes.h = wa->height;
c->state.is_floating = false;
updatetitle(c);
@ -914,12 +914,12 @@ void manage(Window w, XWindowAttributes *wa)
if (
c->state.geometry.basic.position.x + total_width
>
c->mon->screen_geometry.position.x + c->mon->screen_geometry.w
c->mon->screen_geometry.position.x + c->mon->screen_geometry.sizes.w
) {
c->state.geometry.basic.position.x =
c->mon->screen_geometry.position.x
+
c->mon->screen_geometry.w
c->mon->screen_geometry.sizes.w
-
total_width;
}
@ -930,12 +930,12 @@ void manage(Window w, XWindowAttributes *wa)
if (
c->state.geometry.basic.position.y + total_height
>
c->mon->screen_geometry.position.y + c->mon->screen_geometry.h
c->mon->screen_geometry.position.y + c->mon->screen_geometry.sizes.h
) {
c->state.geometry.basic.position.y =
c->mon->screen_geometry.position.y
+
c->mon->screen_geometry.h
c->mon->screen_geometry.sizes.h
-
total_height;
}
@ -973,11 +973,11 @@ void manage(Window w, XWindowAttributes *wa)
c->state.geometry.basic.position.x =
c->mon->screen_geometry.position.x
+
(c->mon->screen_geometry.w - total_width) / 2;
(c->mon->screen_geometry.sizes.w - total_width) / 2;
c->state.geometry.basic.position.y =
c->mon->screen_geometry.position.y
+
(c->mon->screen_geometry.h - total_height) / 2;
(c->mon->screen_geometry.sizes.h - total_height) / 2;
}
XSelectInput(
@ -1019,8 +1019,8 @@ void manage(Window w, XWindowAttributes *wa)
c->win,
c->state.geometry.basic.position.x + 2 * sw,
c->state.geometry.basic.position.y,
c->state.geometry.basic.w,
c->state.geometry.basic.h
c->state.geometry.basic.sizes.w,
c->state.geometry.basic.sizes.h
);
setclientstate(c, NormalState);
@ -1093,7 +1093,7 @@ void movemouse(__attribute__((unused)) const Arg *arg)
(
selmon->window_area_geometry.position.x
+
selmon->window_area_geometry.w
selmon->window_area_geometry.sizes.w
)
-
(nx + client_geometry_total_width(&c->state.geometry))
@ -1104,7 +1104,7 @@ void movemouse(__attribute__((unused)) const Arg *arg)
nx =
selmon->window_area_geometry.position.x
+
selmon->window_area_geometry.w
selmon->window_area_geometry.sizes.w
-
client_geometry_total_width(&c->state.geometry);
}
@ -1120,7 +1120,7 @@ void movemouse(__attribute__((unused)) const Arg *arg)
(
selmon->window_area_geometry.position.y
+
selmon->window_area_geometry.h
selmon->window_area_geometry.sizes.h
) - (ny + client_geometry_total_height(&c->state.geometry))
)
<
@ -1129,7 +1129,7 @@ void movemouse(__attribute__((unused)) const Arg *arg)
ny =
selmon->window_area_geometry.position.y
+
selmon->window_area_geometry.h
selmon->window_area_geometry.sizes.h
-
client_geometry_total_height(&c->state.geometry);
}
@ -1150,8 +1150,8 @@ void movemouse(__attribute__((unused)) const Arg *arg)
c,
nx,
ny,
c->state.geometry.basic.w,
c->state.geometry.basic.h,
c->state.geometry.basic.sizes.w,
c->state.geometry.basic.sizes.h,
c->state.geometry.border_width,
1
);
@ -1166,8 +1166,8 @@ void movemouse(__attribute__((unused)) const Arg *arg)
Monitor *const m = recttomon(
c->state.geometry.basic.position.x,
c->state.geometry.basic.position.y,
c->state.geometry.basic.w,
c->state.geometry.basic.h
c->state.geometry.basic.sizes.w,
c->state.geometry.basic.sizes.h
);
if (m != selmon) {
@ -1303,8 +1303,8 @@ void resizeclient(Client *c, int x, int y, int w, int h, int bw)
c->state.geometry.basic.position.x = wc.x = x;
c->state.geometry.basic.position.y = wc.y = y;
c->state.geometry.basic.w = wc.width = w;
c->state.geometry.basic.h = wc.height = h;
c->state.geometry.basic.sizes.w = wc.width = w;
c->state.geometry.basic.sizes.h = wc.height = h;
c->state.geometry.border_width = wc.border_width = bw;
XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
@ -1334,8 +1334,8 @@ void resizemouse(__attribute__((unused)) const Arg *arg)
0,
0,
0,
c->state.geometry.basic.w + c->state.geometry.border_width - 1,
c->state.geometry.basic.h + c->state.geometry.border_width - 1
c->state.geometry.basic.sizes.w + c->state.geometry.border_width - 1,
c->state.geometry.basic.sizes.h + c->state.geometry.border_width - 1
);
const unsigned int snap_distance = settings_get_snap_distance();
@ -1386,7 +1386,7 @@ void resizemouse(__attribute__((unused)) const Arg *arg)
(
selmon->window_area_geometry.position.x
+
selmon->window_area_geometry.w
selmon->window_area_geometry.sizes.w
)
)
&&
@ -1402,15 +1402,21 @@ void resizemouse(__attribute__((unused)) const Arg *arg)
(
selmon->window_area_geometry.position.y
+
selmon->window_area_geometry.h
selmon->window_area_geometry.sizes.h
)
)
) {
if (!c->state.is_floating &&
(selmon->lt[selmon->sellt]->arrange == NULL ||
abs(nw - c->state.geometry.basic.w) > snap_distance ||
abs(nh - c->state.geometry.basic.h) > snap_distance))
{
if (
!c->state.is_floating
&&
(
selmon->lt[selmon->sellt]->arrange == NULL
||
abs(nw - c->state.geometry.basic.sizes.w) > snap_distance
||
abs(nh - c->state.geometry.basic.sizes.h) > snap_distance
)
) {
togglefloating(NULL);
}
}
@ -1439,8 +1445,8 @@ void resizemouse(__attribute__((unused)) const Arg *arg)
0,
0,
0,
c->state.geometry.basic.w + c->state.geometry.border_width - 1,
c->state.geometry.basic.h + c->state.geometry.border_width - 1
c->state.geometry.basic.sizes.w + c->state.geometry.border_width - 1,
c->state.geometry.basic.sizes.h + c->state.geometry.border_width - 1
);
XUngrabPointer(dpy, CurrentTime);
@ -1450,8 +1456,8 @@ void resizemouse(__attribute__((unused)) const Arg *arg)
Monitor *const m = recttomon(
c->state.geometry.basic.position.x,
c->state.geometry.basic.position.y,
c->state.geometry.basic.w,
c->state.geometry.basic.h
c->state.geometry.basic.sizes.w,
c->state.geometry.basic.sizes.h
);
if (m != selmon) {
@ -1765,8 +1771,8 @@ void showhide(Client *c)
c,
c->state.geometry.basic.position.x,
c->state.geometry.basic.position.y,
c->state.geometry.basic.w,
c->state.geometry.basic.h,
c->state.geometry.basic.sizes.w,
c->state.geometry.basic.sizes.h,
c->state.geometry.border_width,
0
);
@ -1826,9 +1832,9 @@ void togglefloating(__attribute__((unused)) const Arg *arg)
selmon->sel,
selmon->sel->state.geometry.basic.position.x,
selmon->sel->state.geometry.basic.position.y,
selmon->sel->state.geometry.basic.w -
selmon->sel->state.geometry.basic.sizes.w -
2 * (border_width - selmon->sel->state.geometry.border_width),
selmon->sel->state.geometry.basic.h -
selmon->sel->state.geometry.basic.sizes.h -
2 * (border_width - selmon->sel->state.geometry.border_width),
border_width,
0
@ -1930,9 +1936,9 @@ int updategeom()
||
unique[i].y_org != m->screen_geometry.position.y
||
unique[i].width != m->screen_geometry.w
unique[i].width != m->screen_geometry.sizes.w
||
unique[i].height != m->screen_geometry.h
unique[i].height != m->screen_geometry.sizes.h
) {
dirty = 1;
m->num = i;
@ -1942,11 +1948,11 @@ int updategeom()
m->screen_geometry.position.y =
m->window_area_geometry.position.y =
unique[i].y_org;
m->screen_geometry.w =
m->window_area_geometry.w =
m->screen_geometry.sizes.w =
m->window_area_geometry.sizes.w =
unique[i].width;
m->screen_geometry.h =
m->window_area_geometry.h =
m->screen_geometry.sizes.h =
m->window_area_geometry.sizes.h =
unique[i].height;
}
} else { /* less monitors available nn < n */
@ -1971,10 +1977,18 @@ int updategeom()
{ /* default monitor setup */
if (!mons)
mons = createmon();
if (mons->screen_geometry.w != sw || mons->screen_geometry.h != sh) {
if (
mons->screen_geometry.sizes.w != sw
||
mons->screen_geometry.sizes.h != sh
) {
dirty = 1;
mons->screen_geometry.w = mons->window_area_geometry.w = sw;
mons->screen_geometry.h = mons->window_area_geometry.h = sh;
mons->screen_geometry.sizes.w =
mons->window_area_geometry.sizes.w =
sw;
mons->screen_geometry.sizes.h =
mons->window_area_geometry.sizes.h =
sh;
}
}
if (dirty) {

View File

@ -85,15 +85,19 @@ void on_configure_request(XEvent *e)
m->screen_geometry.position.y + ev->y;
}
if (ev->value_mask & CWWidth) {
c->state.geometry.basic.w = ev->width;
c->state.geometry.basic.sizes.w = ev->width;
}
if (ev->value_mask & CWHeight) {
c->state.geometry.basic.h = ev->height;
c->state.geometry.basic.sizes.h = ev->height;
}
if (
(c->state.geometry.basic.position.x + c->state.geometry.basic.w)
(
c->state.geometry.basic.position.x
+
c->state.geometry.basic.sizes.w
)
>
m->screen_geometry.position.x + m->screen_geometry.w
m->screen_geometry.position.x + m->screen_geometry.sizes.w
&&
c->state.is_floating
) {
@ -102,15 +106,19 @@ void on_configure_request(XEvent *e)
m->screen_geometry.position.x
+
(
m->screen_geometry.w / 2
m->screen_geometry.sizes.w / 2
-
client_geometry_total_width(&c->state.geometry) / 2
);
}
if (
(c->state.geometry.basic.position.y + c->state.geometry.basic.h)
(
c->state.geometry.basic.position.y
+
c->state.geometry.basic.sizes.h
)
>
m->screen_geometry.position.y + m->screen_geometry.h
m->screen_geometry.position.y + m->screen_geometry.sizes.h
&&
c->state.is_floating
) {
@ -119,7 +127,7 @@ void on_configure_request(XEvent *e)
m->screen_geometry.position.y
+
(
m->screen_geometry.h / 2
m->screen_geometry.sizes.h / 2
-
client_geometry_total_height(&c->state.geometry) / 2
);
@ -133,8 +141,8 @@ void on_configure_request(XEvent *e)
c->win,
c->state.geometry.basic.position.x,
c->state.geometry.basic.position.y,
c->state.geometry.basic.w,
c->state.geometry.basic.h
c->state.geometry.basic.sizes.w,
c->state.geometry.basic.sizes.h
);
}
} else

View File

@ -10,17 +10,19 @@ void centeredmaster(Monitor *m)
const float master_area_factor = unit_get_master_area_factor(m->unit);
unsigned int mx = 0;
unsigned int mw = m->window_area_geometry.w;
unsigned int mw = m->window_area_geometry.sizes.w;
unsigned int tw = mw;
if (n > m->nmaster) {
/* go mfact box in the center if more than nmaster clients */
mw = m->nmaster ? m->window_area_geometry.w * master_area_factor : 0;
tw = m->window_area_geometry.w - mw;
mw = m->nmaster
? m->window_area_geometry.sizes.w * master_area_factor
: 0;
tw = m->window_area_geometry.sizes.w - mw;
if (n - m->nmaster > 1) {
/* only one client */
mx = (m->window_area_geometry.w - mw) / 2;
tw = (m->window_area_geometry.w - mw) / 2;
mx = (m->window_area_geometry.sizes.w - mw) / 2;
tw = (m->window_area_geometry.sizes.w - mw) / 2;
}
}
@ -40,7 +42,9 @@ void centeredmaster(Monitor *m)
// nmaster clients are stacked vertically,
// in the center of the screen
const unsigned int h =
(m->window_area_geometry.h - my) / (MIN(n, m->nmaster) - i);
(m->window_area_geometry.sizes.h - my)
/
(MIN(n, m->nmaster) - i);
const int left_gap = (n <= m->nmaster + 1) ? gap_size : top_left_half_gap;
const int top_gap = i == 0 ? gap_size : top_left_half_gap;
@ -65,7 +69,7 @@ void centeredmaster(Monitor *m)
// stack clients are stacked vertically
if ((i - m->nmaster) % 2) {
const unsigned int h =
(m->window_area_geometry.h - ety) / ((1 + n - i) / 2);
(m->window_area_geometry.sizes.h - ety) / ((1 + n - i) / 2);
const int left_gap = gap_size;
const int top_gap = (i == m->nmaster + 1) ? gap_size : top_left_half_gap;
@ -88,7 +92,7 @@ void centeredmaster(Monitor *m)
ety += total_height + top_gap + bottom_gap;
} else {
const unsigned int h =
(m->window_area_geometry.h - oty) / ((1 + n - i) / 2);
(m->window_area_geometry.sizes.h - oty) / ((1 + n - i) / 2);
const int left_gap = (m->nmaster == 0 && n == 1) ? gap_size : top_left_half_gap;
const int top_gap = i == m->nmaster ? gap_size : top_left_half_gap;
@ -124,8 +128,8 @@ void floating(Monitor *m)
c,
c->state.geometry.basic.position.x,
c->state.geometry.basic.position.y,
c->state.geometry.basic.w - 2 * border_width,
c->state.geometry.basic.h - 2 * border_width,
c->state.geometry.basic.sizes.w - 2 * border_width,
c->state.geometry.basic.sizes.h - 2 * border_width,
border_width,
0
);
@ -152,16 +156,18 @@ void horizontile(Monitor *m)
const unsigned int mh =
n > m->nmaster
?
(m->nmaster ? m->window_area_geometry.h * master_area_factor : 0)
(m->nmaster ? m->window_area_geometry.sizes.h * master_area_factor : 0)
:
m->window_area_geometry.h;
m->window_area_geometry.sizes.h;
Client *c = nexttiled(m->clients);
for (unsigned int i = 0, mx = 0, tx = 0; c; c = nexttiled(c->next), ++i) {
if (i < m->nmaster) {
const unsigned int w =
(m->window_area_geometry.w - mx) / (MIN(n, m->nmaster) - i);
(m->window_area_geometry.sizes.w - mx)
/
(MIN(n, m->nmaster) - i);
const unsigned int left_gap = i == 0 ? gap_size : top_left_half_gap;
const unsigned int top_gap = gap_size;
@ -182,11 +188,11 @@ void horizontile(Monitor *m)
client_geometry_total_width(&c->state.geometry);
// FIXME: maybe need + left_gap + right_gap
if (mx + total_width < m->window_area_geometry.w) {
if (mx + total_width < m->window_area_geometry.sizes.w) {
mx += total_width + left_gap + right_gap;
}
} else {
const unsigned int w = (m->window_area_geometry.w - tx) / (n - i);
const unsigned int w = (m->window_area_geometry.sizes.w - tx) / (n - i);
const unsigned int left_gap = i == m->nmaster ? gap_size : top_left_half_gap;
const unsigned int top_gap = m->nmaster == 0 ? gap_size : top_left_half_gap;
@ -198,7 +204,7 @@ void horizontile(Monitor *m)
m->window_area_geometry.position.x + tx + left_gap,
m->window_area_geometry.position.y + mh + top_gap,
w - 2 * border_width - left_gap - right_gap,
m->window_area_geometry.h - mh - 2 * border_width - top_gap - bottom_gap,
m->window_area_geometry.sizes.h - mh - 2 * border_width - top_gap - bottom_gap,
border_width,
0
);
@ -207,7 +213,7 @@ void horizontile(Monitor *m)
client_geometry_total_width(&c->state.geometry);
// FIXME: maybe need + left_gap + right_gap
if (tx + total_width < m->window_area_geometry.w) {
if (tx + total_width < m->window_area_geometry.sizes.w) {
tx += total_width + left_gap + right_gap;
}
}
@ -231,8 +237,8 @@ void monocle(Monitor *m)
c,
m->window_area_geometry.position.x + gap_size,
m->window_area_geometry.position.y + gap_size,
m->window_area_geometry.w - 2 * border_width - 2 * gap_size,
m->window_area_geometry.h - 2 * border_width - 2 * gap_size,
m->window_area_geometry.sizes.w - 2 * border_width - 2 * gap_size,
m->window_area_geometry.sizes.h - 2 * border_width - 2 * gap_size,
border_width,
0
);
@ -258,16 +264,16 @@ void tile(Monitor *m)
const unsigned int mw =
n > m->nmaster
?
(m->nmaster ? m->window_area_geometry.w * master_area_factor : 0)
(m->nmaster ? m->window_area_geometry.sizes.w * master_area_factor : 0)
:
m->window_area_geometry.w;
m->window_area_geometry.sizes.w;
Client *c = nexttiled(m->clients);
for (unsigned int i = 0, my = 0, ty = 0; c; c = nexttiled(c->next), ++i) {
if (i < m->nmaster) {
const unsigned int h =
(m->window_area_geometry.h - my) / (MIN(n, m->nmaster) - i);
(m->window_area_geometry.sizes.h - my) / (MIN(n, m->nmaster) - i);
const unsigned int left_gap = gap_size;
const unsigned int top_gap = i == 0 ? gap_size : top_left_half_gap;
@ -288,11 +294,12 @@ void tile(Monitor *m)
client_geometry_total_height(&c->state.geometry);
// FIXME: maybe need + top_gap + bottom_gap
if (my + total_height < m->window_area_geometry.h) {
if (my + total_height < m->window_area_geometry.sizes.h) {
my += total_height + top_gap + bottom_gap;
}
} else {
const unsigned int h = (m->window_area_geometry.h - ty) / (n - i);
const unsigned int h =
(m->window_area_geometry.sizes.h - ty) / (n - i);
const unsigned int left_gap = m->nmaster == 0 ? gap_size : top_left_half_gap;
const unsigned int top_gap = i == m->nmaster ? gap_size : top_left_half_gap;
@ -303,7 +310,7 @@ void tile(Monitor *m)
c,
m->window_area_geometry.position.x + mw + left_gap,
m->window_area_geometry.position.y + ty + top_gap,
m->window_area_geometry.w - mw - 2 * border_width - left_gap - right_gap,
m->window_area_geometry.sizes.w - mw - 2 * border_width - left_gap - right_gap,
h - 2 * border_width - top_gap - bottom_gap,
border_width,
0
@ -313,7 +320,7 @@ void tile(Monitor *m)
client_geometry_total_height(&c->state.geometry);
// FIXME: maybe need + top_gap + bottom_gap
if (ty + total_height < m->window_area_geometry.h) {
if (ty + total_height < m->window_area_geometry.sizes.h) {
ty += total_height + top_gap + bottom_gap;
}
}

View File

@ -8,11 +8,16 @@ void position_init(const Position position)
position->y = 0;
}
void sizes_init(const Sizes sizes)
{
sizes->w = 0;
sizes->h = 0;
}
void basic_geometry_init(const BasicGeometry basic_geometry)
{
position_init(&basic_geometry->position);
basic_geometry->w = 0;
basic_geometry->h = 0;
sizes_init(&basic_geometry->sizes);
}
void client_geometry_init(const ClientGeometry client_geometry)
@ -49,13 +54,13 @@ void client_state_init(const ClientState client_state)
int client_geometry_total_width(
const struct ClientGeometry *const client_geometry
) {
return client_geometry->basic.w + 2 * client_geometry->border_width;
return client_geometry->basic.sizes.w + 2 * client_geometry->border_width;
}
int client_geometry_total_height(
const struct ClientGeometry *const client_geometry
) {
return client_geometry->basic.h + 2 * client_geometry->border_width;
return client_geometry->basic.sizes.h + 2 * client_geometry->border_width;
}
void client_size_hints_update(

View File

@ -9,6 +9,7 @@
*****************/
typedef struct Position *Position;
typedef struct Sizes *Sizes;
typedef struct BasicGeometry *BasicGeometry;
typedef struct ClientGeometry *ClientGeometry;
typedef struct ClientSizeHints *ClientSizeHints;
@ -22,9 +23,13 @@ struct Position {
int x, y;
};
struct Sizes {
int w, h;
};
struct BasicGeometry {
struct Position position;
int w, h;
struct Sizes sizes;
};
struct ClientGeometry {
@ -48,6 +53,7 @@ struct ClientState {
*************/
void position_init(Position position);
void sizes_init(Sizes sizes);
void basic_geometry_init(BasicGeometry basic_geometry);
void client_geometry_init(ClientGeometry client_geometry);
void client_size_hints_init(ClientSizeHints client_size_hints);