static void focus_cycle_destructor(ObClient *client, gpointer data)
{
- /* end cycling if the target disappears */
+ /* end cycling if the target disappears. CurrentTime is fine, time won't
+ be used
+ */
if (focus_cycle_target == client)
- focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
+ focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime);
}
static Window createWindow(Window parent, gulong mask,
focus_indicator.right.obwin.type = Window_Internal;
focus_indicator.bottom.obwin.type = Window_Internal;
- attr.save_under = True;
attr.override_redirect = True;
attr.background_pixel = BlackPixel(ob_display, ob_screen);
focus_indicator.top.win =
createWindow(RootWindow(ob_display, ob_screen),
- CWOverrideRedirect | CWBackPixel | CWSaveUnder,
- &attr);
+ CWOverrideRedirect | CWBackPixel, &attr);
focus_indicator.left.win =
createWindow(RootWindow(ob_display, ob_screen),
- CWOverrideRedirect | CWBackPixel | CWSaveUnder,
- &attr);
+ CWOverrideRedirect | CWBackPixel, &attr);
focus_indicator.right.win =
createWindow(RootWindow(ob_display, ob_screen),
- CWOverrideRedirect | CWBackPixel | CWSaveUnder,
- &attr);
+ CWOverrideRedirect | CWBackPixel, &attr);
focus_indicator.bottom.win =
createWindow(RootWindow(ob_display, ob_screen),
- CWOverrideRedirect | CWBackPixel | CWSaveUnder,
- &attr);
+ CWOverrideRedirect | CWBackPixel, &attr);
stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.top));
stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.left));
XSync(ob_display, FALSE);
}
- /* in the middle of cycling..? kill it. */
+ /* in the middle of cycling..? kill it. CurrentTime is fine, time won't
+ be used.
+ */
if (focus_cycle_target)
- focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
+ focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime);
old = focus_client;
focus_client = client;
active = client ? client->window : None;
PROP_SET32(RootWindow(ob_display, ob_screen),
net_active_window, window, active);
+
+ /* remove hiliting from the window when it gets focused */
+ if (client != NULL)
+ client_hilite(client, FALSE);
}
}
return NULL;
}
-ObClient* focus_fallback_target(ObFocusFallbackType type)
+ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old)
{
GList *it;
- ObClient *old = NULL;
ObClient *target = NULL;
- old = focus_client;
-
if ((type == OB_FOCUS_FALLBACK_UNFOCUSING
|| type == OB_FOCUS_FALLBACK_CLOSED) && old) {
if (old->transient_for) {
if (!config_focus_follow || config_focus_last)
trans = TRUE;
else {
- if ((target = client_under_pointer()) &&
- client_search_transient
- (client_search_top_transient(target), old))
- {
- trans = TRUE;
+ if ((target = client_under_pointer())) {
+ GSList *sit;
+
+ sit = client_search_top_transients(target);
+ for (; sit; sit = g_slist_next(sit))
+ if (client_search_transient(sit->data, old)) {
+ trans = TRUE;
+ break;
+ }
}
}
void focus_fallback(ObFocusFallbackType type)
{
ObClient *new;
+ ObClient *old = focus_client;
/* unfocus any focused clients.. they can be focused by Pointer events
and such, and then when I try focus them, I won't get a FocusIn event
*/
focus_set_client(NULL);
- if ((new = focus_fallback_target(type)))
+ if ((new = focus_fallback_target(type, old)))
client_focus(new);
}
gint wt, wl, wr, wb;
wt = wl = wr = wb = MAX(3,
- ob_rr_theme->handle_height +
- ob_rr_theme->bwidth * 2);
+ MAX(1, MAX(ob_rr_theme->paddingx,
+ ob_rr_theme->paddingy)) * 2 +
+ ob_rr_theme->fbwidth * 2);
x = focus_cycle_target->frame->area.x;
y = focus_cycle_target->frame->area.y;
ft->type == OB_CLIENT_TYPE_MENU ||
ft->type == OB_CLIENT_TYPE_UTILITY))) &&
((ft->can_focus || ft->focus_notify) &&
- !ft->skip_taskbar &&
+ !ft->skip_pager &&
(ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)) &&
ft == client_focus_target(ft))
return TRUE;
}
void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
- gboolean dialog, gboolean done, gboolean cancel)
+ gboolean dialog, gboolean done, gboolean cancel, Time time)
{
static ObClient *first = NULL;
static ObClient *t = NULL;
done_cycle:
if (done && focus_cycle_target)
- client_activate(focus_cycle_target, FALSE, TRUE);
+ client_activate(focus_cycle_target, FALSE, TRUE, time);
t = NULL;
first = NULL;
}
void focus_directional_cycle(ObDirection dir, gboolean interactive,
- gboolean dialog, gboolean done, gboolean cancel)
+ gboolean dialog, gboolean done, gboolean cancel,
+ Time time)
{
static ObClient *first = NULL;
ObClient *ft = NULL;
done_cycle:
if (done && focus_cycle_target)
- client_activate(focus_cycle_target, FALSE, TRUE);
+ client_activate(focus_cycle_target, FALSE, TRUE, time);
first = NULL;
focus_cycle_target = NULL;