From 87872079a70a46de905d79e4236d4b2611ca5082 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Sun, 21 Nov 2021 02:44:01 +0500 Subject: [PATCH] Add structure for position --- src/dwm.c | 190 ++++++++++++++++++++++++++------------------- src/dwm/handlers.c | 26 ++++--- src/dwm/layouts.c | 36 ++++----- src/state.c | 9 ++- src/state.h | 11 ++- 5 files changed, 158 insertions(+), 114 deletions(-) diff --git a/src/dwm.c b/src/dwm.c index 9252633..ef6de5a 100644 --- a/src/dwm.c +++ b/src/dwm.c @@ -51,12 +51,14 @@ 0, \ MIN( \ (x) + (w), \ - window_area_geometry.x + window_area_geometry.w \ + window_area_geometry.position.x \ + + \ + window_area_geometry.w \ ) \ - \ MAX( \ (x), \ - window_area_geometry.x \ + window_area_geometry.position.x \ ) \ ) \ * \ @@ -64,12 +66,14 @@ 0, \ MIN( \ (y) + (h), \ - window_area_geometry.y + window_area_geometry.h \ + window_area_geometry.position.y \ + + \ + window_area_geometry.h \ ) \ - \ MAX( \ (y), \ - window_area_geometry.y \ + window_area_geometry.position.y \ ) \ ) \ ) @@ -327,27 +331,35 @@ int applysizehints( *y = 0; } } else { - if (*x >= m->window_area_geometry.x + m->window_area_geometry.w) { + if ( + *x + >= + m->window_area_geometry.position.x + m->window_area_geometry.w + ) { *x = - m->window_area_geometry.x + m->window_area_geometry.position.x + m->window_area_geometry.w - client_geometry_total_width(&c->state.geometry); } - if (*y >= m->window_area_geometry.y + m->window_area_geometry.h) { + if ( + *y + >= + m->window_area_geometry.position.y + m->window_area_geometry.h + ) { *y = - m->window_area_geometry.y + m->window_area_geometry.position.y + m->window_area_geometry.h - client_geometry_total_height(&c->state.geometry); } - if (*x + *w + 2 * bw <= m->window_area_geometry.x) { - *x = m->window_area_geometry.x; + if (*x + *w + 2 * bw <= m->window_area_geometry.position.x) { + *x = m->window_area_geometry.position.x; } - if (*y + *h + 2 * bw <= m->window_area_geometry.y) { - *y = m->window_area_geometry.y; + if (*y + *h + 2 * bw <= m->window_area_geometry.position.y) { + *y = m->window_area_geometry.position.y; } } @@ -408,9 +420,9 @@ int applysizehints( } return ( - *x != c->state.geometry.basic.x + *x != c->state.geometry.basic.position.x || - *y != c->state.geometry.basic.y + *y != c->state.geometry.basic.position.y || *w != c->state.geometry.basic.w || @@ -555,8 +567,8 @@ void configure(Client *c) .display = dpy, .event = c->win, .window = c->win, - .x = c->state.geometry.basic.x, - .y = c->state.geometry.basic.y, + .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, .border_width = c->state.geometry.border_width, @@ -876,8 +888,8 @@ void manage(Window w, XWindowAttributes *wa) client_state_init(&c->state); c->win = w; - c->state.geometry.basic.x = wa->x; - c->state.geometry.basic.y = wa->y; + 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.is_floating = false; @@ -900,12 +912,12 @@ void manage(Window w, XWindowAttributes *wa) const int total_width = client_geometry_total_width(&c->state.geometry); if ( - c->state.geometry.basic.x + total_width + c->state.geometry.basic.position.x + total_width > - c->mon->screen_geometry.x + c->mon->screen_geometry.w + c->mon->screen_geometry.position.x + c->mon->screen_geometry.w ) { - c->state.geometry.basic.x = - c->mon->screen_geometry.x + c->state.geometry.basic.position.x = + c->mon->screen_geometry.position.x + c->mon->screen_geometry.w - @@ -916,12 +928,12 @@ void manage(Window w, XWindowAttributes *wa) client_geometry_total_height(&c->state.geometry); if ( - c->state.geometry.basic.y + total_height + c->state.geometry.basic.position.y + total_height > - c->mon->screen_geometry.y + c->mon->screen_geometry.h + c->mon->screen_geometry.position.y + c->mon->screen_geometry.h ) { - c->state.geometry.basic.y = - c->mon->screen_geometry.y + c->state.geometry.basic.position.y = + c->mon->screen_geometry.position.y + c->mon->screen_geometry.h - @@ -929,10 +941,14 @@ void manage(Window w, XWindowAttributes *wa) } } - c->state.geometry.basic.x = - MAX(c->state.geometry.basic.x, c->mon->screen_geometry.x); - c->state.geometry.basic.y = - MAX(c->state.geometry.basic.y, c->mon->screen_geometry.y); + c->state.geometry.basic.position.x = MAX( + c->state.geometry.basic.position.x, + c->mon->screen_geometry.position.x + ); + c->state.geometry.basic.position.y = MAX( + c->state.geometry.basic.position.y, + c->mon->screen_geometry.position.y + ); c->state.geometry.border_width = settings_get_border_width(); @@ -954,12 +970,12 @@ void manage(Window w, XWindowAttributes *wa) const int total_height = client_geometry_total_height(&c->state.geometry); - c->state.geometry.basic.x = - c->mon->screen_geometry.x + c->state.geometry.basic.position.x = + c->mon->screen_geometry.position.x + (c->mon->screen_geometry.w - total_width) / 2; - c->state.geometry.basic.y = - c->mon->screen_geometry.y + c->state.geometry.basic.position.y = + c->mon->screen_geometry.position.y + (c->mon->screen_geometry.h - total_height) / 2; } @@ -1001,8 +1017,8 @@ void manage(Window w, XWindowAttributes *wa) XMoveResizeWindow( dpy, c->win, - c->state.geometry.basic.x + 2 * sw, - c->state.geometry.basic.y, + c->state.geometry.basic.position.x + 2 * sw, + c->state.geometry.basic.position.y, c->state.geometry.basic.w, c->state.geometry.basic.h ); @@ -1038,8 +1054,8 @@ void movemouse(__attribute__((unused)) const Arg *arg) if (!getrootptr(&x, &y)) return; const unsigned int snap_distance = settings_get_snap_distance(); - const int ocx = c->state.geometry.basic.x; - const int ocy = c->state.geometry.basic.y; + const int ocx = c->state.geometry.basic.position.x; + const int ocy = c->state.geometry.basic.position.y; Time lasttime = 0; @@ -1066,12 +1082,16 @@ void movemouse(__attribute__((unused)) const Arg *arg) int nx = ocx + (ev.xmotion.x - x); int ny = ocy + (ev.xmotion.y - y); - if (abs(selmon->window_area_geometry.x - nx) < snap_distance) { - nx = selmon->window_area_geometry.x; + if ( + abs(selmon->window_area_geometry.position.x - nx) + < + snap_distance + ) { + nx = selmon->window_area_geometry.position.x; } else if ( abs( ( - selmon->window_area_geometry.x + selmon->window_area_geometry.position.x + selmon->window_area_geometry.w ) @@ -1082,19 +1102,23 @@ void movemouse(__attribute__((unused)) const Arg *arg) snap_distance ) { nx = - selmon->window_area_geometry.x + selmon->window_area_geometry.position.x + selmon->window_area_geometry.w - client_geometry_total_width(&c->state.geometry); } - if (abs(selmon->window_area_geometry.y - ny) < snap_distance) { - ny = selmon->window_area_geometry.y; + if ( + abs(selmon->window_area_geometry.position.y - ny) + < + snap_distance + ) { + ny = selmon->window_area_geometry.position.y; } else if ( abs( ( - selmon->window_area_geometry.y + selmon->window_area_geometry.position.y + selmon->window_area_geometry.h ) - (ny + client_geometry_total_height(&c->state.geometry)) @@ -1103,17 +1127,21 @@ void movemouse(__attribute__((unused)) const Arg *arg) snap_distance ) { ny = - selmon->window_area_geometry.y + selmon->window_area_geometry.position.y + selmon->window_area_geometry.h - client_geometry_total_height(&c->state.geometry); } - if (!c->state.is_floating && - (abs(nx - c->state.geometry.basic.x) > snap_distance || - abs(ny - c->state.geometry.basic.y) > snap_distance)) - { + if ( + !c->state.is_floating + && + ( + abs(nx - c->state.geometry.basic.position.x) > snap_distance + || + abs(ny - c->state.geometry.basic.position.y) > snap_distance) + ) { togglefloating(NULL); } @@ -1136,8 +1164,8 @@ void movemouse(__attribute__((unused)) const Arg *arg) XUngrabPointer(dpy, CurrentTime); Monitor *const m = recttomon( - c->state.geometry.basic.x, - c->state.geometry.basic.y, + c->state.geometry.basic.position.x, + c->state.geometry.basic.position.y, c->state.geometry.basic.w, c->state.geometry.basic.h ); @@ -1273,8 +1301,8 @@ void resizeclient(Client *c, int x, int y, int w, int h, int bw) { XWindowChanges wc; - c->state.geometry.basic.x = wc.x = x; - c->state.geometry.basic.y = wc.y = y; + 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.border_width = wc.border_width = bw; @@ -1311,8 +1339,8 @@ void resizemouse(__attribute__((unused)) const Arg *arg) ); const unsigned int snap_distance = settings_get_snap_distance(); - const int ocx = c->state.geometry.basic.x; - const int ocy = c->state.geometry.basic.y; + const int ocx = c->state.geometry.basic.position.x; + const int ocy = c->state.geometry.basic.position.y; Time lasttime = 0; @@ -1347,32 +1375,32 @@ void resizemouse(__attribute__((unused)) const Arg *arg) if ( ( - c->mon->window_area_geometry.x + nw + c->mon->window_area_geometry.position.x + nw >= - selmon->window_area_geometry.x + selmon->window_area_geometry.position.x ) && ( - c->mon->window_area_geometry.x + nw + c->mon->window_area_geometry.position.x + nw <= ( - selmon->window_area_geometry.x + selmon->window_area_geometry.position.x + selmon->window_area_geometry.w ) ) && ( - c->mon->window_area_geometry.y + nh + c->mon->window_area_geometry.position.y + nh >= - selmon->window_area_geometry.y + selmon->window_area_geometry.position.y ) && ( - c->mon->window_area_geometry.y + nh + c->mon->window_area_geometry.position.y + nh <= ( - selmon->window_area_geometry.y + selmon->window_area_geometry.position.y + selmon->window_area_geometry.h ) @@ -1390,8 +1418,8 @@ void resizemouse(__attribute__((unused)) const Arg *arg) if (!selmon->lt[selmon->sellt]->arrange || c->state.is_floating) { resize( c, - c->state.geometry.basic.x, - c->state.geometry.basic.y, + c->state.geometry.basic.position.x, + c->state.geometry.basic.position.y, nw, nh, c->state.geometry.border_width, @@ -1420,8 +1448,8 @@ void resizemouse(__attribute__((unused)) const Arg *arg) while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); Monitor *const m = recttomon( - c->state.geometry.basic.x, - c->state.geometry.basic.y, + c->state.geometry.basic.position.x, + c->state.geometry.basic.position.y, c->state.geometry.basic.w, c->state.geometry.basic.h ); @@ -1728,15 +1756,15 @@ void showhide(Client *c) XMoveWindow( dpy, c->win, - c->state.geometry.basic.x, - c->state.geometry.basic.y + c->state.geometry.basic.position.x, + c->state.geometry.basic.position.y ); if (!c->mon->lt[c->mon->sellt]->arrange || c->state.is_floating) { resize( c, - c->state.geometry.basic.x, - c->state.geometry.basic.y, + 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.border_width, @@ -1751,7 +1779,7 @@ void showhide(Client *c) dpy, c->win, client_geometry_total_width(&c->state.geometry) * -2, - c->state.geometry.basic.y + c->state.geometry.basic.position.y ); } } @@ -1796,8 +1824,8 @@ void togglefloating(__attribute__((unused)) const Arg *arg) if (selmon->sel->state.is_floating) { resize( selmon->sel, - selmon->sel->state.geometry.basic.x, - selmon->sel->state.geometry.basic.y, + selmon->sel->state.geometry.basic.position.x, + selmon->sel->state.geometry.basic.position.y, selmon->sel->state.geometry.basic.w - 2 * (border_width - selmon->sel->state.geometry.border_width), selmon->sel->state.geometry.basic.h - @@ -1898,9 +1926,9 @@ int updategeom() if ( i >= n || - unique[i].x_org != m->screen_geometry.x + unique[i].x_org != m->screen_geometry.position.x || - unique[i].y_org != m->screen_geometry.y + unique[i].y_org != m->screen_geometry.position.y || unique[i].width != m->screen_geometry.w || @@ -1908,11 +1936,11 @@ int updategeom() ) { dirty = 1; m->num = i; - m->screen_geometry.x = - m->window_area_geometry.x = + m->screen_geometry.position.x = + m->window_area_geometry.position.x = unique[i].x_org; - m->screen_geometry.y = - m->window_area_geometry.y = + m->screen_geometry.position.y = + m->window_area_geometry.position.y = unique[i].y_org; m->screen_geometry.w = m->window_area_geometry.w = diff --git a/src/dwm/handlers.c b/src/dwm/handlers.c index 71022da..3b4749b 100644 --- a/src/dwm/handlers.c +++ b/src/dwm/handlers.c @@ -77,10 +77,12 @@ void on_configure_request(XEvent *e) } else if (c->state.is_floating || !selmon->lt[selmon->sellt]->arrange) { m = c->mon; if (ev->value_mask & CWX) { - c->state.geometry.basic.x = m->screen_geometry.x + ev->x; + c->state.geometry.basic.position.x = + m->screen_geometry.position.x + ev->x; } if (ev->value_mask & CWY) { - c->state.geometry.basic.y = m->screen_geometry.y + ev->y; + c->state.geometry.basic.position.y = + m->screen_geometry.position.y + ev->y; } if (ev->value_mask & CWWidth) { c->state.geometry.basic.w = ev->width; @@ -89,15 +91,15 @@ void on_configure_request(XEvent *e) c->state.geometry.basic.h = ev->height; } if ( - (c->state.geometry.basic.x + c->state.geometry.basic.w) + (c->state.geometry.basic.position.x + c->state.geometry.basic.w) > - m->screen_geometry.x + m->screen_geometry.w + m->screen_geometry.position.x + m->screen_geometry.w && c->state.is_floating ) { /* center in x direction */ - c->state.geometry.basic.x = - m->screen_geometry.x + c->state.geometry.basic.position.x = + m->screen_geometry.position.x + ( m->screen_geometry.w / 2 @@ -106,15 +108,15 @@ void on_configure_request(XEvent *e) ); } if ( - (c->state.geometry.basic.y + c->state.geometry.basic.h) + (c->state.geometry.basic.position.y + c->state.geometry.basic.h) > - m->screen_geometry.y + m->screen_geometry.h + m->screen_geometry.position.y + m->screen_geometry.h && c->state.is_floating ) { /* center in y direction */ - c->state.geometry.basic.y = - m->screen_geometry.y + c->state.geometry.basic.position.y = + m->screen_geometry.position.y + ( m->screen_geometry.h / 2 @@ -129,8 +131,8 @@ void on_configure_request(XEvent *e) XMoveResizeWindow( dpy, c->win, - c->state.geometry.basic.x, - c->state.geometry.basic.y, + c->state.geometry.basic.position.x, + c->state.geometry.basic.position.y, c->state.geometry.basic.w, c->state.geometry.basic.h ); diff --git a/src/dwm/layouts.c b/src/dwm/layouts.c index 2843524..35e8f1a 100644 --- a/src/dwm/layouts.c +++ b/src/dwm/layouts.c @@ -49,8 +49,8 @@ void centeredmaster(Monitor *m) resize( c, - m->window_area_geometry.x + mx + left_gap, - m->window_area_geometry.y + my + top_gap, + m->window_area_geometry.position.x + mx + left_gap, + m->window_area_geometry.position.y + my + top_gap, mw - 2 * border_width - left_gap - right_gap, h - 2 * border_width - top_gap - bottom_gap, border_width, @@ -74,8 +74,8 @@ void centeredmaster(Monitor *m) resize( c, - m->window_area_geometry.x + left_gap, - m->window_area_geometry.y + ety + top_gap, + m->window_area_geometry.position.x + left_gap, + m->window_area_geometry.position.y + ety + top_gap, tw - 2 * border_width - left_gap - right_gap, h - 2 * border_width - top_gap - bottom_gap, border_width, @@ -97,8 +97,8 @@ void centeredmaster(Monitor *m) resize( c, - m->window_area_geometry.x + mx + mw + left_gap, - m->window_area_geometry.y + oty + top_gap, + m->window_area_geometry.position.x + mx + mw + left_gap, + m->window_area_geometry.position.y + oty + top_gap, tw - 2 * border_width - left_gap - right_gap, h - 2 * border_width - top_gap - bottom_gap, border_width, @@ -122,8 +122,8 @@ void floating(Monitor *m) if (ISVISIBLE(c) && c->state.geometry.border_width == 0) { resize( c, - c->state.geometry.basic.x, - c->state.geometry.basic.y, + 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, border_width, @@ -170,8 +170,8 @@ void horizontile(Monitor *m) resize( c, - m->window_area_geometry.x + mx + left_gap, - m->window_area_geometry.y + top_gap, + m->window_area_geometry.position.x + mx + left_gap, + m->window_area_geometry.position.y + top_gap, w - 2 * border_width - left_gap - right_gap, mh - 2 * border_width - top_gap - bottom_gap, border_width, @@ -195,8 +195,8 @@ void horizontile(Monitor *m) resize( c, - m->window_area_geometry.x + tx + left_gap, - m->window_area_geometry.y + mh + top_gap, + 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, border_width, @@ -229,8 +229,8 @@ void monocle(Monitor *m) for (Client *c = nexttiled(m->clients); c; c = nexttiled(c->next)) { resize( c, - m->window_area_geometry.x + gap_size, - m->window_area_geometry.y + gap_size, + 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, border_width, @@ -276,8 +276,8 @@ void tile(Monitor *m) resize( c, - m->window_area_geometry.x + left_gap, - m->window_area_geometry.y + my + top_gap, + m->window_area_geometry.position.x + left_gap, + m->window_area_geometry.position.y + my + top_gap, mw - 2 * border_width - left_gap - right_gap, h - 2 * border_width - top_gap - bottom_gap, border_width, @@ -301,8 +301,8 @@ void tile(Monitor *m) resize( c, - m->window_area_geometry.x + mw + left_gap, - m->window_area_geometry.y + ty + top_gap, + 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, h - 2 * border_width - top_gap - bottom_gap, border_width, diff --git a/src/state.c b/src/state.c index 4cca6f6..ebdf53b 100644 --- a/src/state.c +++ b/src/state.c @@ -2,10 +2,15 @@ #include +void position_init(const Position position) +{ + position->x = 0; + position->y = 0; +} + void basic_geometry_init(const BasicGeometry basic_geometry) { - basic_geometry->x = 0; - basic_geometry->y = 0; + position_init(&basic_geometry->position); basic_geometry->w = 0; basic_geometry->h = 0; } diff --git a/src/state.h b/src/state.h index cd24f58..8bd9b5b 100644 --- a/src/state.h +++ b/src/state.h @@ -8,6 +8,7 @@ * Pointer types * *****************/ +typedef struct Position *Position; typedef struct BasicGeometry *BasicGeometry; typedef struct ClientGeometry *ClientGeometry; typedef struct ClientSizeHints *ClientSizeHints; @@ -17,7 +18,14 @@ typedef struct ClientState *ClientState; * Structures * **************/ -struct BasicGeometry { int x, y, w, h; }; +struct Position { + int x, y; +}; + +struct BasicGeometry { + struct Position position; + int w, h; +}; struct ClientGeometry { struct BasicGeometry basic; @@ -39,6 +47,7 @@ struct ClientState { * Functions * *************/ +void position_init(Position position); void basic_geometry_init(BasicGeometry basic_geometry); void client_geometry_init(ClientGeometry client_geometry); void client_size_hints_init(ClientSizeHints client_size_hints);