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:
parent
67f875338b
commit
d7d11324c0
7 changed files with 37 additions and 128 deletions
|
@ -1,3 +1,6 @@
|
||||||
|
2009-03-01
|
||||||
|
- fixed segfault on tray application due to tint2
|
||||||
|
|
||||||
2009-03-01
|
2009-03-01
|
||||||
- cleanup code
|
- cleanup code
|
||||||
- basic systray with some bugs
|
- basic systray with some bugs
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -82,16 +82,22 @@ void init_systray()
|
||||||
|
|
||||||
void cleanup_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);
|
free_area(&systray.area);
|
||||||
|
|
||||||
if (net_sel_win != None) {
|
if (net_sel_win != None) {
|
||||||
XDestroyWindow(server.dsp, net_sel_win);
|
XDestroyWindow(server.dsp, net_sel_win);
|
||||||
net_sel_win = None;
|
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 width, height;
|
|
||||||
int border;
|
|
||||||
int icon_size;
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
void fix_geometry()
|
void fix_geometry()
|
||||||
{
|
{
|
||||||
GSList *it;
|
GSList *it;
|
||||||
|
@ -216,7 +219,7 @@ void fix_geometry()
|
||||||
|
|
||||||
XResizeWindow(server.dsp, panel->main_win, width + border * 2, height + border * 2);
|
XResizeWindow(server.dsp, panel->main_win, width + border * 2, height + border * 2);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
gboolean error;
|
gboolean error;
|
||||||
int window_error_handler(Display *d, XErrorEvent *e)
|
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;
|
XErrorHandler old;
|
||||||
Panel *panel = systray.area.panel;
|
Panel *panel = systray.area.panel;
|
||||||
|
|
||||||
error = FALSE;
|
error = FALSE;
|
||||||
old = XSetErrorHandler(window_error_handler);
|
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);
|
XSync(server.dsp, False);
|
||||||
XSetErrorHandler(old);
|
XSetErrorHandler(old);
|
||||||
|
|
||||||
|
@ -248,10 +251,15 @@ gboolean icon_swallow(TrayWindow *traywin)
|
||||||
|
|
||||||
|
|
||||||
// The traywin must have its id and type set.
|
// The traywin must have its id and type set.
|
||||||
gboolean icon_add(Window id)
|
gboolean add_icon(Window id)
|
||||||
{
|
{
|
||||||
TrayWindow *traywin;
|
TrayWindow *traywin;
|
||||||
|
|
||||||
|
if (!icon_swallow(id)) {
|
||||||
|
fprintf(stderr, "tint2 : not icon_swallow\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
traywin = g_new0(TrayWindow, 1);
|
traywin = g_new0(TrayWindow, 1);
|
||||||
traywin->id = id;
|
traywin->id = id;
|
||||||
|
|
||||||
|
@ -265,15 +273,6 @@ gboolean icon_add(Window id)
|
||||||
panel->area.resize = 1;
|
panel->area.resize = 1;
|
||||||
panel_refresh = 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
|
// => calcul x, y, width, height dans resize
|
||||||
/*
|
/*
|
||||||
// find the positon for the systray app window
|
// 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;
|
XErrorHandler old;
|
||||||
Window win_id = traywin->id;
|
|
||||||
|
|
||||||
XSelectInput(server.dsp, traywin->id, NoEventMask);
|
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);
|
systray.list_icons = g_slist_remove(systray.list_icons, traywin);
|
||||||
g_free(traywin);
|
g_free(traywin);
|
||||||
printf("suppression d'un icone %d\n", g_slist_length(systray.list_icons));
|
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 *panel = systray.area.panel;
|
||||||
panel->area.resize = 1;
|
panel->area.resize = 1;
|
||||||
panel_refresh = 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) {
|
switch (opcode) {
|
||||||
case SYSTEM_TRAY_REQUEST_DOCK:
|
case SYSTEM_TRAY_REQUEST_DOCK:
|
||||||
id = e->data.l[2];
|
id = e->data.l[2];
|
||||||
if (id) icon_add(id);
|
if (id) add_icon(id);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SYSTEM_TRAY_BEGIN_MESSAGE:
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ void init_systray();
|
||||||
void cleanup_systray();
|
void cleanup_systray();
|
||||||
int net_init();
|
int net_init();
|
||||||
void net_message(XClientMessageEvent *e);
|
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);
|
void draw_systray(void *obj, cairo_t *c, int active);
|
||||||
|
|
||||||
|
|
|
@ -86,8 +86,8 @@ void init ()
|
||||||
|
|
||||||
void cleanup()
|
void cleanup()
|
||||||
{
|
{
|
||||||
cleanup_panel();
|
|
||||||
cleanup_systray();
|
cleanup_systray();
|
||||||
|
cleanup_panel();
|
||||||
|
|
||||||
if (time1_font_desc) pango_font_description_free(time1_font_desc);
|
if (time1_font_desc) pango_font_description_free(time1_font_desc);
|
||||||
if (time2_font_desc) pango_font_description_free(time2_font_desc);
|
if (time2_font_desc) pango_font_description_free(time2_font_desc);
|
||||||
|
@ -551,7 +551,7 @@ load_config:
|
||||||
case DestroyNotify:
|
case DestroyNotify:
|
||||||
for (it = systray.list_icons; it; it = g_slist_next(it)) {
|
for (it = systray.list_icons; it; it = g_slist_next(it)) {
|
||||||
if (((TrayWindow*)it->data)->id == e.xany.window) {
|
if (((TrayWindow*)it->data)->id == e.xany.window) {
|
||||||
icon_remove((TrayWindow*)it->data);
|
remove_icon((TrayWindow*)it->data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
BIN
src/tint2
BIN
src/tint2
Binary file not shown.
Loading…
Reference in a new issue