Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        menus.c 


Log Message:
Do keybord menu navigation without pointer warping.
Do menu sliding more cleanly (block menu item events while sliding).

===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/menus.c,v
retrieving revision 1.130
retrieving revision 1.131
diff -u -3 -r1.130 -r1.131
--- menus.c     9 May 2004 12:12:20 -0000       1.130
+++ menus.c     9 May 2004 21:17:06 -0000       1.131
@@ -26,7 +26,12 @@
 #include <errno.h>
 #include <X11/keysym.h>
 
+#define MENU_ITEM_EVENT_MASK \
+       ButtonPressMask | ButtonReleaseMask | \
+       EnterWindowMask | LeaveWindowMask | PointerMotionMask
+
 static void         MenuRedraw(Menu * m);
+static void         MenuActivateItem(Menu * m, MenuItem * mi);
 static void         MenuDrawItem(Menu * m, MenuItem * mi, char shape);
 
 static void         FileMenuUpdate(int val, void *data);
@@ -134,12 +139,7 @@
    if (m->win)
       EUnmapWindow(disp, m->win);
 
-   if (m->sel_item)
-     {
-       m->sel_item->state = STATE_NORMAL;
-       MenuDrawItem(m, m->sel_item, 1);
-       m->sel_item = NULL;
-     }
+   MenuActivateItem(m, NULL);
 
    m->stuck = 0;
    m->shown = 0;
@@ -666,9 +666,7 @@
    maxx2 = 0;
    has_i = 0;
    has_s = 0;
-   att.event_mask =
-      ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask
-      | PointerMotionMask;
+   att.event_mask = MENU_ITEM_EVENT_MASK;
 
    for (i = 0; i < m->num; i++)
      {
@@ -2397,6 +2395,7 @@
    KeySym              key;
    Menu               *m;
    MenuItem           *mi;
+   EWin               *ewin;
 
    m = FindMenu(win);
    if (m == NULL)
@@ -2420,10 +2419,10 @@
      case XK_Down:
       check_next:
        mi = MenuFindNextItem(m, mi, 1);
-       goto check_warp;
+       goto check_activate;
      case XK_Up:
        mi = MenuFindNextItem(m, mi, -1);
-       goto check_warp;
+       goto check_activate;
      case XK_Left:
        mi = MenuFindParentItem(m);
        m = m->parent;
@@ -2434,17 +2433,25 @@
        m = mi->child;
        if (!m || m->num <= 0)
           break;
+       ewin = FindEwinByMenu(m);
+       if (ewin == NULL || ewin->state != EWIN_STATE_MAPPED)
+          break;
        mi = m->items[0];
        goto check_menu;
       check_menu:
        if (!m)
           break;
-       goto check_warp;
-      check_warp:
+       goto check_activate;
+      check_activate:
        if (!mi)
           break;
+       if (active_menu && active_item && active_menu != m)
+          MenuActivateItem(active_menu, NULL);
+       MenuActivateItem(m, mi);
+#if 0
        XWarpPointer(disp, None, mi->win, 0, 0, 0, 0, mi->text_w / 2,
                     mi->text_h / 2);
+#endif
        break;
      case XK_Return:
        if (!mi->act_id)
@@ -2583,10 +2590,31 @@
 };
 
 static void
