static void screen_fallback_focus(void);
guint screen_num_desktops;
-guint screen_num_monitors;
+guint screen_num_monitors = 0;
guint screen_desktop;
guint screen_last_desktop;
gboolean screen_showing_desktop;
static GSList *struts_right = NULL;
static GSList *struts_bottom = NULL;
-static ObPagerPopup **desktop_popup;
+static ObPagerPopup **desktop_popup = NULL;
/*! The number of microseconds that you need to be on a desktop before it will
replace the remembered "last desktop" */
if (reconfig) {
guint i;
+
+ /* recreate the pager popups to use any new theme stuff. it was
+ freed in screen_shutdown() already. */
desktop_popup = g_new(ObPagerPopup*, screen_num_monitors);
for (i = 0; i < screen_num_monitors; i++) {
desktop_popup[i] = pager_popup_new();
pager_popup_height(desktop_popup[i], POPUP_HEIGHT);
-
- /* update the pager popup's width */
pager_popup_text_width_to_strings(desktop_popup[i],
screen_desktop_names,
screen_num_desktops);
}
return;
- } else {
- desktop_popup = NULL;
}
/* get the initial size */
{
guint i;
- for (i = 0; i < screen_num_monitors; i++) {
+ for (i = 0; i < screen_num_monitors; i++)
pager_popup_free(desktop_popup[i]);
- }
g_free(desktop_popup);
+ desktop_popup = NULL;
if (reconfig)
return;
screen_update_areas();
dock_configure();
+ /* make sure all windows are visible */
for (it = client_list; it; it = g_list_next(it))
client_move_onscreen(it->data, FALSE);
}
void screen_update_areas(void)
{
- guint i, j;
+ guint i, j, onum;
gulong *dims;
GList *it;
GSList *sit;
+ onum = screen_num_monitors;
+
g_free(monitor_area);
extensions_xinerama_screens(&monitor_area, &screen_num_monitors);
- if (!desktop_popup) {
- desktop_popup = g_new(ObPagerPopup*, screen_num_monitors);
- for (i = 0; i < screen_num_monitors; i++) {
+ if (screen_num_monitors < onum) {
+ /* free some of the pager popups */
+ for (i = screen_num_monitors; i < onum; ++i)
+ pager_popup_free(desktop_popup[i]);
+ desktop_popup = g_renew(ObPagerPopup*, desktop_popup,
+ screen_num_monitors);
+ }
+ else {
+ /* add some more pager popups */
+ desktop_popup = g_renew(ObPagerPopup*, desktop_popup,
+ screen_num_monitors);
+ for (i = onum; i < screen_num_monitors; ++i) {
desktop_popup[i] = pager_popup_new();
pager_popup_height(desktop_popup[i], POPUP_HEIGHT);
-
- if (screen_desktop_names)
- /* update the pager popup's width */
+ if (screen_desktop_names) /* the areas are initialized before the
+ desktop names */
pager_popup_text_width_to_strings(desktop_popup[i],
screen_desktop_names,
screen_num_desktops);
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;
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 */