Remove unused variable
[dana/openbox.git] / openbox / event.c
index 0d67fce..ccbb56e 100644 (file)
@@ -273,7 +273,7 @@ static void event_set_curtime(XEvent *e)
        which can happen if the clock goes backwards, we erase the last
        specified user_time */
     if (t && event_last_user_time && event_time_after(event_last_user_time, t))
-        event_last_user_time = CurrentTime;
+        event_reset_user_time();
 
     event_sourcetime = CurrentTime;
     event_curtime = t;
@@ -698,7 +698,8 @@ static void event_process(const XEvent *ec, gpointer data)
     if (e->type == ButtonPress || e->type == ButtonRelease) {
         ObWindow *w;
         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... */
@@ -717,21 +718,24 @@ static void event_process(const XEvent *ec, gpointer data)
             if (prompt && !used)
                 used = event_handle_prompt(prompt, e);
 
-            if (e->type == ButtonPress) {
+            if (e->type == ButtonPress)
                 pressed = e->xbutton.button;
-                pressed_win = e->xbutton.subwindow;
-            }
         }
     }
     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 +810,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;
@@ -1103,7 +1110,9 @@ static void event_handle_client(ObClient *client, XEvent *e)
             if (grab_on_keyboard())
                 break;
             if (e->xcrossing.mode == NotifyGrab ||
-                e->xcrossing.mode == NotifyUngrab ||
+                (e->xcrossing.mode == NotifyUngrab &&
+                 /* ungrab enters are used when _under_ mouse is being used */
+                 !(config_focus_follow && config_focus_under_mouse)) ||
                 /*ignore enters when we're already in the window */
                 e->xcrossing.detail == NotifyInferior)
             {
@@ -1443,9 +1452,15 @@ static void event_handle_client(ObClient *client, XEvent *e)
                 ob_debug_type(OB_DEBUG_APP_BUGS,
                               "_NET_ACTIVE_WINDOW message for window %s is "
                               "missing source indication", client->title);
-            client_activate(client, FALSE, FALSE, TRUE, TRUE,
-                            (e->xclient.data.l[0] == 0 ||
-                             e->xclient.data.l[0] == 2));
+            /* TODO(danakj) This should use
+               (e->xclient.data.l[0] == 0 ||
+                e->xclient.data.l[0] == 2)
+               to determine if a user requested the activation, however GTK+
+               applications seem unable to make this distinction ever
+               (including panels such as xfce4-panel and gnome-panel).
+               So we are left just assuming all activations are from the user.
+            */
+            client_activate(client, FALSE, FALSE, TRUE, TRUE, TRUE);
         } else if (msgtype == OBT_PROP_ATOM(NET_WM_MOVERESIZE)) {
             ob_debug("net_wm_moveresize for 0x%lx direction %d",
                      client->window, e->xclient.data.l[2]);
@@ -1480,7 +1495,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;
 
@@ -1666,6 +1682,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.
@@ -1695,10 +1714,12 @@ static void event_handle_client(ObClient *client, XEvent *e)
                         client->shaped = ((XShapeEvent*)e)->shaped;
                         kind = ShapeBounding;
                         break;
+#ifdef ShapeInput
                     case ShapeInput:
                         client->shaped_input = ((XShapeEvent*)e)->shaped;
                         kind = ShapeInput;
                         break;
+#endif
                     default:
                         g_assert_not_reached();
                 }
@@ -1849,14 +1870,23 @@ static gboolean event_handle_menu_input(XEvent *ev)
                 ret = TRUE;
             }
 
-            else if (sym == XK_Right) {
-                /* Right goes to the selected submenu */
-                if (frame->selected &&
-                    frame->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
-                {
-                    /* make sure it is visible */
-                    menu_frame_select(frame, frame->selected, TRUE);
-                    menu_frame_select_next(frame->child);
+            else if (sym == XK_Right || sym == XK_Return || sym == XK_KP_Enter)
+            {
+                /* Right and enter goes to the selected submenu.
+                   Enter executes instead if it's not on a submenu. */
+
+                if (frame->selected) {
+                    const ObMenuEntryType t = frame->selected->entry->type;
+
+                    if (t == OB_MENU_ENTRY_TYPE_SUBMENU) {
+                        /* make sure it is visible */
+                        menu_frame_select(frame, frame->selected, TRUE);
+                        /* move focus to the child menu */
+                        menu_frame_select_next(frame->child);
+                    }
+                    else if (sym != XK_Right) {
+                        frame->press_doexec = TRUE;
+                    }
                 }
                 ret = TRUE;
             }
@@ -1881,11 +1911,6 @@ static gboolean event_handle_menu_input(XEvent *ev)
                 ret = TRUE;
             }
 
-            else if (sym == XK_Return || sym == XK_KP_Enter) {
-                frame->press_doexec = TRUE;
-                ret = TRUE;
-            }
-
             /* keyboard accelerator shortcuts. (if it was a valid key) */
             else if (frame->entries &&
                      (unikey =
@@ -1931,8 +1956,15 @@ static gboolean event_handle_menu_input(XEvent *ev)
                 if (found) {
                     menu_frame_select(frame, found, TRUE);
 
-                    if (num_found == 1)
-                        frame->press_doexec = TRUE;
+                    if (num_found == 1) {
+                        if (found->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) {
+                            /* move focus to the child menu */
+                            menu_frame_select_next(frame->child);
+                        }
+                        else {
+                            frame->press_doexec = TRUE;
+                        }
+                    }
                     ret = TRUE;
                 }
             }
@@ -1947,9 +1979,7 @@ static gboolean event_handle_menu_input(XEvent *ev)
                 frame->got_press &&
                 frame->press_doexec)
             {
-                if (frame->child)
-                    menu_frame_select_next(frame->child);
-                else if (frame->selected)
+                if (frame->selected)
                     menu_entry_frame_execute(frame->selected, ev->xkey.state);
             }
         }
@@ -1973,6 +2003,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)
@@ -2202,7 +2246,7 @@ gboolean event_time_after(guint32 t1, guint32 t2)
 gboolean find_timestamp(XEvent *e, gpointer data)
 {
     const Time t = event_get_timestamp(e);
-    if (t >= event_curtime) {
+    if (t && t >= event_curtime) {
         event_curtime = t;
         return TRUE;
     }
@@ -2246,3 +2290,13 @@ void event_reset_time(void)
 {
     next_time();
 }
+
+void event_update_user_time(void)
+{
+    event_last_user_time = event_time();
+}
+
+void event_reset_user_time(void)
+{
+    event_last_user_time = CurrentTime;
+}