From: Dana Jansens Date: Sat, 21 Nov 2009 21:05:27 +0000 (-0500) Subject: Some fixes for the pager popups, and avoid a crash if you destroy a popup while it... X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fopenbox;a=commitdiff_plain;h=33328583a143677d27eb3d081ce66532c3aaca1c Some fixes for the pager popups, and avoid a crash if you destroy a popup while it is going to be shown later by a delay. --- diff --git a/openbox/popup.c b/openbox/popup.c index 2a0d5960..5cbe0347 100644 --- a/openbox/popup.c +++ b/openbox/popup.c @@ -65,6 +65,8 @@ ObPopup *popup_new(void) void popup_free(ObPopup *self) { if (self) { + popup_hide(self); /* make sure it's not showing or is being delayed and + will be shown */ XDestroyWindow(ob_display, self->bg); XDestroyWindow(ob_display, self->text); RrAppearanceFree(self->a_bg); diff --git a/openbox/screen.c b/openbox/screen.c index 1bcda980..5ca0832c 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -57,7 +57,7 @@ static void screen_tell_ksplash(void); 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; @@ -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" */ @@ -355,20 +355,19 @@ void screen_startup(gboolean reconfig) 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 */ @@ -460,10 +459,10 @@ void screen_shutdown(gboolean reconfig) { 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; @@ -510,6 +509,7 @@ void screen_resize(void) 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); } @@ -1340,22 +1340,32 @@ 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 (!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);