diff --git a/openbox/event.c b/openbox/event.c index f813d3f5..a4943f46 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -1782,6 +1782,9 @@ static gboolean event_handle_menu_input(XEvent *ev) frame->press_keycode = ev->xkey.keycode; frame->press_doexec = FALSE; + unikey = obt_keyboard_keypress_to_unichar(menu_frame_ic(frame), + &ev->xkey); + if (ob_keycode_match(ev->xkey.keycode, OB_KEY_ESCAPE)) { menu_frame_hide_all(); ret = TRUE; @@ -1831,7 +1834,7 @@ static gboolean event_handle_menu_input(XEvent *ev) } /* keyboard accelerator shortcuts. (if it was a valid key) */ - else if ((unikey = obt_keyboard_keypress_to_unichar(&ev->xkey))) { + else if (unikey) { GList *start; GList *it; ObMenuEntryFrame *found = NULL; diff --git a/openbox/grab.c b/openbox/grab.c index e797e44c..f82592f3 100644 --- a/openbox/grab.c +++ b/openbox/grab.c @@ -40,6 +40,7 @@ static guint pgrabs = 0; /*! The time at which the last grab was made */ static Time grab_time = CurrentTime; static gint passive_count = 0; +static ObtIC *ic = NULL; static Time ungrab_time(void) { @@ -58,6 +59,11 @@ static Time ungrab_time(void) return t; } +static Window grab_window(void) +{ + return screen_support_win; +} + gboolean grab_on_keyboard(void) { return kgrabs > 0; @@ -68,13 +74,18 @@ gboolean grab_on_pointer(void) return pgrabs > 0; } +ObtIC *grab_input_context(void) +{ + return ic; +} + gboolean grab_keyboard_full(gboolean grab) { gboolean ret = FALSE; if (grab) { if (kgrabs++ == 0) { - ret = XGrabKeyboard(obt_display, obt_root(ob_screen), + ret = XGrabKeyboard(obt_display, grab_window(), False, GrabModeAsync, GrabModeAsync, event_curtime) == Success; if (!ret) @@ -102,7 +113,7 @@ gboolean grab_pointer_full(gboolean grab, gboolean owner_events, if (grab) { if (pgrabs++ == 0) { - ret = XGrabPointer(obt_display, screen_support_win, owner_events, + ret = XGrabPointer(obt_display, grab_window(), owner_events, GRAB_PTR_MASK, GrabModeAsync, GrabModeAsync, (confine ? obt_root(ob_screen) : None), @@ -157,10 +168,15 @@ void grab_startup(gboolean reconfig) mask_list[i++] = caps | scroll; mask_list[i++] = num | caps | scroll; g_assert(i == MASK_LIST_SIZE); + + ic = obt_keyboard_context_new(obt_root(ob_screen), grab_window()); } void grab_shutdown(gboolean reconfig) { + obt_keyboard_context_unref(ic); + ic = NULL; + if (reconfig) return; while (ungrab_keyboard()); diff --git a/openbox/grab.h b/openbox/grab.h index 82536373..c4fe17c2 100644 --- a/openbox/grab.h +++ b/openbox/grab.h @@ -20,6 +20,7 @@ #define __grab_h #include "misc.h" +#include "obt/keyboard.h" #include #include @@ -27,6 +28,8 @@ void grab_startup(gboolean reconfig); void grab_shutdown(gboolean reconfig); +ObtIC *grab_input_context(void); + gboolean grab_keyboard_full(gboolean grab); /*! @param confine If true the pointer is confined to the screen */ gboolean grab_pointer_full(gboolean grab, gboolean owner_events, diff --git a/openbox/menuframe.c b/openbox/menuframe.c index b80bac91..ac033f4b 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -155,6 +155,13 @@ void menu_frame_free(ObMenuFrame *self) } } +ObtIC* menu_frame_ic(ObMenuFrame *self) +{ + /* menus are always used through a grab right now, so they can always use + the grab input context */ + return grab_input_context(); +} + static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry, ObMenuFrame *frame) { diff --git a/openbox/menuframe.h b/openbox/menuframe.h index 8f124ed6..44c02562 100644 --- a/openbox/menuframe.h +++ b/openbox/menuframe.h @@ -23,6 +23,7 @@ #include "geom.h" #include "window.h" #include "obrender/render.h" +#include "obt/keyboard.h" #include @@ -113,6 +114,8 @@ ObMenuFrame* menu_frame_new(struct _ObMenu *menu, struct _ObClient *client); void menu_frame_free(ObMenuFrame *self); +ObtIC* menu_frame_ic(ObMenuFrame *self); + void menu_frame_move(ObMenuFrame *self, gint x, gint y); void menu_frame_move_on_screen(ObMenuFrame *self, gint x, gint y, gint *dx, gint *dy);