add the focusDelay option
Dana Jansens danakj@orodu.net
4 files changed,
39 insertions(+),
3 deletions(-)
M
data/rc.xml
→
data/rc.xml
@@ -15,6 +15,7 @@ <focusNew>yes</focusNew>
<followMouse>no</followMouse> <focusLast>yes</focusLast> <focusLastOnDesktop>yes</focusLastOnDesktop> + <focusDelay>150000</focusDelay> </focus> <theme>
M
openbox/config.c
→
openbox/config.c
@@ -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 @@ if ((n = parse_find_node("focusLast", 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 @@ config_focus_new = TRUE;
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);
M
openbox/config.h
→
openbox/config.h
@@ -16,8 +16,9 @@ /*! Focus the last focused window as a fallback */
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;
M
openbox/event.c
→
openbox/event.c
@@ -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 @@
#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 @@ case OB_FRAME_CONTEXT_CLOSE:
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 @@ #ifdef DEBUG_FOCUS
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 @@ }
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); +}