Revert "Show desktop switch popup on every monitor"
[mikachu/openbox.git] / openbox / screen.c
index 346b50c..cf2a6db 100644 (file)
@@ -56,20 +56,20 @@ static gboolean replace_wm(void);
 static void     screen_tell_ksplash(void);
 static void     screen_fallback_focus(void);
 
-guint    screen_num_desktops;
-guint    screen_num_monitors;
-guint    screen_desktop;
-guint    screen_last_desktop;
-gboolean screen_showing_desktop;
+guint           screen_num_desktops;
+guint           screen_num_monitors;
+guint           screen_desktop;
+guint           screen_last_desktop;
+gboolean        screen_showing_desktop;
 ObDesktopLayout screen_desktop_layout;
-gchar  **screen_desktop_names;
-Window   screen_support_win;
-Time     screen_desktop_user_time = CurrentTime;
+gchar         **screen_desktop_names;
+Window          screen_support_win;
+Time            screen_desktop_user_time = CurrentTime;
 
 static Size     screen_physical_size;
 static guint    screen_old_desktop;
 static gboolean screen_desktop_timeout = TRUE;
-/*! An array of desktops, holding array of areas per monitor */
+/*! An array of desktops, holding an array of areas per monitor */
 static Rect  *monitor_area = NULL;
 /*! An array of desktops, holding an array of struts */
 static GSList *struts_top = NULL;
@@ -340,7 +340,7 @@ static void screen_tell_ksplash(void)
     e.xclient.display = ob_display;
     e.xclient.window = RootWindow(ob_display, ob_screen);
     e.xclient.message_type =
-        XInternAtom(ob_display, "_KDE_SPLASH_PROGRESS", False );
+        XInternAtom(ob_display, "_KDE_SPLASH_PROGRESS", False);
     e.xclient.format = 8;
     strcpy(e.xclient.data.b, "wm started");
     XSendEvent(ob_display, RootWindow(ob_display, ob_screen),
@@ -409,7 +409,7 @@ void screen_startup(gboolean reconfig)
                arguments, you can use %1$d for the first one and %2$d for the
                second one. For example,
                "The current session has %2$d desktops, but Openbox is configured for %1$d ..." */
-            g_warning(_("Openbox is configured for %d desktops, but the current session has %d.  Overriding the Openbox configuration."),
+            g_warning(ngettext("Openbox is configured for %d desktop, but the current session has %d.  Overriding the Openbox configuration.", "Openbox is configured for %d desktops, but the current session has %d.  Overriding the Openbox configuration.", config_desktops_num),
                       config_desktops_num, d);
         }
         screen_set_num_desktops(d);
@@ -492,7 +492,7 @@ void screen_resize(void)
     PROP_SETA32(RootWindow(ob_display, ob_screen),
                 net_desktop_geometry, cardinal, geometry, 2);
 
-    if (ob_state() == OB_STATE_STARTING)
+    if (ob_state() != OB_STATE_RUNNING)
         return;
 
     screen_update_areas();
@@ -542,12 +542,13 @@ void screen_set_num_desktops(guint num)
                 stacking_raise(CLIENT_AS_WINDOW(c));
         }
     }
+    g_list_free(stacking_copy);
 
     /* change our struts/area to match (after moving windows) */
     screen_update_areas();
 
     /* may be some unnamed desktops that we need to fill in with names
-     (after updating the areas so the popup can resize) */
+       (after updating the areas so the popup can resize) */
     screen_update_desktop_names();
 
     /* change our desktop if we're on one that no longer exists! */
@@ -714,6 +715,15 @@ void screen_set_desktop(guint num, gboolean dofocus)
         if (WINDOW_IS_CLIENT(it->data)) {
             ObClient *c = it->data;
             client_hide(c);
+            if (c == focus_client) {
+                /* c was focused and we didn't do fallback clearly so make sure
+                   openbox doesnt still consider the window focused.
+                   this happens when using NextWindow with allDesktops, since
+                   it doesnt want to move focus on desktop change, but the
+                   focus is not going to stay with the current window, which
+                   has now disappeared */
+                focus_set_client(NULL);
+            }
         }
     }
 
@@ -798,6 +808,7 @@ void screen_remove_desktop(gboolean current)
             }
         }
     }
+    g_list_free(stacking_copy);
 
     /* fallback focus like we're changing desktops */
     if (screen_desktop < screen_num_desktops - 1) {
@@ -1416,6 +1427,18 @@ void screen_update_areas(void)
                     b = MAX(b, s->strut->bottom);
             }
 
+            /* if the monitor is not against the edge of the root window,
+               the struts will include the distance from the root window's edge
+               to the monitor, so add that back into the monitor's work area */
+            if (l) l += RECT_LEFT  (monitor_area[screen_num_monitors])
+                        - RECT_LEFT  (monitor_area[i]);
+            if (t) t += RECT_TOP   (monitor_area[screen_num_monitors])
+                        - RECT_TOP   (monitor_area[i]);
+            if (r) r -= RECT_RIGHT (monitor_area[screen_num_monitors])
+                        - RECT_RIGHT (monitor_area[i]);
+            if (b) b -= RECT_BOTTOM(monitor_area[screen_num_monitors])
+                        - RECT_BOTTOM(monitor_area[i]);
+
             /* based on these margins, set the work area for the
                monitor/desktop */
             dims[(i * screen_num_desktops + j) * 4 + 0] += l;
