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

View File

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

View File

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

View File

@ -8,11 +8,16 @@ void position_init(const Position position)
position->y = 0; position->y = 0;
} }
void sizes_init(const Sizes sizes)
{
sizes->w = 0;
sizes->h = 0;
}
void basic_geometry_init(const BasicGeometry basic_geometry) void basic_geometry_init(const BasicGeometry basic_geometry)
{ {
position_init(&basic_geometry->position); position_init(&basic_geometry->position);
basic_geometry->w = 0; sizes_init(&basic_geometry->sizes);
basic_geometry->h = 0;
} }
void client_geometry_init(const ClientGeometry client_geometry) 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( int client_geometry_total_width(
const struct ClientGeometry *const client_geometry 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( int client_geometry_total_height(
const struct ClientGeometry *const client_geometry 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( void client_size_hints_update(

View File

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