]> Dogcows Code - chaz/tint2/commitdiff
fixed segfault on tray application due to tint2
authorThierry Lorthiois <lorthiois@bbsoft.fr>
Sun, 1 Mar 2009 19:18:35 +0000 (19:18 +0000)
committerThierry Lorthiois <lorthiois@bbsoft.fr>
Sun, 1 Mar 2009 19:18:35 +0000 (19:18 +0000)
ChangeLog
doc/tint2-0.7.odt
doc/tint2-0.7.pdf
src/systray/systraybar.c
src/systray/systraybar.h
src/tint.c
src/tint2

index 53da82cabb2fd50249140ddea86ad0250ec110b2..05cce82aea1b32350efc97d6daa669c44ff2a629 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index 0cdafe7894bf64d65aaa0c17150427aa74dfebf2..2fd3249a764056a4967efabaf89b4890a483409d 100644 (file)
Binary files a/doc/tint2-0.7.odt and b/doc/tint2-0.7.odt differ
index e9501312a76c478cdf98b3974e31be0d02b332e7..2454e22d15ac0772473cca7ba3adcc766a90a3ac 100644 (file)
Binary files a/doc/tint2-0.7.pdf and b/doc/tint2-0.7.pdf differ
index 307fa18caa2577d8fccdf444b084b0f0eccb2a75..18c1f22e97ed3e4523316d85f75e6274704812da 100644 (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);
-  }
-}
-*/
 
index 8c9b5ef61a9c3884be3d0e85622459ed02e66d14..071f6f7dbc2ce8f0c204924e3593e9d00e014123 100644 (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);
 
index 7b6b3c5dd06b05d0b1341bf9f4ce515e70da6b5f..f54bebe6ee9c5d4e411dbfa4f664ed2cd3ea8c7d 100644 (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;
                                                        }
                                                }
index a14452ca3e705c611ef54ebab56564064467cd3b..acb995c7865536cb796b0163ae33c85f7862563f 100755 (executable)
Binary files a/src/tint2 and b/src/tint2 differ
This page took 0.03684 seconds and 4 git commands to generate.