Select the menu item under the mouse when the mouse is moved (Fix bug 5237)
[dana/openbox.git] / openbox / event.c
index 2dde132..15a7a47 100644 (file)
@@ -700,6 +700,8 @@ static void event_process(const XEvent *ec, gpointer data)
         static guint pressed = 0;
         static Window pressed_win = None;
 
+        event_sourcetime = event_curtime;
+
         /* If the button press was on some non-root window, or was physically
            on the root window... */
         if (window != obt_root(ob_screen) ||
@@ -726,12 +728,17 @@ static void event_process(const XEvent *ec, gpointer data)
     else if (e->type == KeyPress || e->type == KeyRelease ||
              e->type == MotionNotify)
     {
+        event_sourcetime = event_curtime;
+
         used = event_handle_user_input(client, e);
 
         if (prompt && !used)
             used = event_handle_prompt(prompt, e);
     }
 
+    /* show any debug prompts that are queued */
+    ob_debug_show_prompts();
+
     /* if something happens and it's not from an XEvent, then we don't know
        the time, so clear it here until the next event is handled */
     event_curtime = event_sourcetime = CurrentTime;
@@ -806,11 +813,14 @@ void event_enter_client(ObClient *client)
     g_assert(config_focus_follow);
 
     if (is_enter_focus_event_ignored(event_curserial)) {
-        ob_debug_type(OB_DEBUG_FOCUS, "Ignoring enter event with serial %lu\n"
+        ob_debug_type(OB_DEBUG_FOCUS, "Ignoring enter event with serial %lu "
                       "on client 0x%x", event_curserial, client->window);
         return;
     }
 
+    ob_debug_type(OB_DEBUG_FOCUS, "using enter event with serial %lu "
+                  "on client 0x%x", event_curserial, client->window);
+
     if (client_enter_focusable(client) && client_can_focus(client)) {
         if (config_focus_delay) {
             ObFocusDelayData *data;
@@ -1488,7 +1498,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
             }
             else if ((Atom)e->xclient.data.l[2] ==
                      OBT_PROP_ATOM(NET_WM_MOVERESIZE_CANCEL))
-                moveresize_end(TRUE);
+                if (moveresize_client)
+                    moveresize_end(TRUE);
         } else if (msgtype == OBT_PROP_ATOM(NET_MOVERESIZE_WINDOW)) {
             gint ograv, x, y, w, h;
 
@@ -1674,6 +1685,9 @@ static void event_handle_client(ObClient *client, XEvent *e)
                 event_last_user_time = t;
             }
         }
+        else if (msgtype == OBT_PROP_ATOM(NET_WM_WINDOW_OPACITY)) {
+            client_update_opacity(client);
+        }
 #ifdef SYNC
         else if (msgtype == OBT_PROP_ATOM(NET_WM_SYNC_REQUEST_COUNTER)) {
             /* if they are resizing right now this would cause weird behaviour.
@@ -1992,6 +2006,20 @@ static void event_handle_menu(ObMenuFrame *frame, XEvent *ev)
     ObMenuEntryFrame *e;
 
     switch (ev->type) {
+    case MotionNotify:
+        // We need to catch MotionNotify in addition to EnterNotify because
+        // it is possible for the menu to be opened under the mouse cursor, and
+        // moving the mouse should select the item.
+        if ((e = g_hash_table_lookup(menu_frame_map, &ev->xmotion.window))) {
+            if (e->ignore_enters)
+                --e->ignore_enters;
+            else if (!(f = find_active_menu()) ||
+                     f == e->frame ||
+                     f->parent == e->frame ||
+                     f->child == e->frame)
+                menu_frame_select(e->frame, e, FALSE);
+        }
+        break;
     case EnterNotify:
         if ((e = g_hash_table_lookup(menu_frame_map, &ev->xcrossing.window))) {
             if (e->ignore_enters)