X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=6b0ecdd7b04304ff88ec5bc6d4e6dbac46625656;hb=040d344a89f40487de8a1920e0aaeccd93a6a995;hp=cd5625990e9fa31ea1cac9f4863a6fb97bfe8f64;hpb=2b80e4e8ef56bb4fba614139601e750344418e5b;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index cd562599..6b0ecdd7 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -74,6 +74,7 @@ typedef struct { ObClient *client; Time time; + gulong serial; } ObFocusDelayData; typedef struct @@ -246,7 +247,6 @@ static void event_set_curtime(XEvent *e) event_last_user_time = CurrentTime; event_curtime = t; - event_curserial = 0; } static void event_hack_mods(XEvent *e) @@ -705,30 +705,9 @@ static void event_process(const XEvent *ec, gpointer data) /* Otherwise only process it if it was physically on an openbox internal window */ else { - Window target, parent, root, *children; - unsigned int nchildren; ObWindow *w; - /* Find the top level ancestor of the subwindow, besides the - root */ - target = e->xbutton.subwindow; - ob_debug("subwindow 0x%x\n", target); - while (XQueryTree(ob_display, target, &root, &parent, &children, - &nchildren) != 0) - { - XFree(children); - if (parent == root) { - ob_debug("parent is root\n"); - break; - } - target = parent; - } - ob_debug("toplevel 0x%x\n", target); - - w = g_hash_table_lookup(window_map, &target); - ob_debug("w 0x%x\n", w); - - if ((w = g_hash_table_lookup(window_map, &target)) && + if ((w = g_hash_table_lookup(window_map, &e->xbutton.subwindow)) && WINDOW_IS_INTERNAL(w)) { event_handle_user_input(client, e); @@ -742,6 +721,7 @@ static void event_process(const XEvent *ec, gpointer data) /* if something happens and it's not from an XEvent, then we don't know the time */ event_curtime = CurrentTime; + event_curserial = 0; } static void event_handle_root(XEvent *e) @@ -816,6 +796,7 @@ void event_enter_client(ObClient *client) data = g_new(ObFocusDelayData, 1); data->client = client; data->time = event_curtime; + data->serial = event_curserial; ob_main_loop_timeout_add(ob_main_loop, config_focus_delay * 1000, @@ -825,6 +806,7 @@ void event_enter_client(ObClient *client) ObFocusDelayData data; data.client = client; data.time = event_curtime; + data.serial = event_curserial; focus_delay_func(&data); } } @@ -1689,6 +1671,8 @@ static gboolean event_handle_menu_keyboard(XEvent *ev) /* Allow control while going thru the menu */ else if (ev->type == KeyPress && (state & ~ControlMask) == 0) { + frame->got_press = TRUE; + if (keycode == ob_keycode(OB_KEY_ESCAPE)) { menu_frame_hide_all(); ret = TRUE; @@ -1722,7 +1706,7 @@ static gboolean event_handle_menu_keyboard(XEvent *ev) Allow ControlMask only, and don't bother if the menu is empty */ else if (ev->type == KeyRelease && (state & ~ControlMask) == 0 && - frame->entries) + frame->entries && frame->got_press) { if (keycode == ob_keycode(OB_KEY_RETURN)) { /* Enter runs the active item or goes into the submenu. @@ -1912,6 +1896,7 @@ static gboolean focus_delay_func(gpointer data) if (menu_frame_visible || moveresize_in_progress) return FALSE; event_curtime = d->time; + event_curserial = d->serial; if (client_focus(d->client) && config_focus_raise) stacking_raise(CLIENT_AS_WINDOW(d->client)); event_curtime = old; @@ -1924,7 +1909,7 @@ static void focus_delay_client_dest(ObClient *client, gpointer data) client, FALSE); } -void event_halt_focus_delay(gulong serial) +void event_halt_focus_delay() { /* ignore all enter events up till the event which caused this to occur */ if (event_curserial) event_ignore_enter_range(1, event_curserial); @@ -1933,7 +1918,6 @@ void event_halt_focus_delay(gulong serial) gulong event_start_ignore_all_enters(void) { - /* increment the serial so we don't ignore events we weren't meant to */ XSync(ob_display, FALSE); return LastKnownRequestProcessed(ob_display); } @@ -1959,6 +1943,7 @@ static void event_ignore_enter_range(gulong start, gulong end) void event_end_ignore_all_enters(gulong start) { + XSync(ob_display, FALSE); event_ignore_enter_range(start, LastKnownRequestProcessed(ob_display)); }