From 194589eb6bfd9d44d2c595035475af14644350c1 Mon Sep 17 00:00:00 2001 From: okan Date: Tue, 13 Nov 2018 17:37:13 +0000 Subject: [PATCH] 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 */