X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=mod_menu%2Fgrabmenu.c;h=9192a95917d41fcdab3a559db6ff05babc2888ed;hb=ae4260bb64817c11f9a7140324cd3e3ba113e297;hp=79a01ce4b47ea926ebd37e6d66bfc1d81fdf5c0d;hpb=803afbc1cd633f6c025bcd9537e9b7e9aedadd0d;p=ion3.git diff --git a/mod_menu/grabmenu.c b/mod_menu/grabmenu.c index 79a01ce..9192a95 100644 --- a/mod_menu/grabmenu.c +++ b/mod_menu/grabmenu.c @@ -3,10 +3,7 @@ * * 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 - * 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 @@ -17,6 +14,7 @@ #include #include #include +#include #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+1; 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; }