all repos — tint2 @ d7d11324c03a1aff747c73bc7e07aa9fe38bd42c

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

fixed segfault on tray application due to tint2

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

d7d11324c03a1aff747c73bc7e07aa9fe38bd42c

parent

67f875338b906191f7053282b20070bf2bcc8511

M ChangeLogChangeLog

@@ -1,3 +1,6 @@

+2009-03-01 +- fixed segfault on tray application due to tint2 + 2009-03-01 - cleanup code - basic systray with some bugs
M src/systray/systraybar.csrc/systray/systraybar.c

@@ -82,16 +82,22 @@

void cleanup_systray() { + if (systray.list_icons) { + GSList *it; + + for (it = systray.list_icons; it; it = it->next) + remove_icon((TrayWindow*)it->data); + + g_slist_free(systray.list_icons); + systray.list_icons = 0; + } + free_area(&systray.area); if (net_sel_win != None) { XDestroyWindow(server.dsp, net_sel_win); net_sel_win = None; } - if (systray.list_icons) { - g_slist_free(systray.list_icons); - systray.list_icons = 0; - } }

@@ -196,12 +202,9 @@ return 1;

} -//Window win, root; -int width, height; -int border; -int icon_size; +//int width, height; - +/* void fix_geometry() { GSList *it;

@@ -216,7 +219,7 @@ }

XResizeWindow(server.dsp, panel->main_win, width + border * 2, height + border * 2); } - +*/ gboolean error; int window_error_handler(Display *d, XErrorEvent *e)

@@ -232,14 +235,14 @@ return 0;

} -gboolean icon_swallow(TrayWindow *traywin) +gboolean icon_swallow(Window id) { XErrorHandler old; Panel *panel = systray.area.panel; error = FALSE; old = XSetErrorHandler(window_error_handler); - XReparentWindow(server.dsp, traywin->id, panel->main_win, 0, 0); + XReparentWindow(server.dsp, id, panel->main_win, 0, 0); XSync(server.dsp, False); XSetErrorHandler(old);

@@ -248,9 +251,14 @@ }

// The traywin must have its id and type set. -gboolean icon_add(Window id) +gboolean add_icon(Window id) { TrayWindow *traywin; + + if (!icon_swallow(id)) { + fprintf(stderr, "tint2 : not icon_swallow\n"); + return FALSE; + } traywin = g_new0(TrayWindow, 1); traywin->id = id;

@@ -265,15 +273,6 @@ Panel *panel = systray.area.panel;

panel->area.resize = 1; panel_refresh = 1; - if (!icon_swallow(traywin)) { - printf("not icon_swallow\n"); - g_free(traywin); - return FALSE; - } - else - printf("icon_swallow\n"); - //return TRUE; - // => calcul x, y, width, height dans resize /* // find the positon for the systray app window

@@ -291,14 +290,20 @@ return TRUE;

} -void icon_remove(TrayWindow *traywin) +void remove_icon(TrayWindow *traywin) { XErrorHandler old; - Window win_id = traywin->id; XSelectInput(server.dsp, traywin->id, NoEventMask); - // remove it from our list + // 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); + + // 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));

@@ -308,19 +313,7 @@ // changed in systray force resize on panel

Panel *panel = systray.area.panel; panel->area.resize = 1; panel_refresh = 1; - return; -/* - // reparent it to root - error = FALSE; - old = XSetErrorHandler(window_error_handler); - XReparentWindow(server.dsp, win_id, root, 0, 0); - XSync(server.dsp, False); - XSetErrorHandler(old); - - reposition_icons(); - fix_geometry(); - */ }

@@ -334,7 +327,7 @@

switch (opcode) { case SYSTEM_TRAY_REQUEST_DOCK: id = e->data.l[2]; - if (id) icon_add(id); + if (id) add_icon(id); break; case SYSTEM_TRAY_BEGIN_MESSAGE:

@@ -358,91 +351,4 @@ }

} -/* -void event_loop() -{ - XEvent e; - Window cover; - GSList *it; - - while (!exit_app) { - while (XPending(server.dsp)) { - XNextEvent(display, &e); - - switch (e.type) - { - case PropertyNotify: - // systray window list has changed? - if (e.xproperty.atom == kde_systray_prop) { - XSelectInput(display, win, NoEventMask); - kde_update_icons(); - XSelectInput(display, win, StructureNotifyMask); - - while (XCheckTypedEvent(display, PropertyNotify, &e)); - } - - break; - - case ConfigureNotify: - if (e.xany.window != win) { - // find the icon it pertains to and beat it into submission - GSList *it; - - for (it = icons; it != NULL; it = g_slist_next(it)) { - TrayWindow *traywin = it->data; - if (traywin->id == e.xany.window) { - XMoveResizeWindow(display, traywin->id, traywin->x, traywin->y, - icon_size, icon_size); - break; - } - } - break; - } - - // briefly cover the entire containing window, which causes it and - // all of the icons to refresh their windows. finally, they update - // themselves when the background of the main window's parent changes. - - cover = XCreateSimpleWindow(display, win, 0, 0, - border * 2 + width, border * 2 + height, - 0, 0, 0); - XMapWindow(display, cover); - XDestroyWindow(display, cover); - - break; - - case ReparentNotify: - if (e.xany.window == win) // reparented to us - break; - case UnmapNotify: - case DestroyNotify: - for (it = icons; it; it = g_slist_next(it)) { - if (((TrayWindow*)it->data)->id == e.xany.window) { - icon_remove(it); - break; - } - } - break; - - case ClientMessage: - if (e.xclient.message_type == net_opcode_atom && - e.xclient.format == 32 && - e.xclient.window == net_sel_win) - net_message(&e.xclient); - - default: - break; - } - } - usleep(500000); - } - - // remove/unparent all the icons - while (icons) { - // do the remove here explicitly, cuz the event handler isn't going to - // happen anymore. - icon_remove(icons); - } -} -*/
M src/systray/systraybar.hsrc/systray/systraybar.h

@@ -39,7 +39,7 @@ void init_systray();

void cleanup_systray(); int net_init(); void net_message(XClientMessageEvent *e); -void icon_remove(TrayWindow *traywin); +void remove_icon(TrayWindow *traywin); void draw_systray(void *obj, cairo_t *c, int active);
M src/tint.csrc/tint.c

@@ -86,8 +86,8 @@

void cleanup() { - cleanup_panel(); cleanup_systray(); + cleanup_panel(); if (time1_font_desc) pango_font_description_free(time1_font_desc); if (time2_font_desc) pango_font_description_free(time2_font_desc);

@@ -551,7 +551,7 @@ case UnmapNotify:

case DestroyNotify: for (it = systray.list_icons; it; it = g_slist_next(it)) { if (((TrayWindow*)it->data)->id == e.xany.window) { - icon_remove((TrayWindow*)it->data); + remove_icon((TrayWindow*)it->data); break; } }