aboutsummaryrefslogtreecommitdiff
path: root/dwl.c
diff options
context:
space:
mode:
authorDevin J. Pohly <djpohly@gmail.com>2020-04-23 20:40:02 -0500
committerDevin J. Pohly <djpohly@gmail.com>2020-04-23 22:11:52 -0500
commit0d8f51e0a3be6876e74ab82c581018dd5191aff1 (patch)
tree3c3d0d5137727c7c876768d0d562ba36d4c7ccd2 /dwl.c
parenta87adfd77c36d35147096444fa47346aaf2b88a8 (diff)
implement focusmon and tagmon
Diffstat (limited to 'dwl.c')
-rw-r--r--dwl.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/dwl.c b/dwl.c
index 633e80f..a8633e8 100644
--- a/dwl.c
+++ b/dwl.c
@@ -130,7 +130,9 @@ static void createnotify(struct wl_listener *listener, void *data);
static void createpointer(struct wlr_input_device *device);
static void cursorframe(struct wl_listener *listener, void *data);
static void destroynotify(struct wl_listener *listener, void *data);
+static Monitor *dirtomon(int dir);
static void focus(Client *c, struct wlr_surface *surface);
+static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
static void incnmaster(const Arg *arg);
static void inputdevice(struct wl_listener *listener, void *data);
@@ -149,12 +151,14 @@ static void resize(Client *c, int x, int y, int w, int h);
static void resizemouse(const Arg *arg);
static void run(char *startup_cmd);
static Client *selclient(void);
+static void sendmon(Client *c, Monitor *m);
static void setcursor(struct wl_listener *listener, void *data);
static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setup(void);
static void spawn(const Arg *arg);
static void tag(const Arg *arg);
+static void tagmon(const Arg *arg);
static void tile(Monitor *m);
static void togglefloating(const Arg *arg);
static void toggletag(const Arg *arg);
@@ -387,6 +391,22 @@ destroynotify(struct wl_listener *listener, void *data)
free(c);
}
+Monitor *
+dirtomon(int dir)
+{
+ Monitor *m;
+
+ if (dir > 0) {
+ if (selmon->link.next == &mons)
+ return wl_container_of(mons.next, m, link);
+ return wl_container_of(selmon->link.next, m, link);
+ } else {
+ if (selmon->link.prev == &mons)
+ return wl_container_of(mons.prev, m, link);
+ return wl_container_of(selmon->link.prev, m, link);
+ }
+}
+
void
focus(Client *c, struct wlr_surface *surface)
{
@@ -447,6 +467,17 @@ focus(Client *c, struct wlr_surface *surface)
}
void
+focusmon(const Arg *arg)
+{
+ Monitor *m = dirtomon(arg->i);
+
+ if (m == selmon)
+ return;
+ selmon = m;
+ focus(NULL, NULL);
+}
+
+void
focusstack(const Arg *arg)
{
/* Focus the next or previous client (in tiling order) on selmon */
@@ -934,6 +965,18 @@ selclient(void)
}
void
+sendmon(Client *c, Monitor *m)
+{
+ if (c->mon == m)
+ return;
+ c->mon = m;
+ c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
+
+ if (c == selclient())
+ focus(NULL, NULL);
+}
+
+void
setcursor(struct wl_listener *listener, void *data)
{
/* This event is raised by the seat when a client provides a cursor image */
@@ -1100,6 +1143,15 @@ tag(const Arg *arg)
}
void
+tagmon(const Arg *arg)
+{
+ Client *sel = selclient();
+ if (!sel)
+ return;
+ sendmon(sel, dirtomon(arg->i));
+}
+
+void
tile(Monitor *m)
{
unsigned int i, n = 0, h, mw, my, ty;