]> Dogcows Code - chaz/openbox/blobdiff - openbox/screen.c
Merge branch 'backport' into work
[chaz/openbox] / openbox / screen.c
index 8012942beb65a09ebfe0c88d32cab8010995edce..5050a68525851b5b7a3fd844b66b5496af24a646 100644 (file)
@@ -929,7 +929,7 @@ void screen_show_desktop_popup(guint d)
     /* 0 means don't show the popup */
     if (!config_desktop_popup_time) return;
 
-    a = screen_physical_area_primary();
+    a = screen_physical_area_primary(FALSE);
     pager_popup_position(desktop_popup, CenterGravity,
                          a->x + a->width / 2, a->y + a->height / 2);
     pager_popup_icon_size_multiplier(desktop_popup,
@@ -1270,19 +1270,6 @@ void screen_install_colormap(ObClient *client, gboolean install)
     }
 }
 
-#define STRUT_LEFT_ON_MONITOR(s, i) \
-    (RANGES_INTERSECT(s->left_start, s->left_end - s->left_start + 1, \
-                      monitor_area[i].y, monitor_area[i].height))
-#define STRUT_RIGHT_ON_MONITOR(s, i) \
-    (RANGES_INTERSECT(s->right_start, s->right_end - s->right_start + 1, \
-                      monitor_area[i].y, monitor_area[i].height))
-#define STRUT_TOP_ON_MONITOR(s, i) \
-    (RANGES_INTERSECT(s->top_start, s->top_end - s->top_start + 1, \
-                      monitor_area[i].x, monitor_area[i].width))
-#define STRUT_BOTTOM_ON_MONITOR(s, i) \
-    (RANGES_INTERSECT(s->bottom_start, s->bottom_end - s->bottom_start + 1, \
-                      monitor_area[i].x, monitor_area[i].width))
-
 typedef struct {
     guint desktop;
     StrutPartial *strut;
@@ -1359,7 +1346,7 @@ static void get_xinerama_screens(Rect **xin_areas, guint *nxin)
 
 void screen_update_areas(void)
 {
-    guint i, j;
+    guint j;
     gulong *dims;
     GList *it;
     GSList *sit;
@@ -1377,7 +1364,7 @@ void screen_update_areas(void)
     config_margins.right_start = RECT_TOP(monitor_area[screen_num_monitors]);
     config_margins.right_end = RECT_BOTTOM(monitor_area[screen_num_monitors]);
 
-    dims = g_new(gulong, 4 * screen_num_desktops * screen_num_monitors);
+    dims = g_new(gulong, 4 * screen_num_desktops);
 
     RESET_STRUT_LIST(struts_left);
     RESET_STRUT_LIST(struts_top);
@@ -1423,69 +1410,51 @@ void screen_update_areas(void)
     VALIDATE_STRUTS(struts_bottom, bottom,
                     monitor_area[screen_num_monitors].height / 2);
 
-    /* set up the work areas to be full screen */
-    for (i = 0; i < screen_num_monitors; ++i)
-        for (j = 0; j < screen_num_desktops; ++j) {
-            dims[(i * screen_num_desktops + j) * 4+0] = monitor_area[i].x;
-            dims[(i * screen_num_desktops + j) * 4+1] = monitor_area[i].y;
-            dims[(i * screen_num_desktops + j) * 4+2] = monitor_area[i].width;
-            dims[(i * screen_num_desktops + j) * 4+3] = monitor_area[i].height;
-        }
-
-    /* calculate the work areas from the struts */
-    for (i = 0; i < screen_num_monitors; ++i)
-        for (j = 0; j < screen_num_desktops; ++j) {
-            gint l = 0, r = 0, t = 0, b = 0;
+    /* set up the work area to be full screen across all monitors */
+    for (j = 0; j < screen_num_desktops; ++j) {
+        dims[j*4 + 0] =
+            monitor_area[screen_num_monitors].x;
+        dims[j*4 + 1] =
+            monitor_area[screen_num_monitors].y;
+        dims[j*4 + 2] =
+            monitor_area[screen_num_monitors].width;
+        dims[j*4 + 3] =
+            monitor_area[screen_num_monitors].height;
+    }
 
-            /* only add the strut to the area if it touches the monitor */
+    /* calculate the work area from the struts */
+    for (j = 0; j < screen_num_desktops; ++j) {
+        gint l = 0, r = 0, t = 0, b = 0;
 
-            for (sit = struts_left; sit; sit = g_slist_next(sit)) {
-                ObScreenStrut *s = sit->data;
-                if ((s->desktop == j || s->desktop == DESKTOP_ALL) &&
-                    STRUT_LEFT_ON_MONITOR(s->strut, i))
-                    l = MAX(l, s->strut->left);
-            }
-            for (sit = struts_top; sit; sit = g_slist_next(sit)) {
-                ObScreenStrut *s = sit->data;
-                if ((s->desktop == j || s->desktop == DESKTOP_ALL) &&
-                    STRUT_TOP_ON_MONITOR(s->strut, i))
-                    t = MAX(t, s->strut->top);
-            }
-            for (sit = struts_right; sit; sit = g_slist_next(sit)) {
-                ObScreenStrut *s = sit->data;
-                if ((s->desktop == j || s->desktop == DESKTOP_ALL) &&
-                    STRUT_RIGHT_ON_MONITOR(s->strut, i))
-                    r = MAX(r, s->strut->right);
-            }
-            for (sit = struts_bottom; sit; sit = g_slist_next(sit)) {
-                ObScreenStrut *s = sit->data;
-                if ((s->desktop == j || s->desktop == DESKTOP_ALL) &&
-                    STRUT_BOTTOM_ON_MONITOR(s->strut, i))
-                    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;
-            dims[(i * screen_num_desktops + j) * 4 + 1] += t;
-            dims[(i * screen_num_desktops + j) * 4 + 2] -= l + r;
-            dims[(i * screen_num_desktops + j) * 4 + 3] -= t + b;
+        for (sit = struts_left; sit; sit = g_slist_next(sit)) {
+            ObScreenStrut *s = sit->data;
+            if (s->desktop == j || s->desktop == DESKTOP_ALL)
+                l = MAX(l, s->strut->left);
+        }
+        for (sit = struts_top; sit; sit = g_slist_next(sit)) {
+            ObScreenStrut *s = sit->data;
+            if (s->desktop == j || s->desktop == DESKTOP_ALL)
+                t = MAX(t, s->strut->top);
+        }
+        for (sit = struts_right; sit; sit = g_slist_next(sit)) {
+            ObScreenStrut *s = sit->data;
+            if (s->desktop == j || s->desktop == DESKTOP_ALL)
+                r = MAX(r, s->strut->right);
         }
+        for (sit = struts_bottom; sit; sit = g_slist_next(sit)) {
+            ObScreenStrut *s = sit->data;
+            if (s->desktop == j || s->desktop == DESKTOP_ALL)
+                b = MAX(b, s->strut->bottom);
+        }
+
+        /* based on these margins, set the work area for the desktop */
+        dims[j*4 + 0] += l;
+        dims[j*4 + 1] += t;
+        dims[j*4 + 2] -= l + r;
+        dims[j*4 + 3] -= t + b;
+    }
 
-    /* all the work areas are not used here, only the ones for the first
-       monitor are */
+    /* set the legacy workarea hint to the union of all the monitors */
     OBT_PROP_SETA32(obt_root(ob_screen), NET_WORKAREA, CARDINAL,
                     dims, 4 * screen_num_desktops);
 
@@ -1724,7 +1693,7 @@ Rect* screen_physical_area_active(void)
     return screen_physical_area_monitor(screen_monitor_active());
 }
 
-guint screen_monitor_primary(void)
+guint screen_monitor_primary(gboolean fixed)
 {
     if (config_primary_monitor_index > 0) {
         if (config_primary_monitor_index-1 < screen_num_monitors)
@@ -1732,15 +1701,17 @@ guint screen_monitor_primary(void)
         else
             return 0;
     }
+    else if (fixed)
+        return 0;
     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)
+Rect *screen_physical_area_primary(gboolean fixed)
 {
-    return screen_physical_area_monitor(screen_monitor_primary());
+    return screen_physical_area_monitor(screen_monitor_primary(fixed));
 }
 
 void screen_set_root_cursor(void)
@@ -1753,17 +1724,21 @@ void screen_set_root_cursor(void)
                       ob_cursor(OB_CURSOR_POINTER));
 }
 
-guint screen_monitor_pointer()
+guint screen_find_monitor_point(guint x, guint y)
 {
     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);
+    RECT_SET(mon, x, y, 1, 1);
     return screen_find_monitor(&mon);
 }
 
+guint screen_monitor_pointer()
+{
+    gint x, y;
+    if (!screen_pointer_pos(&x, &y))
+        x = y = 0;
+    return screen_find_monitor_point(x, y);
+}
+
 gboolean screen_pointer_pos(gint *x, gint *y)
 {
     Window w;
This page took 0.025831 seconds and 4 git commands to generate.