]> Dogcows Code - chaz/openbox/commitdiff
make menu input work with the new obt keyboard stuff.
authorDana Jansens <danakj@orodu.net>
Thu, 11 Feb 2010 19:17:59 +0000 (14:17 -0500)
committerDana Jansens <danakj@orodu.net>
Thu, 11 Feb 2010 19:17:59 +0000 (14:17 -0500)
create an Input Context for use during keyboard grabs, and use this to
  translate KeyPress events properly.
make the menu respond to KeyPress events, since these are the only ones that
  can be translated properly, but still execute things from KeyRelease events

openbox/event.c
openbox/grab.c
openbox/grab.h
openbox/menuframe.c
openbox/menuframe.h

index f813d3f5cb2a45c9ad2672690b17698cf32a5520..a4943f46fa0048a20af2271bddaa0e362cce6241 100644 (file)
@@ -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;
index e797e44ce9ad62e88ab2edc49ed128725bb72019..f82592f3473fc962b2b0fce10b23a9a912c8abf0 100644 (file)
@@ -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());
index 8253637329f69456e49c939ac887be8abffa2c4b..c4fe17c2a5918c95fc50c3669e240275db0eb1ae 100644 (file)
@@ -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,
index b80bac9123e6722acb21d18a5535bb24c080b265..ac033f4b44756a4432741fde0046fbd3561fa0bd 100644 (file)
@@ -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)
 {
index 8f124ed6f037c71278e1535957a2427bcac042b8..44c02562220a983128b6fe2d36dcec3f7cb06510 100644 (file)
@@ -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);
This page took 0.036718 seconds and 4 git commands to generate.