- 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_PAGER || 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;
+ }
+ if (at[i] == server.atom._NET_WM_STATE_MODAL) {
+ // do not add modal windows if the transient window is already in the taskbar
+ if ( XGetTransientForHint(server.dsp, win, &window) && 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);