fixed segfault on tray application due to tint2

git-svn-id: http://tint2.googlecode.com/svn/trunk@65 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
lorthiois@bbsoft.fr 2009-03-01 19:18:35 +00:00
parent 67f875338b
commit d7d11324c0
7 changed files with 37 additions and 128 deletions

View file

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

Binary file not shown.

Binary file not shown.

View file

@ -82,16 +82,22 @@ void init_systray()
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 @@ int net_init()
}
//Window win, root;
int width, height;
int border;
int icon_size;
//int width, height;
/*
void fix_geometry()
{
GSList *it;
@ -216,7 +219,7 @@ void fix_geometry()
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 @@ int window_error_handler(Display *d, XErrorEvent *e)
}
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,10 +251,15 @@ gboolean icon_swallow(TrayWindow *traywin)
// 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 @@ gboolean icon_add(Window id)
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 @@ gboolean icon_add(Window id)
}
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 @@ void icon_remove(TrayWindow *traywin)
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 @@ void net_message(XClientMessageEvent *e)
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 net_message(XClientMessageEvent *e)
}
/*
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);
}
}
*/

View file

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

View file

@ -86,8 +86,8 @@ void init ()
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 @@ load_config:
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;
}
}

BIN
src/tint2

Binary file not shown.