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;
}
/* 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;
/*! 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)
{
return t;
}
+static Window grab_window(void)
+{
+ return screen_support_win;
+}
+
gboolean grab_on_keyboard(void)
{
return kgrabs > 0;
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)
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),
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());
#define __grab_h
#include "misc.h"
+#include "obt/keyboard.h"
#include <glib.h>
#include <X11/Xlib.h>
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,
}
}
+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)
{
#include "geom.h"
#include "window.h"
#include "obrender/render.h"
+#include "obt/keyboard.h"
#include <glib.h>
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);