]> git.decadent.org.uk Git - ion3.git/blobdiff - mod_menu/grabmenu.c
Imported Upstream version 20090110
[ion3.git] / mod_menu / grabmenu.c
index cc94437677fb0c57cc915d444c236162b9feb5f8..d490b3970a1f575db586ac3056f19a662fba5930 100644 (file)
@@ -1,12 +1,9 @@
 /*
  * ion/mod_menu/grabmenu.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * 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,13 +35,25 @@ static bool grabmenu_handler(WRegion *reg, XEvent *xev)
     if(reg==NULL)
         return FALSE;
     
-    if(menu->gm_state==ev->state && 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,
@@ -53,12 +63,25 @@ WMenu *mod_menu_do_grabmenu(WMPlex *mplex, ExtlFn handler, ExtlTab tab,
     WMPlexAttachParams par;
     WMenu *menu;
     XKeyEvent *ev;
+    uint state, kcb;
+    bool sub;
     
-    ev=ioncore_current_key_event();
-    
-    if(ev==NULL)
+    if(!ioncore_current_key(&kcb, &state, &sub))
         return NULL;
     
+    if(state==0){
+        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;
     fnp.tab=tab;
     fnp.pmenu_mode=FALSE;
@@ -68,21 +91,24 @@ 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,
                                      (void*)&fnp); 
     
     if(menu==NULL)
-        return FALSE;
+        return NULL;
  
-    menu->gm_kcb=ev->keycode;
-    menu->gm_state=ev->state;
+    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;
 }