From cd218b417b3aa87bd32e19e85523a360e8fa3615 Mon Sep 17 00:00:00 2001 From: Jakub Date: Fri, 24 May 2024 21:36:09 -0400 Subject: [PATCH] windo map patch --- dwm.c | 54 ++++++++++++- patches/behavior/dwm-windowmap-20221026.diff | 83 ++++++++++++++++++++ 2 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 patches/behavior/dwm-windowmap-20221026.diff diff --git a/dwm.c b/dwm.c index 76250c0..74bb6df 100644 --- a/dwm.c +++ b/dwm.c @@ -274,6 +274,9 @@ static void updatetitle(Client *c); static void updatewindowtype(Client *c); static void updatewmhints(Client *c); static void view(const Arg *arg); +static void window_set_state(Display *dpy, Window win, long state); +static void window_map(Display *dpy, Client *c, int deiconify); +static void window_unmap(Display *dpy, Window win, Window root, int iconify); static Client *wintoclient(Window w); static Monitor *wintomon(Window w); static int xerror(Display *dpy, XErrorEvent *ee); @@ -2349,14 +2352,12 @@ showhide(Client *c) return; if (ISVISIBLE(c)) { /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, 0); + window_map(dpy, c, 1); showhide(c->snext); } else { /* hide clients bottom up */ showhide(c->snext); - XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); + window_unmap(dpy, c->win, root, 1); } } @@ -2934,6 +2935,51 @@ updatewmhints(Client *c) } } +void +window_set_state(Display *dpy, Window win, long state) +{ + long data[] = { state, None }; + + XChangeProperty(dpy, win, wmatom[WMState], wmatom[WMState], 32, + PropModeReplace, (unsigned char*)data, 2); +} + +void +window_map(Display *dpy, Client *c, int deiconify) +{ + Window win = c->win; + + if (deiconify) + window_set_state(dpy, win, NormalState); + + XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); + XSetInputFocus(dpy, win, RevertToPointerRoot, CurrentTime); + XMapWindow(dpy, win); +} + +void +window_unmap(Display *dpy, Window win, Window root, int iconify) +{ + static XWindowAttributes ca, ra; + + XGrabServer(dpy); + XGetWindowAttributes(dpy, root, &ra); + XGetWindowAttributes(dpy, win, &ca); + + /* Prevent UnmapNotify events */ + XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask); + XSelectInput(dpy, win, ca.your_event_mask & ~StructureNotifyMask); + + XUnmapWindow(dpy, win); + + if (iconify) + window_set_state(dpy, win, IconicState); + + XSelectInput(dpy, root, ra.your_event_mask); + XSelectInput(dpy, win, ca.your_event_mask); + XUngrabServer(dpy); +} + void view(const Arg *arg) { diff --git a/patches/behavior/dwm-windowmap-20221026.diff b/patches/behavior/dwm-windowmap-20221026.diff new file mode 100644 index 0000000..db04e41 --- /dev/null +++ b/patches/behavior/dwm-windowmap-20221026.diff @@ -0,0 +1,83 @@ +diff --git a/dwm.c b/dwm.c +index e5efb6a..eaf0333 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -228,6 +228,9 @@ static void updatetitle(Client *c); + static void updatewindowtype(Client *c); + static void updatewmhints(Client *c); + static void view(const Arg *arg); ++static void window_set_state(Display *dpy, Window win, long state); ++static void window_map(Display *dpy, Client *c, int deiconify); ++static void window_unmap(Display *dpy, Window win, Window root, int iconify); + static Client *wintoclient(Window w); + static Monitor *wintomon(Window w); + static int xerror(Display *dpy, XErrorEvent *ee); +@@ -1617,14 +1620,12 @@ showhide(Client *c) + return; + if (ISVISIBLE(c)) { + /* show clients top down */ +- XMoveWindow(dpy, c->win, c->x, c->y); +- if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) +- resize(c, c->x, c->y, c->w, c->h, 0); ++ window_map(dpy, c, 1); + showhide(c->snext); + } else { + /* hide clients bottom up */ + showhide(c->snext); +- XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); ++ window_unmap(dpy, c->win, root, 1); + } + } + +@@ -2032,6 +2033,51 @@ updatewmhints(Client *c) + } + } + ++void ++window_set_state(Display *dpy, Window win, long state) ++{ ++ long data[] = { state, None }; ++ ++ XChangeProperty(dpy, win, wmatom[WMState], wmatom[WMState], 32, ++ PropModeReplace, (unsigned char*)data, 2); ++} ++ ++void ++window_map(Display *dpy, Client *c, int deiconify) ++{ ++ Window win = c->win; ++ ++ if (deiconify) ++ window_set_state(dpy, win, NormalState); ++ ++ XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); ++ XSetInputFocus(dpy, win, RevertToPointerRoot, CurrentTime); ++ XMapWindow(dpy, win); ++} ++ ++void ++window_unmap(Display *dpy, Window win, Window root, int iconify) ++{ ++ static XWindowAttributes ca, ra; ++ ++ XGrabServer(dpy); ++ XGetWindowAttributes(dpy, root, &ra); ++ XGetWindowAttributes(dpy, win, &ca); ++ ++ /* Prevent UnmapNotify events */ ++ XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask); ++ XSelectInput(dpy, win, ca.your_event_mask & ~StructureNotifyMask); ++ ++ XUnmapWindow(dpy, win); ++ ++ if (iconify) ++ window_set_state(dpy, win, IconicState); ++ ++ XSelectInput(dpy, root, ra.your_event_mask); ++ XSelectInput(dpy, win, ca.your_event_mask); ++ XUngrabServer(dpy); ++} ++ + void + view(const Arg *arg) + {