~ruther/dwl

3227713bdabc08eac98fe11b0029d5266bd895c3 — Ben Collerson 9 months ago 70ed657
namedscratchpads: focusortoggle functions
2 files changed, 89 insertions(+), 0 deletions(-)

M config.def.h
M dwl.c
M config.def.h => config.def.h +2 -0
@@ 132,6 132,8 @@ static const Key keys[] = {
	{ MODKEY,                    XKB_KEY_p,          spawn,          {.v = menucmd} },
	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return,     spawn,          {.v = termcmd} },
	{ MODKEY,                    XKB_KEY_grave,      togglescratch,  {.v = scratchpadcmd } },
	// { MODKEY,                    XKB_KEY_grave,      focusortogglescratch, {.v = scratchpadcmd } },
	// { MODKEY,                    XKB_KEY_grave,      focusortogglematchingscratch, {.v = scratchpadcmd } },
	{ MODKEY,                    XKB_KEY_j,          focusstack,     {.i = +1} },
	{ MODKEY,                    XKB_KEY_k,          focusstack,     {.i = -1} },
	{ MODKEY,                    XKB_KEY_i,          incnmaster,     {.i = +1} },

M dwl.c => dwl.c +87 -0
@@ 289,6 289,8 @@ static void destroykeyboardgroup(struct wl_listener *listener, void *data);
static Monitor *dirtomon(enum wlr_direction dir);
static void focusclient(Client *c, int lift);
static void focusmon(const Arg *arg);
static void focusortogglematchingscratch(const Arg *arg);
static void focusortogglescratch(const Arg *arg);
static void focusstack(const Arg *arg);
static Client *focustop(Monitor *m);
static void fullscreennotify(struct wl_listener *listener, void *data);


@@ 1429,6 1431,91 @@ focusmon(const Arg *arg)
}

void
focusortogglematchingscratch(const Arg *arg)
{
	Client *c;
	unsigned int found = 0;
	unsigned int hide = 0;

	wl_list_for_each(c, &clients, link) {
		if (c->scratchkey == 0) {
			continue;
		}
		if (c->scratchkey == ((char**)arg->v)[0][0]) {
			if (VISIBLEON(c, selmon)) {
				if (found == 1) {
					if (hide == 1) {
						c->tags = 0;
						focusclient(focustop(selmon), 1);
					}
					continue;
				}
				if (focustop(selmon) == c) {
					// hide
					c->tags = 0;
					focusclient(focustop(selmon), 1);
					hide = 1;
				} else {
					// focus
					focusclient(c, 1);
				}
			} else {
				// show
				c->tags = selmon->tagset[selmon->seltags];
				// focus
				focusclient(c, 1);
			}
			found = 1;
			continue;
		}
		if (VISIBLEON(c, selmon)) {
			// hide
			c->tags = 0;
		}
	}

	if (found) {
		arrange(selmon);
	} else {
		spawnscratch(arg);
	}
}

void
focusortogglescratch(const Arg *arg)
{
	Client *c;
	unsigned int found = 0;

	/* search for first window that matches the scratchkey */
	wl_list_for_each(c, &clients, link)
		if (c->scratchkey == ((char**)arg->v)[0][0]) {
			found = 1;
			break;
		}

	if (found) {
		if (VISIBLEON(c, selmon)) {
			if (focustop(selmon) == c) {
				// hide
				c->tags = 0;
				focusclient(focustop(selmon), 1);
			} else {
				// focus
				focusclient(c, 1);
			}
		} else {
			// show
			c->tags = selmon->tagset[selmon->seltags];
			focusclient(c, 1);
		}
		arrange(selmon);
	} else{
		spawnscratch(arg);
	}
}

void
focusstack(const Arg *arg)
{
	/* Focus the next or previous client (in tiling order) on selmon */

Do not follow this link