gboolean ignored;
} ObEventData;
+typedef struct
+{
+ ObClient *client;
+ Time time;
+} ObFocusDelayData;
+
static void event_process(const XEvent *e, gpointer data);
static void event_client_dest(ObClient *client, gpointer data);
static void event_handle_root(XEvent *e);
static gboolean menu_can_hide;
+static ObFocusDelayData focus_delay_data = { .client = NULL,
+ .time = CurrentTime };
+
+
+
#ifdef USE_SM
static void ice_handler(gint fd, gpointer conn)
{
switch(e->type) {
case EnterNotify:
case LeaveNotify:
- if (e->xcrossing.detail == NotifyInferior)
- return TRUE;
- break;
+ return keyboard_interactively_grabbed();
case FocusIn:
case FocusOut:
/* I don't think this should ever happen with our event masks, but
ed->ignored = FALSE;
/* deal with it in the kernel */
- if (group)
+
+ if (menu_frame_visible &&
+ (e->type == EnterNotify || e->type == LeaveNotify))
+ {
+ /* crossing events for menu */
+ event_handle_menu(e);
+ } else if (group)
event_handle_group(group, e);
else if (client)
event_handle_client(client, e);
xerror_set_ignore(FALSE);
}
- /* crossing events for menu */
- if (e->type == EnterNotify || e->type == LeaveNotify)
- if (menu_frame_visible)
- event_handle_menu(e);
-
/* user input (action-bound) events */
if (e->type == ButtonPress || e->type == ButtonRelease ||
e->type == MotionNotify || e->type == KeyPress ||
if (client_normal(client) && client_can_focus(client)) {
if (config_focus_delay) {
ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
+
+ focus_delay_data.client = client;
+ focus_delay_data.time = event_curtime;
+
ob_main_loop_timeout_add(ob_main_loop,
config_focus_delay,
focus_delay_func,
- client, NULL);
- } else
- focus_delay_func(client);
+ NULL, NULL);
+ } else {
+ focus_delay_data.client = client;
+ focus_delay_data.time = event_curtime;
+ focus_delay_func(NULL);
+ }
}
}
frame_adjust_state(client->frame);
break;
case OB_FRAME_CONTEXT_FRAME:
- if (config_focus_follow && config_focus_delay)
- ob_main_loop_timeout_remove_data(ob_main_loop,
- focus_delay_func,
- client, TRUE);
+ if (config_focus_follow && config_focus_delay &&
+ focus_delay_data.client == client)
+ {
+ event_halt_focus_delay();
+ }
break;
default:
break;
{
menu_frame_select(e->frame, NULL);
}
+ case MotionNotify:
+ if ((e = menu_entry_frame_under(ev->xmotion.x_root,
+ ev->xmotion.y_root)))
+ menu_frame_select(e->frame, e);
+ break;
case KeyPress:
if (ev->xkey.keycode == ob_keycode(OB_KEY_ESCAPE))
menu_frame_hide_all();
static gboolean focus_delay_func(gpointer data)
{
- ObClient *c = data;
-
- if (focus_client != c) {
- if (client_focus(c) && config_focus_raise)
- client_raise(c);
+ Time old = event_curtime;
+ event_curtime = focus_delay_data.time;
+ if (focus_client != focus_delay_data.client) {
+ if (client_focus(focus_delay_data.client) && config_focus_raise)
+ client_raise(focus_delay_data.client);
}
+ event_curtime = old;
return FALSE; /* no repeat */
}
static void focus_delay_client_dest(ObClient *client, gpointer data)
{
- ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func,
- client, TRUE);
+ if (focus_delay_data.client == client)
+ event_halt_focus_delay();
}
static void event_client_dest(ObClient *client, gpointer data)
void event_halt_focus_delay()
{
+ focus_delay_data.client = NULL;
ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
}