X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=bb2490868249473813470d1a81ee24de0c40cfae;hb=078f6e5ad0641372bb3c656b588f6c325fb64db0;hp=868712c1fe53209ea28322b007e22315251a4a36;hpb=7cf4c970ae89f06aa77345900f96a310400c8595;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 868712c1..bb249086 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -343,6 +343,9 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only) /* This means focus was taken by a keyboard/mouse grab. */ if (mode == NotifyGrab) return FALSE; + /* This means focus was grabbed on a window and it was released. */ + if (mode == NotifyUngrab) + return FALSE; /* Focus left the root window revertedto state */ if (win == RootWindow(ob_display, ob_screen)) @@ -516,7 +519,7 @@ static void event_process(const XEvent *ec, gpointer data) */ if (!focus_left_screen) - focus_fallback(TRUE); + focus_fallback(TRUE, FALSE); } } else if (!client) @@ -526,10 +529,7 @@ static void event_process(const XEvent *ec, gpointer data) /* If you send focus to a window and then it disappears, you can get the FocusIn for it, after it is unmanaged. - Just wait for the next FocusOut/FocusIn pair, but note that - nothing is focused now. - */ - focus_set_client(NULL); + Just wait for the next FocusOut/FocusIn pair. */ } else if (client != focus_client) { focus_left_screen = FALSE; @@ -539,16 +539,8 @@ static void event_process(const XEvent *ec, gpointer data) client_bring_helper_windows(client); } } else if (e->type == FocusOut) { - gboolean nomove = FALSE; XEvent ce; - if (client) { - frame_adjust_focus(client->frame, FALSE); - /* focus_set_client(NULL) has already been called in this - section or by focus_fallback */ - client_calc_layer(client); - } - /* Look for the followup FocusIn */ if (!XCheckIfEvent(ob_display, &ce, event_look_for_focusin, NULL)) { /* There is no FocusIn, this means focus went to a window that @@ -581,9 +573,16 @@ static void event_process(const XEvent *ec, gpointer data) ob_debug_type(OB_DEBUG_FOCUS, "Focus went to an unmanaged window 0x%x !\n", ce.xfocus.window); - focus_fallback(TRUE); + focus_fallback(TRUE, FALSE); } } + + if (client && client != focus_client) { + frame_adjust_focus(client->frame, FALSE); + /* focus_set_client(NULL) has already been called in this + section or by focus_fallback */ + client_calc_layer(client); + } } else if (timewinclients) event_handle_user_time_window_clients(timewinclients, e); else if (client) @@ -998,26 +997,22 @@ static void event_handle_client(ObClient *client, XEvent *e) also you can't compress stacking events */ - gint x, y, w, h; + gint x, y, w, h, b; gboolean move = FALSE; gboolean resize = FALSE; + gboolean border = FALSE; /* get the current area */ RECT_TO_DIMS(client->area, x, y, w, h); + b = client->border_width; ob_debug("ConfigureRequest desktop %d wmstate %d visibile %d\n", screen_desktop, client->wmstate, client->frame->visible); if (e->xconfigurerequest.value_mask & CWBorderWidth) if (client->border_width != e->xconfigurerequest.border_width) { - client->border_width = e->xconfigurerequest.border_width; - - /* if the border width is changing then that is the same - as requesting a resize, but we don't actually change - the client's border, so it will change their root - coordiantes (since they include the border width) and - we need to a notify then */ - move = TRUE; + b = e->xconfigurerequest.border_width; + border = TRUE; } @@ -1117,17 +1112,21 @@ static void event_handle_client(ObClient *client, XEvent *e) notify is sent or not */ } - if (move || resize) { + if (move || resize || border) { gint lw,lh; - client_find_onscreen(client, &x, &y, w, h, FALSE); - client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE); + if (move || resize) { + client_find_onscreen(client, &x, &y, w, h, FALSE); + client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE); + } /* if they requested something that moves the window, or if the window is actually being changed then configure it and send a configure notify to them */ - if (move || !RECT_EQUAL_DIMS(client->area, x, y, w, h)) { + if (move || !RECT_EQUAL_DIMS(client->area, x, y, w, h) || + border) + { ob_debug("Doing configure\n"); - client_configure(client, x, y, w, h, FALSE, TRUE); + client_configure(client, x, y, w, h, b, FALSE, TRUE); } /* ignore enter events caused by these like ob actions do */ @@ -1332,7 +1331,8 @@ static void event_handle_client(ObClient *client, XEvent *e) client_find_onscreen(client, &x, &y, w, h, FALSE); - client_configure(client, x, y, w, h, FALSE, TRUE); + client_configure(client, x, y, w, h, client->border_width, + FALSE, TRUE); client->gravity = ograv; @@ -1458,6 +1458,7 @@ static void event_handle_client(ObClient *client, XEvent *e) client_update_sync_request_counter(client); } #endif + break; case ColormapNotify: client_update_colormap(client, e->xcolormap.colormap); break; @@ -1569,7 +1570,7 @@ static gboolean event_handle_menu_keyboard(XEvent *ev) Control-Enter runs it without closing the menu. */ if (frame->child) menu_frame_select_next(frame->child); - else + else if (frame->selected) menu_entry_frame_execute(frame->selected, state, ev->xkey.time); } @@ -1591,8 +1592,8 @@ static gboolean event_handle_menu_keyboard(XEvent *ev) menu_frame_select_next(frame); } - /* keyboard accelerator shortcuts. */ - else if (ev->xkey.state == 0 && + /* keyboard accelerator shortcuts. (allow controlmask) */ + else if ((ev->xkey.state & ~ControlMask) == 0 && /* was it a valid key? */ unikey != 0 && /* don't bother if the menu is empty. */ @@ -1840,6 +1841,25 @@ static gboolean is_enter_focus_event_ignored(XEvent *e) return FALSE; } +void event_cancel_all_key_grabs() +{ + if (keyboard_interactively_grabbed()) + keyboard_interactive_cancel(); + else if (menu_frame_visible) + menu_frame_hide_all(); + else if (grab_on_keyboard()) + ungrab_keyboard(); + else + /* If we don't have the keyboard grabbed, then ungrab it with + XUngrabKeyboard, so that there is not a passive grab left + on from the KeyPress. If the grab is left on, and focus + moves during that time, it will be NotifyWhileGrabbed, and + applications like to ignore those! */ + if (!keyboard_interactively_grabbed()) + XUngrabKeyboard(ob_display, CurrentTime); + +} + gboolean event_time_after(Time t1, Time t2) { g_assert(t1 != CurrentTime);