aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dwl.c50
1 files changed, 24 insertions, 26 deletions
diff --git a/dwl.c b/dwl.c
index 1b92a3e..cb5341a 100644
--- a/dwl.c
+++ b/dwl.c
@@ -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);
}