#include "window.h"
#include "server.h"
#include "panel.h"
+#include "taskbar.h"
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);
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;
}
}
-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++;
}
}
-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;