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