X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=14aa696bb119689bca9f110947b1c13fe857b682;hb=cfce98840ac138675971f8421032da9e0030ecc7;hp=f813d3f5cb2a45c9ad2672690b17698cf32a5520;hpb=62f8a5c49b852047bf6cc199d2d0c9add41d35a9;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index f813d3f5..14aa696b 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -638,7 +638,6 @@ static void event_process(const XEvent *ec, gpointer data) modifier map, and rebind all the key bindings as appropriate */ ob_debug("Keyboard map changed. Reloading keyboard bindings."); ob_set_state(OB_STATE_RECONFIGURING); - XRefreshKeyboardMapping(&e->xmapping); obt_keyboard_reload(); keyboard_rebind(); ob_set_state(OB_STATE_RUNNING); @@ -812,7 +811,7 @@ void event_enter_client(ObClient *client) obt_main_loop_timeout_remove(ob_main_loop, focus_delay_func); - data = g_new(ObFocusDelayData, 1); + data = g_slice_new(ObFocusDelayData); data->client = client; data->time = event_curtime; data->serial = event_curserial; @@ -847,7 +846,7 @@ void event_leave_client(ObClient *client) obt_main_loop_timeout_remove(ob_main_loop, unfocus_delay_func); - data = g_new(ObFocusDelayData, 1); + data = g_slice_new(ObFocusDelayData); data->client = client; data->time = event_curtime; data->serial = event_curserial; @@ -1358,11 +1357,23 @@ static void event_handle_client(ObClient *client, XEvent *e) (e->xclient.data.l[0] == 2 ? "user" : "INVALID")))); /* XXX make use of data.l[2] !? */ if (e->xclient.data.l[0] == 1 || e->xclient.data.l[0] == 2) { - event_curtime = e->xclient.data.l[1]; + /* we can not trust the timestamp from applications. + e.g. chromium passes a very old timestamp. openbox thinks + the window will get focus and calls XSetInputFocus with the + (old) timestamp, which doesn't end up moving focus at all. + but the window is raised, not hilited, etc, as if it was + really going to get focus. + + so do not use this timestamp in event_curtime, as this would + be used in XSetInputFocus. + */ + /*event_curtime = e->xclient.data.l[1];*/ if (e->xclient.data.l[1] == 0) ob_debug_type(OB_DEBUG_APP_BUGS, "_NET_ACTIVE_WINDOW message for window %s is" " missing a timestamp", client->title); + + event_curtime = event_get_server_time(); } else ob_debug_type(OB_DEBUG_APP_BUGS, "_NET_ACTIVE_WINDOW message for window %s is " @@ -1777,17 +1788,20 @@ static gboolean event_handle_menu_input(XEvent *ev) /* Allow control while going thru the menu */ else if (ev->type == KeyPress && (mods & ~ControlMask) == 0) { gunichar unikey; + KeySym sym; frame->got_press = TRUE; frame->press_keycode = ev->xkey.keycode; frame->press_doexec = FALSE; - if (ob_keycode_match(ev->xkey.keycode, OB_KEY_ESCAPE)) { + sym = obt_keyboard_keypress_to_keysym(ev); + + if (sym == XK_Escape) { menu_frame_hide_all(); ret = TRUE; } - else if (ob_keycode_match(ev->xkey.keycode, OB_KEY_LEFT)) { + else if (sym == XK_Left) { /* Left goes to the parent menu */ if (frame->parent) { /* remove focus from the child */ @@ -1799,7 +1813,7 @@ static gboolean event_handle_menu_input(XEvent *ev) ret = TRUE; } - else if (ob_keycode_match(ev->xkey.keycode, OB_KEY_RIGHT)) { + else if (sym == XK_Right) { /* Right goes to the selected submenu */ if (frame->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) { @@ -1810,28 +1824,37 @@ static gboolean event_handle_menu_input(XEvent *ev) ret = TRUE; } - else if (ob_keycode_match(ev->xkey.keycode, OB_KEY_UP)) { + else if (sym == XK_Up) { menu_frame_select_previous(frame); ret = TRUE; } - else if (ob_keycode_match(ev->xkey.keycode, OB_KEY_DOWN)) { + else if (sym == XK_Down) { menu_frame_select_next(frame); ret = TRUE; } - else if (ob_keycode_match(ev->xkey.keycode, OB_KEY_HOME)) { + else if (sym == XK_Home) { menu_frame_select_first(frame); ret = TRUE; } - else if (ob_keycode_match(ev->xkey.keycode, OB_KEY_END)) { + else if (sym == XK_End) { menu_frame_select_last(frame); ret = TRUE; } + else if (sym == XK_Return) { + frame->press_doexec = TRUE; + ret = TRUE; + } + /* keyboard accelerator shortcuts. (if it was a valid key) */ - else if ((unikey = obt_keyboard_keypress_to_unichar(&ev->xkey))) { + else if (frame->entries && + (unikey = + obt_keyboard_keypress_to_unichar(menu_frame_ic(frame), + ev))) + { GList *start; GList *it; ObMenuEntryFrame *found = NULL; @@ -1882,27 +1905,15 @@ static gboolean event_handle_menu_input(XEvent *ev) doesn't get sent to the focused application. Allow ControlMask only, and don't bother if the menu is empty */ - else if (ev->type == KeyRelease && (mods & ~ControlMask) == 0 && - frame->entries && frame->got_press) - { - if (ob_keycode_match(ev->xkey.keycode, OB_KEY_RETURN)) { - /* Enter runs the active item or goes into the submenu. - Control-Enter runs it without closing the menu. */ - if (frame->child) - menu_frame_select_next(frame->child); - else if (frame->selected) - menu_entry_frame_execute(frame->selected, ev->xkey.state); - - ret = TRUE; - } - + else if (ev->type == KeyRelease && (mods & ~ControlMask) == 0) { if (frame->press_keycode == ev->xkey.keycode && + frame->got_press && frame->press_doexec) { - if (frame->selected->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) - menu_entry_frame_execute(frame->selected, ev->xkey.state); - else + if (frame->child) menu_frame_select_next(frame->child); + else if (frame->selected) + menu_entry_frame_execute(frame->selected, ev->xkey.state); } } } @@ -1998,7 +2009,7 @@ static gboolean event_handle_user_input(ObClient *client, XEvent *e) static void focus_delay_dest(gpointer data) { - g_free(data); + g_slice_free(ObFocusDelayData, data); } static gboolean focus_delay_cmp(gconstpointer d1, gconstpointer d2) @@ -2060,7 +2071,7 @@ static void event_ignore_enter_range(gulong start, gulong end) g_assert(start != 0); g_assert(end != 0); - r = g_new(ObSerialRange, 1); + r = g_slice_new(ObSerialRange); r->start = start; r->end = end; ignore_serials = g_slist_prepend(ignore_serials, r); @@ -2095,7 +2106,7 @@ static gboolean is_enter_focus_event_ignored(gulong serial) if ((glong)(serial - r->end) > 0) { /* past the end */ ignore_serials = g_slist_delete_link(ignore_serials, it); - g_free(r); + g_slice_free(ObSerialRange, r); } else if ((glong)(serial - r->start) >= 0) return TRUE;