all repos — openbox @ 418095b48ea33dfce904a0250f1659a6a0feeb78

openbox fork - make it a bit more like ryudo

add the focusDelay option
Dana Jansens danakj@orodu.net
commit

418095b48ea33dfce904a0250f1659a6a0feeb78

parent

91e04979a675a75d3f20de98bf070c9fb1d8f3fa

4 files changed, 39 insertions(+), 3 deletions(-)

jump to
M data/rc.xmldata/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.copenbox/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.hopenbox/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.copenbox/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); +}