diff --git a/src/dwm.c b/src/dwm.c index ef6de5a..fdaeb2c 100644 --- a/src/dwm.c +++ b/src/dwm.c @@ -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) { diff --git a/src/dwm/handlers.c b/src/dwm/handlers.c index 3b4749b..dbb8548 100644 --- a/src/dwm/handlers.c +++ b/src/dwm/handlers.c @@ -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 diff --git a/src/dwm/layouts.c b/src/dwm/layouts.c index 35e8f1a..a7743a2 100644 --- a/src/dwm/layouts.c +++ b/src/dwm/layouts.c @@ -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; } } diff --git a/src/state.c b/src/state.c index ebdf53b..ea9197a 100644 --- a/src/state.c +++ b/src/state.c @@ -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( diff --git a/src/state.h b/src/state.h index 8bd9b5b..6283791 100644 --- a/src/state.h +++ b/src/state.h @@ -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);