all repos — openbox @ 08269cefbce2fe600269c989f9a6a22a98641ba1

openbox fork - make it a bit more like ryudo

make menu input work with the new obt keyboard stuff.

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
Dana Jansens danakj@orodu.net
commit

08269cefbce2fe600269c989f9a6a22a98641ba1

parent

62f8a5c49b852047bf6cc199d2d0c9add41d35a9

5 files changed, 35 insertions(+), 3 deletions(-)

jump to
M openbox/event.copenbox/event.c

@@ -1782,6 +1782,9 @@ frame->got_press = TRUE;

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 @@ 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;
M openbox/grab.copenbox/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 @@ t = CurrentTime; /*grab_time;*/

return t; } +static Window grab_window(void) +{ + return screen_support_win; +} + gboolean grab_on_keyboard(void) { return kgrabs > 0;

@@ -68,13 +74,18 @@ {

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 ret = FALSE;

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 @@ mask_list[i++] = num | scroll;

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());
M openbox/grab.hopenbox/grab.h

@@ -20,12 +20,15 @@ #ifndef __grab_h

#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 */
M openbox/menuframe.copenbox/menuframe.c

@@ -155,6 +155,13 @@ g_free(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) {
M openbox/menuframe.hopenbox/menuframe.h

@@ -23,6 +23,7 @@

#include "geom.h" #include "window.h" #include "obrender/render.h" +#include "obt/keyboard.h" #include <glib.h>

@@ -112,6 +113,8 @@ ObMenuFrame* menu_frame_new(struct _ObMenu *menu,

guint show_from, 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,