X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=15a7a4790569a5d510b9f59c701a9cbdbcc3e21f;hb=2391410e3fd7767e266c0efe84fd34244ea29dc6;hp=ba39ef9f562d9844ec8eae01885f17c2239341c9;hpb=2e82715a4a53fbab6d359c76aa58581c4087ddaf;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index ba39ef9f..15a7a479 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -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. @@ -1945,8 +1959,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; } } @@ -1985,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)