diff --git a/configure.in b/configure.in index a1a33c016..6547682f4 100644 --- a/configure.in +++ b/configure.in @@ -256,6 +256,8 @@ src/modules/layout/Makefile src/modules/layout/module.desktop src/modules/exebuf/Makefile src/modules/exebuf/module.desktop +src/modules/winlist/Makefile +src/modules/winlist/module.desktop src/modules/conf_wallpaper/Makefile src/modules/conf_wallpaper/module.desktop src/modules/conf_theme/Makefile diff --git a/po/POTFILES.in b/po/POTFILES.in index 54a92d50b..382e573ed 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -126,7 +126,6 @@ src/bin/e_widget_table.c src/bin/e_widget_textblock.c src/bin/e_widget_tlist.c src/bin/e_win.c -src/bin/e_winlist.c src/bin/e_xinerama.c src/bin/e_zone.c src/modules/battery/e_mod_config.c @@ -211,6 +210,8 @@ src/modules/dropshadow/e_mod_config.c src/modules/dropshadow/e_mod_main.c src/modules/exebuf/e_mod_main.c src/modules/exebuf/e_exebuf.c +src/modules/winlist/e_mod_main.c +src/modules/winlist/e_winlist.c src/modules/ibar/e_mod_config.c src/modules/ibar/e_mod_main.c src/modules/ibox/e_mod_config.c diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 988a6453c..79cb6bc3d 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -72,7 +72,6 @@ e_ipc_codec.h \ e_prefix.h \ e_datastore.h \ e_msg.h \ -e_winlist.h \ e_alert.h \ e_maximize.h \ e_grabinput.h \ @@ -199,7 +198,6 @@ e_ipc_codec.c \ e_prefix.c \ e_datastore.c \ e_msg.c \ -e_winlist.c \ e_alert.c \ e_maximize.c \ e_grabinput.c \ diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c index 609629413..9387612dd 100644 --- a/src/bin/e_actions.c +++ b/src/bin/e_actions.c @@ -1441,100 +1441,6 @@ ACT_FN_GO(app) } /***************************************************************************/ -ACT_FN_GO(winlist) -{ - E_Zone *zone; - - zone = _e_actions_zone_get(obj); - if (zone) - { - if (params) - { - if (!strcmp(params, "next")) - { - if (!e_winlist_show(zone)) - e_winlist_next(); - } - else if (!strcmp(params, "prev")) - { - if (!e_winlist_show(zone)) - e_winlist_prev(); - } - } - else - { - if (!e_winlist_show(zone)) - e_winlist_next(); - } - } -} -ACT_FN_GO_MOUSE(winlist) -{ - E_Zone *zone; - - zone = _e_actions_zone_get(obj); - if (zone) - { - if (params) - { - if (!strcmp(params, "next")) - { - if (e_winlist_show(zone)) - e_winlist_modifiers_set(ev->modifiers); - else - e_winlist_next(); - } - else if (!strcmp(params, "prev")) - { - if (e_winlist_show(zone)) - e_winlist_modifiers_set(ev->modifiers); - else - e_winlist_prev(); - } - } - else - { - if (e_winlist_show(zone)) - e_winlist_modifiers_set(ev->modifiers); - else - e_winlist_next(); - } - } -} -ACT_FN_GO_KEY(winlist) -{ - E_Zone *zone; - - zone = _e_actions_zone_get(obj); - if (zone) - { - if (params) - { - if (!strcmp(params, "next")) - { - if (e_winlist_show(zone)) - e_winlist_modifiers_set(ev->modifiers); - else - e_winlist_next(); - } - else if (!strcmp(params, "prev")) - { - if (e_winlist_show(zone)) - e_winlist_modifiers_set(ev->modifiers); - else - e_winlist_prev(); - } - } - else - { - if (e_winlist_show(zone)) - e_winlist_modifiers_set(ev->modifiers); - else - e_winlist_next(); - } - } -} - ACT_FN_GO(desk_deskshow_toggle) { E_Zone *zone; @@ -2249,15 +2155,6 @@ e_actions_init(void) e_action_predef_name_set(_("Launch"), _("Application"), "app", NULL, "syntax: , example:", 1); - /* winlist */ - ACT_GO(winlist); - e_action_predef_name_set(_("Window : List"), _("Next Window"), "winlist", - "next", NULL, 0); - e_action_predef_name_set(_("Window : List"), _("Previous Window"), - "winlist", "prev", NULL, 0); - ACT_GO_MOUSE(winlist); - ACT_GO_KEY(winlist); - ACT_GO(restart); e_action_predef_name_set(_("Enlightenment"), _("Restart"), "restart", NULL, NULL, 0); diff --git a/src/bin/e_border.c b/src/bin/e_border.c index a9f56087d..61322006a 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -118,6 +118,8 @@ static Evas_List *focus_stack = NULL; static Ecore_X_Screen_Size screen_size = { -1, -1 }; +static int focus_track_frozen = 0; + EAPI int E_EVENT_BORDER_ADD = 0; EAPI int E_EVENT_BORDER_REMOVE = 0; EAPI int E_EVENT_BORDER_ZONE_SET = 0; @@ -1324,7 +1326,7 @@ e_border_focus_set(E_Border *bd, int focus, int set) } if (bd->visible) { - if (!e_winlist_active_get()) + if (focus_track_frozen > 0) e_border_focus_latest_set(bd); } // printf("EMIT 0x%x activeve\n", bd->client.win); @@ -7440,3 +7442,15 @@ e_border_hook_del(E_Border_Hook *bh) else _e_border_hooks_delete++; } + +EAPI void +e_border_focus_track_freeze(void) +{ + focus_track_frozen++; +} + +EAPI void +e_border_focus_track_thaw(void) +{ + focus_track_frozen--; +} diff --git a/src/bin/e_border.h b/src/bin/e_border.h index beb3f1730..62333b83f 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -668,6 +668,8 @@ EAPI void e_border_resize_limit(E_Border *bd, int *w, int *h); EAPI E_Border_Hook *e_border_hook_add(E_Border_Hook_Point hookpoint, void (*func) (void *data, E_Border *bd), void *data); EAPI void e_border_hook_del(E_Border_Hook *bh); +EAPI void e_border_focus_track_freeze(void); +EAPI void e_border_focus_track_thaw(void); extern EAPI int E_EVENT_BORDER_RESIZE; extern EAPI int E_EVENT_BORDER_MOVE; diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 792c1fd40..eae473b5b 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -759,6 +759,7 @@ e_config_init(void) CFG_MODULE("temperature", 1, 0); CFG_MODULE("pager", 1, 0); CFG_MODULE("exebuf", 1, 1); + CFG_MODULE("winlist", 1, 1); CFG_MODULE("conf_applications", 1, 1); CFG_MODULE("conf_borders", 1, 1); CFG_MODULE("conf_clientlist", 1, 1); diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 512558ffd..baaaf7f5a 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -48,7 +48,6 @@ #include "e_prefix.h" #include "e_datastore.h" #include "e_msg.h" -#include "e_winlist.h" #include "e_alert.h" #include "e_maximize.h" #include "e_grabinput.h" diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 8cbdac317..41496604a 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -740,14 +740,6 @@ main(int argc, char **argv) _e_main_shutdown(-1); } _e_main_shutdown_push(e_module_shutdown); - TS("winlist"); - /* setup winlist */ - if (!e_winlist_init()) - { - e_error_message_show(_("Enlightenment cannot set up its window list system.")); - _e_main_shutdown(-1); - } - _e_main_shutdown_push(e_winlist_shutdown); TS("colorclasses"); /* setup color_class */ if (!e_color_class_init()) diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index c844769ff..2521593c2 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -11,6 +11,7 @@ ibox \ start \ layout \ exebuf \ +winlist \ conf_wallpaper \ conf_theme \ conf_colors \ diff --git a/src/modules/exebuf/e_exebuf.c b/src/modules/exebuf/e_exebuf.c index 099a6130d..06d6f92a4 100644 --- a/src/modules/exebuf/e_exebuf.c +++ b/src/modules/exebuf/e_exebuf.c @@ -148,7 +148,6 @@ e_exebuf_show(E_Zone *zone) E_OBJECT_CHECK_RETURN(zone, 0); E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, 0); - if (e_winlist_active_get()) return 0; if (exebuf) return 0; input_window = ecore_x_window_input_new(zone->container->win, zone->x, diff --git a/src/modules/winlist/Makefile.am b/src/modules/winlist/Makefile.am new file mode 100644 index 000000000..c29d3018e --- /dev/null +++ b/src/modules/winlist/Makefile.am @@ -0,0 +1,31 @@ +MAINTAINERCLEANFILES = Makefile.in +MODULE = winlist + +# data files for the module +filesdir = $(libdir)/enlightenment/modules/$(MODULE) +files_DATA = \ +e-module-$(MODULE).edj module.desktop + +EXTRA_DIST = $(files_DATA) + +# the module .so file +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src/modules/$(MODULE) \ + -I$(top_srcdir)/src/bin \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/modules \ + @e_cflags@ +pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.c \ + e_mod_main.h \ + e_winlist.c \ + e_winlist.h + +module_la_LIBADD = @e_libs@ @dlopen_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h + +uninstall: + rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE) diff --git a/src/modules/winlist/e-module-winlist.edj b/src/modules/winlist/e-module-winlist.edj new file mode 100644 index 000000000..64e7dd38c Binary files /dev/null and b/src/modules/winlist/e-module-winlist.edj differ diff --git a/src/modules/winlist/e_mod_main.c b/src/modules/winlist/e_mod_main.c new file mode 100644 index 000000000..1640f410a --- /dev/null +++ b/src/modules/winlist/e_mod_main.c @@ -0,0 +1,219 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#include "e.h" +#include "e_mod_main.h" + +/***************************************************************************/ +/**/ +/* actual module specifics */ + +static void _e_mod_action_winlist_cb(E_Object *obj, const char *params); +static void _e_mod_action_winlist_mouse_cb(E_Object *obj, const char *params, Ecore_X_Event_Mouse_Button_Down *ev); +static void _e_mod_action_winlist_key_cb(E_Object *obj, const char *params, Ecore_X_Event_Key_Down *ev); + +static E_Module *conf_module = NULL; +static E_Action *act = NULL; + +/**/ +/***************************************************************************/ + +/***************************************************************************/ +/**/ + +/**/ +/***************************************************************************/ + +/***************************************************************************/ +/**/ +/* module setup */ +EAPI E_Module_Api e_modapi = +{ + E_MODULE_API_VERSION, + "Exebuf" +}; + +EAPI void * +e_modapi_init(E_Module *m) +{ + conf_module = m; + e_winlist_init(); + /* add module supplied action */ + act = e_action_add("winlist"); + if (act) + { + 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; + e_action_predef_name_set(_("Window : List"), _("Next Window"), "winlist", + "next", NULL, 0); + e_action_predef_name_set(_("Window : List"), _("Previous Window"), + "winlist", "prev", NULL, 0); + } + e_module_delayed_set(m, 1); + return m; +} + +EAPI int +e_modapi_shutdown(E_Module *m) +{ + /* remove module-supplied action */ + if (act) + { + e_action_predef_name_del(_("Window : List"), _("Previous Window")); + e_action_predef_name_del(_("Window : List"), _("Next Window")); + e_action_del("exebuf"); + act = NULL; + } + e_winlist_shutdown(); + conf_module = NULL; + return 1; +} + +EAPI int +e_modapi_save(E_Module *m) +{ + return 1; +} + +EAPI int +e_modapi_about(E_Module *m) +{ + e_module_dialog_show(m, + _("Enlightenment Winlist Module"), + _("A module for displaying a list of windows to switch between.")); + return 1; +} + +/* action callback */ +static void +_e_mod_action_winlist_cb(E_Object *obj, const char *params) +{ + E_Zone *zone; + + if (obj) + { + if (obj->type == E_MANAGER_TYPE) + zone = e_util_zone_current_get((E_Manager *)obj); + else if (obj->type == E_CONTAINER_TYPE) + zone = e_util_zone_current_get(((E_Container *)obj)->manager); + else if (obj->type == E_ZONE_TYPE) + zone = e_util_zone_current_get(((E_Zone *)obj)->container->manager); + else + zone = e_util_zone_current_get(e_manager_current_get()); + } + zone = e_util_zone_current_get(e_manager_current_get()); + if (zone) + { + if (params) + { + if (!strcmp(params, "next")) + { + if (!e_winlist_show(zone)) + e_winlist_next(); + } + else if (!strcmp(params, "prev")) + { + if (!e_winlist_show(zone)) + e_winlist_prev(); + } + } + else + { + if (!e_winlist_show(zone)) + e_winlist_next(); + } + } +} + +static void +_e_mod_action_winlist_mouse_cb(E_Object *obj, const char *params, Ecore_X_Event_Mouse_Button_Down *ev) +{ + E_Zone *zone; + + if (obj) + { + if (obj->type == E_MANAGER_TYPE) + zone = e_util_zone_current_get((E_Manager *)obj); + else if (obj->type == E_CONTAINER_TYPE) + zone = e_util_zone_current_get(((E_Container *)obj)->manager); + else if (obj->type == E_ZONE_TYPE) + zone = e_util_zone_current_get(((E_Zone *)obj)->container->manager); + else + zone = e_util_zone_current_get(e_manager_current_get()); + } + zone = e_util_zone_current_get(e_manager_current_get()); + if (zone) + { + if (params) + { + if (!strcmp(params, "next")) + { + if (e_winlist_show(zone)) + e_winlist_modifiers_set(ev->modifiers); + else + e_winlist_next(); + } + else if (!strcmp(params, "prev")) + { + if (e_winlist_show(zone)) + e_winlist_modifiers_set(ev->modifiers); + else + e_winlist_prev(); + } + } + else + { + if (e_winlist_show(zone)) + e_winlist_modifiers_set(ev->modifiers); + else + e_winlist_next(); + } + } +} + +static void +_e_mod_action_winlist_key_cb(E_Object *obj, const char *params, Ecore_X_Event_Key_Down *ev) +{ + E_Zone *zone; + + if (obj) + { + if (obj->type == E_MANAGER_TYPE) + zone = e_util_zone_current_get((E_Manager *)obj); + else if (obj->type == E_CONTAINER_TYPE) + zone = e_util_zone_current_get(((E_Container *)obj)->manager); + else if (obj->type == E_ZONE_TYPE) + zone = e_util_zone_current_get(((E_Zone *)obj)->container->manager); + else + zone = e_util_zone_current_get(e_manager_current_get()); + } + zone = e_util_zone_current_get(e_manager_current_get()); + if (zone) + { + if (params) + { + if (!strcmp(params, "next")) + { + if (e_winlist_show(zone)) + e_winlist_modifiers_set(ev->modifiers); + else + e_winlist_next(); + } + else if (!strcmp(params, "prev")) + { + if (e_winlist_show(zone)) + e_winlist_modifiers_set(ev->modifiers); + else + e_winlist_prev(); + } + } + else + { + if (e_winlist_show(zone)) + e_winlist_modifiers_set(ev->modifiers); + else + e_winlist_next(); + } + } +} diff --git a/src/modules/winlist/e_mod_main.h b/src/modules/winlist/e_mod_main.h new file mode 100644 index 000000000..521916762 --- /dev/null +++ b/src/modules/winlist/e_mod_main.h @@ -0,0 +1,21 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +#define E_TYPEDEFS 1 +#include "e_winlist.h" + +#undef E_TYPEDEFS +#include "e_winlist.h" + + +EAPI extern E_Module_Api e_modapi; + +EAPI void *e_modapi_init (E_Module *m); +EAPI int e_modapi_shutdown (E_Module *m); +EAPI int e_modapi_save (E_Module *m); +EAPI int e_modapi_about (E_Module *m); + +#endif diff --git a/src/bin/e_winlist.c b/src/modules/winlist/e_winlist.c similarity index 99% rename from src/bin/e_winlist.c rename to src/modules/winlist/e_winlist.c index 0bc18564b..9e502fee7 100644 --- a/src/bin/e_winlist.c +++ b/src/modules/winlist/e_winlist.c @@ -2,6 +2,7 @@ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #include "e.h" +#include "e_winlist.h" /* local subsystem functions */ typedef struct _E_Winlist_Win E_Winlist_Win; @@ -115,6 +116,7 @@ e_winlist_show(E_Zone *zone) winlist = e_popup_new(zone, x, y, w, h); if (!winlist) return 0; + e_border_focus_track_freeze(); evas_event_feed_mouse_in(winlist->evas, ecore_x_current_time_get(), NULL); evas_event_feed_mouse_move(winlist->evas, -1000000, -1000000, ecore_x_current_time_get(), NULL); @@ -243,6 +245,7 @@ e_winlist_hide(void) bg_object = NULL; evas_event_thaw(winlist->evas); e_object_del(E_OBJECT(winlist)); + e_border_focus_track_thaw(); winlist = NULL; hold_count = 0; hold_mod = 0; @@ -302,13 +305,6 @@ e_winlist_hide(void) } } -EAPI int -e_winlist_active_get(void) -{ - if (winlist) return 1; - return 0; -} - EAPI void e_winlist_next(void) { diff --git a/src/bin/e_winlist.h b/src/modules/winlist/e_winlist.h similarity index 91% rename from src/bin/e_winlist.h rename to src/modules/winlist/e_winlist.h index f68757369..139b71c7b 100644 --- a/src/bin/e_winlist.h +++ b/src/modules/winlist/e_winlist.h @@ -12,7 +12,6 @@ EAPI int e_winlist_shutdown(void); EAPI int e_winlist_show(E_Zone *zone); EAPI void e_winlist_hide(void); -EAPI int e_winlist_active_get(void); EAPI void e_winlist_next(void); EAPI void e_winlist_prev(void); EAPI void e_winlist_modifiers_set(int mod); diff --git a/src/modules/winlist/module.desktop.in b/src/modules/winlist/module.desktop.in new file mode 100644 index 000000000..5def61e26 --- /dev/null +++ b/src/modules/winlist/module.desktop.in @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Link +Name=Winlist +Icon=e-module-winlist