X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=5050a68525851b5b7a3fd844b66b5496af24a646;hb=1b392b5fbe85c55cda2b0fc9d1e10cbe56216185;hp=8012942beb65a09ebfe0c88d32cab8010995edce;hpb=a93b00a5e93281c7c2c31112f0b6b827d605a19d;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 8012942b..5050a685 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -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;