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
focus_fallback(TRUE);
}
}
+
+ 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)
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;
}
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 */
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;
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);
}
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);