X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=mod_menu%2Fgrabmenu.c;h=9192a95917d41fcdab3a559db6ff05babc2888ed;hb=ae4260bb64817c11f9a7140324cd3e3ba113e297;hp=cc94437677fb0c57cc915d444c236162b9feb5f8;hpb=8366314611bf30a0f31d25bf5f5023186fa87692;p=ion3.git diff --git a/mod_menu/grabmenu.c b/mod_menu/grabmenu.c index cc94437..9192a95 100644 --- a/mod_menu/grabmenu.c +++ b/mod_menu/grabmenu.c @@ -1,12 +1,9 @@ /* * 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 - * 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,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+1; 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; }