event_handle_menu(e);
} else if (e->type == FocusIn) {
if (e->xfocus.detail == NotifyPointerRoot ||
- e->xfocus.detail == NotifyDetailNone)
+ e->xfocus.detail == NotifyDetailNone ||
+ e->xfocus.detail == NotifyInferior)
{
- ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none\n");
- /* Focus has been reverted to the root window or nothing.
- FocusOut events come after UnmapNotify, so we don't need to
- worry about focusing an invalid window
- */
- if (!focus_left_screen)
- focus_fallback(TRUE);
- } else if (e->xfocus.detail == NotifyInferior) {
+ XEvent ce;
ob_debug_type(OB_DEBUG_FOCUS,
- "Focus went to root or our frame window");
- /* Focus has been given to the root window. */
- focus_fallback(TRUE);
+ "Focus went to pointer root/none or to our frame "
+ "window\n");
+
+ /* If another FocusIn is in the queue then don't fallback yet. This
+ fixes the fun case of:
+ window map -> send focusin
+ window unmap -> get focusout
+ window map -> send focusin
+ get first focus out -> fall back to something (new window
+ hasn't received focus yet, so something else) -> send focusin
+ which means the "something else" is the last thing to get a
+ focusin sent to it, so the new window doesn't end up with focus.
+ */
+ if (XCheckIfEvent(ob_display, &ce, look_for_focusin, NULL)) {
+ XPutBackEvent(ob_display, &ce);
+ ob_debug_type(OB_DEBUG_FOCUS,
+ " but another FocusIn is coming\n");
+ } else {
+ /* Focus has been reverted to the root window, nothing, or to
+ our frame window.
+
+ FocusOut events come after UnmapNotify, so we don't need to
+ worry about focusing an invalid window
+ */
+
+ /* In this case we know focus is in our screen */
+ if (e->xfocus.detail == NotifyInferior)
+ focus_left_screen = FALSE;
+
+ if (!focus_left_screen)
+ focus_fallback(TRUE);
+ }
} else if (client && client != focus_client) {
focus_left_screen = FALSE;
frame_adjust_focus(client->frame, TRUE);
ob_debug_type(OB_DEBUG_APP_BUGS,
"_NET_CURRENT_DESKTOP message is missing "
"a timestamp\n");
- screen_set_desktop(d);
+ screen_set_desktop(d, TRUE);
}
} else if (msgtype == prop_atoms.net_number_of_desktops) {
guint d = e->xclient.data.l[0];
ObMenuEntryFrame *e = it->data;
gunichar entrykey = 0;
- if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
- e->entry->data.normal.enabled)
+ if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL)
entrykey = e->entry->data.normal.shortcut;
else if (e->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
entrykey = e->entry->data.submenu.submenu->shortcut;
num_found == 1)
{
menu_frame_select(frame, found, TRUE);
- usleep(50000);
+ usleep(50000); /* highlight the item for a short bit so the
+ user can see what happened */
menu_entry_frame_execute(found, state, ev->xkey.time);
} else {
menu_frame_select(frame, found, TRUE);