/* 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))
*/
if (!focus_left_screen)
- focus_fallback(TRUE);
+ focus_fallback(TRUE, FALSE);
}
}
else if (!client)
client_bring_helper_windows(client);
}
} else if (e->type == FocusOut) {
- gboolean nomove = FALSE;
XEvent ce;
/* Look for the followup FocusIn */
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);
}
}
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;
client_update_sync_request_counter(client);
}
#endif
+ break;
case ColormapNotify:
client_update_colormap(client, e->xcolormap.colormap);
break;
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);