X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=3e27903fba2c95c70bf994e90cfa5c53a2994e7e;hb=ac6cd2344f2afda023ac08017e0d2b19b0f66df8;hp=b88562fe3ae24e2a83aa2d9c760ffec2b83c93d0;hpb=ba6dcc15f8893b1d72f185e838c3d34c62f335b4;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index b88562fe..3e27903f 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -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 = 1; -guint screen_old_desktop; -gboolean screen_desktop_timeout = TRUE; -Size screen_physical_size; -gboolean screen_showing_desktop; +guint screen_num_desktops; +guint screen_num_monitors = 0; +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; - -/*! An array of desktops, holding array of areas per monitor */ +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 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; @@ -77,7 +77,7 @@ static GSList *struts_left = NULL; 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" */ @@ -300,6 +300,7 @@ gboolean screen_annex(void) supported[i++] = prop_atoms.ob_wm_state_undecorated; supported[i++] = prop_atoms.openbox_pid; supported[i++] = prop_atoms.ob_theme; + supported[i++] = prop_atoms.ob_config_file; supported[i++] = prop_atoms.ob_control; g_assert(i == num_support); @@ -339,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), @@ -352,14 +353,20 @@ void screen_startup(gboolean reconfig) guint32 d; gboolean namesexist = FALSE; - desktop_popup = pager_popup_new(); - pager_popup_height(desktop_popup, POPUP_HEIGHT); - if (reconfig) { - /* update the pager popup's width */ - pager_popup_text_width_to_strings(desktop_popup, - screen_desktop_names, - screen_num_desktops); + 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); + pager_popup_text_width_to_strings(desktop_popup[i], + screen_desktop_names, + screen_num_desktops); + } + return; } @@ -402,7 +409,17 @@ void screen_startup(gboolean reconfig) screen_num_desktops = 0; if (PROP_GET32(RootWindow(ob_display, ob_screen), net_number_of_desktops, cardinal, &d)) + { + if (d != config_desktops_num) { + /* TRANSLATORS: If you need to specify a different order of the + 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(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); + } /* restore from session if possible */ else if (session_num_desktops) screen_set_num_desktops(session_num_desktops); @@ -440,7 +457,12 @@ void screen_startup(gboolean reconfig) void screen_shutdown(gboolean reconfig) { - pager_popup_free(desktop_popup); + guint 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; @@ -481,12 +503,13 @@ 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(); dock_configure(); + /* make sure all windows are visible */ for (it = client_list; it; it = g_list_next(it)) client_move_onscreen(it->data, FALSE); } @@ -531,12 +554,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! */ @@ -613,10 +637,15 @@ void screen_set_desktop(guint num, gboolean dofocus) /* If screen_desktop_timeout is true, then we've been on this desktop long enough and we can save it as the last desktop. */ - /* save the "last desktop" as the "old desktop" */ - screen_old_desktop = screen_last_desktop; - /* save the desktop we're coming from as the "last desktop" */ - screen_last_desktop = previous; + if (screen_last_desktop == previous) + /* this is the startup state only */ + screen_old_desktop = screen_desktop; + else { + /* save the "last desktop" as the "old desktop" */ + screen_old_desktop = screen_last_desktop; + /* save the desktop we're coming from as the "last desktop" */ + screen_last_desktop = previous; + } } else { /* If screen_desktop_timeout is false, then we just got to this desktop @@ -672,6 +701,9 @@ void screen_set_desktop(guint num, gboolean dofocus) ob_debug("Moving to desktop %d\n", num+1); + if (ob_state() == OB_STATE_RUNNING) + screen_show_desktop_popup(screen_desktop); + /* ignore enter events caused by the move */ ignore_start = event_start_ignore_all_enters(); @@ -702,9 +734,6 @@ void screen_set_desktop(guint num, gboolean dofocus) if (event_curtime != CurrentTime) screen_desktop_user_time = event_curtime; - - if (ob_state() == OB_STATE_RUNNING) - screen_show_desktop_popup(screen_desktop); } void screen_add_desktop(gboolean current) @@ -782,6 +811,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) { @@ -904,39 +934,52 @@ static guint translate_row_col(guint r, guint c) static gboolean hide_desktop_popup_func(gpointer data) { - pager_popup_hide(desktop_popup); + guint i; + + for (i = 0; i < screen_num_monitors; i++) { + pager_popup_hide(desktop_popup[i]); + } return FALSE; /* don't repeat */ } void screen_show_desktop_popup(guint d) { Rect *a; + guint i; /* 0 means don't show the popup */ if (!config_desktop_popup_time) return; - a = screen_physical_area_active(); - pager_popup_position(desktop_popup, CenterGravity, - a->x + a->width / 2, a->y + a->height / 2); - pager_popup_icon_size_multiplier(desktop_popup, - (screen_desktop_layout.columns / - screen_desktop_layout.rows) / 2, - (screen_desktop_layout.rows/ - screen_desktop_layout.columns) / 2); - pager_popup_max_width(desktop_popup, - MAX(a->width/3, POPUP_WIDTH)); - pager_popup_show(desktop_popup, screen_desktop_names[d], d); - - ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func); - ob_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000, - hide_desktop_popup_func, NULL, NULL, NULL); - g_free(a); + for (i = 0; i < screen_num_monitors; i++) { + a = screen_physical_area_monitor(i); + pager_popup_position(desktop_popup[i], CenterGravity, + a->x + a->width / 2, a->y + a->height / 2); + pager_popup_icon_size_multiplier(desktop_popup[i], + (screen_desktop_layout.columns / + screen_desktop_layout.rows) / 2, + (screen_desktop_layout.rows/ + screen_desktop_layout.columns) / 2); + pager_popup_max_width(desktop_popup[i], + MAX(a->width/3, POPUP_WIDTH)); + pager_popup_show(desktop_popup[i], screen_desktop_names[d], d); + + ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func); + ob_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000, + hide_desktop_popup_func, desktop_popup[i], + g_direct_equal, NULL); + g_free(a); + } } void screen_hide_desktop_popup(void) { - ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func); - pager_popup_hide(desktop_popup); + guint i; + + for (i = 0; i < screen_num_monitors; i++) { + ob_main_loop_timeout_remove_data(ob_main_loop, hide_desktop_popup_func, + desktop_popup[i], FALSE); + pager_popup_hide(desktop_popup[i]); + } } guint screen_find_desktop(guint from, ObDirection dir, @@ -1171,9 +1214,11 @@ void screen_update_desktop_names(void) } /* resize the pager for these names */ - pager_popup_text_width_to_strings(desktop_popup, - screen_desktop_names, - screen_num_desktops); + for (i = 0; i < screen_num_monitors; i++) { + pager_popup_text_width_to_strings(desktop_popup[i], + screen_desktop_names, + screen_num_desktops); + } } void screen_show_desktop(gboolean show, ObClient *show_only) @@ -1295,14 +1340,38 @@ typedef struct { 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 (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) /* the areas are initialized before the + desktop names */ + pager_popup_text_width_to_strings(desktop_popup[i], + screen_desktop_names, + screen_num_desktops); + } + } + /* set up the user-specified margins */ config_margins.top_start = RECT_LEFT(monitor_area[screen_num_monitors]); config_margins.top_end = RECT_RIGHT(monitor_area[screen_num_monitors]); @@ -1400,6 +1469,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; @@ -1540,28 +1621,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 */