Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/evas

Dir     : e17/libs/evas/src/lib/canvas


Modified Files:
        evas_events.c evas_key_grab.c 


Log Message:


make deleting of grabs within a key callback "safe"

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_events.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- evas_events.c       25 May 2003 09:43:53 -0000      1.9
+++ evas_events.c       8 Jul 2003 06:08:25 -0000       1.10
@@ -515,7 +515,9 @@
    if (e->events_frozen > 0) return;
      {
        Evas_Event_Key_Down ev;
+       int exclusive;
        
+       exclusive = 0;
        ev.keyname = (char *)keyname;
        ev.data = (void *)data;
        ev.modifiers = &(e->modifiers);
@@ -524,11 +526,18 @@
          {
             Evas_List *l;
             
+            e->walking_grabs++;
             for (l = e->grabs; l; l= l->next)
               {
                  Evas_Key_Grab *g;
                  
                  g = l->data;
+                 if (g->just_added)
+                   {
+                      g->just_added = 0;
+                      continue;
+                   }
+                 if (g->delete_me) continue;
                  if (((e->modifiers.mask & g->modifiers) ||
                       (g->modifiers == e->modifiers.mask)) &&
                      (!((e->modifiers.mask & g->not_modifiers) ||
@@ -537,11 +546,32 @@
                    {
                       if (!e->events_frozen)
                         evas_object_event_callback_call(g->object, 
EVAS_CALLBACK_KEY_DOWN, &ev);
-                      if (g->exclusive) return;
-                   }                 
+                      if (g->exclusive) exclusive = 1;
+                   }
+              }
+            e->walking_grabs--;
+            if (e->walking_grabs <= 0)
+              {
+                 while (e->delete_grabs > 0)
+                   {
+                      Evas_List *l;
+                      
+                      e->delete_grabs--;
+                      for (l = e->grabs; l; l= l->next)
+                        {
+                           Evas_Key_Grab *g;
+                           
+                           g = l->data;
+                           if (g->delete_me)
+                             {
+                                evas_key_grab_free(g->object, g->keyname, 
g->modifiers, g->not_modifiers);
+                                continue;
+                             }
+                        }
+                   }
               }
          }
-       if (e->focused)
+       if ((e->focused) && (!exclusive))
          {
             if (!e->events_frozen)
               evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN, 
&ev);
@@ -565,7 +595,9 @@
    if (e->events_frozen > 0) return;
      {
        Evas_Event_Key_Up ev;
+       int exclusive;
        
+       exclusive = 0;  
        ev.keyname = (char *)keyname;
        ev.data = (void *)data;
        ev.modifiers = &(e->modifiers);
@@ -574,11 +606,18 @@
          {
             Evas_List *l;
             
+            e->walking_grabs++;
             for (l = e->grabs; l; l= l->next)
               {
                  Evas_Key_Grab *g;
                  
                  g = l->data;
+                 if (g->just_added)
+                   {
+                      g->just_added = 0;
+                      continue;
+                   }
+                 if (g->delete_me) continue;
                  if (((e->modifiers.mask & g->modifiers) ||
                       (g->modifiers == e->modifiers.mask)) &&
                      (!((e->modifiers.mask & g->not_modifiers) ||
@@ -587,11 +626,32 @@
                    {
                       if (!e->events_frozen)
                         evas_object_event_callback_call(g->object, 
EVAS_CALLBACK_KEY_UP, &ev);
-                      if (g->exclusive) return;
+                      if (g->exclusive) exclusive = 1;
                    }                 
               }
+            e->walking_grabs--;
+            if (e->walking_grabs <= 0)
+              {
+                 while (e->delete_grabs > 0)
+                   {
+                      Evas_List *l;
+                      
+                      e->delete_grabs--;
+                      for (l = e->grabs; l; l= l->next)
+                        {
+                           Evas_Key_Grab *g;
+                           
+                           g = l->data;
+                           if (g->delete_me)
+                             {
+                                evas_key_grab_free(g->object, g->keyname, 
g->modifiers, g->not_modifiers);
+                                continue;
+                             }
+                        }
+                   }
+              }
          }
-       if (e->focused)
+       if ((e->focused) && (!exclusive))
          {
             if (!e->events_frozen)
               evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP, &ev);
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_key_grab.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- evas_key_grab.c     5 Mar 2003 02:30:15 -0000       1.6
+++ evas_key_grab.c     8 Jul 2003 06:08:26 -0000       1.7
@@ -9,7 +9,6 @@
 /* modifiers/not_modifers they use */
 
 static Evas_Key_Grab *evas_key_grab_new  (Evas_Object *obj, const char *keyname, 
Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive);
-static void           evas_key_grab_free (Evas_Object *obj, const char *keyname, 
Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers);
 static Evas_Key_Grab *evas_key_grab_find (Evas_Object *obj, const char *keyname, 
Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive);
 
 static Evas_Key_Grab *
@@ -25,6 +24,8 @@
    g->not_modifiers = not_modifiers;
    g->exclusive = exclusive;
    g->keyname = strdup(keyname);
+   if (obj->layer->evas->walking_grabs)
+     g->just_added = 1;
    if (!g->keyname)
      {
        if (!evas_mem_free(strlen(keyname) + 1))
@@ -71,19 +72,6 @@
    return g;
 }
 
-static void
-evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask 
modifiers, Evas_Modifier_Mask not_modifiers)
-{
-   /* MEM OK */
-   Evas_Key_Grab *g;
-   
-   g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0);
-   if (!g) return;
-   g->object->grabs = evas_list_remove(g->object->grabs, g);
-   if (g->keyname) free(g->keyname);
-   free(g);
-}
-
 static Evas_Key_Grab *
 evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask 
modifiers, Evas_Modifier_Mask not_modifiers, int exclusive)
 {
@@ -122,6 +110,19 @@
      }  
 }
 
+void
+evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask 
modifiers, Evas_Modifier_Mask not_modifiers)
+{
+   /* MEM OK */
+   Evas_Key_Grab *g;
+   
+   g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0);
+   if (!g) return;
+   g->object->grabs = evas_list_remove(g->object->grabs, g);
+   if (g->keyname) free(g->keyname);
+   free(g);
+}
+
 /* public calls */
 
 /**
@@ -168,5 +169,14 @@
    if (!keyname) return;
    g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0);
    if (!g) return;
-   evas_key_grab_free(g->object, keyname, modifiers, not_modifiers);
+   if (g->object->layer->evas->walking_grabs)
+     {
+       if (!g->delete_me)
+         {
+            g->object->layer->evas->delete_grabs++;
+            g->delete_me = 1;
+         }
+     }
+   else
+     evas_key_grab_free(g->object, keyname, modifiers, not_modifiers);
 }




-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100006ave/direct;at.asp_061203_01/01
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to