X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Fwindow.c;h=8ba71f607a2cc01f1c575a0b33e9a3c498086a39;hb=ed39165e7908dda7b2c7581075ef71a6de669a59;hp=ebbdce01f4522f48bb2a02a21c091a51e4f99169;hpb=d1123a0ede12eb1126eb5eb932d9177de67d46c5;p=chaz%2Ftint2 diff --git a/src/util/window.c b/src/util/window.c index ebbdce0..8ba71f6 100644 --- a/src/util/window.c +++ b/src/util/window.c @@ -24,41 +24,52 @@ #include #include #include + #include +#include +#include #include "common.h" #include "window.h" #include "server.h" +#include "panel.h" void set_active (Window win) { - send_event32 (win, server.atom._NET_ACTIVE_WINDOW, 2, 0); + send_event32 (win, server.atom._NET_ACTIVE_WINDOW, 2, CurrentTime, 0); } void set_desktop (int desktop) { - send_event32 (server.root_win, server.atom._NET_CURRENT_DESKTOP, desktop, 0); + send_event32 (server.root_win, server.atom._NET_CURRENT_DESKTOP, desktop, 0, 0); } void windows_set_desktop (Window win, int desktop) { - send_event32 (win, server.atom._NET_WM_DESKTOP, desktop, 2); + send_event32 (win, server.atom._NET_WM_DESKTOP, desktop, 2, 0); } void set_close (Window win) { - send_event32 (win, server.atom._NET_CLOSE_WINDOW, 0, 2); + send_event32 (win, server.atom._NET_CLOSE_WINDOW, 0, 2, 0); } void window_toggle_shade (Window win) { - send_event32 (win, server.atom._NET_WM_STATE, 2, 0); + send_event32 (win, server.atom._NET_WM_STATE, 2, server.atom._NET_WM_STATE_SHADED, 0); +} + + +void window_maximize_restore (Window win) +{ + send_event32 (win, server.atom._NET_WM_STATE, 2, server.atom._NET_WM_STATE_MAXIMIZED_VERT, 0); + send_event32 (win, server.atom._NET_WM_STATE, 2, server.atom._NET_WM_STATE_MAXIMIZED_HORZ, 0); } @@ -67,7 +78,7 @@ int window_is_hidden (Window win) Window window; Atom *at; int count, i; - + if (XGetTransientForHint(server.dsp, win, &window) != 0) { if (window) { return 1; @@ -75,8 +86,8 @@ int window_is_hidden (Window win) } 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) { + for (i = 0; i < count; i++) { + if (at[i] == server.atom._NET_WM_STATE_SKIP_TASKBAR) { XFree(at); return 1; } @@ -90,11 +101,17 @@ int window_is_hidden (Window win) return 1; } } + XFree(at); + + for (i=0 ; i < nb_panel ; i++) { + if (panel1[i].main_win == win) { + return 1; + } + } // specification // Windows with neither _NET_WM_WINDOW_TYPE nor WM_TRANSIENT_FOR set // MUST be taken as top-level window. - XFree(at); return 0; } @@ -102,7 +119,7 @@ int window_is_hidden (Window win) int window_get_desktop (Window win) { return get_property32(win, server.atom._NET_WM_DESKTOP, XA_CARDINAL); -} +} int window_get_monitor (Window win) @@ -110,13 +127,15 @@ int window_get_monitor (Window win) int i, x, y; Window src; - XTranslateCoordinates(server.dsp, win, server.root_win, 0, 0, &x, &y, &src); + XTranslateCoordinates(server.dsp, win, server.root_win, 0, 0, &x, &y, &src); + x += 2; + y += 2; for (i = 0; i < server.nb_monitor; i++) { if (x >= server.monitor[i].x && x <= (server.monitor[i].x + server.monitor[i].width)) if (y >= server.monitor[i].y && y <= (server.monitor[i].y + server.monitor[i].height)) break; } - + //printf("window %lx : ecran %d, (%d, %d)\n", win, i, x, y); if (i == server.nb_monitor) return 0; else return i; @@ -129,6 +148,23 @@ int window_is_iconified (Window win) } +int window_is_urgent (Window win) +{ + 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_DEMANDS_ATTENTION) { + XFree(at); + return 1; + } + } + XFree(at); + return 0; +} + + int server_get_number_of_desktop () { return get_property32(server.root_win, server.atom._NET_NUMBER_OF_DESKTOPS, XA_CARDINAL); @@ -210,55 +246,35 @@ long *get_best_icon (long *data, int icon_count, int num, int *iw, int *ih, int } } } - + *iw = width[icon_num]; *ih = height[icon_num]; return icon_data[icon_num]; } -void draw_rect(cairo_t *c, double x, double y, double w, double h, double r) -{ - if (r > 0.0) { - double c1 = 0.55228475 * r; - - cairo_move_to(c, x+r, y); - cairo_rel_line_to(c, w-2*r, 0); - cairo_rel_curve_to(c, c1, 0.0, r, c1, r, r); - cairo_rel_line_to(c, 0, h-2*r); - cairo_rel_curve_to(c, 0.0, c1, c1-r, r, -r, r); - cairo_rel_line_to (c, -w +2*r, 0); - cairo_rel_curve_to (c, -c1, 0, -r, -c1, -r, -r); - cairo_rel_line_to (c, 0, -h + 2 * r); - cairo_rel_curve_to (c, 0, -c1, r - c1, -r, r, -r); - } - else - cairo_rectangle(c, x, y, w, h); -} - - void get_text_size(PangoFontDescription *font, int *height_ink, int *height, int panel_height, char *text, int len) { PangoRectangle rect_ink, rect; - Pixmap pmap = server_create_pixmap (panel_height, panel_height); + 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_height); 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; //printf("dimension : %d - %d\n", rect_ink.height, rect.height); - g_object_unref (layout); + g_object_unref (layout); cairo_destroy (c); cairo_surface_destroy (cs); XFreePixmap (server.dsp, pmap); } -