+MenusSetEvents(int on)
+{
+   int                 i, j;
+   Menu               *m;
+   long                event_mask;
+
+   event_mask = (on) ? MENU_ITEM_EVENT_MASK : 0;
+
+   for (i = 0; i < Mode.cur_menu_depth; i++)
+     {
+       m = Mode.cur_menu[i];
+       if (!m)
+          continue;
+
+       for (j = 0; j < m->num; j++)
+          XSelectInput(disp, m->items[j]->win, event_mask);
+     }
+}
+
+static void
 SubmenuShowTimeout(int val, void *dat)
 {
    int                 mx, my;
    unsigned int        mw, mh;
+   MenuItem           *mi;
    EWin               *ewin2, *ewin;
    struct _mdata      *data;
 
@@ -2598,10 +2626,11 @@
    if (!FindEwinByMenu(data->m))
       return;
 
-   GetWinXY(data->mi->win, &mx, &my);
-   GetWinWH(data->mi->win, &mw, &mh);
-   MenuShow(data->mi->child, 1);
-   ewin2 = FindEwinByMenu(data->mi->child);
+   mi = data->mi;
+   GetWinXY(mi->win, &mx, &my);
+   GetWinWH(mi->win, &mw, &mh);
+   MenuShow(mi->child, 1);
+   ewin2 = FindEwinByMenu(mi->child);
    if (ewin2)
      {
        MoveEwin(ewin2,
@@ -2614,8 +2643,8 @@
        if (Conf.menuslide)
           UnShadeEwin(ewin2);
 
-       if (Mode.cur_menu[Mode.cur_menu_depth - 1] != data->mi->child)
-          Mode.cur_menu[Mode.cur_menu_depth++] = data->mi->child;
+       if (Mode.cur_menu[Mode.cur_menu_depth - 1] != mi->child)
+          Mode.cur_menu[Mode.cur_menu_depth++] = mi->child;
 
        if (Conf.menusonscreen)
          {
@@ -2649,37 +2678,38 @@
                              }
                         }
                    }
+
+                 /* Disable menu item events while sliding */
+                 MenusSetEvents(0);
                  SlideEwinsTo(menus, fx, fy, tx, ty, Mode.cur_menu_depth,
                               Conf.shadespeed);
+                 MenusSetEvents(1);
+
                  if (Conf.warpmenus)
-                    XWarpPointer(disp, None, None, 0, 0, 0, 0, xdist, ydist);
+                    XWarpPointer(disp, None, mi->win, 0, 0, 0, 0,
+                                 mi->text_w / 2, mi->text_h / 2);
               }
          }
      }
    val = 0;
 }
 
-int
-MenusEventMouseIn(XEvent * ev)
+static void
+MenuActivateItem(Menu * m, MenuItem * mi)
 {
    static struct _mdata mdata;
-   Window              win = ev->xcrossing.window;
-   Menu               *m;
-   MenuItem           *mi;
    int                 i, j;
 
-   m = FindMenuItem(win, &mi);
-   if (m == NULL)
-      return 0;
-   if (mi == NULL)
-      goto done;
+   if (m->sel_item)
+     {
+       m->sel_item->state = STATE_NORMAL;
+       MenuDrawItem(m, m->sel_item, 1);
+     }
 
-   PagerHideAllHi();
+   m->sel_item = mi;
 
-   if ((win == mi->icon_win) && (ev->xcrossing.detail == NotifyAncestor))
-      goto done;
-   if ((win == mi->win) && (ev->xcrossing.detail == NotifyInferior))
-      goto done;
+   if (mi == NULL)
+      return;
 
    mi->state = STATE_HILITED;
    MenuDrawItem(m, mi, 1);
@@ -2716,6 +2746,29 @@
             DoIn("SUBMENU_SHOW", 0.2, SubmenuShowTimeout, 0, &mdata);
          }
      }
+}
+
+int
+MenusEventMouseIn(XEvent * ev)
+{
+   Window              win = ev->xcrossing.window;
+   Menu               *m;
+   MenuItem           *mi;
+
+   m = FindMenuItem(win, &mi);
+   if (m == NULL)
+      return 0;
+   if (mi == NULL)
+      goto done;
+
+   PagerHideAllHi();
+
+   if ((win == mi->icon_win) && (ev->xcrossing.detail == NotifyAncestor))
+      goto done;
+   if ((win == mi->win) && (ev->xcrossing.detail == NotifyInferior))
+      goto done;
+
+   MenuActivateItem(m, mi);
 
  done:
    return 1;
@@ -2739,8 +2792,7 @@
    if ((win == mi->win) && (ev->xcrossing.detail == NotifyInferior))
       goto done;
 
-   mi->state = STATE_NORMAL;
-   MenuDrawItem(m, mi, 1);
+   MenuActivateItem(m, NULL);
 
  done:
    return 1;




-------------------------------------------------------
This SF.Net email is sponsored by Sleepycat Software
Learn developer strategies Cisco, Motorola, Ericsson & Lucent use to 
deliver higher performing products faster, at low TCO.
http://www.sleepycat.com/telcomwpreg.php?From=osdnemail3
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to