- Window window;
- Atom *at;
- int count, i;
-
- if (XGetTransientForHint(server.dsp, win, &window) != 0) {
- if (window) {
- return 1;
- }
- }
-
- at = server_get_property (win, server.atom._NET_WM_STATE, XA_ATOM, &count);
- for (i = 0; i < count; i++) {
- if (at[i] == server.atom._NET_WM_STATE_SKIP_TASKBAR) {
- XFree(at);
- return 1;
- }
- }
- XFree(at);
-
- at = server_get_property (win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, &count);
- for (i = 0; i < count; i++) {
- if (at[i] == server.atom._NET_WM_WINDOW_TYPE_DOCK || at[i] == server.atom._NET_WM_WINDOW_TYPE_DESKTOP || at[i] == server.atom._NET_WM_WINDOW_TYPE_TOOLBAR || at[i] == server.atom._NET_WM_WINDOW_TYPE_MENU || at[i] == server.atom._NET_WM_WINDOW_TYPE_SPLASH) {
- XFree(at);
- return 1;
- }
- }
- XFree(at);
+ Window window;
+ Atom *at;
+ int count, i;
+
+ at = server_get_property (win, server.atom._NET_WM_STATE, XA_ATOM, &count);
+ for (i = 0; i < count; i++) {
+ if (at[i] == server.atom._NET_WM_STATE_SKIP_TASKBAR) {
+ XFree(at);
+ return 1;
+ }
+ // do not add transient_for windows if the transient window is already in the taskbar
+ window=win;
+ while ( XGetTransientForHint(server.dsp, window, &window) ) {
+ if ( task_get_tasks(window) ) {
+ XFree(at);
+ return 1;
+ }
+ }
+ }
+ XFree(at);
+
+ at = server_get_property (win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, &count);
+ for (i = 0; i < count; i++) {
+ if (at[i] == server.atom._NET_WM_WINDOW_TYPE_DOCK || at[i] == server.atom._NET_WM_WINDOW_TYPE_DESKTOP || at[i] == server.atom._NET_WM_WINDOW_TYPE_TOOLBAR || at[i] == server.atom._NET_WM_WINDOW_TYPE_MENU || at[i] == server.atom._NET_WM_WINDOW_TYPE_SPLASH) {
+ XFree(at);
+ return 1;
+ }
+ }
+ XFree(at);