fix focus when starting up, especially when replacing another instance of openbox
adds a function event_reset_time() that forces event_time() to look for a new (future) timestamp
This commit is contained in:
parent
ab7673c816
commit
9a826d8c3d
3 changed files with 27 additions and 12 deletions
|
@ -98,13 +98,13 @@ static gboolean focus_delay_func(gpointer data);
|
|||
static gboolean unfocus_delay_func(gpointer data);
|
||||
static void focus_delay_client_dest(ObClient *client, gpointer data);
|
||||
|
||||
Time event_last_user_time;
|
||||
Time event_last_user_time = CurrentTime;
|
||||
|
||||
/*! The time of the current X event (if it had a timestamp) */
|
||||
static Time event_curtime;
|
||||
static Time event_curtime = CurrentTime;
|
||||
/*! The source time that started the current X event (user-provided, so not
|
||||
to be trusted) */
|
||||
static Time event_sourcetime;
|
||||
static Time event_sourcetime = CurrentTime;
|
||||
|
||||
/*! The serial of the current X event */
|
||||
static gulong event_curserial;
|
||||
|
@ -146,10 +146,6 @@ void event_startup(gboolean reconfig)
|
|||
#endif
|
||||
|
||||
client_add_destroy_notify(focus_delay_client_dest, NULL);
|
||||
|
||||
event_curtime = CurrentTime;
|
||||
event_sourcetime = CurrentTime;
|
||||
event_last_user_time = CurrentTime;
|
||||
}
|
||||
|
||||
void event_shutdown(gboolean reconfig)
|
||||
|
@ -2210,7 +2206,7 @@ gboolean event_time_after(guint32 t1, guint32 t2)
|
|||
gboolean find_timestamp(XEvent *e, gpointer data)
|
||||
{
|
||||
const Time t = event_get_timestamp(e);
|
||||
if (t != CurrentTime) {
|
||||
if (t > event_curtime) {
|
||||
event_curtime = t;
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -2218,10 +2214,8 @@ gboolean find_timestamp(XEvent *e, gpointer data)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
Time event_time(void)
|
||||
static Time next_time(void)
|
||||
{
|
||||
if (event_curtime) return event_curtime;
|
||||
|
||||
/* Some events don't come with timestamps :(
|
||||
...but we can get one anyways >:) */
|
||||
|
||||
|
@ -2240,7 +2234,19 @@ Time event_time(void)
|
|||
return event_curtime;
|
||||
}
|
||||
|
||||
Time event_time(void)
|
||||
{
|
||||
if (event_curtime) return event_curtime;
|
||||
|
||||
return next_time();
|
||||
}
|
||||
|
||||
Time event_source_time(void)
|
||||
{
|
||||
return event_sourcetime;
|
||||
}
|
||||
|
||||
void event_reset_time(void)
|
||||
{
|
||||
next_time();
|
||||
}
|
||||
|
|
|
@ -68,6 +68,11 @@ gboolean event_time_after(guint32 t1, guint32 t2);
|
|||
is a time at or after it, but at or before any other events we will process
|
||||
*/
|
||||
Time event_time(void);
|
||||
|
||||
/*! Force event_time() to skip the current timestamp and look for the next
|
||||
one. */
|
||||
void event_reset_time(void);
|
||||
|
||||
/*! A time at which an event happened that caused this current event to be
|
||||
generated. This is a user-provided time and not to be trusted.
|
||||
Returns CurrentTime if there was no source time provided.
|
||||
|
|
|
@ -213,6 +213,11 @@ gint main(gint argc, gchar **argv)
|
|||
XC_top_left_corner);
|
||||
|
||||
if (screen_annex()) { /* it will be ours! */
|
||||
|
||||
/* get a timestamp from after taking over as the WM. if we use the
|
||||
old timestamp to set focus it can fail when replacing another WM. */
|
||||
event_reset_time();
|
||||
|
||||
do {
|
||||
ObPrompt *xmlprompt = NULL;
|
||||
|
||||
|
@ -317,7 +322,6 @@ gint main(gint argc, gchar **argv)
|
|||
|
||||
/* get all the existing windows */
|
||||
window_manage_all();
|
||||
focus_nothing();
|
||||
|
||||
/* focus what was focused if a wm was already running */
|
||||
if (OBT_PROP_GET32(obt_root(ob_screen),
|
||||
|
|
Loading…
Reference in a new issue