X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Fwindow.c;h=046623652a27ec402c407a3c393593f00dccbc39;hb=bbec33ce1a15b555a737f2fefe7bdfb6a8881705;hp=1aa08774e28f9f93369f5a49b3bdd87f53d4c0f7;hpb=5449d421272dda86d1d01ad0e1a5c1cc0b840322;p=chaz%2Ftint2 diff --git a/src/util/window.c b/src/util/window.c index 1aa0877..0466236 100644 --- a/src/util/window.c +++ b/src/util/window.c @@ -86,9 +86,10 @@ int window_is_hidden (Window win) 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_task(window) ) { + // 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; } @@ -146,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; } @@ -208,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++; } @@ -226,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; @@ -297,3 +310,29 @@ void get_text_size(PangoFontDescription *font, int *height_ink, int *height, int } +void get_text_size2(PangoFontDescription *font, int *height_ink, int *height, int *width, int panel_height, int panel_with, char *text, int len) +{ + PangoRectangle rect_ink, rect; + + Pixmap pmap = XCreatePixmap (server.dsp, server.root_win, panel_height, panel_height, server.depth); + + cairo_surface_t *cs = cairo_xlib_surface_create (server.dsp, pmap, server.visual, panel_height, panel_with); + cairo_t *c = cairo_create (cs); + + PangoLayout *layout = pango_cairo_create_layout (c); + pango_layout_set_font_description (layout, font); + pango_layout_set_text (layout, text, len); + + pango_layout_get_pixel_extents(layout, &rect_ink, &rect); + *height_ink = rect_ink.height; + *height = rect.height; + *width = rect.width; + //printf("dimension : %d - %d\n", rect_ink.height, rect.height); + + g_object_unref (layout); + cairo_destroy (c); + cairo_surface_destroy (cs); + XFreePixmap (server.dsp, pmap); +} + +