@@ 220,7 220,7 @@ static void destroylayersurfacenotify(struct wl_listener *listener, void *data);
static void destroynotify(struct wl_listener *listener, void *data);
static void destroyxdeco(struct wl_listener *listener, void *data);
static Monitor *dirtomon(int dir);
-static void focusclient(Client *old, Client *c, int lift);
+static void focusclient(Client *c, int lift);
static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
static Client *focustop(Monitor *m);
@@ 630,7 630,7 @@ buttonpress(struct wl_listener *listener, void *data)
case WLR_BUTTON_PRESSED:;
/* Change focus if the button was _pressed_ over a client */
if ((c = xytoclient(cursor->x, cursor->y)))
- focusclient(selclient(), c, 1);
+ focusclient(c, 1);
keyboard = wlr_seat_get_keyboard(seat);
mods = wlr_keyboard_get_modifiers(keyboard);
@@ 708,7 708,7 @@ cleanupmon(struct wl_listener *listener, void *data)
do // don't switch to disabled mons
selmon = wl_container_of(mons.prev, selmon, link);
while (!selmon->wlr_output->enabled && i++ < nmons);
- focusclient(selclient(), focustop(selmon), 1);
+ focusclient(focustop(selmon), 1);
closemon(m);
free(m);
}
@@ 1039,9 1039,10 @@ dirtomon(int dir)
}
void
-focusclient(Client *old, Client *c, int lift)
+focusclient(Client *c, int lift)
{
struct wlr_keyboard *kb = wlr_seat_get_keyboard(seat);
+ struct wlr_surface *old = seat->keyboard_state.focused_surface;
/* Raise client in stacking order if requested */
if (c && lift) {
@@ 1050,17 1051,19 @@ focusclient(Client *old, Client *c, int lift)
}
/* Nothing else to do? */
- if (c == old)
+ if (c && WLR_SURFACE(c) == old)
return;
/* Deactivate old client if focus is changing */
- if (c != old && old) {
+ if (old && (!c || WLR_SURFACE(c) != old)) {
+ if (wlr_surface_is_xdg_surface(old))
+ wlr_xdg_toplevel_set_activated(
+ wlr_xdg_surface_from_wlr_surface(old), false);
#ifdef XWAYLAND
- if (old->type != XDGShell)
- wlr_xwayland_surface_activate(old->surface.xwayland, 0);
- else
+ else if (wlr_surface_is_xwayland_surface(old))
+ wlr_xwayland_surface_activate(
+ wlr_xwayland_surface_from_wlr_surface(old), false);
#endif
- wlr_xdg_toplevel_set_activated(old->surface.xdg, 0);
}
/* Update wlroots' keyboard focus */
@@ 1092,12 1095,10 @@ focusclient(Client *old, Client *c, int lift)
void
focusmon(const Arg *arg)
{
- Client *sel;
do
selmon = dirtomon(arg->i);
while (!selmon->wlr_output->enabled);
- sel = selclient();
- focusclient(sel, focustop(selmon), 1);
+ focusclient(focustop(selmon), 1);
}
void
@@ 1123,7 1124,7 @@ focusstack(const Arg *arg)
}
}
/* If only one client is visible on selmon, then c == sel */
- focusclient(sel, c, 1);
+ focusclient(c, 1);
}
Client *
@@ 1549,7 1550,7 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy,
#endif
if (sloppyfocus)
- focusclient(selclient(), c, 0);
+ focusclient(c, 0);
}
void
@@ 1893,7 1894,6 @@ void
setmon(Client *c, Monitor *m, unsigned int newtags)
{
Monitor *oldmon = c->mon;
- Client *oldsel = selclient();
if (oldmon == m)
return;
@@ 1911,7 1911,7 @@ setmon(Client *c, Monitor *m, unsigned int newtags)
c->tags = newtags ? newtags : m->tagset[m->seltags]; /* assign tags of target monitor */
arrange(m);
}
- focusclient(oldsel, focustop(selmon), 1);
+ focusclient(focustop(selmon), 1);
}
void
@@ 2119,7 2119,7 @@ tag(const Arg *arg)
Client *sel = selclient();
if (sel && arg->ui & TAGMASK) {
sel->tags = arg->ui & TAGMASK;
- focusclient(sel, focustop(selmon), 1);
+ focusclient(focustop(selmon), 1);
arrange(selmon);
}
}
@@ 2186,7 2186,7 @@ toggletag(const Arg *arg)
newtags = sel->tags ^ (arg->ui & TAGMASK);
if (newtags) {
sel->tags = newtags;
- focusclient(sel, focustop(selmon), 1);
+ focusclient(focustop(selmon), 1);
arrange(selmon);
}
}
@@ 2194,12 2194,11 @@ toggletag(const Arg *arg)
void
toggleview(const Arg *arg)
{
- Client *sel = selclient();
unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
if (newtagset) {
selmon->tagset[selmon->seltags] = newtagset;
- focusclient(sel, focustop(selmon), 1);
+ focusclient(focustop(selmon), 1);
arrange(selmon);
}
}
@@ 2210,7 2209,7 @@ unmaplayersurface(LayerSurface *layersurface)
layersurface->layer_surface->mapped = false;
if (layersurface->layer_surface->surface ==
seat->keyboard_state.focused_surface)
- focusclient(NULL, selclient(), 1);
+ focusclient(selclient(), 1);
motionnotify(0);
}
@@ 2266,13 2265,12 @@ updatemons()
void
view(const Arg *arg)
{
- Client *sel = selclient();
if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
return;
selmon->seltags ^= 1; /* toggle sel tagset */
if (arg->ui & TAGMASK)
selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
- focusclient(sel, focustop(selmon), 1);
+ focusclient(focustop(selmon), 1);
arrange(selmon);
}
@@ 2319,7 2317,7 @@ xytomon(double x, double y)
void
zoom(const Arg *arg)
{
- Client *c, *sel = selclient(), *oldsel = sel;
+ Client *c, *sel = selclient();
if (!sel || !selmon->lt[selmon->sellt]->arrange || sel->isfloating)
return;
@@ 2344,7 2342,7 @@ zoom(const Arg *arg)
wl_list_remove(&sel->link);
wl_list_insert(&clients, &sel->link);
- focusclient(oldsel, sel, 1);
+ focusclient(sel, 1);
arrange(selmon);
}