/*
* ion/mod_menu/grabmenu.c
*
- * Copyright (c) Tuomo Valkonen 1999-2006.
+ * Copyright (c) Tuomo Valkonen 1999-2007.
*
* 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
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,
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;
(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;
}