summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/event.c5
-rw-r--r--openbox/grab.c20
-rw-r--r--openbox/grab.h3
-rw-r--r--openbox/menuframe.c7
-rw-r--r--openbox/menuframe.h3
5 files changed, 35 insertions, 3 deletions
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 <glib.h>
#include <X11/Xlib.h>
@@ -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 <glib.h>
@@ -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);