add the focusDelay option
This commit is contained in:
parent
91e04979a6
commit
418095b48e
4 changed files with 39 additions and 3 deletions
|
@ -15,6 +15,7 @@
|
|||
<followMouse>no</followMouse>
|
||||
<focusLast>yes</focusLast>
|
||||
<focusLastOnDesktop>yes</focusLastOnDesktop>
|
||||
<focusDelay>150000</focusDelay>
|
||||
</focus>
|
||||
|
||||
<theme>
|
||||
|
|
|
@ -10,6 +10,7 @@ gboolean config_focus_new;
|
|||
gboolean config_focus_follow;
|
||||
gboolean config_focus_last;
|
||||
gboolean config_focus_last_on_desktop;
|
||||
guint config_focus_delay;
|
||||
|
||||
char *config_theme;
|
||||
|
||||
|
@ -205,6 +206,8 @@ static void parse_focus(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
|
|||
config_focus_last = parse_bool(doc, n);
|
||||
if ((n = parse_find_node("focusLastOnDesktop", node)))
|
||||
config_focus_last_on_desktop = parse_bool(doc, n);
|
||||
if ((n = parse_find_node("focusDelay", node)))
|
||||
config_focus_delay = parse_int(doc, n);
|
||||
}
|
||||
|
||||
static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
|
||||
|
@ -358,6 +361,7 @@ void config_startup(ObParseInst *i)
|
|||
config_focus_follow = FALSE;
|
||||
config_focus_last = TRUE;
|
||||
config_focus_last_on_desktop = TRUE;
|
||||
config_focus_delay = 150000;
|
||||
|
||||
parse_register(i, "focus", parse_focus, NULL);
|
||||
|
||||
|
|
|
@ -16,8 +16,9 @@ extern gboolean config_focus_follow;
|
|||
extern gboolean config_focus_last;
|
||||
/*! Focus the last focused window as a fallback when switching desktops */
|
||||
extern gboolean config_focus_last_on_desktop;
|
||||
/*! The number of slits to create
|
||||
extern int config_slit_number;*/
|
||||
/*! Timeout for focusing windows on focus follows mouse, in microseconds */
|
||||
extern guint config_focus_delay;
|
||||
|
||||
/*! When true windows' contents are refreshed while they are resized; otherwise
|
||||
they are not updated until the resize is complete */
|
||||
extern gboolean config_redraw_resize;
|
||||
|
|
|
@ -46,6 +46,9 @@ static void event_handle_dock(ObDock *s, XEvent *e);
|
|||
static void event_handle_dockapp(ObDockApp *app, XEvent *e);
|
||||
static void event_handle_client(ObClient *c, XEvent *e);
|
||||
|
||||
static gboolean focus_delay_func(gpointer data);
|
||||
static void focus_delay_client_dest(gpointer data);
|
||||
|
||||
#define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
|
||||
(e)->xfocus.detail == NotifyAncestor || \
|
||||
(e)->xfocus.detail > NotifyNonlinearVirtual)
|
||||
|
@ -137,10 +140,13 @@ void event_startup()
|
|||
#ifdef USE_LIBSN
|
||||
ob_main_loop_x_add(ob_main_loop, sn_handler, ob_sn_display, NULL);
|
||||
#endif
|
||||
|
||||
client_add_destructor(focus_delay_client_dest);
|
||||
}
|
||||
|
||||
void event_shutdown()
|
||||
{
|
||||
client_remove_destructor(focus_delay_client_dest);
|
||||
XFreeModifiermap(modmap);
|
||||
}
|
||||
|
||||
|
@ -648,6 +654,11 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
client->frame->close_hover = FALSE;
|
||||
frame_adjust_state(client->frame);
|
||||
break;
|
||||
case OB_FRAME_CONTEXT_FRAME:
|
||||
/* XXX if doing a 'reconfigure' make sure you kill this timer,
|
||||
maybe all timers.. */
|
||||
if (config_focus_delay)
|
||||
ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -690,7 +701,14 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
|||
ob_debug("EnterNotify on %lx, focusing window\n",
|
||||
client->window);
|
||||
#endif
|
||||
client_focus(client);
|
||||
if (config_focus_delay) {
|
||||
ob_main_loop_timeout_add(ob_main_loop,
|
||||
config_focus_delay,
|
||||
focus_delay_func,
|
||||
client,
|
||||
NULL);
|
||||
} else
|
||||
client_focus(client);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -1157,3 +1175,15 @@ static void event_handle_menu(XEvent *ev)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean focus_delay_func(gpointer data)
|
||||
{
|
||||
ObClient *c = data;
|
||||
client_focus(c);
|
||||
return FALSE; /* no repeat */
|
||||
}
|
||||
|
||||
static void focus_delay_client_dest(gpointer data)
|
||||
{
|
||||
ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue