From 8622308774bcb0569c8ffa1ea3f928b9d20f35b8 Mon Sep 17 00:00:00 2001 From: Andreas Fink Date: Tue, 29 Dec 2009 22:04:24 +0000 Subject: [PATCH] *fix* segfault fixed when removing last desktop and we've been on last desktop --- src/taskbar/task.c | 1 + src/tint.c | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/taskbar/task.c b/src/taskbar/task.c index 81d4eda..191394c 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -75,6 +75,7 @@ Task *add_task (Window win) Taskbar *tskbar; Task *new_tsk2=0; int i, j; + // QUESTION: Do we need to iterate over nb_panel (we know the monitor, why not taking panel1[monitor]??? for (i=0 ; i < nb_panel ; i++) { for (j=0 ; j < panel1[i].nb_desktop ; j++) { if (new_tsk.desktop != ALLDESKTOP && new_tsk.desktop != j) continue; diff --git a/src/tint.c b/src/tint.c index bb7586d..cdb72a8 100644 --- a/src/tint.c +++ b/src/tint.c @@ -411,8 +411,11 @@ void event_property_notify (XEvent *e) Panel *panel = &panel1[i]; if (panel_mode == MULTI_DESKTOP && panel->g_taskbar.use_active) { // redraw both taskbar - panel->taskbar[old_desktop].area.is_active = 0; - panel->taskbar[old_desktop].area.resize = 1; + if (server.nb_desktop > old_desktop) { + // can happen if last desktop is deleted and we've been on the last desktop + panel->taskbar[old_desktop].area.is_active = 0; + panel->taskbar[old_desktop].area.resize = 1; + } panel->taskbar[server.desktop].area.is_active = 1; panel->taskbar[server.desktop].area.resize = 1; panel_refresh = 1; @@ -421,13 +424,15 @@ void event_property_notify (XEvent *e) Taskbar *tskbar; Task *tsk; GSList *l; - tskbar = &panel->taskbar[old_desktop]; - for (l = tskbar->area.list; l ; l = l->next) { - tsk = l->data; - if (tsk->desktop == ALLDESKTOP) { - tsk->area.on_screen = 0; - tskbar->area.resize = 1; - panel_refresh = 1; + if (server.nb_desktop > old_desktop) { + tskbar = &panel->taskbar[old_desktop]; + for (l = tskbar->area.list; l ; l = l->next) { + tsk = l->data; + if (tsk->desktop == ALLDESKTOP) { + tsk->area.on_screen = 0; + tskbar->area.resize = 1; + panel_refresh = 1; + } } } tskbar = &panel->taskbar[server.desktop]; @@ -710,6 +715,7 @@ int main (int argc, char *argv[]) if (panel_refresh) { panel_refresh = 0; + // QUESTION: do we need this first refresh_systray, because we check refresh_systray once again later... if (refresh_systray) { panel = (Panel*)systray.area.panel; XSetWindowBackgroundPixmap (server.dsp, panel->main_win, None); -- 2.44.0