]> git.decadent.org.uk Git - ion3.git/blobdiff - mod_menu/grabmenu.c
Imported Upstream version 20090110
[ion3.git] / mod_menu / grabmenu.c
index 79a01ce4b47ea926ebd37e6d66bfc1d81fdf5c0d..d490b3970a1f575db586ac3056f19a662fba5930 100644 (file)
@@ -1,12 +1,9 @@
 /*
  * ion/mod_menu/grabmenu.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2007
+ * Copyright (c) Tuomo Valkonen 1999-2009
  *
- * Ion is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
+ * See the included file LICENSE for details.
  */
 
 #include <libextl/extl.h>
@@ -17,6 +14,7 @@
 #include <ioncore/binding.h>
 #include <ioncore/conf-bindings.h>
 #include <ioncore/key.h>
+#include <ioncore/stacking.h>
 #include "menu.h"
 #include "mkmenu.h"
 
@@ -37,15 +35,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 +70,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;
@@ -75,9 +91,11 @@ WMenu *mod_menu_do_grabmenu(WMPlex *mplex, ExtlFn handler, ExtlTab tab,
     extl_table_gets_i(param, "initial", &(fnp.initial));
 
     par.flags=(MPLEX_ATTACH_SWITCHTO|
+               MPLEX_ATTACH_LEVEL|
                MPLEX_ATTACH_UNNUMBERED|
                MPLEX_ATTACH_SIZEPOLICY);
     par.szplcy=SIZEPOLICY_FULL_BOUNDS;
+    par.level=STACKING_LEVEL_MODAL1+2;
 
     menu=(WMenu*)mplex_do_attach_new(mplex, &par,
                                      (WRegionCreateFn*)create_menu,
@@ -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;
 }