]> Dogcows Code - chaz/tint2/blobdiff - src/util/window.c
*fix* issue 282
[chaz/tint2] / src / util / window.c
index 1cc91a81f124b7bf9ad0c4f08e5d2ed0fd91e22a..98e3075978f65ad2e322f3a1add96807e06f27f6 100644 (file)
@@ -33,6 +33,7 @@
 #include "window.h"
 #include "server.h"
 #include "panel.h"
+#include "taskbar.h"
 
 
 
@@ -79,18 +80,20 @@ int window_is_hidden (Window win)
        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;
                }
+               // 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);
 
@@ -144,7 +147,19 @@ int window_get_monitor (Window win)
 
 int window_is_iconified (Window win)
 {
-       return (IconicState == get_property32(win, server.atom.WM_STATE, server.atom.WM_STATE));
+       // EWMH specification : minimization of windows use _NET_WM_STATE_HIDDEN.
+       // WM_STATE is not accurate for shaded window and in multi_desktop mode.
+       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_HIDDEN) {
+                       XFree(at);
+                       return 1;
+               }
+       }
+       XFree(at);
+       return 0;
 }
 
 
@@ -206,17 +221,17 @@ int window_is_active (Window win)
 }
 
 
-int get_icon_count (long *data, int num)
+int get_icon_count (gulong *data, int num)
 {
        int count, pos, w, h;
 
        count = 0;
        pos = 0;
-       while (pos < num) {
+       while (pos+2 < num) {
                w = data[pos++];
                h = data[pos++];
                pos += w * h;
-               if (pos > num || w * h == 0) break;
+               if (pos > num || w <= 0 || h <= 0) break;
                count++;
        }
 
@@ -224,10 +239,10 @@ int get_icon_count (long *data, int num)
 }
 
 
-long *get_best_icon (long *data, int icon_count, int num, int *iw, int *ih, int best_icon_size)
+gulong *get_best_icon (gulong *data, int icon_count, int num, int *iw, int *ih, int best_icon_size)
 {
        int width[icon_count], height[icon_count], pos, i, w, h;
-       long *icon_data[icon_count];
+       gulong *icon_data[icon_count];
 
        /* List up icons */
        pos = 0;
This page took 0.022696 seconds and 4 git commands to generate.