]> Dogcows Code - chaz/openbox/commitdiff
make configurerequest activate but net_restack_windows just restack.
authorDana Jansens <danakj@orodu.net>
Thu, 10 May 2007 04:39:06 +0000 (04:39 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 10 May 2007 04:39:06 +0000 (04:39 +0000)
fix bottomif, topif, opposite.
fix debug output in event printing when there was no problem

openbox/event.c
openbox/stacking.c
openbox/stacking.h

index 271114a27d0907f77a8aee42533fe2dd11add46d..6bf6e87b27cde03ed9709a78d8556a8b450a8a33 100644 (file)
@@ -1030,8 +1030,9 @@ static void event_handle_client(ObClient *client, XEvent *e)
                     sibling = WINDOW_AS_CLIENT(win);
             }
 
+            /* activate it rather than just focus it */
             stacking_restack_request(client, sibling,
-                                     e->xconfigurerequest.detail);
+                                     e->xconfigurerequest.detail, TRUE);
         }
         break;
     case UnmapNotify:
@@ -1236,12 +1237,14 @@ static void event_handle_client(ObClient *client, XEvent *e)
                     e->xclient.data.l[2] == TopIf ||
                     e->xclient.data.l[2] == Opposite)
                 {
+                    /* just raise, don't activate */
                     stacking_restack_request(client, sibling,
-                                             e->xclient.data.l[2]);
-                }
-                ob_debug_type(OB_DEBUG_APP_BUGS, "_NET_RESTACK_WINDOW sent "
-                              "for window %s with invalid detail 0d\n",
-                              client->title, e->xclient.data.l[2]);
+                                             e->xclient.data.l[2], FALSE);
+                } else
+                    ob_debug_type(OB_DEBUG_APP_BUGS,
+                                  "_NET_RESTACK_WINDOW sent for window %s "
+                                  "with invalid detail %d\n",
+                                  client->title, e->xclient.data.l[2]);
             }
         }
         break;
index 70a072fcf382968ac37519f1da7deb8478321950..564b995e2d8f292bc6bd26fb6802bb96ac552b9c 100644 (file)
@@ -461,41 +461,87 @@ void stacking_add_nonintrusive(ObWindow *win)
     }
 }
 
