summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.h1
-rw-r--r--client.c17
-rw-r--r--xevents.c3
3 files changed, 21 insertions, 0 deletions
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;