X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=00de8b36880e075ebef460e0b9da9bcf236a7d9a;hb=854b2ae68498133f3119ec614b725025af3fd66b;hp=96fe627505600f6587efc9391d2d4258ca0e89b0;hpb=33cc5724028121753bfc6e4fc51f3027864f9678;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 96fe6275..00de8b36 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -440,27 +440,28 @@ static void event_process(const XEvent *ec, gpointer data) } } -#if 1 /* focus debugging stuff */ if (e->type == FocusIn || e->type == FocusOut) { gint mode = e->xfocus.mode; gint detail = e->xfocus.detail; Window window = e->xfocus.window; if (detail == NotifyVirtual) { - ob_debug("FOCUS %s NOTIFY VIRTUAL window 0x%x\n", - (e->type == FocusIn ? "IN" : "OUT"), window); + ob_debug_type(OB_DEBUG_FOCUS, + "FOCUS %s NOTIFY VIRTUAL window 0x%x\n", + (e->type == FocusIn ? "IN" : "OUT"), window); } else if (detail == NotifyNonlinearVirtual) { - ob_debug("FOCUS %s NOTIFY NONLINVIRTUAL window 0x%x\n", - (e->type == FocusIn ? "IN" : "OUT"), window); + ob_debug_type(OB_DEBUG_FOCUS, + "FOCUS %s NOTIFY NONLINVIRTUAL window 0x%x\n", + (e->type == FocusIn ? "IN" : "OUT"), window); } else - ob_debug("UNKNOWN FOCUS %s (d %d, m %d) window 0x%x\n", - (e->type == FocusIn ? "IN" : "OUT"), - detail, mode, window); + ob_debug_type(OB_DEBUG_FOCUS, + "UNKNOWN FOCUS %s (d %d, m %d) window 0x%x\n", + (e->type == FocusIn ? "IN" : "OUT"), + detail, mode, window); } -#endif event_set_curtime(e); event_hack_mods(e); @@ -505,6 +506,11 @@ static void event_process(const XEvent *ec, gpointer data) xerror_set_ignore(FALSE); } + /* crossing events for menu */ + if (e->type == EnterNotify || e->type == LeaveNotify) + if (menu_frame_visible) + event_handle_menu(e); + /* user input (action-bound) events */ if (e->type == ButtonPress || e->type == ButtonRelease || e->type == MotionNotify || e->type == KeyPress || @@ -560,9 +566,11 @@ static void event_handle_root(XEvent *e) msgtype = e->xclient.message_type; if (msgtype == prop_atoms.net_current_desktop) { guint d = e->xclient.data.l[0]; - event_curtime = e->xclient.data.l[1]; - if (d < screen_num_desktops) + if (d < screen_num_desktops) { + event_curtime = e->xclient.data.l[1]; + ob_debug("SWITCH DESKTOP TIME: %d\n", event_curtime); screen_set_desktop(d); + } } else if (msgtype == prop_atoms.net_number_of_desktops) { guint d = e->xclient.data.l[0]; if (d > 0) @@ -676,18 +684,18 @@ static void event_handle_client(ObClient *client, XEvent *e) if (!XCheckIfEvent(ob_display, &ce, look_for_focusin, NULL)) { /* There is no FocusIn, this means focus went to a window that is not being managed, or a window on another screen. */ - ob_debug("Focus went to a black hole !\n"); + ob_debug_type(OB_DEBUG_FOCUS, "Focus went to a black hole !\n"); } else if (ce.xany.window == e->xany.window) { /* If focus didn't actually move anywhere, there is nothing to do*/ break; } else if (ce.xfocus.detail == NotifyPointerRoot || ce.xfocus.detail == NotifyDetailNone) { - ob_debug("Focus went to root\n"); + ob_debug_type(OB_DEBUG_FOCUS, "Focus went to root\n"); /* Focus has been reverted to the root window or nothing, so fall back to something other than the window which just had it. */ focus_fallback(FALSE); } else if (ce.xfocus.detail == NotifyInferior) { - ob_debug("Focus went to parent\n"); + ob_debug_type(OB_DEBUG_FOCUS, "Focus went to parent\n"); /* Focus has been reverted to parent, which is our frame window, or the root window, so fall back to something other than the window which had it. */ @@ -699,8 +707,9 @@ static void event_handle_client(ObClient *client, XEvent *e) if (ed.ignored) { /* The FocusIn was ignored, this means it was on a window that isn't a client. */ - ob_debug("Focus went to an unmanaged window 0x%x !\n", - ce.xfocus.window); + ob_debug_type(OB_DEBUG_FOCUS, + "Focus went to an unmanaged window 0x%x !\n", + ce.xfocus.window); focus_fallback(TRUE); } } @@ -778,21 +787,19 @@ static void event_handle_client(ObClient *client, XEvent *e) if (e->xcrossing.mode == NotifyGrab || e->xcrossing.mode == NotifyUngrab) { -#ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx IGNORED\n", - (e->type == EnterNotify ? "Enter" : "Leave"), - e->xcrossing.mode, - e->xcrossing.detail, client?client->window:0); -#endif + ob_debug_type(OB_DEBUG_FOCUS, + "%sNotify mode %d detail %d on %lx IGNORED\n", + (e->type == EnterNotify ? "Enter" : "Leave"), + e->xcrossing.mode, + e->xcrossing.detail, client?client->window:0); } else { -#ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx, " - "focusing window: %d\n", - (e->type == EnterNotify ? "Enter" : "Leave"), - e->xcrossing.mode, - e->xcrossing.detail, (client?client->window:0), - !nofocus); -#endif + ob_debug_type(OB_DEBUG_FOCUS, + "%sNotify mode %d detail %d on %lx, " + "focusing window: %d\n", + (e->type == EnterNotify ? "Enter" : "Leave"), + e->xcrossing.mode, + e->xcrossing.detail, (client?client->window:0), + !nofocus); if (!nofocus && config_focus_follow) event_enter_client(client); } @@ -908,14 +915,14 @@ static void event_handle_client(ObClient *client, XEvent *e) } break; case UnmapNotify: - ob_debug("UnmapNotify for window 0x%x eventwin 0x%x sendevent %d " - "ignores left %d\n", - client->window, e->xunmap.event, e->xunmap.from_configure, - client->ignore_unmaps); if (client->ignore_unmaps) { client->ignore_unmaps--; break; } + ob_debug("UnmapNotify for window 0x%x eventwin 0x%x sendevent %d " + "ignores left %d\n", + client->window, e->xunmap.event, e->xunmap.from_configure, + client->ignore_unmaps); client_unmanage(client); break; case DestroyNotify: @@ -1161,7 +1168,7 @@ static void event_handle_client(ObClient *client, XEvent *e) client_update_icons(client); } else if (msgtype == prop_atoms.net_wm_user_time) { - client_update_user_time(client, TRUE); + client_update_user_time(client); } else if (msgtype == prop_atoms.sm_client_id) { client_update_sm_client_id(client); @@ -1260,24 +1267,24 @@ static void event_handle_menu(XEvent *ev) menu_frame_hide_all(); } break; - case MotionNotify: - if ((f = menu_frame_under(ev->xmotion.x_root, - ev->xmotion.y_root))) { - if ((e = menu_entry_frame_under(ev->xmotion.x_root, - ev->xmotion.y_root))) { - /* XXX menu_frame_entry_move_on_screen(f); */ - menu_frame_select(f, e); - } + case EnterNotify: + if ((e = g_hash_table_lookup(menu_frame_map, &ev->xcrossing.window))) { + if (e->ignore_enters) + --e->ignore_enters; + else + menu_frame_select(e->frame, e); } - { - ObMenuFrame *a; - - a = find_active_menu(); - if (a && a != f && - a->selected->entry->type != OB_MENU_ENTRY_TYPE_SUBMENU) - { - menu_frame_select(a, NULL); - } + break; + case LeaveNotify: + if ((e = g_hash_table_lookup(menu_frame_map, &ev->xcrossing.window))) { + if (e->entry->type != OB_MENU_ENTRY_TYPE_SUBMENU) + menu_frame_select(e->frame, NULL); + } + case MotionNotify: + if ((e = menu_entry_frame_under(ev->xmotion.x_root, + ev->xmotion.y_root))) { + /* XXX menu_frame_entry_move_on_screen(f); */ + menu_frame_select(e->frame, e); } break; case KeyPress: @@ -1376,6 +1383,9 @@ void event_ignore_queued_enters() gboolean event_time_after(Time t1, Time t2) { + g_assert(t1 != CurrentTime); + g_assert(t2 != CurrentTime); + /* Timestamp values wrap around (after about 49.7 days). The server, given its current time is represented by timestamp T, always interprets @@ -1383,5 +1393,15 @@ gboolean event_time_after(Time t1, Time t2) later in time than T. - http://tronche.com/gui/x/xlib/input/pointer-grabbing.html */ - return t1 >= t2 && t1 <= t2 + (1 << (sizeof(Time)*8-1)); + + /* TIME_HALF is half of the number space of a Time type variable */ +#define TIME_HALF (Time)(1 << (sizeof(Time)*8-1)) + + if (t2 >= TIME_HALF) + /* t2 is in the second half so t1 might wrap around and be smaller than + t2 */ + return t1 >= t2 || t1 < (t2 + TIME_HALF); + else + /* t2 is in the first half so t1 has to come after it */ + return t1 >= t2 && t1 < (t2 + TIME_HALF); }