From a63b87e31561b68c0daad5ffaa0ff47cb84ab402 Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 8 Nov 2018 15:49:42 +0000 Subject: [PATCH 1/4] Use the original client border width to adjust initial placement of clients containing {P,US}Position requests where they are explicitly set to 'ignore' in cwmrc(5); clients are unaware that their border will be altered (removed in this case) when calcuating position and thus end up a factor of their original border width off once mapped by cwm(1). cwm(1) will essentially shift the client to the edge if the original request's position and border match. Window offset noticed by at least Andre Stoebe via bugs@, and others since (and likely before). Thanks! --- calmwm.h | 1 + client.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/calmwm.h b/calmwm.h index 4984417..f007a04 100644 --- a/calmwm.h +++ b/calmwm.h @@ -130,6 +130,7 @@ struct client_ctx { Window win; Colormap colormap; int bwidth; /* border width */ + int obwidth; /* original border width */ struct geom geom, savegeom, fullgeom; struct { long flags; /* defined hints */ diff --git a/client.c b/client.c index 45412f3..1fa74b9 100644 --- a/client.c +++ b/client.c @@ -96,6 +96,7 @@ client_init(Window win, struct screen_ctx *sc, int active) cc->ptr.y = cc->geom.h / 2; cc->colormap = wattr.colormap; + cc->obwidth = wattr.border_width; if (wattr.map_state != IsViewable) { client_placecalc(cc); @@ -760,6 +761,12 @@ client_placecalc(struct client_ctx *cc) cc->geom.x = sc->view.h - cc->bwidth - 1; if (cc->geom.y + cc->geom.h + cc->bwidth <= 0) cc->geom.y = -(cc->geom.h + cc->bwidth - 1); + if (cc->flags & CLIENT_IGNORE) { + if (((cc->obwidth * 2) + cc->geom.x + cc->geom.w) == sc->view.w) + cc->geom.x += cc->obwidth * 2; + if (((cc->obwidth * 2) + cc->geom.y + cc->geom.h) == sc->view.h) + cc->geom.y += cc->obwidth * 2; + } } else { struct geom area; int xmouse, ymouse; From 268deed916cd217b39568809d520f9d4515abdac Mon Sep 17 00:00:00 2001 From: okan Date: Fri, 9 Nov 2018 16:00:54 +0000 Subject: [PATCH 2/4] merge from base, from sashan@: > - odd condition/test in PF lexer > (and other lexers too) > > This commit rectifies earlier change: > > in the lex... even inside quotes, a \ followed by space or tab should > expand to space or tab, and a \ followed by newline should be ignored > (as a line continuation). compatible with the needs of hoststated > (which has the most strict quoted string requirements), and ifstated > (where one commonly does line continuations in strings). > > OK deraadt@, OK millert@ --- parse.y | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parse.y b/parse.y index 0e4f791..04e7bd4 100644 --- a/parse.y +++ b/parse.y @@ -467,7 +467,8 @@ yylex(void) } else if (c == '\\') { if ((next = lgetc(quotec)) == EOF) return (0); - if (next == quotec || c == ' ' || c == '\t') + if (next == quotec || next == ' ' || + next == '\t') c = next; else if (next == '\n') { file->lineno++; From 194589eb6bfd9d44d2c595035475af14644350c1 Mon Sep 17 00:00:00 2001 From: okan Date: Tue, 13 Nov 2018 17:37:13 +0000 Subject: [PATCH 3/4] Allow 'transientfor' clients to inherit group and bwidth either during init or via property notify events. Previously only the flags were set but nothing was in the path to apply said flags and/or bwidth. Required slight of re-orgnaization of client_init. --- client.c | 37 +++++++++++++++++++++---------------- conf.c | 5 +---- xevents.c | 3 +++ 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/client.c b/client.c index 1fa74b9..ff20290 100644 --- a/client.c +++ b/client.c @@ -62,10 +62,9 @@ client_init(Window win, struct screen_ctx *sc, int active) mapped = wattr.map_state != IsUnmapped; } - cc = xmalloc(sizeof(*cc)); - XGrabServer(X_Dpy); + cc = xmalloc(sizeof(*cc)); cc->sc = sc; cc->win = win; cc->label = NULL; @@ -74,30 +73,33 @@ client_init(Window win, struct screen_ctx *sc, int active) cc->stackingorder = 0; memset(&cc->hint, 0, sizeof(cc->hint)); memset(&cc->ch, 0, sizeof(cc->ch)); - TAILQ_INIT(&cc->nameq); - client_setname(cc); + cc->geom.x = wattr.x; + cc->geom.y = wattr.y; + cc->geom.w = wattr.width; + cc->geom.h = wattr.height; + cc->colormap = wattr.colormap; + cc->obwidth = wattr.border_width; + cc->bwidth = Conf.bwidth; + + client_setname(cc); conf_client(cc); XGetClassHint(X_Dpy, cc->win, &cc->ch); client_wm_hints(cc); client_wm_protocols(cc); client_getsizehints(cc); + client_transient(cc); client_mwm_hints(cc); - cc->geom.x = wattr.x; - cc->geom.y = wattr.y; - cc->geom.w = wattr.width; - cc->geom.h = wattr.height; + if ((cc->flags & CLIENT_IGNORE)) + cc->bwidth = 0; cc->dim.w = (cc->geom.w - cc->hint.basew) / cc->hint.incw; cc->dim.h = (cc->geom.h - cc->hint.baseh) / cc->hint.inch; cc->ptr.x = cc->geom.w / 2; cc->ptr.y = cc->geom.h / 2; - cc->colormap = wattr.colormap; - cc->obwidth = wattr.border_width; - if (wattr.map_state != IsViewable) { client_placecalc(cc); client_resize(cc, 0); @@ -114,8 +116,6 @@ client_init(Window win, struct screen_ctx *sc, int active) XAddToSaveSet(X_Dpy, cc->win); - client_transient(cc); - /* Notify client of its configuration. */ client_config(cc); @@ -131,6 +131,10 @@ client_init(Window win, struct screen_ctx *sc, int active) client_unhide(cc); if (mapped) { + if (cc->gc) { + group_movetogroup(cc, cc->gc->num); + goto out; + } if (group_restore(cc)) goto out; if (group_autogroup(cc)) @@ -926,10 +930,11 @@ client_transient(struct client_ctx *cc) Window trans; if (XGetTransientForHint(X_Dpy, cc->win, &trans)) { - if ((tc = client_find(trans)) != NULL && tc->gc) { - group_movetogroup(cc, tc->gc->num); - if (tc->flags & CLIENT_IGNORE) + if ((tc = client_find(trans)) != NULL) { + if (tc->flags & CLIENT_IGNORE) { cc->flags |= CLIENT_IGNORE; + cc->bwidth = tc->bwidth; + } } } } diff --git a/conf.c b/conf.c index b77425c..b18dc4a 100644 --- a/conf.c +++ b/conf.c @@ -434,16 +434,13 @@ void conf_client(struct client_ctx *cc) { struct winname *wn; - int ignore = 0; TAILQ_FOREACH(wn, &Conf.ignoreq, entry) { if (strncasecmp(wn->name, cc->name, strlen(wn->name)) == 0) { - ignore = 1; + cc->flags |= CLIENT_IGNORE; break; } } - cc->bwidth = (ignore) ? 0 : Conf.bwidth; - cc->flags |= (ignore) ? CLIENT_IGNORE : 0; } void diff --git a/xevents.c b/xevents.c index 21eb68b..e192400 100644 --- a/xevents.c +++ b/xevents.c @@ -198,6 +198,9 @@ xev_handle_propertynotify(XEvent *ee) break; case XA_WM_TRANSIENT_FOR: client_transient(cc); + client_draw_border(cc); + if (cc->gc) + group_movetogroup(cc, cc->gc->num); break; default: /* do nothing */ From 695eb1d8e52c8498afe342ec8ecd404fbffb9e1c Mon Sep 17 00:00:00 2001 From: okan Date: Wed, 14 Nov 2018 19:22:51 +0000 Subject: [PATCH 4/4] Stop asking for events (NoEventMask) from menu window once done with the menu (we don't destroy it, only unmap). --- menu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/menu.c b/menu.c index e00e8a9..d06c529 100644 --- a/menu.c +++ b/menu.c @@ -159,6 +159,7 @@ out: mi = NULL; } + XSelectInput(X_Dpy, sc->menu.win, NoEventMask); XSetInputFocus(X_Dpy, focuswin, focusrevert, CurrentTime); /* restore if user didn't move */ xu_ptr_getpos(sc->rootwin, &xcur, &ycur);