X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=849d87e36235ef35856b3513c084878662529d62;hb=0e9bd66b75725b4d6632eafcaeb34b9fe310e4ea;hp=43a283cdd27926cb22e80ec7c13ed70be85e1fde;hpb=7a1a6da8495bb56bb938bacd58a4d52bf08a2974;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 43a283cd..849d87e3 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -56,10 +56,9 @@ typedef struct gpointer data; } Destructor; -GList *client_list = NULL; +GList *client_list = NULL; static GSList *client_destructors = NULL; -static Time client_last_user_time = CurrentTime; static void client_get_all(ObClient *self); static void client_toggle_border(ObClient *self, gboolean show); @@ -272,13 +271,14 @@ void client_manage(Window window) self->wmstate = WithdrawnState; /* make sure it gets updated first time */ self->layer = -1; self->desktop = screen_num_desktops; /* always an invalid value */ - self->user_time = client_last_user_time; + self->user_time = CurrentTime; client_get_all(self); - client_restore_session_state(self); /* per-app settings override stuff, and return the settings for other uses too */ settings = client_get_settings_state(self); + /* the session should get the last say */ + client_restore_session_state(self); client_calc_layer(self); @@ -402,9 +402,12 @@ void client_manage(Window window) mouse_grab_for_client(self, TRUE); if (activate) { + guint32 last_time = focus_client ? + focus_client->user_time : CurrentTime; + /* This is focus stealing prevention */ ob_debug("Want to focus new window 0x%x with time %u (last time %u)\n", - self->window, self->user_time, client_last_user_time); + self->window, self->user_time, last_time); /* If a nothing at all, or a parent was focused, then focus this always @@ -414,8 +417,8 @@ void client_manage(Window window) else { /* If time stamp is old, don't steal focus */ - if (self->user_time && - !event_time_after(self->user_time, client_last_user_time)) + if (self->user_time && last_time && + !event_time_after(self->user_time, last_time)) { activate = FALSE; } @@ -435,7 +438,7 @@ void client_manage(Window window) } else { ob_debug("Focus stealing prevention activated for %s with time %u " "(last time %u)\n", - self->title, self->user_time, client_last_user_time); + self->title, self->user_time, last_time); /* if the client isn't focused, then hilite it so the user knows it is there */ client_hilite(self, TRUE); @@ -690,7 +693,7 @@ static ObAppSettings *client_get_settings_state(ObClient *self) if (settings->desktop < screen_num_desktops || settings->desktop == DESKTOP_ALL) - client_set_desktop(self, settings->desktop, TRUE); + self->desktop = settings->desktop; if (settings->layer == -1) { self->below = TRUE; @@ -948,7 +951,7 @@ static void client_get_all(ObClient *self) client_update_sm_client_id(self); client_update_strut(self); client_update_icons(self); - client_update_user_time(self, FALSE); + client_update_user_time(self); } static void client_get_startup_id(ObClient *self) @@ -1851,27 +1854,21 @@ void client_update_icons(ObClient *self) frame_adjust_icon(self->frame); } -void client_update_user_time(ObClient *self, gboolean new_event) +void client_update_user_time(ObClient *self) { guint32 time; if (PROP_GET32(self->window, net_wm_user_time, cardinal, &time)) { - self->user_time = time; /* we set this every time, not just when it grows, because in practice sometimes time goes backwards! (ntpdate.. yay....) so.. if it goes backward we don't want all windows to stop focusing. we'll just assume noone is setting times older than the last one, cuz that would be pretty stupid anyways - However! This is called when a window is mapped to get its user time - but it's an old number, it's not changing it from new user - interaction, so in that case, don't change the last user time. */ - if (new_event) - client_last_user_time = time; + self->user_time = time; /* ob_debug("window %s user time %u\n", self->title, time); - ob_debug("last user time %u\n", client_last_user_time); */ } } @@ -2398,10 +2395,12 @@ void client_configure_full(ObClient *self, ObCorner anchor, /* find the client's position relative to the root window */ oldrx = self->root_pos.x; oldry = self->root_pos.y; - rootmoved = (oldrx != (self->frame->area.x + self->frame->size.left - - self->border_width) || - oldry != (self->frame->area.y + self->frame->size.top - - self->border_width)); + rootmoved = (oldrx != (signed)(self->frame->area.x + + self->frame->size.left - + self->border_width) || + oldry != (signed)(self->frame->area.y + + self->frame->size.top - + self->border_width)); if (force_reply || ((!user || (user && final)) && rootmoved)) { @@ -3064,16 +3063,19 @@ static void client_unfocus(ObClient *self) void client_activate(ObClient *self, gboolean here, gboolean user) { + guint32 last_time = focus_client ? focus_client->user_time : CurrentTime; + /* XXX do some stuff here if user is false to determine if we really want to activate it or not (a parent or group member is currently active)? */ ob_debug("Want to activate window 0x%x with time %u (last time %u), " "source=%s\n", - self->window, event_curtime, client_last_user_time, + self->window, event_curtime, last_time, (user ? "user" : "application")); - if (!user && event_curtime && - !event_time_after(event_curtime, client_last_user_time)) + + if (!user && event_curtime && last_time && + !event_time_after(event_curtime, last_time)) { client_hilite(self, TRUE); } else { @@ -3339,7 +3341,7 @@ GSList *client_search_all_top_parents(ObClient *self) for (it = self->group->members; it; it = g_slist_next(it)) { ObClient *c = it->data; - if (!c->transient_for) + if (!c->transient_for && client_normal(c)) ret = g_slist_prepend(ret, c); }