@@ -1556,28 +1579,32 @@ Rect* screen_area(guint desktop, guint head, Rect *search)
                 if ((s->desktop == d || s->desktop == DESKTOP_ALL) &&
                     STRUT_LEFT_IN_SEARCH(s->strut, search) &&
                     !STRUT_LEFT_IGNORE(s->strut, us, search))
-                    l = MAX(l, al + s->strut->left);
+                    l = MAX(l, RECT_LEFT(monitor_area[screen_num_monitors])
+                               + s->strut->left);
             }
             for (it = struts_top; it; it = g_slist_next(it)) {
                 ObScreenStrut *s = it->data;
                 if ((s->desktop == d || s->desktop == DESKTOP_ALL) &&
                     STRUT_TOP_IN_SEARCH(s->strut, search) &&
                     !STRUT_TOP_IGNORE(s->strut, us, search))
-                    t = MAX(t, at + s->strut->top);
+                    t = MAX(t, RECT_TOP(monitor_area[screen_num_monitors])
+                               + s->strut->top);
             }
             for (it = struts_right; it; it = g_slist_next(it)) {
                 ObScreenStrut *s = it->data;
                 if ((s->desktop == d || s->desktop == DESKTOP_ALL) &&
                     STRUT_RIGHT_IN_SEARCH(s->strut, search) &&
                     !STRUT_RIGHT_IGNORE(s->strut, us, search))
-                    r = MIN(r, ar - s->strut->right);
+                    r = MIN(r, RECT_RIGHT(monitor_area[screen_num_monitors])
+                               - s->strut->right);
             }
             for (it = struts_bottom; it; it = g_slist_next(it)) {
                 ObScreenStrut *s = it->data;
                 if ((s->desktop == d || s->desktop == DESKTOP_ALL) &&
                     STRUT_BOTTOM_IN_SEARCH(s->strut, search) &&
                     !STRUT_BOTTOM_IGNORE(s->strut, us, search))
-                    b = MIN(b, ab - s->strut->bottom);
+                    b = MIN(b, RECT_BOTTOM(monitor_area[screen_num_monitors])
+                               - s->strut->bottom);
             }
 
             /* limit to this monitor */
@@ -1645,24 +1672,38 @@ gboolean screen_physical_area_monitor_contains(guint head, Rect *search)
     return RECT_INTERSECTS_RECT(monitor_area[head], *search);
 }
 
-Rect* screen_physical_area_active(void)
+guint screen_monitor_active(void)
 {
-    Rect *a;
-    gint x, y;
-
     if (moveresize_client)
-        a = screen_physical_area_monitor(client_monitor(focus_client));
+        return client_monitor(moveresize_client);
     else if (focus_client)
-        a = screen_physical_area_monitor(client_monitor(focus_client));
-    else {
-        Rect mon;
-        if (screen_pointer_pos(&x, &y))
-            RECT_SET(mon, x, y, 1, 1);
+        return client_monitor(focus_client);
+    else
+        return screen_monitor_pointer();
+}
+
+Rect* screen_physical_area_active(void)
+{
+    return screen_physical_area_monitor(screen_monitor_active());
+}
+
+guint screen_monitor_primary(void)
+{
+    if (config_primary_monitor_index > 0) {
+        if (config_primary_monitor_index-1 < screen_num_monitors)
+            return config_primary_monitor_index - 1;
         else
-            RECT_SET(mon, 0, 0, 1, 1);
-        a = screen_physical_area_monitor(screen_find_monitor(&mon));
+            return 0;
     }
-    return a;
+    else if (config_primary_monitor == OB_PLACE_MONITOR_ACTIVE)
+        return screen_monitor_active();
+    else /* config_primary_monitor == OB_PLACE_MONITOR_MOUSE */
+        return screen_monitor_pointer();
+}
+
+Rect *screen_physical_area_primary(void)
+{
+    return screen_physical_area_monitor(screen_monitor_primary());
 }
 
 void screen_set_root_cursor(void)
@@ -1675,6 +1716,17 @@ void screen_set_root_cursor(void)
                       ob_cursor(OB_CURSOR_POINTER));
 }
 
+guint screen_monitor_pointer()
+{
+    Rect mon;
+    gint x, y;
+    if (screen_pointer_pos(&x, &y))
+        RECT_SET(mon, x, y, 1, 1);
+    else
+        RECT_SET(mon, 0, 0, 1, 1);
+    return screen_find_monitor(&mon);
+}
+
 gboolean screen_pointer_pos(gint *x, gint *y)
 {
     Window w;