all repos — tint2 @ f100b491589c16b7144c98c7864af13b9dde090c

fork of the tint2 desktop panel for my custom setup - only minimized windows across all desktops for the taskbar

fixed issue 110 and issue 107

git-svn-id: http://tint2.googlecode.com/svn/trunk@134 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
lorthiois@bbsoft.fr lorthiois@bbsoft.fr@121b4492-b84c-0410-8b4c-0d4edfb3f3cc
commit

f100b491589c16b7144c98c7864af13b9dde090c

parent

e20d94b18890c496c6c692e9070bef055f5ea62c

M ChangeLogChangeLog

@@ -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'
M src/server.csrc/server.c

@@ -79,6 +79,8 @@ server.atom._NET_SYSTEM_TRAY_OPCODE = XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_OPCODE", False);

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); }
M src/server.hsrc/server.h

@@ -58,6 +58,8 @@ Atom _NET_SYSTEM_TRAY_OPCODE;

Atom MANAGER; Atom _NET_SYSTEM_TRAY_MESSAGE_DATA; Atom _NET_SYSTEM_TRAY_ORIENTATION; + Atom _XEMBED; + Atom _XEMBED_INFO; } Global_atom;
M src/systray/systraybar.csrc/systray/systraybar.c

@@ -164,46 +164,25 @@

// 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 @@ return 0;

} -// The traywin must have its id and type set. gboolean add_icon(Window id) { TrayWindow *traywin;

@@ -261,19 +239,48 @@ old = XSetErrorHandler(window_error_handler);

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 @@

void remove_icon(TrayWindow *traywin) { XErrorHandler old; + Window id = traywin->id; - XSelectInput(server.dsp, traywin->id, NoEventMask); + // remove from our list + systray.list_icons = g_slist_remove(systray.list_icons, traywin); + g_free(traywin); + 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); - XReparentWindow(server.dsp, traywin->id, server.root_win, 0, 0); + XUnmapWindow(server.dsp, id); + XReparentWindow(server.dsp, id, server.root_win, 0, 0); XSync(server.dsp, False); XSetErrorHandler(old); - // 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; - // changed in systray force resize on panel Panel *panel = systray.area.panel; panel->area.resize = 1; panel_refresh = 1; - }

@@ -334,11 +342,10 @@ // we don't show baloons messages.

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; } }
M src/systray/systraybar.hsrc/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 @@ {

Window id; int x, y; int width, height; - - long *icon_data; } TrayWindow;

@@ -38,18 +42,21 @@

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 refresh_systray_icon(); -void resize_systray(void *obj); - -void refresh_systray_icon(); +void kde_update_icons(); #endif
M src/taskbar/taskbar.csrc/taskbar/taskbar.c

@@ -175,7 +175,6 @@ GSList *l0;

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
M src/tint.csrc/tint.c

@@ -596,8 +596,8 @@ if (c != -1) {

i = config_read_file (optarg); c = getopt (argc, argv, "j:"); if (c != -1) { - // usage: tint2 [-c] <config_file> -j <jpeg_file> for internal use - printf("jpeg file %s\n", optarg); + // usage: tint2 [-c] <config_file> -j <file> for internal use + printf("file %s\n", optarg); cleanup(); exit(0); }

@@ -653,8 +653,13 @@ event_configure_notify (e.xconfigure.window);

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)
M tintrc05tintrc05

@@ -25,6 +25,7 @@ # PANEL

#--------------------------------------------- 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