Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        iconify.c 


Log Message:
Fix segv when removing systray item.

===================================================================
RCS file: /cvs/e/e16/e/src/iconify.c,v
retrieving revision 1.206
retrieving revision 1.207
diff -u -3 -r1.206 -r1.207
--- iconify.c   11 May 2006 20:47:26 -0000      1.206
+++ iconify.c   12 May 2006 09:27:59 -0000      1.207
@@ -53,7 +53,7 @@
 
 static void         SystrayInit(Iconbox * ib, Win win, int screen);
 static void         SystrayExit(Iconbox * ib);
-static void         IconboxObjSwinFree(Iconbox * ib, SWin * swin);
+static void         IconboxObjSwinDel(Iconbox * ib, Win win, int gone);
 
 typedef struct
 {
@@ -422,8 +422,6 @@
 static void
 IconboxDestroy(Iconbox * ib, int exiting)
 {
-   int                 i;
-
    ecore_list_remove_node(ibox_list, ib);
 
    if (ib->name)
@@ -438,17 +436,17 @@
        break;
      }
 
-   for (i = 0; i < ib->num_objs; i++)
+   while (ib->num_objs)
      {
        switch (ib->type)
          {
          case IB_TYPE_ICONBOX:
             if (!exiting)
-               EwinDeIconify(ib->objs[i].u.ewin);
-            IconboxObjEwinDel(ib, ib->objs[i].u.ewin);
+               EwinDeIconify(ib->objs[0].u.ewin);
+            IconboxObjEwinDel(ib, ib->objs[0].u.ewin);
             break;
          case IB_TYPE_SYSTRAY:
-            IconboxObjSwinFree(ib, ib->objs[i].u.swin);
+            IconboxObjSwinDel(ib, ib->objs[0].u.swin->win, 0);
             break;
          }
      }
@@ -2718,21 +2716,23 @@
 }
 
 static void
-IconboxObjSwinUnmanage(Iconbox * ib, Win win, int gone)
+IconboxObjSwinUnmanage(Iconbox * ib __UNUSED__, Win win, int gone)
 {
 #if DEBUG_SYSTRAY
    Eprintf("IconboxObjSwinUnmanage %#lx gone=%d\n", WinGetXwin(win), gone);
 #endif
+
+   if (!gone)
+     {
+       ESelectInput(win, NoEventMask);
+       EUnmapWindow(win);
+       EReparentWindow(win, VRoot.win, 0, 0);
+       XRemoveFromSaveSet(disp, WinGetXwin(win));
+     }
+#if 0                          /* Not needed when going to EUnregisterWindow */
    EventCallbackUnregister(win, 0, SystrayItemEvent, ib);
+#endif
    EUnregisterWindow(win);
-
-   if (gone)
-      return;
-
-   ESelectInput(win, NoEventMask);
-   EUnmapWindow(win);
-   EReparentWindow(win, VRoot.win, 0, 0);
-   XRemoveFromSaveSet(disp, Xwin(win));
 }
 
 static void
@@ -2798,21 +2798,24 @@
 }
 
 static void
-IconboxObjSwinDel(Iconbox * ib, Window win, int gone)
+IconboxObjSwinDel(Iconbox * ib, Win win, int gone)
 {
    int                 i;
    SWin               *swin;
 
-   i = IconboxObjSwinFind(ib, win);
+   i = IconboxObjSwinFind(ib, WinGetXwin(win));
    if (i < 0)
       return;
 
+   if (EventDebug(EDBUG_TYPE_ICONBOX))
+      Eprintf("IconboxObjSwinDel %#lx\n", Xwin(win));
+
    swin = ib->objs[i].u.swin;
 
-   if (IconboxObjectDel(ib, swin) == 0)
-      IconboxRedraw(ib);
+   IconboxObjectDel(ib, swin);
 
-   IconboxObjSwinUnmanage(ib, swin->win, gone);
+   if (disp)
+      IconboxObjSwinUnmanage(ib, swin->win, gone);
 
    Efree(swin);
 }
@@ -2860,18 +2863,6 @@
 }
 
 static void
-IconboxObjSwinFree(Iconbox * ib, SWin * swin)
-{
-   if (EventDebug(EDBUG_TYPE_ICONBOX))
-      Eprintf("IconboxObjSwinFree %#lx\n", Xwin(swin->win));
-
-   if (disp)
-      IconboxObjSwinUnmanage(ib, swin->win, 0);
-
-   Efree(swin);
-}
-
-static void
 SystrayEventClientMessage(Iconbox * ib, XClientMessageEvent * ev)
 {
    Window              win;
@@ -2977,7 +2968,7 @@
      {
      case MapNotify:
        EWindowSync(win);
-       IconboxRedraw(prm);
+       IconboxRedraw(ib);
        break;
 
      case DestroyNotify:
@@ -2991,15 +2982,16 @@
        goto do_terminate;
 
      case ClientMessage:
-       SystrayEventClientMessage(prm, &(ev->xclient));
+       SystrayEventClientMessage(ib, &(ev->xclient));
        break;
 
      case PropertyNotify:
-       SystrayEventClientProperty(prm, &(ev->xproperty));
+       SystrayEventClientProperty(ib, &(ev->xproperty));
        break;
 
       do_terminate:
-       IconboxObjSwinDel(prm, WinGetXwin(win), ev->type != ReparentNotify);
+       IconboxObjSwinDel(ib, win, ev->type != ReparentNotify);
+       IconboxRedraw(ib);
        break;
      }
 }




-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to