diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index a6fec3a..5a380c1 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -374,9 +374,11 @@ gboolean add_icon(Window id) if ( XGetWindowAttributes(server.dsp, id, &attr) == False ) return FALSE; unsigned long mask = 0; XSetWindowAttributes set_attr; + Visual* visual = server.visual; //printf("icon with depth: %d, width %d, height %d\n", attr.depth, attr.width, attr.height); printf("icon with depth: %d\n", attr.depth); if (attr.depth != server.depth || systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) { + visual = attr.visual; set_attr.colormap = attr.colormap; set_attr.background_pixel = 0; set_attr.border_pixel = 0; @@ -387,7 +389,7 @@ gboolean add_icon(Window id) mask = CWBackPixmap; } Window parent_window; - parent_window = XCreateWindow(server.dsp, panel->main_win, 0, 0, 30, 30, 0, attr.depth, InputOutput, attr.visual, mask, &set_attr); + parent_window = XCreateWindow(server.dsp, panel->main_win, 0, 0, 30, 30, 0, attr.depth, InputOutput, visual, mask, &set_attr); old = XSetErrorHandler(window_error_handler); XReparentWindow(server.dsp, id, parent_window, 0, 0); XSync(server.dsp, False); diff --git a/src/taskbar/task.c b/src/taskbar/task.c index 921f067..af4c369 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -444,9 +444,11 @@ void active_task() //printf("Change active task %ld\n", w1); if (w1) { - Window w2; - if (XGetTransientForHint(server.dsp, w1, &w2) != 0) - if (w2 && !task_get_tasks(w1)) w1 = w2; + if (!task_get_tasks(w1)) { + Window w2; + while (XGetTransientForHint(server.dsp, w1, &w2)) + w1 = w2; + } set_task_state((task_active = task_get_task(w1)), TASK_ACTIVE); } } diff --git a/src/util/window.c b/src/util/window.c index f4ef6a0..dc38d24 100644 --- a/src/util/window.c +++ b/src/util/window.c @@ -87,9 +87,12 @@ int window_is_hidden (Window win) return 1; } // do not add transient_for windows if the transient window is already in the taskbar - if ( XGetTransientForHint(server.dsp, win, &window) && task_get_tasks(window) ) { - XFree(at); - return 1; + window=win; + while ( XGetTransientForHint(server.dsp, window, &window) ) { + if ( task_get_tasks(window) ) { + XFree(at); + return 1; + } } } XFree(at);