diff --git a/calmwm.h b/calmwm.h index 2f1c6c2..b69fdf8 100644 --- a/calmwm.h +++ b/calmwm.h @@ -328,6 +328,7 @@ void client_send_delete(struct client_ctx *); void client_setactive(struct client_ctx *, int); void client_setname(struct client_ctx *); int client_snapcalc(int, int, int, int, int); +void client_transient(struct client_ctx *); void client_unhide(struct client_ctx *); void client_vertmaximize(struct client_ctx *); void client_warp(struct client_ctx *); diff --git a/client.c b/client.c index e7783a4..711aeba 100644 --- a/client.c +++ b/client.c @@ -113,6 +113,8 @@ client_new(Window win, struct screen_ctx *sc, int mapped) XAddToSaveSet(X_Dpy, cc->win); + client_transient(cc); + /* Notify client of its configuration. */ xu_configure(cc); @@ -869,6 +871,21 @@ client_freehints(struct client_ctx *cc) XFree(cc->app_class); } +void +client_transient(struct client_ctx *cc) +{ + struct client_ctx *tc; + Window trans; + + if (XGetTransientForHint(X_Dpy, cc->win, &trans)) { + if ((tc = client_find(trans)) && tc->group) { + group_movetogroup(cc, tc->group->shortcut - 1); + if (tc->flags & CLIENT_IGNORE) + cc->flags |= CLIENT_IGNORE; + } + } +} + static int client_inbound(struct client_ctx *cc, int x, int y) { diff --git a/xevents.c b/xevents.c index 34dd051..6c4ba71 100644 --- a/xevents.c +++ b/xevents.c @@ -191,6 +191,9 @@ xev_handle_propertynotify(XEvent *ee) case XA_WM_NAME: client_setname(cc); break; + case XA_WM_TRANSIENT_FOR: + client_transient(cc); + break; default: /* do nothing */ break;