From 67725da2a2dbfdfee28794882f25d425758816d6 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Sat, 4 Apr 2020 13:50:10 -0400 Subject: [PATCH] added support for withdrawing windows --- anvil.c | 77 ++++++++++++++++++++++++++++---------------------------- anvil.h | 1 - client.c | 14 +---------- mons.c | 4 +++ mouse.c | 36 ++++++++++++++------------ 5 files changed, 64 insertions(+), 68 deletions(-) diff --git a/anvil.c b/anvil.c index 2f06ab4..b5d6cf1 100644 --- a/anvil.c +++ b/anvil.c @@ -17,13 +17,13 @@ static void xbtnpress(XEvent* e) XGrabPointer(X.disp, ev->window, False, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, X.csr_move, CurrentTime); - printf("BTN_DN(w: 0x%lx x: %d y: %d rx: %d ry: %d)\n", ev->window, ev->x, ev->y, ev->x_root, ev->y_root); + printf("BTN_DN(w: 0x%lx s: %d x: %d y: %d rx: %d ry: %d)\n", ev->window, ev->state, ev->x, ev->y, ev->x_root, ev->y_root); X.start_x = ev->x_root, X.start_y = ev->y_root; X.last_x = ev->x_root, X.last_y = ev->y_root; - Location loc; - Client* c = client_get(e->xbutton.window, &loc); - if (c && (ev->window == c->frame)) + Location loc = {0}; + if (mons_find(ev->window, &loc) && (loc.client->frame == ev->window)) { + Client* c = loc.client; if (ev->y < MIN_HEIGHT) { X.edge = E_TOP; @@ -52,9 +52,8 @@ static void xbtnrelease(XEvent* e) { XButtonEvent* ev = &(e->xbutton); printf("BTN_UP(w: 0x%lx x: %d y: %d rx: %d ry: %d)\n", ev->window, ev->x, ev->y, ev->x_root, ev->y_root); - Location loc; - Client* c = client_get(e->xbutton.window, &loc); - if (c && (ev->window == c->frame)) + Location loc = {0}; + if (mons_find(ev->window, &loc) && (loc.client->frame == ev->window)) { mouse_up(ev, &loc); } @@ -68,9 +67,8 @@ static void xbtnmotion(XEvent* e) XMotionEvent *ev = &e->xmotion; printf("BTN_MV(w: 0x%lx x: %d y: %d rx: %d ry: %d)\n", ev->window, ev->x, ev->y, ev->x_root, ev->y_root); while (XCheckTypedWindowEvent(X.disp, ev->window, ev->type, e)); - Location loc; - Client* c = client_get(ev->window, &loc); - if (c && (ev->window == c->frame)) + Location loc = {0}; + if (mons_find(ev->window, &loc) && (loc.client->frame == ev->window)) { mouse_drag(ev, &loc); } @@ -89,15 +87,15 @@ static void xconfigrequest(XEvent* e) wc.border_width = ev->border_width; wc.sibling = ev->above; wc.stack_mode = ev->detail; - Client* c = client_get(ev->window, NULL); - if (c && c->win == ev->window) + Location loc = {0}; + if (mons_find(ev->window, &loc) && (loc.client->win == ev->window)) { - c->w = wc.width; - c->h = wc.height; - client_adjust(c); - if (X.mode == M_RESIZE && Focused == c) + loc.client->w = wc.width; + loc.client->h = wc.height; + client_adjust(loc.client); + if (X.mode == M_RESIZE && Focused == loc.client) { - warp_mouse(c); + warp_mouse(loc.client); } } else @@ -111,7 +109,8 @@ static void xmaprequest(XEvent* e) XMapRequestEvent* ev = &(e->xmaprequest); printf("MAP(w: 0x%lx)\n", ev->window); XWindowAttributes attr; - if (!client_get(ev->window, NULL)) + Location loc = {0}; + if (!mons_find(ev->window, &loc)) { if (XGetWindowAttributes(X.disp, ev->window, &attr) && !attr.override_redirect) { @@ -123,11 +122,18 @@ static void xmaprequest(XEvent* e) static void xunmapnotify(XEvent* e) { XUnmapEvent* ev = &(e->xunmap); - printf("UNMAP(w: 0x%lx)\n", ev->window); - Client* c = client_get(ev->window, NULL); - if (c && c->win == ev->window && !(c->flags & F_SHADED)) + printf("UNMAP(e: 0x%lx w: 0x%lx %d)\n", ev->event, ev->window, ev->from_configure); + Location loc = {0}; + if (mons_find(ev->window, &loc))// && loc.client->win == ev->window) { - XUnmapWindow(X.disp, c->frame); + if (ev->event == X.root && ev->window == loc.client->win) + { + mons_delclient(&loc); + } + else if ( !(loc.client->flags & F_SHADED) ) + { + XUnmapWindow(X.disp, loc.client->frame); + } } } @@ -138,10 +144,6 @@ static void xdestroynotify(XEvent* e) Location loc = {0}; if (mons_find(ev->window, &loc)) { - if (Focused == loc.client) - { - Focused = NULL; - } mons_delclient(&loc); } } @@ -152,7 +154,6 @@ static void xclientmsg(XEvent* e) printf("CLIENT_MSG(w: 0x%lx a: '%s')\n", ev->window, XGetAtomName(X.disp, ev->message_type)); if (ev->message_type == atom("_NET_ACTIVE_WINDOW")) { - printf("ACTIVATE(w: %lx)\n", ev->window); mons_activate(ev->window); } } @@ -161,22 +162,22 @@ static void xpropnotify(XEvent* e) { XPropertyEvent* ev = &(e->xproperty); printf("PROP_NOTIFY(w: 0x%lx)\n", ev->window); - Client* c = client_get(ev->window, NULL); - if (c) + Location loc = {0}; + if (mons_find(ev->window, &loc)) { - client_readprops(c); - client_draw(c); + client_readprops(loc.client); + client_draw(loc.client); } } static void xenternotify(XEvent* e) { XCrossingEvent* ev = &(e->xcrossing); - Client* c = client_get(ev->window, NULL); - printf("ENTER(w: 0x%lx c: 0x%lx)\n", ev->window, c ? c->win : 0); - if (c) + Location loc = {0}; + if (mons_find(ev->window, &loc)) { - client_focus(c); + printf("ENTER(w: 0x%lx c: 0x%lx)\n", ev->window, loc.client->win); + client_focus(loc.client); } } @@ -186,10 +187,10 @@ static void xexpose(XEvent* e) if (ev->count == 0) { printf("EXPOSE(w: 0x%lx)\n", ev->window); - Client* c = client_get(ev->window, NULL); - if (c) + Location loc = {0}; + if (mons_find(ev->window, &loc)) { - client_draw(c); + client_draw(loc.client); } } } diff --git a/anvil.h b/anvil.h index 6035295..13b9331 100644 --- a/anvil.h +++ b/anvil.h @@ -156,7 +156,6 @@ extern Client* Focused; void client_initall(void); Client* client_add(Window win, XWindowAttributes* attr); void client_draw(Client* c); -Client* client_get(Window w, Location* loc); void client_adjust(Client* c); void client_move(Client* c, int xdiff, int ydiff); void client_resize(Client* c, int xdiff, int ydiff); diff --git a/client.c b/client.c index 8ad5ef5..3be4022 100644 --- a/client.c +++ b/client.c @@ -77,25 +77,13 @@ void client_draw(Client* c) } } -Client* client_get(Window w, Location* loc) -{ - Location local_loc; - Client* c = NULL; - loc = (loc ? loc : &local_loc); - if (mons_find(w, loc)) - { - c = loc->client; - } - return c; -} - void client_adjust(Client* c) { int shaded = (c->flags & F_SHADED); int minheight = (shaded ? MIN_HEIGHT : 3*MIN_HEIGHT); if (c->w < minheight) c->w = minheight; if (c->h < minheight) c->h = minheight; - XMoveResizeWindow(X.disp, c->frame, c->x, c->y, c->w, c->h); + XMoveResizeWindow(X.disp, c->frame, c->x, c->y, c->w, (shaded ? minheight : c->h)); printf("CONFIG(c: %lx x: %d y: %d w: %d h: %d)\n", c->frame, c->x, c->y, c->w, c->h); if ( !(c->flags & F_SHADED) ) { diff --git a/mons.c b/mons.c index 69d1de9..93002dd 100644 --- a/mons.c +++ b/mons.c @@ -99,6 +99,10 @@ void mons_addclient(Client* c) void mons_delclient(Location* loc) { + if (Focused == loc->client) + { + Focused = NULL; + } remove_client(loc, loc->client); xfree(loc->client->name); XDestroyWindow(X.disp, loc->client->frame); diff --git a/mouse.c b/mouse.c index cd940df..2b81e63 100644 --- a/mouse.c +++ b/mouse.c @@ -8,6 +8,11 @@ static inline int PRESSED(int mods, int btn) return ((mods & (1 << (btn + 7))) == (1 << (btn + 7))); } +static inline int FLAGS_SET(int state, int flags) +{ + return ((state & flags) == flags); +} + static void float_click(XButtonEvent* ev, Location* loc) { if ((ev->button == Button1) && (ev->y > MIN_HEIGHT)) @@ -17,17 +22,17 @@ static void float_click(XButtonEvent* ev, Location* loc) } else if (ev->button == Button2) { - if (ev->state & MODKEY) + if (FLAGS_SET(ev->state, (MODKEY|ShiftMask))) { - client_close(loc->client); + mons_togglefloat(loc); } - else if (ev->state & (MODKEY|ShiftMask)) + else if (FLAGS_SET(ev->state, MODKEY)) { - mons_togglefloat(loc); + client_close(loc->client); } else { - puts("undefined"); + /* nothing to do */ } } else if (ev->button == Button3) @@ -52,17 +57,17 @@ static void monocled_click(XButtonEvent* ev, Location* loc) } else if (ev->button == Button2) { - if (ev->state & MODKEY) + if (FLAGS_SET(ev->state, (MODKEY|ShiftMask))) { - client_close(loc->client); + mons_togglefloat(loc); } - else if (ev->state & (MODKEY|ShiftMask)) + else if (FLAGS_SET(ev->state, MODKEY)) { - mons_togglefloat(loc); + client_close(loc->client); } - else + else { - puts("expand client"); + /* nothing to do */ } } else if (ev->button == Button3) @@ -88,13 +93,13 @@ static void stacked_click(XButtonEvent* ev, Location* loc) } else if (ev->button == Button2) { - if (ev->state & MODKEY) + if (FLAGS_SET(ev->state, (MODKEY|ShiftMask))) { - client_close(loc->client); + mons_togglefloat(loc); } - else if (ev->state & (MODKEY|ShiftMask)) + else if (FLAGS_SET(ev->state, MODKEY)) { - mons_togglefloat(loc); + client_close(loc->client); } else { @@ -163,4 +168,3 @@ void mouse_drag(XMotionEvent* ev, Location* loc) float_drag(ev, loc); } } - -- 2.54.0