/*
* ion/mod_menu/grabmenu.c
*
- * Copyright (c) Tuomo Valkonen 1999-2007.
+ * Copyright (c) Tuomo Valkonen 1999-2008.
*
- * 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>
#include <ioncore/binding.h>
#include <ioncore/conf-bindings.h>
#include <ioncore/key.h>
+#include <ioncore/stacking.h>
#include "menu.h"
#include "mkmenu.h"
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,
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;
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+1;
menu=(WMenu*)mplex_do_attach_new(mplex, &par,
(WRegionCreateFn*)create_menu,
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;
}