static void screen_fallback_focus(void);
guint screen_num_desktops;
-guint screen_num_monitors = 0;
+guint screen_num_monitors;
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 = NULL;
+static ObPagerPopup **desktop_popup;
/*! 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);
}
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);
+ }
}
}
void screen_update_areas(void)
{
- guint i, j, onum;
+ guint i, j;
gulong *dims;
GList *it;
GSList *sit;
- onum = screen_num_monitors;
-
g_free(monitor_area);
extensions_xinerama_screens(&monitor_area, &screen_num_monitors);
- 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) {
+ if (!desktop_popup) {
+ 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);
- if (screen_desktop_names) /* the areas are initialized before the
- desktop names */
+
+ if (screen_desktop_names)
+ /* update the pager popup's width */
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])
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)
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;