-gboolean stacking_occluded(ObClient *client, ObClient *sibling)
+/*! Returns TRUE if client is occluded by the sibling. If sibling is NULL it
+  tries against all other clients.
+*/
+static gboolean stacking_occluded(ObClient *client, ObClient *sibling)
 {
     GList *it;
-    gboolean obscured = FALSE;
+    gboolean occluded = FALSE;
     gboolean found = FALSE;
 
     /* no need for any looping in this case */
     if (sibling && client->layer != sibling->layer)
-        return obscured;
+        return occluded;
 
-    for (it = stacking_list; it; it = g_list_next(it))
+    for (it = stacking_list; it;
+         it = (found ? g_list_previous(it) :g_list_next(it)))
         if (WINDOW_IS_CLIENT(it->data)) {
             ObClient *c = it->data;
             if (found) {
-                if (sibling != NULL) {
-                    if (c == sibling) {
-                        obscured = TRUE;
+                if (RECT_INTERSECTS_RECT(c->frame->area, client->frame->area))
+                {
+                    if (sibling != NULL) {
+                        if (c == sibling) {
+                            occluded = TRUE;
+                            break;
+                        }
+                    }
+                    else if (c->layer == client->layer) {
+                        occluded = TRUE;
                         break;
                     }
+                    else if (c->layer > client->layer)
+                        break; /* we past its layer */
                 }
-                else if (c->layer == client->layer) {
-                    obscured = TRUE;
-                    break;
+            }
+            else if (c == client)
+                found = TRUE;
+        }
+    return occluded;
+}
+
+/*! Returns TRUE if client is occludes the sibling. If sibling is NULL it tries
+  against all other clients.
+*/
+static gboolean stacking_occludes(ObClient *client, ObClient *sibling)
+{
+    GList *it;
+    gboolean occludes = FALSE;
+    gboolean found = FALSE;
+
+    /* no need for any looping in this case */
+    if (sibling && client->layer != sibling->layer)
+        return occludes;
+
+    for (it = stacking_list; it; it = g_list_next(it))
+        if (WINDOW_IS_CLIENT(it->data)) {
+            ObClient *c = it->data;
+            if (found) {
+                if (RECT_INTERSECTS_RECT(c->frame->area, client->frame->area))
+                {
+                    if (sibling != NULL) {
+                        if (c == sibling) {
+                            occludes = TRUE;
+                            break;
+                        }
+                    }
+                    else if (c->layer == client->layer) {
+                        occludes = TRUE;
+                        break;
+                    }
+                    else if (c->layer > client->layer)
+                        break; /* we past its layer */
                 }
-                else if (c->layer > client->layer)
-                    break; /* we past its layer */
             }
             else if (c == client)
                 found = TRUE;
         }
-    return obscured;
+    return occludes;
 }
 
 void stacking_restack_request(ObClient *client, ObClient *sibling,
-                              gint detail)
+                              gint detail, gboolean activate)
 {
     switch (detail) {
     case Below:
@@ -510,29 +556,45 @@ void stacking_restack_request(ObClient *client, ObClient *sibling,
                  client->title, sibling ? sibling->title : "(all)");
         /* if this client occludes sibling (or anything if NULL), then
            lower it to the bottom */
-        if (stacking_occluded(sibling, client))
+        if (stacking_occludes(client, sibling))
             stacking_lower(CLIENT_AS_WINDOW(client));
         break;
     case Above:
         ob_debug("Restack request Above for client %s sibling %s\n",
                  client->title, sibling ? sibling->title : "(all)");
-        /* activate it rather than just focus it */
-        client_activate(client, FALSE, FALSE);
+        if (activate)
+            /* use user=TRUE because it is impossible to get a timestamp
+               for this */
+            client_activate(client, FALSE, TRUE);
+        else
+            stacking_raise(CLIENT_AS_WINDOW(client));
         break;
     case TopIf:
         ob_debug("Restack request TopIf for client %s sibling %s\n",
                  client->title, sibling ? sibling->title : "(all)");
-        if (stacking_occluded(client, sibling))
-            /* activate it rather than just focus it */
-            client_activate(client, FALSE, FALSE);
+        if (stacking_occluded(client, sibling)) {
+            if (activate)
+                /* use user=TRUE because it is impossible to get a timestamp
+                   for this */
+                client_activate(client, FALSE, TRUE);
+            else
+                stacking_raise(CLIENT_AS_WINDOW(client));
+        }
+        break;
     case Opposite:
         ob_debug("Restack request Opposite for client %s sibling "
                  "%s\n",
                  client->title, sibling ? sibling->title : "(all)");
-        if (stacking_occluded(client, sibling))
-            /* activate it rather than just focus it */
-            client_activate(client, FALSE, FALSE);
-        else if (stacking_occluded(sibling, client))
+        if (stacking_occluded(client, sibling)) {
+            if (activate)
+                /* use user=TRUE because it is impossible to get a timestamp
+                   for this */
+                client_activate(client, FALSE, TRUE);
+            else
+                stacking_raise(CLIENT_AS_WINDOW(client));
+        }
+        else if (stacking_occludes(client, sibling))
             stacking_lower(CLIENT_AS_WINDOW(client));
+        break;
     }
 }
index d570c944867cbb7e088b7c7a5b097b71c3588b99..afa4a6c696afe4c076488d75f09a4e05f2445644 100644 (file)
@@ -59,21 +59,18 @@ void stacking_lower(ObWindow *window);
 */
 void stacking_below(ObWindow *window, ObWindow *below);
 
-/*! Returns TRUE if client is occluded by sibling. If sibling is NULL it tries
-  against all other clients. Otherwise, it returns FALSE.
-*/
-gboolean stacking_occluded(struct _ObClient *client,struct _ObClient *sibling);
-
 /*! Restack a window based upon a sibling (or all windows) in various ways.
   @param client The client to be restacked
   @param sibling Another client to compare to, or NULL to compare to all
                  windows
   @param detail One of Above, Below, TopIf, BottomIf, Opposite
+  @param activate If TRUE, and if the window is going to be raised, it will
+                  be activated instead
   See http://tronche.com/gui/x/xlib/window/configure.html for details on
   how each detail works with and without a sibling.
 */
 void stacking_restack_request(struct _ObClient *client,
                               struct _ObClient *sibling,
-                              gint detail);
+                              gint detail, gboolean);
 
 #endif
This page took 0.035076 seconds and 4 git commands to generate.