Revert "Revert "make windows stay on screen when..."
authorDana Jansens <danakj@orodu.net>
Sat, 21 Nov 2009 19:17:02 +0000 (14:17 -0500)
committerDana Jansens <danakj@orodu.net>
Sat, 21 Nov 2009 19:24:17 +0000 (14:24 -0500)
Just kidding.  This doesn't revert d81d54c7a977a034199f24fc8fa7433e634aaf91 but
it redoes the work that patch reverted in a better, less intrusive, way.

openbox/event.c

index e4292cb..38b6bec 100644 (file)
@@ -1513,15 +1513,30 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
         msgtype = e->xproperty.atom;
         if (msgtype == XA_WM_NORMAL_HINTS) {
+            int x, y, w, h, lw, lh;
+
             ob_debug("Update NORMAL hints");
             client_update_normal_hints(client);
             /* normal hints can make a window non-resizable */
             client_setup_decor_and_functions(client, FALSE);
 
-            /* make sure the client's sizes are within its bounds, but only
-               reconfigure the window if it needs to. emacs will update its
-               normal hints every time it receives a conigurenotify */
-            client_reconfigure(client, FALSE);
+            x = client->area.x;
+            y = client->area.y;
+            w = client->area.width;
+            h = client->area.height;
+
+            /* apply the new normal hints */
+            client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
+            /* make sure the window is visible, and if the window is resized
+               off-screen due to the normal hints changing then this will push
+               it back onto the screen. */
+            client_find_onscreen(client, &x, &y, w, h, FALSE);
+
+            /* make sure the client's sizes are within its bounds, but don't
+               make it reply with a configurenotify unless something changed.
+               emacs will update its normal hints every time it receives a
+               configurenotify */
+            client_configure(client, x, y, w, h, FALSE, TRUE, FALSE);
         } else if (msgtype == OBT_PROP_ATOM(MOTIF_WM_HINTS)) {
             client_get_mwm_hints(client);
             /* This can override some mwm hints */