add the focusDelay option

This commit is contained in:
Dana Jansens 2003-09-03 08:12:07 +00:00
parent 91e04979a6
commit 418095b48e
4 changed files with 39 additions and 3 deletions

View file

@ -15,6 +15,7 @@
<followMouse>no</followMouse> <followMouse>no</followMouse>
<focusLast>yes</focusLast> <focusLast>yes</focusLast>
<focusLastOnDesktop>yes</focusLastOnDesktop> <focusLastOnDesktop>yes</focusLastOnDesktop>
<focusDelay>150000</focusDelay>
</focus> </focus>
<theme> <theme>

View file

@ -10,6 +10,7 @@ gboolean config_focus_new;
gboolean config_focus_follow; gboolean config_focus_follow;
gboolean config_focus_last; gboolean config_focus_last;
gboolean config_focus_last_on_desktop; gboolean config_focus_last_on_desktop;
guint config_focus_delay;
char *config_theme; char *config_theme;
@ -205,6 +206,8 @@ static void parse_focus(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
config_focus_last = parse_bool(doc, n); config_focus_last = parse_bool(doc, n);
if ((n = parse_find_node("focusLastOnDesktop", node))) if ((n = parse_find_node("focusLastOnDesktop", node)))
config_focus_last_on_desktop = parse_bool(doc, n); 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, 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_follow = FALSE;
config_focus_last = TRUE; config_focus_last = TRUE;
config_focus_last_on_desktop = TRUE; config_focus_last_on_desktop = TRUE;
config_focus_delay = 150000;
parse_register(i, "focus", parse_focus, NULL); parse_register(i, "focus", parse_focus, NULL);

View file

@ -16,8 +16,9 @@ extern gboolean config_focus_follow;
extern gboolean config_focus_last; extern gboolean config_focus_last;
/*! Focus the last focused window as a fallback when switching desktops */ /*! Focus the last focused window as a fallback when switching desktops */
extern gboolean config_focus_last_on_desktop; extern gboolean config_focus_last_on_desktop;
/*! The number of slits to create /*! Timeout for focusing windows on focus follows mouse, in microseconds */
extern int config_slit_number;*/ extern guint config_focus_delay;
/*! When true windows' contents are refreshed while they are resized; otherwise /*! When true windows' contents are refreshed while they are resized; otherwise
they are not updated until the resize is complete */ they are not updated until the resize is complete */
extern gboolean config_redraw_resize; extern gboolean config_redraw_resize;

View file

@ -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_dockapp(ObDockApp *app, XEvent *e);
static void event_handle_client(ObClient *c, 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 || \ #define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
(e)->xfocus.detail == NotifyAncestor || \ (e)->xfocus.detail == NotifyAncestor || \
(e)->xfocus.detail > NotifyNonlinearVirtual) (e)->xfocus.detail > NotifyNonlinearVirtual)
@ -137,10 +140,13 @@ void event_startup()
#ifdef USE_LIBSN #ifdef USE_LIBSN
ob_main_loop_x_add(ob_main_loop, sn_handler, ob_sn_display, NULL); ob_main_loop_x_add(ob_main_loop, sn_handler, ob_sn_display, NULL);
#endif #endif
client_add_destructor(focus_delay_client_dest);
} }
void event_shutdown() void event_shutdown()
{ {
client_remove_destructor(focus_delay_client_dest);
XFreeModifiermap(modmap); XFreeModifiermap(modmap);
} }
@ -648,6 +654,11 @@ static void event_handle_client(ObClient *client, XEvent *e)
client->frame->close_hover = FALSE; client->frame->close_hover = FALSE;
frame_adjust_state(client->frame); frame_adjust_state(client->frame);
break; 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: default:
break; break;
} }
@ -690,7 +701,14 @@ static void event_handle_client(ObClient *client, XEvent *e)
ob_debug("EnterNotify on %lx, focusing window\n", ob_debug("EnterNotify on %lx, focusing window\n",
client->window); client->window);
#endif #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; break;
@ -1157,3 +1175,15 @@ static void event_handle_menu(XEvent *ev)
break; 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);
}