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.

This commit is contained in:
Dana Jansens 2009-11-21 16:05:27 -05:00
parent 056295a8ad
commit 33328583a1
2 changed files with 27 additions and 15 deletions

View file

@ -65,6 +65,8 @@ ObPopup *popup_new(void)
void popup_free(ObPopup *self) void popup_free(ObPopup *self)
{ {
if (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->bg);
XDestroyWindow(ob_display, self->text); XDestroyWindow(ob_display, self->text);
RrAppearanceFree(self->a_bg); RrAppearanceFree(self->a_bg);

View file

@ -57,7 +57,7 @@ static void screen_tell_ksplash(void);
static void screen_fallback_focus(void); static void screen_fallback_focus(void);
guint screen_num_desktops; guint screen_num_desktops;
guint screen_num_monitors; guint screen_num_monitors = 0;
guint screen_desktop; guint screen_desktop;
guint screen_last_desktop; guint screen_last_desktop;
gboolean screen_showing_desktop; gboolean screen_showing_desktop;
@ -77,7 +77,7 @@ static GSList *struts_left = NULL;
static GSList *struts_right = NULL; static GSList *struts_right = NULL;
static GSList *struts_bottom = 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 /*! The number of microseconds that you need to be on a desktop before it will
replace the remembered "last desktop" */ replace the remembered "last desktop" */
@ -355,20 +355,19 @@ void screen_startup(gboolean reconfig)
if (reconfig) { if (reconfig) {
guint i; 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); desktop_popup = g_new(ObPagerPopup*, screen_num_monitors);
for (i = 0; i < screen_num_monitors; i++) { for (i = 0; i < screen_num_monitors; i++) {
desktop_popup[i] = pager_popup_new(); desktop_popup[i] = pager_popup_new();
pager_popup_height(desktop_popup[i], POPUP_HEIGHT); pager_popup_height(desktop_popup[i], POPUP_HEIGHT);
/* update the pager popup's width */
pager_popup_text_width_to_strings(desktop_popup[i], pager_popup_text_width_to_strings(desktop_popup[i],
screen_desktop_names, screen_desktop_names,
screen_num_desktops); screen_num_desktops);
} }
return; return;
} else {
desktop_popup = NULL;
} }
/* get the initial size */ /* get the initial size */
@ -460,10 +459,10 @@ void screen_shutdown(gboolean reconfig)
{ {
guint i; guint i;
for (i = 0; i < screen_num_monitors; i++) { for (i = 0; i < screen_num_monitors; i++)
pager_popup_free(desktop_popup[i]); pager_popup_free(desktop_popup[i]);
}
g_free(desktop_popup); g_free(desktop_popup);
desktop_popup = NULL;
if (reconfig) if (reconfig)
return; return;
@ -510,6 +509,7 @@ void screen_resize(void)
screen_update_areas(); screen_update_areas();
dock_configure(); dock_configure();
/* make sure all windows are visible */
for (it = client_list; it; it = g_list_next(it)) for (it = client_list; it; it = g_list_next(it))
client_move_onscreen(it->data, FALSE); client_move_onscreen(it->data, FALSE);
} }
@ -1340,22 +1340,32 @@ typedef struct {
void screen_update_areas(void) void screen_update_areas(void)
{ {
guint i, j; guint i, j, onum;
gulong *dims; gulong *dims;
GList *it; GList *it;
GSList *sit; GSList *sit;
onum = screen_num_monitors;
g_free(monitor_area); g_free(monitor_area);
extensions_xinerama_screens(&monitor_area, &screen_num_monitors); extensions_xinerama_screens(&monitor_area, &screen_num_monitors);
if (!desktop_popup) { if (screen_num_monitors < onum) {
desktop_popup = g_new(ObPagerPopup*, screen_num_monitors); /* free some of the pager popups */
for (i = 0; i < screen_num_monitors; i++) { 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(); desktop_popup[i] = pager_popup_new();
pager_popup_height(desktop_popup[i], POPUP_HEIGHT); pager_popup_height(desktop_popup[i], POPUP_HEIGHT);
if (screen_desktop_names) /* the areas are initialized before the
if (screen_desktop_names) desktop names */
/* update the pager popup's width */
pager_popup_text_width_to_strings(desktop_popup[i], pager_popup_text_width_to_strings(desktop_popup[i],
screen_desktop_names, screen_desktop_names,
screen_num_desktops); screen_num_desktops);