From f100b491589c16b7144c98c7864af13b9dde090c Mon Sep 17 00:00:00 2001 From: "lorthiois@bbsoft.fr" Date: Mon, 29 Jun 2009 18:39:44 +0000 Subject: [PATCH] fixed issue 110 and issue 107 git-svn-id: http://tint2.googlecode.com/svn/trunk@134 121b4492-b84c-0410-8b4c-0d4edfb3f3cc --- ChangeLog | 3 ++ src/server.c | 2 + src/server.h | 2 + src/systray/systraybar.c | 91 +++++++++++++++++++++------------------- src/systray/systraybar.h | 21 ++++++---- src/taskbar/taskbar.c | 1 - src/tint.c | 11 +++-- tintrc05 | 1 + 8 files changed, 79 insertions(+), 53 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2f8bdc8..6216a06 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2009-06-29 +- fixed issue 110 and issue 107 + 2009-06-25 - improve user's message when compiled with --disable-battery - replace 'task_width = width' by 'task_maximum_size = width height' diff --git a/src/server.c b/src/server.c index 8ec1297..9271fcd 100644 --- a/src/server.c +++ b/src/server.c @@ -79,6 +79,8 @@ void server_init_atoms () server.atom.MANAGER = XInternAtom(server.dsp, "MANAGER", False); server.atom._NET_SYSTEM_TRAY_MESSAGE_DATA = XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_MESSAGE_DATA", False); server.atom._NET_SYSTEM_TRAY_ORIENTATION = XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_ORIENTATION", False); + server.atom._XEMBED = XInternAtom(server.dsp, "_XEMBED", False); + server.atom._XEMBED_INFO = XInternAtom(server.dsp, "_XEMBED_INFO", False); } diff --git a/src/server.h b/src/server.h index 0073913..5356229 100644 --- a/src/server.h +++ b/src/server.h @@ -58,6 +58,8 @@ typedef struct Global_atom Atom MANAGER; Atom _NET_SYSTEM_TRAY_MESSAGE_DATA; Atom _NET_SYSTEM_TRAY_ORIENTATION; + Atom _XEMBED; + Atom _XEMBED_INFO; } Global_atom; diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index 5045f68..9842384 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -164,46 +164,25 @@ void resize_systray(void *obj) // position and size the icon window XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, icon_size, icon_size); } - //printf("resize_systray %d %d\n", systray.area.posx, systray.area.width); } -/* -void create_hint_win() -{ - XWMHints hints; - XClassHint classhints; - Panel *panel = systray.area.panel; - hint_win = XCreateSimpleWindow(server.dsp, server.root_win, 0, 0, 1, 1, 0, 0, 0); - - hints.flags = StateHint | WindowGroupHint | IconWindowHint; - hints.initial_state = WithdrawnState; - hints.window_group = hint_win; - hints.icon_window = panel->main_win; - - classhints.res_name = "docker"; - classhints.res_class = "Docker"; - - XSetWMProperties(server.dsp, hint_win, NULL, NULL, NULL, 0, - NULL, &hints, &classhints); - - XMapWindow(server.dsp, hint_win); -} -*/ +// *********************************************** +// systray protocol int init_net() { + // freedesktop systray specification if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != None) { fprintf(stderr, "tint2 : another systray is running\n"); return 0; } - //create_hint_win(); - // init systray protocol net_sel_win = XCreateSimpleWindow(server.dsp, server.root_win, -1, -1, 1, 1, 0, 0, 0); // v0.2 trayer specification. tint2 always orizontal. + // TODO : vertical panel ?? int orient = 0; XChangeProperty(server.dsp, net_sel_win, server.atom._NET_SYSTEM_TRAY_ORIENTATION, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &orient, 1); @@ -249,7 +228,6 @@ int window_error_handler(Display *d, XErrorEvent *e) } -// The traywin must have its id and type set. gboolean add_icon(Window id) { TrayWindow *traywin; @@ -261,19 +239,48 @@ gboolean add_icon(Window id) XReparentWindow(server.dsp, id, panel->main_win, 0, 0); XSync(server.dsp, False); XSetErrorHandler(old); - if (error != FALSE) { fprintf(stderr, "tint2 : not icon_swallow\n"); return FALSE; } + { + Atom acttype; + int actfmt; + unsigned long nbitem, bytes; + unsigned char *data = 0; + int ret; + + ret = XGetWindowProperty(server.dsp, id, server.atom._XEMBED_INFO, 0, 2, False, server.atom._XEMBED_INFO, &acttype, &actfmt, &nbitem, &bytes, &data); + if (data) XFree(data); + if (ret != Success) { + fprintf(stderr, "tint2 : xembed error\n"); + return FALSE; + } + } + { + XEvent e; + e.xclient.type = ClientMessage; + e.xclient.serial = 0; + e.xclient.send_event = True; + e.xclient.message_type = server.atom._XEMBED; + e.xclient.window = id; + e.xclient.format = 32; + e.xclient.data.l[0] = CurrentTime; + e.xclient.data.l[1] = XEMBED_EMBEDDED_NOTIFY; + e.xclient.data.l[2] = 0; + e.xclient.data.l[3] = panel->main_win; + e.xclient.data.l[4] = 0; + XSendEvent(server.dsp, id, False, 0xFFFFFF, &e); + } + traywin = g_new0(TrayWindow, 1); traywin->id = id; systray.list_icons = g_slist_prepend(systray.list_icons, traywin); - //printf("ajout d'un icone %d (%lx)\n", g_slist_length(systray.list_icons), id); systray.area.resize = 1; systray.area.redraw = 1; + //printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons)); // watch for the icon trying to resize itself! XSelectInput(server.dsp, traywin->id, StructureNotifyMask); @@ -291,28 +298,29 @@ gboolean add_icon(Window id) void remove_icon(TrayWindow *traywin) { XErrorHandler old; - - XSelectInput(server.dsp, traywin->id, NoEventMask); - - // reparent to root - error = FALSE; - old = XSetErrorHandler(window_error_handler); - XReparentWindow(server.dsp, traywin->id, server.root_win, 0, 0); - XSync(server.dsp, False); - XSetErrorHandler(old); + Window id = traywin->id; // remove from our list systray.list_icons = g_slist_remove(systray.list_icons, traywin); g_free(traywin); - //printf("suppression d'un icone %d\n", g_slist_length(systray.list_icons)); systray.area.resize = 1; systray.area.redraw = 1; + //printf("remove_icon id %lx, %d\n", traywin->id); + + XSelectInput(server.dsp, id, NoEventMask); + + // reparent to root + error = FALSE; + old = XSetErrorHandler(window_error_handler); + XUnmapWindow(server.dsp, id); + XReparentWindow(server.dsp, id, server.root_win, 0, 0); + XSync(server.dsp, False); + XSetErrorHandler(old); // changed in systray force resize on panel Panel *panel = systray.area.panel; panel->area.resize = 1; panel_refresh = 1; - } @@ -334,11 +342,10 @@ void net_message(XClientMessageEvent *e) break; default: - if (opcode == server.atom._NET_SYSTEM_TRAY_MESSAGE_DATA) { + if (opcode == server.atom._NET_SYSTEM_TRAY_MESSAGE_DATA) printf("message from dockapp: %s\n", e->data.b); - } else - printf("SYSTEM_TRAY : unknown message type\n"); + fprintf(stderr, "SYSTEM_TRAY : unknown message type\n"); break; } } diff --git a/src/systray/systraybar.h b/src/systray/systraybar.h index dbe3fbe..03c0313 100644 --- a/src/systray/systraybar.h +++ b/src/systray/systraybar.h @@ -2,7 +2,8 @@ * Copyright (C) 2009 thierry lorthiois (lorthiois@bbsoft.fr) * * systraybar -* based on 'docker-1.5' from Ben Jansens. +* systray implementation come from 'docker-1.5' by Ben Jansens, +* and from systray/xembed specification (freedesktop.org). * **************************************************************************/ @@ -12,6 +13,11 @@ #include "common.h" #include "area.h" +// XEMBED messages +#define XEMBED_EMBEDDED_NOTIFY 0 +// Flags for _XEMBED_INFO +#define XEMBED_MAPPED (1 << 0) + typedef struct { // always start with area @@ -26,8 +32,6 @@ typedef struct Window id; int x, y; int width, height; - - long *icon_data; } TrayWindow; @@ -38,18 +42,21 @@ extern int refresh_systray; void init_systray(); void cleanup_systray(); +void draw_systray(void *obj, cairo_t *c, int active); +void resize_systray(void *obj); + +// systray protocol int init_net(); void cleanup_net(); void net_message(XClientMessageEvent *e); +gboolean add_icon(Window id); void remove_icon(TrayWindow *traywin); -void draw_systray(void *obj, cairo_t *c, int active); - -void resize_systray(void *obj); - void refresh_systray_icon(); +void kde_update_icons(); + #endif diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index 8da5b03..5619aa8 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -175,7 +175,6 @@ void task_refresh_tasklist () Task *tsk; win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results); - if (!win) return; // Remove any old and set active win diff --git a/src/tint.c b/src/tint.c index 1753ac5..e5bde53 100644 --- a/src/tint.c +++ b/src/tint.c @@ -596,8 +596,8 @@ load_config: i = config_read_file (optarg); c = getopt (argc, argv, "j:"); if (c != -1) { - // usage: tint2 [-c] -j for internal use - printf("jpeg file %s\n", optarg); + // usage: tint2 [-c] -j for internal use + printf("file %s\n", optarg); cleanup(); exit(0); } @@ -653,8 +653,13 @@ load_config: break; case ReparentNotify: - if (e.xany.window == server.root_win) // reparented to us + if (!systray.area.on_screen) break; + panel = (Panel*)systray.area.panel; + if (e.xany.window == panel->main_win) // reparented to us + break; + // FIXME: 'reparent to us' badly detected => disabled + break; case UnmapNotify: case DestroyNotify: if (!systray.area.on_screen) diff --git a/tintrc05 b/tintrc05 index 432b28d..be54756 100644 --- a/tintrc05 +++ b/tintrc05 @@ -25,6 +25,7 @@ border_color = #d1d1d1 40 #--------------------------------------------- panel_monitor = all panel_position = center left vertical +#panel_position = bottom center horizontal panel_size = 90% 85 panel_margin = 0 0 panel_padding = 10 3 10