]> git.decadent.org.uk Git - ion3.git/blobdiff - mod_menu/grabmenu.c
[svn-upgrade] Integrating new upstream version, ion3 (20070318)
[ion3.git] / mod_menu / grabmenu.c
index 79a01ce4b47ea926ebd37e6d66bfc1d81fdf5c0d..05e801f56b417acea18cb76ed52842f908c05a3e 100644 (file)
@@ -37,15 +37,25 @@ static bool grabmenu_handler(WRegion *reg, XEvent *xev)
     if(reg==NULL)
         return FALSE;
     
-    if((menu->gm_state==ev->state || menu->gm_state==AnyModifier) 
-       && ev->keycode==menu->gm_kcb){
-        menu_select_next(menu);
+    if(ev->keycode==menu->gm_kcb){
+        if(menu->gm_state==ev->state)
+            menu_select_next(menu);
+        else if((menu->gm_state|ShiftMask)==ev->state)
+            menu_select_prev(menu);
+        else if(menu->gm_state==AnyModifier)
+            menu_select_next(menu);
     }
     
     return FALSE;
 }
 
 
+static void grabkilled_handler(WRegion *reg)
+{
+    destroy_obj((Obj*)reg);
+}
+
+
 /*--lowlevel routine not to be called by the user--*/
 EXTL_EXPORT
 WMenu *mod_menu_do_grabmenu(WMPlex *mplex, ExtlFn handler, ExtlTab tab,
@@ -62,8 +72,16 @@ WMenu *mod_menu_do_grabmenu(WMPlex *mplex, ExtlFn handler, ExtlTab tab,
         return NULL;
     
     if(state==0){
-        /* TODO: cycle key? */
-        return mod_menu_do_menu(mplex, handler, tab, param);
+        WMenu *menu=mod_menu_do_menu(mplex, handler, tab, param);
+        /*
+        if(menu!=NULL && cycle!=extl_fn_none()){
+            uint kcb, state; 
+        
+            menu->cycle_bindmap=region_add_cycle_bindmap((WRegion*)menu,
+                                                         kcb, state, ???,
+                                                         ???);
+        }*/
+        return menu;
     }
     
     fnp.handler=handler;
@@ -89,7 +107,8 @@ WMenu *mod_menu_do_grabmenu(WMPlex *mplex, ExtlFn handler, ExtlTab tab,
     menu->gm_kcb=kcb;
     menu->gm_state=state;
     
-    ioncore_grab_establish((WRegion*)menu, grabmenu_handler, NULL, 0);
+    ioncore_grab_establish((WRegion*)menu, grabmenu_handler, 
+                           grabkilled_handler, 0);
     
     return menu;
 }