static gboolean focus_delay_func(gpointer data);
static void focus_delay_client_dest(gpointer data);
+static gboolean menu_hide_delay_func(gpointer data);
+
#define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
(e)->xfocus.detail == NotifyAncestor || \
(e)->xfocus.detail > NotifyNonlinearVirtual)
static ObClient *focus_delay_client;
+static gboolean menu_can_hide;
+
#ifdef USE_SM
static void ice_handler(int fd, gpointer conn)
{
if (menu_frame_visible)
event_handle_menu(e);
else {
- if (!keyboard_process_interactive_grab(e)) {
+ if (!keyboard_process_interactive_grab(e, &client)) {
if (moveresize_in_progress)
moveresize_event(e);
+ menu_can_hide = FALSE;
+ ob_main_loop_timeout_add(ob_main_loop,
+ G_USEC_PER_SEC / 4,
+ menu_hide_delay_func,
+ NULL, NULL);
+
if (e->type == ButtonPress || e->type == ButtonRelease ||
e->type == MotionNotify)
mouse_event(client, e);
causes the window which appears to be focused to be
the one on which the actions will be executed */
keyboard_event((focus_cycle_target ?
- focus_cycle_target : client), e);
+ focus_cycle_target :
+ (client ? client : focus_client)), e);
}
}
}
/* Wheel buttons don't draw because they are an instant click, so it
is a waste of resources to go drawing it. */
if (!(e->xbutton.button == 4 || e->xbutton.button == 5)) {
- switch (frame_context(client, e->xbutton.window)) {
+ con = frame_context(client, e->xbutton.window);
+ con = mouse_button_frame_context(con, e->xbutton.button);
+ switch (con) {
case OB_FRAME_CONTEXT_MAXIMIZE:
client->frame->max_press = (e->type == ButtonPress);
framerender_frame(client->frame);
switch (ev->type) {
case ButtonRelease:
- if (!(f = menu_frame_under(ev->xbutton.x_root,
- ev->xbutton.y_root)))
+ if ((e = menu_entry_frame_under(ev->xbutton.x_root,
+ ev->xbutton.y_root)))
+ menu_entry_frame_execute(e, ev->xbutton.state);
+ else if (menu_can_hide)
menu_frame_hide_all();
- else {
- if ((e = menu_entry_frame_under(ev->xbutton.x_root,
- ev->xbutton.y_root)))
- menu_entry_frame_execute(e, ev->xbutton.state);
- }
break;
case MotionNotify:
if ((f = menu_frame_under(ev->xmotion.x_root,
}
}
+static gboolean menu_hide_delay_func(gpointer data)
+{
+ menu_can_hide = TRUE;
+ return FALSE; /* no repeat */
+}
+
static gboolean focus_delay_func(gpointer data)
{
client_focus(focus_delay_client);