|
From: <enl...@li...> - 2005-06-12 06:50:45
|
Enlightenment CVS committal
Author : raster
Project : e17
Module : apps/e
Dir : e17/apps/e/src/bin
Modified Files:
e_actions.c e_bindings.c e_bindings.h e_border.c e_border.h
e_config.c e_config.h e_manager.c e_winlist.c e_winlist.h
Log Message:
winlist alt-tab works (and dhift-alt-tab to go in reverse)... it is NOT
complete... gfx are ugly. i have fixme's. it doesnt work with pointer focus
really... etc.
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_actions.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- e_actions.c 2 Jun 2005 09:49:07 -0000 1.11
+++ e_actions.c 12 Jun 2005 06:50:33 -0000 1.12
@@ -520,6 +520,107 @@
}
}
+/***************************************************************************/
+ACT_FN_GO(winlist)
+{
+ E_Zone *zone = NULL;
+
+ if (!obj) return;
+ if (obj->type == E_MANAGER_TYPE)
+ zone = e_util_zone_current_get((E_Manager *)obj);
+ else if (obj->type == E_ZONE_TYPE)
+ zone = (E_Zone *)obj;
+ if (zone)
+ {
+ if (params)
+ {
+ if (!strcmp(params, "next"))
+ {
+ e_winlist_show(zone);
+ e_winlist_next();
+ }
+ else if (!strcmp(params, "prev"))
+ {
+ e_winlist_show(zone);
+ e_winlist_prev();
+ }
+ }
+ else
+ {
+ e_winlist_show(zone);
+ e_winlist_next();
+ }
+ }
+}
+ACT_FN_GO_MOUSE(winlist)
+{
+ E_Zone *zone = NULL;
+
+ if (!obj) return;
+ if (obj->type == E_MANAGER_TYPE)
+ zone = e_util_zone_current_get((E_Manager *)obj);
+ else if (obj->type == E_ZONE_TYPE)
+ zone = (E_Zone *)obj;
+ if (zone)
+ {
+ if (params)
+ {
+ if (!strcmp(params, "next"))
+ {
+ if (e_winlist_show(zone))
+ e_winlist_modifiers_set(ev->modifiers);
+ e_winlist_next();
+ }
+ else if (!strcmp(params, "prev"))
+ {
+ if (e_winlist_show(zone))
+ e_winlist_modifiers_set(ev->modifiers);
+ e_winlist_prev();
+ }
+ }
+ else
+ {
+ if (e_winlist_show(zone))
+ e_winlist_modifiers_set(ev->modifiers);
+ e_winlist_next();
+ }
+ }
+}
+ACT_FN_GO_KEY(winlist)
+{
+ E_Zone *zone = NULL;
+
+ if (!obj) return;
+ if (obj->type == E_MANAGER_TYPE)
+ zone = e_util_zone_current_get((E_Manager *)obj);
+ else if (obj->type == E_ZONE_TYPE)
+ zone = (E_Zone *)obj;
+ if (zone)
+ {
+ if (params)
+ {
+ if (!strcmp(params, "next"))
+ {
+ if (e_winlist_show(zone))
+ e_winlist_modifiers_set(ev->modifiers);
+ e_winlist_next();
+ }
+ else if (!strcmp(params, "prev"))
+ {
+ if (e_winlist_show(zone))
+ e_winlist_modifiers_set(ev->modifiers);
+ e_winlist_prev();
+ }
+ }
+ else
+ {
+ if (e_winlist_show(zone))
+ e_winlist_modifiers_set(ev->modifiers);
+ e_winlist_next();
+ }
+ }
+}
+
/* local subsystem globals */
static Evas_Hash *actions = NULL;
@@ -577,6 +678,10 @@
ACT_GO(app);
+ ACT_GO(winlist);
+ ACT_GO_MOUSE(winlist);
+ ACT_GO_KEY(winlist);
+
return 1;
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_bindings.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- e_bindings.c 20 May 2005 10:14:51 -0000 1.13
+++ e_bindings.c 12 Jun 2005 06:50:33 -0000 1.14
@@ -371,7 +371,7 @@
if (_e_bindings_context_match(bind->ctxt, ctxt))
{
E_Action *act;
-
+
act = e_action_find(bind->action);
if (act)
{
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_bindings.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- e_bindings.h 20 May 2005 10:14:51 -0000 1.9
+++ e_bindings.h 12 Jun 2005 06:50:33 -0000 1.10
@@ -10,6 +10,8 @@
E_BINDING_CONTEXT_BORDER,
E_BINDING_CONTEXT_ZONE,
E_BINDING_CONTEXT_MANAGER,
+ E_BINDING_CONTEXT_MENU,
+ E_BINDING_CONTEXT_WINLIST,
E_BINDING_CONTEXT_ANY
} E_Binding_Context;
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.c,v
retrieving revision 1.254
retrieving revision 1.255
diff -u -3 -r1.254 -r1.255
--- e_border.c 11 Jun 2005 13:32:29 -0000 1.254
+++ e_border.c 12 Jun 2005 06:50:33 -0000 1.255
@@ -129,7 +129,9 @@
static Ecore_Timer *focus_fix_timer = NULL;
static int grabbed = 0;
-
+
+static Evas_List *focus_stack = NULL;
+
int E_EVENT_BORDER_ADD = 0;
int E_EVENT_BORDER_REMOVE = 0;
int E_EVENT_BORDER_ZONE_SET = 0;
@@ -457,6 +459,8 @@
desk[1] = desky;
ecore_x_window_prop_card32_set(win, E_ATOM_DESK, desk, 2);
+ focus_stack = evas_list_append(focus_stack, bd);
+
return bd;
}
@@ -804,6 +808,8 @@
// printf("flag focus to %i\n", focus);
if ((focus) && (!bd->focused))
{
+ focus_stack = evas_list_remove(focus_stack, bd);
+ focus_stack = evas_list_prepend(focus_stack, bd);
edje_object_signal_emit(bd->bg_object, "active", "");
e_focus_event_focus_in(bd);
}
@@ -1560,6 +1566,12 @@
}
}
+Evas_List *
+e_border_focus_stack_get(void)
+{
+ return focus_stack;
+}
+
/* local subsystem functions */
static void
_e_border_free(E_Border *bd)
@@ -1633,7 +1645,8 @@
borders_hash = evas_hash_del(borders_hash, _e_border_winid_str_get(bd->bg_win), bd);
borders_hash = evas_hash_del(borders_hash, _e_border_winid_str_get(bd->win), bd);
borders = evas_list_remove(borders, bd);
-
+ focus_stack = evas_list_remove(focus_stack, bd);
+
free(bd);
}
@@ -1656,7 +1669,7 @@
_e_border_del(E_Border *bd)
{
E_Event_Border_Remove *ev;
-
+
if (!bd->dangling_ref_check)
bd->dangling_ref_check = ecore_timer_add(1.0, _e_border_del_dangling_ref_check, bd);
if (!bd->already_unparented)
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.h,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -3 -r1.72 -r1.73
--- e_border.h 10 Jun 2005 04:19:46 -0000 1.72
+++ e_border.h 12 Jun 2005 06:50:33 -0000 1.73
@@ -439,7 +439,9 @@
EAPI void e_border_button_bindings_ungrab_all(void);
EAPI void e_border_button_bindings_grab_all(void);
-
+
+EAPI Evas_List *e_border_focus_stack_get(void);
+
extern EAPI int E_EVENT_BORDER_RESIZE;
extern EAPI int E_EVENT_BORDER_MOVE;
extern EAPI int E_EVENT_BORDER_ADD;
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_config.c,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -3 -r1.57 -r1.58
--- e_config.c 9 Jun 2005 02:18:38 -0000 1.57
+++ e_config.c 12 Jun 2005 06:50:33 -0000 1.58
@@ -650,6 +650,24 @@
eb->params = strdup("Eterm");
e_config->key_bindings = evas_list_append(e_config->key_bindings, eb);
+ eb = E_NEW(E_Config_Binding_Key, 1);
+ eb->context = E_BINDING_CONTEXT_ANY;
+ eb->key = strdup("Tab");
+ eb->modifiers = E_BINDING_MODIFIER_ALT;
+ eb->any_mod = 0;
+ eb->action = strdup("winlist");
+ eb->params = strdup("next");
+ e_config->key_bindings = evas_list_append(e_config->key_bindings, eb);
+
+ eb = E_NEW(E_Config_Binding_Key, 1);
+ eb->context = E_BINDING_CONTEXT_ANY;
+ eb->key = strdup("Tab");
+ eb->modifiers = E_BINDING_MODIFIER_SHIFT | E_BINDING_MODIFIER_ALT;
+ eb->any_mod = 0;
+ eb->action = strdup("winlist");
+ eb->params = strdup("prev");
+ e_config->key_bindings = evas_list_append(e_config->key_bindings, eb);
+
/* should do these - can't yet due to other things missing... */
/* need a yes/no dialog for these - to stop accidental logouts. for this
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_config.h,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -3 -r1.28 -r1.29
--- e_config.h 27 May 2005 10:04:53 -0000 1.28
+++ e_config.h 12 Jun 2005 06:50:33 -0000 1.29
@@ -46,7 +46,7 @@
* defaults for e to work - started at 100 when we introduced this config
* versioning feature
*/
-#define E_CONFIG_FILE_VERSION 107
+#define E_CONFIG_FILE_VERSION 108
#define E_EVAS_ENGINE_DEFAULT 0
#define E_EVAS_ENGINE_SOFTWARE_X11 1
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_manager.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -3 -r1.31 -r1.32
--- e_manager.c 5 Jun 2005 15:30:46 -0000 1.31
+++ e_manager.c 12 Jun 2005 06:50:33 -0000 1.32
@@ -468,7 +468,7 @@
man = data;
e = ev;
- printf("KEY %s [win=%x event_win=%x]\n", e->keyname, e->win, e->event_win);
+// printf("KEY %s [win=%x event_win=%x]\n", e->keyname, e->win, e->event_win);
if (e->event_win != man->root) return 1;
if (e_bindings_key_down_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
return 0;
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_winlist.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_winlist.c 7 Jun 2005 13:53:27 -0000 1.2
+++ e_winlist.c 12 Jun 2005 06:50:34 -0000 1.3
@@ -4,9 +4,41 @@
#include "e.h"
/* local subsystem functions */
+typedef struct _E_Winlist_Win E_Winlist_Win;
+
+struct _E_Winlist_Win
+{
+ Evas_Object *bg_object;
+ Evas_Object *icon_object;
+ E_Border *border;
+};
+
+static void _e_winlist_size_adjust(void);
+static void _e_winlist_border_add(E_Border *bd, E_Zone *zone, E_Desk *desk);
+static void _e_winlist_border_del(E_Border *bd);
+static void _e_winlist_activate_nth(int n);
+static void _e_winlist_activate(void);
+static void _e_winlist_deactivate(void);
+static void _e_winlist_show_active(void);
+static int _e_winlist_cb_event_border_add(void *data, int type, void *event);
+static int _e_winlist_cb_event_border_remove(void *data, int type, void *event);
+static int _e_winlist_cb_key_down(void *data, int type, void *event);
+static int _e_winlist_cb_key_up(void *data, int type, void *event);
/* local subsystem globals */
static E_Popup *winlist = NULL;
+static Evas_Object *bg_object = NULL;
+static Evas_Object *list_object = NULL;
+static Evas_List *wins = NULL;
+static Evas_List *win_selected = NULL;
+static int hold_count = 0;
+static int hold_mod = 0;
+static Evas_List *handlers = NULL;
+static Ecore_X_Window input_window = 0;
+
+/* FIXME: gfx are UGLY. theyare test gfx and nothng more atm */
+/* FIXME: support optional warp pointer to window */
+/* FIXME: add mouse downa nd up handlers and pass events to bindings from them incase mouse binding starst winlist */
/* externally accessible functions */
int
@@ -22,72 +54,386 @@
return 1;
}
-/*
- * how to handle? on show, grab keyboard (and mouse) like menus
- * set "modifier keys active" if spawning event had modfiers active
- * if "modifier keys active" and if all modifier keys are released or is found not active on start = end
- * up/left == prev
- * down/right == next
- * escape = end
- * 1 - 9, 0 = select window 1 - 9, 10
- * local subsystem functions
- */
-
-void
+int
e_winlist_show(E_Zone *zone)
{
int x, y, w, h;
Evas_Object *o;
+ Evas_List *l;
+ E_Desk *desk;
+ E_Border *bd;
- if (winlist) return;
+ if (winlist) return 0;
- /* FIXME: should be config */
+ /* FIXME: sizes/pos should be config */
w = zone->w / 2;
- if (w > 400) w = 400;
+ if (w > 320) w = 320;
h = zone->h / 2;
if (h > 800) h = 800;
else if (h < 400) h = 400;
+ x = (zone->w - w) / 2;
+ y = (zone->h - h) / 2;
winlist = e_popup_new(zone, x, y, w, h);
if (!winlist) return;
e_popup_layer_set(winlist, 255);
+ evas_event_freeze(winlist->evas);
o = edje_object_add(winlist->evas);
- /* FIXME: need theme stuff */
+ bg_object = o;
e_theme_edje_object_set(o, "base/theme/winlist",
"widgets/winlist/main");
evas_object_move(o, 0, 0);
evas_object_resize(o, w, h);
evas_object_show(o);
e_popup_edje_bg_object_set(winlist, o);
- /* FIXME: bg obj needs to be stored */
- /* FIXME: create and swallow box */
- /* FIXME: fill box with current clients */
- /* FIXME: configure list with current focused window */
- /* FIXME: grab mouse and keyboard */
+
+ o = e_box_add(winlist->evas);
+ list_object = o;
+ e_box_align_set(o, 0.5, 0.0);
+ e_box_orientation_set(o, 0);
+ e_box_homogenous_set(o, 1);
+ edje_object_part_swallow(bg_object, "list_swallow", o);
+ evas_object_show(o);
+
+ desk = e_desk_current_get(winlist->zone);
+ e_box_freeze(list_object);
+ for (l = e_border_focus_stack_get(); l; l = l->next)
+ {
+ E_Border *bd;
+
+ bd = l->data;
+ _e_winlist_border_add(bd, winlist->zone, desk);
+ }
+ e_box_thaw(list_object);
+ bd = e_border_focused_get();
+ if (bd) e_border_focus_set(bd, 0, 0);
+ _e_winlist_activate_nth(0);
+ evas_event_thaw(winlist->evas);
+ _e_winlist_size_adjust();
+
+ input_window = ecore_x_window_input_new(zone->container->win, 0, 0, 1, 1);
+ ecore_x_window_show(input_window);
+ ecore_x_pointer_grab(input_window);
+ ecore_x_keyboard_grab(input_window);
+ handlers = evas_list_append
+ (handlers, ecore_event_handler_add
+ (E_EVENT_BORDER_ADD, _e_winlist_cb_event_border_add, NULL));
+ handlers = evas_list_append
+ (handlers, ecore_event_handler_add
+ (E_EVENT_BORDER_REMOVE, _e_winlist_cb_event_border_remove, NULL));
+ handlers = evas_list_append
+ (handlers, ecore_event_handler_add
+ (ECORE_X_EVENT_KEY_DOWN, _e_winlist_cb_key_down, NULL));
+ handlers = evas_list_append
+ (handlers, ecore_event_handler_add
+ (ECORE_X_EVENT_KEY_UP, _e_winlist_cb_key_up, NULL));
e_popup_show(winlist);
+ return 1;
}
void
e_winlist_hide(void)
{
if (!winlist) return;
+
+ /* FIXME: ensure whatever window is selected is focused after we finish cleanup */
+
+ evas_event_freeze(winlist->evas);
e_popup_hide(winlist);
+ e_box_freeze(list_object);
+ while (wins)
+ {
+ E_Winlist_Win *ww;
+
+ ww = wins->data;
+ evas_object_del(ww->bg_object);
+ evas_object_del(ww->icon_object);
+ free(ww);
+ wins = evas_list_remove_list(wins, wins);
+ }
+ e_box_thaw(list_object);
+ win_selected = NULL;
+ evas_object_del(list_object);
+ list_object = NULL;
+ evas_object_del(bg_object);
+ bg_object = NULL;
+ evas_event_thaw(winlist->evas);
e_object_del(E_OBJECT(winlist));
winlist = NULL;
+ hold_count = 0;
+ hold_mod = 0;
+ while (handlers)
+ {
+ ecore_event_handler_del(handlers->data);
+ handlers = evas_list_remove_list(handlers, handlers);
+ }
+ ecore_x_window_del(input_window);
+ input_window = 0;
}
void
e_winlist_next(void)
{
+ _e_winlist_deactivate();
+ win_selected = win_selected->next;
+ if (!win_selected) win_selected = wins;
+ _e_winlist_show_active();
+ _e_winlist_activate();
}
void
e_winlist_prev(void)
{
+ _e_winlist_deactivate();
+ win_selected = win_selected->prev;
+ if (!win_selected) win_selected = evas_list_last(wins);
+ _e_winlist_show_active();
+ _e_winlist_activate();
}
void
e_winlist_modifiers_set(int mod)
{
+ hold_mod = mod;
+ hold_count = 0;
+ if (hold_mod & ECORE_X_MODIFIER_SHIFT) hold_count++;
+ if (hold_mod & ECORE_X_MODIFIER_CTRL) hold_count++;
+ if (hold_mod & ECORE_X_MODIFIER_ALT) hold_count++;
+ if (hold_mod & ECORE_X_MODIFIER_WIN) hold_count++;
+}
+
+/* local subsystem functions */
+static void
+_e_winlist_size_adjust(void)
+{
+ Evas_Coord mw, mh;
+ int x, y, w, h;
+
+ e_box_freeze(list_object);
+ e_box_min_size_get(list_object, &mw, &mh);
+ edje_extern_object_min_size_set(list_object, mw, mh);
+ edje_object_part_swallow(bg_object, "list_swallow", list_object);
+ edje_object_size_min_calc(bg_object, &mw, &mh);
+ edje_extern_object_min_size_set(list_object, -1, -1);
+ e_box_thaw(list_object);
+
+ /* FIXME: sizes/pos should be config */
+ w = winlist->zone->w / 2;
+ if (w > 320) w = 320;
+ h = mh;
+ if (h > 800) h = 800;
+ x = (winlist->zone->w - w) / 2;
+ y = (winlist->zone->h - h) / 2;
+ evas_object_resize(bg_object, w, h);
+ e_popup_move_resize(winlist, x, y, w, h);
+}
+
+static void
+_e_winlist_border_add(E_Border *bd, E_Zone *zone, E_Desk *desk)
+{
+ if ((bd->zone) &&
+ (bd->zone == zone) &&
+ ((bd->desk == desk) || (bd->sticky)))
+ {
+ E_Winlist_Win *ww;
+ Evas_Coord mw, mh;
+ Evas_Object *o;
+
+ ww = calloc(1, sizeof(E_Winlist_Win));
+ if (!ww) return;
+ ww->border = bd;
+ wins = evas_list_append(wins, ww);
+ o = edje_object_add(winlist->evas);
+ ww->bg_object = o;
+ e_theme_edje_object_set(o, "base/theme/winlist",
+ "widgets/winlist/item");
+ if (bd->client.netwm.name)
+ edje_object_part_text_set(o, "title_text", bd->client.netwm.name);
+ else if (bd->client.icccm.title)
+ edje_object_part_text_set(o, "title_text", bd->client.icccm.title);
+ evas_object_show(o);
+ o = e_border_icon_add(bd, winlist->evas);
+ ww->icon_object = o;
+ edje_object_part_swallow(ww->bg_object, "icon_swallow", o);
+ evas_object_show(o);
+ edje_object_size_min_calc(ww->bg_object, &mw, &mh);
+ e_box_pack_end(list_object, ww->bg_object);
+ e_box_pack_options_set(ww->bg_object,
+ 1, 1, /* fill */
+ 1, 0, /* expand */
+ 0.5, 0.5, /* align */
+ mw, mh, /* min */
+ 9999, mh /* max */
+ );
+ }
+}
+
+static void
+_e_winlist_border_del(E_Border *bd)
+{
+ Evas_List *l;
+
+ for (l = wins; l; l = l->next)
+ {
+ E_Winlist_Win *ww;
+
+ ww = l->data;
+ if (ww->border == bd)
+ {
+ evas_object_del(ww->bg_object);
+ evas_object_del(ww->icon_object);
+ free(ww);
+ wins = evas_list_remove_list(wins, l);
+ return;
+ }
+ }
+}
+
+static void
+_e_winlist_activate_nth(int n)
+{
+ Evas_List *l;
+
+ _e_winlist_deactivate();
+ l = evas_list_nth_list(wins, n);
+ if (l)
+ {
+ win_selected = l;
+ _e_winlist_show_active();
+ _e_winlist_activate();
+ }
+}
+
+static void
+_e_winlist_activate(void)
+{
+ E_Winlist_Win *ww;
+
+ if (!win_selected) return;
+ ww = win_selected->data;
+ edje_object_signal_emit(ww->bg_object, "active", "");
+ e_border_raise(ww->border);
+ e_border_focus_set(ww->border, 1, 1);
+ edje_object_signal_emit(bg_object, "active", "");
+}
+
+static void
+_e_winlist_deactivate(void)
+{
+ E_Winlist_Win *ww;
+
+ if (!win_selected) return;
+ ww = win_selected->data;
+ edje_object_signal_emit(ww->bg_object, "passive", "");
+ e_border_focus_set(ww->border, 0, 0);
+}
+
+static void
+_e_winlist_show_active(void)
+{
+ /* FIXME: scroll so the selected win is visible */
+}
+
+static int
+_e_winlist_cb_event_border_add(void *data, int type, void *event)
+{
+ E_Event_Border_Add *ev;
+
+ ev = event;
+ _e_winlist_border_add(ev->border, winlist->zone,
+ e_desk_current_get(winlist->zone));
+ _e_winlist_size_adjust();
+}
+
+static int
+_e_winlist_cb_event_border_remove(void *data, int type, void *event)
+{
+ E_Event_Border_Remove *ev;
+
+ ev = event;
+ _e_winlist_border_del(ev->border);
+ _e_winlist_size_adjust();
+}
+
+static int
+_e_winlist_cb_key_down(void *data, int type, void *event)
+{
+ Ecore_X_Event_Key_Down *ev;
+
+ ev = event;
+ if (ev->win != input_window) return 1;
+ if (!strcmp(ev->keysymbol, "Up"))
+ e_winlist_prev();
+ else if (!strcmp(ev->keysymbol, "Down"))
+ e_winlist_next();
+ else if (!strcmp(ev->keysymbol, "Left"))
+ e_winlist_prev();
+ else if (!strcmp(ev->keysymbol, "Right"))
+ e_winlist_next();
+ else if (!strcmp(ev->keysymbol, "Return"))
+ e_winlist_hide();
+ else if (!strcmp(ev->keysymbol, "space"))
+ e_winlist_hide();
+ else if (!strcmp(ev->keysymbol, "Escape"))
+ e_winlist_hide();
+ else if (!strcmp(ev->keysymbol, "1"))
+ _e_winlist_activate_nth(0);
+ else if (!strcmp(ev->keysymbol, "2"))
+ _e_winlist_activate_nth(1);
+ else if (!strcmp(ev->keysymbol, "3"))
+ _e_winlist_activate_nth(2);
+ else if (!strcmp(ev->keysymbol, "4"))
+ _e_winlist_activate_nth(3);
+ else if (!strcmp(ev->keysymbol, "5"))
+ _e_winlist_activate_nth(4);
+ else if (!strcmp(ev->keysymbol, "6"))
+ _e_winlist_activate_nth(5);
+ else if (!strcmp(ev->keysymbol, "7"))
+ _e_winlist_activate_nth(6);
+ else if (!strcmp(ev->keysymbol, "8"))
+ _e_winlist_activate_nth(7);
+ else if (!strcmp(ev->keysymbol, "9"))
+ _e_winlist_activate_nth(8);
+ else if (!strcmp(ev->keysymbol, "0"))
+ _e_winlist_activate_nth(9);
+ else
+ e_bindings_key_down_event_handle(E_BINDING_CONTEXT_WINLIST,
+ E_OBJECT(winlist->zone), ev);
+ return 1;
+}
+
+static int
+_e_winlist_cb_key_up(void *data, int type, void *event)
+{
+ Ecore_X_Event_Key_Up *ev;
+
+ ev = event;
+ if (ev->win != input_window) return 1;
+ if (hold_mod)
+ {
+ if ((hold_mod & ECORE_X_MODIFIER_SHIFT) && (!strcmp(ev->keysymbol, "Shift_L"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_SHIFT) && (!strcmp(ev->keysymbol, "Shift_R"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_CTRL) && (!strcmp(ev->keysymbol, "Control_L"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_CTRL) && (!strcmp(ev->keysymbol, "Control_R"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_ALT) && (!strcmp(ev->keysymbol, "Alt_L"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_ALT) && (!strcmp(ev->keysymbol, "Alt_R"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_ALT) && (!strcmp(ev->keysymbol, "Meta_L"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_ALT) && (!strcmp(ev->keysymbol, "Meta_R"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_ALT) && (!strcmp(ev->keysymbol, "Super_L"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_ALT) && (!strcmp(ev->keysymbol, "Super_R"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_WIN) && (!strcmp(ev->keysymbol, "Super_L"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_WIN) && (!strcmp(ev->keysymbol, "Super_R"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_WIN) && (!strcmp(ev->keysymbol, "Mode_switch"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_WIN) && (!strcmp(ev->keysymbol, "Meta_L"))) hold_count--;
+ else if ((hold_mod & ECORE_X_MODIFIER_WIN) && (!strcmp(ev->keysymbol, "Meta_R"))) hold_count--;
+ if (hold_count <= 0)
+ {
+ e_winlist_hide();
+ return 1;
+ }
+ }
+ e_bindings_key_up_event_handle(E_BINDING_CONTEXT_WINLIST,
+ E_OBJECT(winlist->zone), ev);
+ return 1;
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_winlist.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_winlist.h 7 Jun 2005 13:53:27 -0000 1.2
+++ e_winlist.h 12 Jun 2005 06:50:34 -0000 1.3
@@ -10,7 +10,7 @@
EAPI int e_winlist_init(void);
EAPI int e_winlist_shutdown(void);
-EAPI void e_winlist_show(E_Zone *zone);
+EAPI int e_winlist_show(E_Zone *zone);
EAPI void e_winlist_hide(void);
EAPI void e_winlist_next(void);
EAPI void e_winlist_prev(void);
|