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);




-------------------------------------------------------
This SF.Net email is sponsored by: NEC IT Guy Games.  How far can you shotput
a projector? How fast can you ride your desk chair down the office luge track?
If you want to score the big prize, get to know the little guy.  
Play to win an NEC 61" plasma display: http://www.necitguy.com/?r=20
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to