From 1ca3270f1dd80550d346154c023db28153db9c1a Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 23 Aug 2012 07:57:47 +0000 Subject: [PATCH] stringshare and action cleanups for winlist, should no longer call strcmp 500 times per activation SVN revision: 75602 --- src/modules/winlist/e_mod_main.c | 19 +++++++++++-------- src/modules/winlist/e_mod_main.h | 2 ++ src/modules/winlist/e_winlist.c | 31 ++++++++++++++----------------- src/modules/winlist/e_winlist.h | 2 ++ 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/modules/winlist/e_mod_main.c b/src/modules/winlist/e_mod_main.c index 9eb162555..abc4ab3bc 100644 --- a/src/modules/winlist/e_mod_main.c +++ b/src/modules/winlist/e_mod_main.c @@ -9,7 +9,8 @@ static void _e_mod_action_winlist_key_cb(E_Object *obj, const char *params, Ecore_Event_Key *ev); static E_Module *conf_module = NULL; -static E_Action *act = NULL; +const char *_winlist_act = NULL; +E_Action *_act_winlist = NULL; /* module setup */ EAPI E_Module_Api e_modapi = @@ -25,13 +26,14 @@ e_modapi_init(E_Module *m) e_configure_registry_category_add("windows", 50, _("Windows"), NULL, "preferences-system-windows"); e_configure_registry_item_add("windows/window_list", 70, _("Window Switcher"), NULL, "preferences-winlist", e_int_config_winlist); e_winlist_init(); + _winlist_act = eina_stringshare_add("winlist"); /* add module supplied action */ - act = e_action_add("winlist"); - if (act) + _act_winlist = e_action_add(_winlist_act); + if (_act_winlist) { - act->func.go = _e_mod_action_winlist_cb; - act->func.go_mouse = _e_mod_action_winlist_mouse_cb; - act->func.go_key = _e_mod_action_winlist_key_cb; + _act_winlist->func.go = _e_mod_action_winlist_cb; + _act_winlist->func.go_mouse = _e_mod_action_winlist_mouse_cb; + _act_winlist->func.go_key = _e_mod_action_winlist_key_cb; e_action_predef_name_set(_("Window : List"), _("Next Window"), "winlist", "next", NULL, 0); e_action_predef_name_set(_("Window : List"), _("Previous Window"), @@ -67,7 +69,7 @@ e_modapi_shutdown(E_Module *m __UNUSED__) E_Config_Dialog *cfd; /* remove module-supplied action */ - if (act) + if (_act_winlist) { e_action_predef_name_del(_("Window : List"), _("Previous Window")); e_action_predef_name_del(_("Window : List"), _("Next Window")); @@ -80,7 +82,7 @@ e_modapi_shutdown(E_Module *m __UNUSED__) e_action_predef_name_del(_("Window : List"), _("Window Up")); e_action_predef_name_del(_("Window : List"), _("Window on the Right")); e_action_del("winlist"); - act = NULL; + _act_winlist = NULL; } e_winlist_shutdown(); @@ -89,6 +91,7 @@ e_modapi_shutdown(E_Module *m __UNUSED__) e_configure_registry_item_del("windows/window_list"); e_configure_registry_category_del("windows"); conf_module = NULL; + eina_stringshare_replace(&_winlist_act, NULL); return 1; } diff --git a/src/modules/winlist/e_mod_main.h b/src/modules/winlist/e_mod_main.h index f55fa56dd..d1920c23e 100644 --- a/src/modules/winlist/e_mod_main.h +++ b/src/modules/winlist/e_mod_main.h @@ -9,6 +9,8 @@ #include "e_winlist.h" #include "e_int_config_winlist.h" +extern const char *_winlist_act; +extern E_Action *_act_winlist; EAPI extern E_Module_Api e_modapi; EAPI void *e_modapi_init (E_Module *m); diff --git a/src/modules/winlist/e_winlist.c b/src/modules/winlist/e_winlist.c index 73b0f8cee..c443b5bc9 100644 --- a/src/modules/winlist/e_winlist.c +++ b/src/modules/winlist/e_winlist.c @@ -76,7 +76,7 @@ _wmclass_picked(const Eina_List *lst, const char *wmclass) if (!wmclass) return EINA_FALSE; EINA_LIST_FOREACH(lst, l, s) - if ((s) && (!strcmp(s, wmclass))) + if (s == wmclass) return EINA_TRUE; return EINA_FALSE; @@ -183,8 +183,7 @@ e_winlist_show(E_Zone *zone, E_Winlist_Filter filter) if (!_last_border) pick = EINA_FALSE; else - pick = !strcmp(_last_border->client.icccm.class, - bd->client.icccm.class); + pick = _last_border->client.icccm.class == bd->client.icccm.class; break; case E_WINLIST_FILTER_CLASSES: pick = (!_wmclass_picked(wmclasses, bd->client.icccm.class)); @@ -1319,14 +1318,13 @@ _e_winlist_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event) _e_winlist_activate_nth(9); else { - E_Action *act; Eina_List *l; E_Config_Binding_Key *binding; E_Binding_Modifier mod; EINA_LIST_FOREACH(e_config->key_bindings, l, binding) { - if (binding->action && strcmp(binding->action, "winlist")) continue; + if (binding->action != _winlist_act) continue; mod = 0; @@ -1342,11 +1340,11 @@ _e_winlist_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event) if (binding->key && (!strcmp(binding->key, ev->keyname)) && ((binding->modifiers == mod) || (binding->any_mod))) { - if (!(act = e_action_find(binding->action))) continue; - if (act->func.go_key) - act->func.go_key(E_OBJECT(_winlist->zone), binding->params, ev); - else if (act->func.go) - act->func.go(E_OBJECT(_winlist->zone), binding->params); + if (!_act_winlist) continue; + if (_act_winlist->func.go_key) + _act_winlist->func.go_key(E_OBJECT(_winlist->zone), binding->params, ev); + else if (_act_winlist->func.go) + _act_winlist->func.go(E_OBJECT(_winlist->zone), binding->params); } } } @@ -1357,7 +1355,6 @@ static Eina_Bool _e_winlist_cb_key_up(void *data __UNUSED__, int type __UNUSED__, void *event) { Ecore_Event_Key *ev; - E_Action *act; Eina_List *l; E_Config_Binding_Key *binding; E_Binding_Modifier mod; @@ -1405,7 +1402,7 @@ _e_winlist_cb_key_up(void *data __UNUSED__, int type __UNUSED__, void *event) EINA_LIST_FOREACH(e_config->key_bindings, l, binding) { - if (binding->action && strcmp(binding->action, "winlist")) continue; + if (binding->action != _winlist_act) continue; mod = 0; if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) @@ -1420,11 +1417,11 @@ _e_winlist_cb_key_up(void *data __UNUSED__, int type __UNUSED__, void *event) if (binding->key && (!strcmp(binding->key, ev->keyname)) && ((binding->modifiers == mod) || (binding->any_mod))) { - if (!(act = e_action_find(binding->action))) continue; - if (act->func.end_key) - act->func.end_key(E_OBJECT(_winlist->zone), binding->params, ev); - else if (act->func.end) - act->func.end(E_OBJECT(_winlist->zone), binding->params); + if (!_act_winlist) continue; + if (_act_winlist->func.end_key) + _act_winlist->func.end_key(E_OBJECT(_winlist->zone), binding->params, ev); + else if (_act_winlist->func.end) + _act_winlist->func.end(E_OBJECT(_winlist->zone), binding->params); } } diff --git a/src/modules/winlist/e_winlist.h b/src/modules/winlist/e_winlist.h index b6d813dd1..ae7b614e4 100644 --- a/src/modules/winlist/e_winlist.h +++ b/src/modules/winlist/e_winlist.h @@ -4,6 +4,8 @@ #ifndef E_WINLIST_H #define E_WINLIST_H +#include "e_mod_main.h" + int e_winlist_init(void); int e_winlist_shutdown(void);