From 2824ffb4cf54b0b8080f5d9bfbbb9103d6e0874c Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Sun, 7 Feb 2021 20:56:02 +0000 Subject: [PATCH 01/14] Run launcher shell script instead of rofi This shell script currently just picks between rofi and dmenu although may do more later on --- config.def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 3c730da..64bedf3 100644 --- a/config.def.h +++ b/config.def.h @@ -73,7 +73,7 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "rofi", "-show", "drun", "-modi", "drun", "-theme", "themes/launchpad.rasi", NULL }; +static const char *dmenucmd[] = { "launcher", NULL }; //static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; static const char *termcmd[] = { "folder-shell", NULL }; From e11fb64dadff39d08705ad09d8ddc38bb9a87b44 Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Wed, 10 Feb 2021 21:24:23 +0000 Subject: [PATCH 02/14] Changes onboard to svkbd --- config.def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 64bedf3..8fbf319 100644 --- a/config.def.h +++ b/config.def.h @@ -37,7 +37,7 @@ static const Rule rules[] = { { "xterm-256color", NULL, NULL, 0, 0, 1, 1, 0, 0, -1 }, { "Thunderbird", NULL, NULL, 1 << 8 , 0, 0, 0, 0, 0, -1 }, { NULL, NULL, "noswallow", 0, 0, 0, 1, 0, 0, -1 }, - { "Onboard", NULL, NULL, 0, 1, 0, 1, 0, 1, -1 }, + { "svkbd", NULL, NULL, 0, 1, 0, 1, 0, 1, -1 }, { "Onboard-settings", NULL, NULL, 0, 0, 0, 0, 0, 0, -1 } }; From 449d90b2e3c32fcc4c869ab6331a5491ee29c798 Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Wed, 10 Feb 2021 21:28:36 +0000 Subject: [PATCH 03/14] Adds power menu and removes unused binding --- config.def.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index 8fbf319..4b4ed24 100644 --- a/config.def.h +++ b/config.def.h @@ -122,7 +122,7 @@ static const char *brightnessDown[] = { "brightness", "down", NULL }; static const char *setBackgroundRandom[] = { "rofi-background", "--earth", NULL }; static const char *backgroundDetails[] = { "background", "--only-notify", NULL }; -static const char *unity_hud[] = { "hud-menu.py" }; +static const char *powerMenu[] = { "rofi-shutdown", NULL }; #include "movestack.c" static Key keys[] = { @@ -178,7 +178,6 @@ static Key keys[] = { { MODKEY, XK_w, spawn, {.v = whichproject } }, { MODKEY|ShiftMask, XK_w, spawn, {.v = project } }, { MODKEY, XK_d, spawn, {.v = pass } }, - { MODKEY, XK_x, spawn, {.v = unity_hud } }, //Background { MODKEY, XK_e, spawn, {.v = setBackgroundRandom } }, { MODKEY|ControlMask, XK_e, spawn, {.v = backgroundDetails } }, @@ -188,6 +187,7 @@ static Key keys[] = { { 0, XF86XK_AudioMute, spawn, {.v = volumeToggle } }, { 0, XF86XK_MonBrightnessUp, spawn, {.v = brightnessUp } }, { 0, XF86XK_MonBrightnessDown, spawn, {.v = brightnessDown } }, + { 0, XF86XK_PowerOff, spawn, {.v = powerMenu } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) From c0a50b817c5e142ca7e6419b88b69da72b0dd46d Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Mon, 22 Feb 2021 21:53:08 +0000 Subject: [PATCH 04/14] Applies the multikey patch This allows me to have the same key do different things based on the number of times it is pushed. This is going to be useful on the pinephone so I can have double click or click and hold on the limited number of physical buttons --- config.def.h | 134 +++++++++++++++++++++++++++------------------------ config.mk | 2 +- dwm.c | 104 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 171 insertions(+), 69 deletions(-) diff --git a/config.def.h b/config.def.h index 4b4ed24..fab6021 100644 --- a/config.def.h +++ b/config.def.h @@ -37,7 +37,7 @@ static const Rule rules[] = { { "xterm-256color", NULL, NULL, 0, 0, 1, 1, 0, 0, -1 }, { "Thunderbird", NULL, NULL, 1 << 8 , 0, 0, 0, 0, 0, -1 }, { NULL, NULL, "noswallow", 0, 0, 0, 1, 0, 0, -1 }, - { "svkbd", NULL, NULL, 0, 1, 0, 1, 0, 1, -1 }, + { "svkbd", NULL, NULL, 0, 1, 0, 1, 0, 1, -1 }, { "Onboard-settings", NULL, NULL, 0, 0, 0, 0, 0, 0, -1 } }; @@ -63,10 +63,10 @@ static const Layout layouts[] = { /* key definitions */ #define MODKEY Mod4Mask #define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + { MODKEY, KEY, 0, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, 0, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, 0, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, 0, toggletag, {.ui = 1 << TAG} }, /* helper for spawning shell commands in the pre dwm-5.0 fashion */ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } @@ -125,69 +125,76 @@ static const char *backgroundDetails[] = { "background", "--only-notify", NULL } static const char *powerMenu[] = { "rofi-shutdown", NULL }; #include "movestack.c" + +#define MULTIKEY_THRESHOLD_MS_PRESS 200 +#define MULTIKEY_THRESHOLD_MS_HOLD 700 + + static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY, XK_Return, spawn, {.v = termcmd } }, - { MODKEY|ControlMask, XK_Return, spawn, {.v = lfcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, - { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY|ShiftMask, XK_i, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY|ShiftMask, XK_l, spawn, {.v = logout} }, - { MODKEY|ShiftMask, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, toggleAttachBelow, {0} }, - { MODKEY, XK_q, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY|ShiftMask, XK_t, setlayout, {.v = &layouts[3]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[4]} }, - { MODKEY|ShiftMask, XK_f, setlayout, {.v = &layouts[5]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - { 0, XK_Print, spawn, {.v = fullscreenshot } }, - { ControlMask, XK_Print, spawn, {.v = activescreenshot } }, - { ShiftMask, XK_Print, spawn, {.v = selectscreenshot } }, - { 0, XF86XK_AudioPlay, spawn, {.v = playpause } }, - { MODKEY|ShiftMask, XK_d, spawn, {.v = date } }, - { MODKEY|ShiftMask, XK_b, spawn, {.v = battery} }, - { MODKEY|ShiftMask, XK_Insert, spawn, {.v = greenclip } }, + /* modifier key count function argument */ + { MODKEY, XK_p, 0, spawn, {.v = dmenucmd } }, + { MODKEY, XK_Return, 0, spawn, {.v = termcmd } }, + { MODKEY|ControlMask, XK_Return, 0, spawn, {.v = lfcmd } }, + { MODKEY, XK_b, 0, togglebar, {0} }, + { MODKEY, XK_j, 0, focusstack, {.i = +1 } }, + { MODKEY, XK_k, 0, focusstack, {.i = -1 } }, + { MODKEY|ShiftMask, XK_j, 0, movestack, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, 0, movestack, {.i = -1 } }, + { MODKEY, XK_i, 0, incnmaster, {.i = +1 } }, + { MODKEY|ShiftMask, XK_i, 0, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, 0, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, 0, setmfact, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_l, 0, spawn, {.v = logout} }, + { MODKEY|ShiftMask, XK_Return, 0, zoom, {0} }, + { MODKEY, XK_Tab, 0, toggleAttachBelow, {0} }, + { MODKEY, XK_q, 0, killclient, {0} }, + { MODKEY, XK_t, 0, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_m, 0, setlayout, {.v = &layouts[2]} }, + { MODKEY|ShiftMask, XK_t, 0, setlayout, {.v = &layouts[3]} }, + { MODKEY, XK_f, 0, setlayout, {.v = &layouts[4]} }, + { MODKEY|ShiftMask, XK_f, 0, setlayout, {.v = &layouts[5]} }, + { MODKEY, XK_space, 0, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, 0, togglefloating, {0} }, + { MODKEY, XK_0, 0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, 0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, 0, focusmon, {.i = -1 } }, + { MODKEY, XK_period, 0, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, 0, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, 0, tagmon, {.i = +1 } }, + { 0, XK_Print, 0, spawn, {.v = fullscreenshot } }, + { ControlMask, XK_Print, 0, spawn, {.v = activescreenshot } }, + { ShiftMask, XK_Print, 0, spawn, {.v = selectscreenshot } }, + { 0, XF86XK_AudioPlay, 0, spawn, {.v = playpause } }, + { MODKEY|ShiftMask, XK_d, 0, spawn, {.v = date } }, + { MODKEY|ShiftMask, XK_b, 0, spawn, {.v = battery} }, + { MODKEY|ShiftMask, XK_Insert, 0, spawn, {.v = greenclip } }, //Applications - { MODKEY|ShiftMask, XK_q, spawn, {.v = qutebrowser } }, - { MODKEY , XK_s, spawn, {.v = surf } }, - { MODKEY, XK_c, spawn, {.v = firefox } }, - { MODKEY|ShiftMask, XK_c, spawn, {.v = chromium } }, + { MODKEY|ShiftMask, XK_q, 0, spawn, {.v = qutebrowser } }, + { MODKEY, XK_s, 0, spawn, {.v = surf } }, + { MODKEY, XK_c, 0, spawn, {.v = firefox } }, + { MODKEY|ShiftMask, XK_c, 0, spawn, {.v = chromium } }, //Dmenu / Rofi - { MODKEY, XK_u, spawn, {.v = unicode } }, - { MODKEY, XK_y, spawn, {.v = youtube } }, - { MODKEY, XK_a, spawn, {.v = offlineArchWiki } }, - { MODKEY|ShiftMask, XK_a, spawn, {.v = screenlayout } }, - { MODKEY|ShiftMask, XK_m, spawn, {.v = manPages } }, - { MODKEY|ShiftMask, XK_p, spawn, {.v = ports } }, - { MODKEY, XK_w, spawn, {.v = whichproject } }, - { MODKEY|ShiftMask, XK_w, spawn, {.v = project } }, - { MODKEY, XK_d, spawn, {.v = pass } }, + { MODKEY, XK_u, 0, spawn, {.v = unicode } }, + { MODKEY, XK_y, 0, spawn, {.v = youtube } }, + { MODKEY, XK_a, 0, spawn, {.v = offlineArchWiki } }, + { MODKEY|ShiftMask, XK_a, 0, spawn, {.v = screenlayout } }, + { MODKEY|ShiftMask, XK_m, 0, spawn, {.v = manPages } }, + { MODKEY|ShiftMask, XK_p, 0, spawn, {.v = ports } }, + { MODKEY, XK_w, 0, spawn, {.v = whichproject } }, + { MODKEY|ShiftMask, XK_w, 0, spawn, {.v = project } }, + { MODKEY, XK_d, 0, spawn, {.v = pass } }, //Background - { MODKEY, XK_e, spawn, {.v = setBackgroundRandom } }, - { MODKEY|ControlMask, XK_e, spawn, {.v = backgroundDetails } }, + { MODKEY, XK_e, 0, spawn, {.v = setBackgroundRandom } }, + { MODKEY|ControlMask, XK_e, 0, spawn, {.v = backgroundDetails } }, //Special keys - { 0, XF86XK_AudioRaiseVolume, spawn, {.v = volumeUp } }, - { 0, XF86XK_AudioLowerVolume, spawn, {.v = volumeDown } }, - { 0, XF86XK_AudioMute, spawn, {.v = volumeToggle } }, - { 0, XF86XK_MonBrightnessUp, spawn, {.v = brightnessUp } }, - { 0, XF86XK_MonBrightnessDown, spawn, {.v = brightnessDown } }, - { 0, XF86XK_PowerOff, spawn, {.v = powerMenu } }, + { 0, XF86XK_AudioRaiseVolume, 0, spawn, {.v = volumeUp } }, + { 0, XF86XK_AudioLowerVolume, 0, spawn, {.v = volumeDown } }, + { 0, XF86XK_AudioMute, 0, spawn, {.v = volumeToggle } }, + { 0, XF86XK_MonBrightnessUp, 0, spawn, {.v = brightnessUp } }, + { 0, XF86XK_MonBrightnessDown, 0, spawn, {.v = brightnessDown } }, + { 0, XF86XK_PowerOff, 0, spawn, {.v = powerMenu } }, + { MODKEY|ShiftMask, XK_r, 0, quit, {0} }, + TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) @@ -197,7 +204,6 @@ static Key keys[] = { TAGKEYS( XK_7, 6) TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_r, quit, {0} }, }; /* button definitions */ diff --git a/config.mk b/config.mk index b77641d..eb52280 100644 --- a/config.mk +++ b/config.mk @@ -22,7 +22,7 @@ FREETYPEINC = /usr/include/freetype2 # includes and libs INCS = -I${X11INC} -I${FREETYPEINC} -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res +LIBS = -L${X11LIB} -lrt -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res # flags CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} diff --git a/dwm.c b/dwm.c index 14a1be2..cd1419b 100644 --- a/dwm.c +++ b/dwm.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,7 @@ #include #endif /* XINERAMA */ #include +#include #include #include @@ -106,6 +108,7 @@ struct Client { typedef struct { unsigned int mod; KeySym keysym; + unsigned int npresses; void (*func)(const Arg *); const Arg arg; } Key; @@ -187,6 +190,10 @@ static void grabbuttons(Client *c, int focused); static void grabkeys(void); static void incnmaster(const Arg *arg); static void keypress(XEvent *e); +static void keypresstimerdispatch(int msduration, int data); +static void keypresstimerdone(union sigval timer_data); +static void keypresstimerdonesync(int idx); +static void keyrelease(XEvent *e); static void killclient(const Arg *arg); static void manage(Window w, XWindowAttributes *wa); static void mappingnotify(XEvent *e); @@ -273,13 +280,14 @@ static void (*handler[LASTEvent]) (XEvent *) = { [Expose] = expose, [FocusIn] = focusin, [KeyPress] = keypress, + [KeyRelease] = keyrelease, [MappingNotify] = mappingnotify, [MapRequest] = maprequest, [MotionNotify] = motionnotify, [PropertyNotify] = propertynotify, [UnmapNotify] = unmapnotify }; -static Atom wmatom[WMLast], netatom[NetLast]; +static Atom timeratom, wmatom[WMLast], netatom[NetLast]; static int running = 1; static Cur *cursor[CurLast]; static Clr **scheme; @@ -290,6 +298,10 @@ static Window root, wmcheckwin; static xcb_connection_t *xcon; +static int multikeypendingindex = -1; +static timer_t multikeypendingtimer = NULL; +static int multikeyup = 1; + /* configuration, allows nested code to access above variables */ #include "config.h" @@ -604,6 +616,11 @@ clientmessage(XEvent *e) XClientMessageEvent *cme = &e->xclient; Client *c = wintoclient(cme->window); + if (cme->message_type == timeratom) { + keypresstimerdonesync(cme->data.s[0]); + return; + } + if (!c) return; if (cme->message_type == netatom[NetWMState]) { @@ -1070,11 +1087,88 @@ keypress(XEvent *e) { ev = &e->xkey; keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for (i = 0; i < LENGTH(keys); i++) + for (i = 0; i < LENGTH(keys); i++){ if (keysym == keys[i].keysym && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) - keys[i].func(&(keys[i].arg)); + && keys[i].func){ + // E.g. Normal functionality case - npresses 0 == keydown immediate fn + if (keys[i].npresses == 0) { + keys[i].func(&(keys[i].arg)); + break; + } + + // Multikey functionality - find index of key, set global, & dispatch + if ( + (multikeypendingindex == -1 && multikeyup && keys[i].npresses == 1) || + (multikeypendingindex != -1 && keys[multikeypendingindex].npresses + 1 == keys[i].npresses) + ) { + multikeyup = 0; + multikeypendingindex = i; + keypresstimerdispatch(MULTIKEY_THRESHOLD_MS_PRESS, i); + break; + } + } + } +} + +void +keypresstimerdispatch(int msduration, int data) +{ + struct sigevent timer_signal_event; + struct itimerspec timer_period; + // Clear out the old timer if any set,and dispatch new timer + if (multikeypendingtimer != NULL) timer_delete(multikeypendingtimer); + timer_signal_event.sigev_notify = SIGEV_THREAD; + timer_signal_event.sigev_notify_function = keypresstimerdone; + timer_signal_event.sigev_value.sival_int = data; + timer_signal_event.sigev_notify_attributes = NULL; + timer_create(CLOCK_MONOTONIC, &timer_signal_event, &multikeypendingtimer); + timer_period.it_value.tv_sec = 0; + timer_period.it_value.tv_nsec = msduration * 1000000; + timer_period.it_interval.tv_sec = 0; + timer_period.it_interval.tv_nsec = 0; + timer_settime(multikeypendingtimer, 0, &timer_period, NULL); +} + +void +keypresstimerdone(union sigval timer_data) +{ + XEvent ev; + memset(&ev, 0, sizeof ev); + ev.xclient.type = ClientMessage; + ev.xclient.window = root; + ev.xclient.message_type = timeratom; + ev.xclient.format = 16; + ev.xclient.data.s[0] = ((short) timer_data.sival_int); + XSendEvent(dpy, root, False, SubstructureRedirectMask, &ev); + XSync(dpy, False); +} + +void +keypresstimerdonesync(int idx) +{ + int i, maxidx; + if (keys[idx].npresses == 1 && !multikeyup) { + // Dispatch hold key + maxidx = -1; + for (i = 0; i < LENGTH(keys); i++) + if (keys[i].keysym == keys[idx].keysym) maxidx = i; + if (maxidx != -1) + keypresstimerdispatch( + MULTIKEY_THRESHOLD_MS_HOLD - MULTIKEY_THRESHOLD_MS_PRESS, + maxidx + ); + } else if (keys[idx].func) { + // Run the actual keys' fn + keys[idx].func(&(keys[idx].arg)); + multikeypendingindex = -1; + } +} + +void +keyrelease(XEvent *e) +{ + multikeyup = 1; } void @@ -2439,6 +2533,7 @@ zoom(const Arg *arg) int main(int argc, char *argv[]) { + XInitThreads(); if (argc == 2 && !strcmp("-v", argv[1])) die("dwm-"VERSION); else if (argc != 1) @@ -2449,6 +2544,7 @@ main(int argc, char *argv[]) die("dwm: cannot open display"); if (!(xcon = XGetXCBConnection(dpy))) die("dwm: cannot get xcb connection\n"); + XkbSetDetectableAutoRepeat(dpy, True, NULL); checkotherwm(); setup(); #ifdef __OpenBSD__ From 3b11aab6f24bef0300a4667debbee3195346d830 Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Mon, 22 Feb 2021 21:58:43 +0000 Subject: [PATCH 05/14] Makes double press of power button bring up power menu --- config.def.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index fab6021..7ce9135 100644 --- a/config.def.h +++ b/config.def.h @@ -192,7 +192,11 @@ static Key keys[] = { { 0, XF86XK_AudioMute, 0, spawn, {.v = volumeToggle } }, { 0, XF86XK_MonBrightnessUp, 0, spawn, {.v = brightnessUp } }, { 0, XF86XK_MonBrightnessDown, 0, spawn, {.v = brightnessDown } }, - { 0, XF86XK_PowerOff, 0, spawn, {.v = powerMenu } }, + // On the pinephone, I want a single press of the power button to put the phone in sleep mode. + // I want a double press to bring up the power menu + // TODO: Make a command for screen lock + //{ 1, XF86XK_PowerOff, 0, spawn, {.v = } }, + { 2, XF86XK_PowerOff, 0, spawn, {.v = powerMenu } }, { MODKEY|ShiftMask, XK_r, 0, quit, {0} }, TAGKEYS( XK_1, 0) From 47ffe2fbdb9756dc64eb69e95eedca7f382e4d3f Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Mon, 22 Feb 2021 22:06:13 +0000 Subject: [PATCH 06/14] Fixes keybindings for power button --- config.def.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index 7ce9135..7d06a2c 100644 --- a/config.def.h +++ b/config.def.h @@ -195,8 +195,8 @@ static Key keys[] = { // On the pinephone, I want a single press of the power button to put the phone in sleep mode. // I want a double press to bring up the power menu // TODO: Make a command for screen lock - //{ 1, XF86XK_PowerOff, 0, spawn, {.v = } }, - { 2, XF86XK_PowerOff, 0, spawn, {.v = powerMenu } }, + //{ 0, XF86XK_PowerOff, 1, spawn, {.v = } }, + { 0, XF86XK_PowerOff, 2, spawn, {.v = powerMenu } }, { MODKEY|ShiftMask, XK_r, 0, quit, {0} }, TAGKEYS( XK_1, 0) From 6866a4a4ea98dfced0d429e449374022b7717cce Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Thu, 25 Feb 2021 14:57:02 +0000 Subject: [PATCH 07/14] Changes functionality of power button A single push will turn off the screen A double push or a push and hold will open the power menu, allowing you to turn off, restart, logout or suspend (CRUST) --- config.def.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 7d06a2c..9d7bebf 100644 --- a/config.def.h +++ b/config.def.h @@ -122,6 +122,7 @@ static const char *brightnessDown[] = { "brightness", "down", NULL }; static const char *setBackgroundRandom[] = { "rofi-background", "--earth", NULL }; static const char *backgroundDetails[] = { "background", "--only-notify", NULL }; +static const char *lockScreen[] = { "screenlock", "--suspend", NULL }; static const char *powerMenu[] = { "rofi-shutdown", NULL }; #include "movestack.c" @@ -195,7 +196,7 @@ static Key keys[] = { // On the pinephone, I want a single press of the power button to put the phone in sleep mode. // I want a double press to bring up the power menu // TODO: Make a command for screen lock - //{ 0, XF86XK_PowerOff, 1, spawn, {.v = } }, + { 0, XF86XK_PowerOff, 1, spawn, {.v = lockScreen } }, { 0, XF86XK_PowerOff, 2, spawn, {.v = powerMenu } }, { MODKEY|ShiftMask, XK_r, 0, quit, {0} }, From 3dbeed51c5ce7da3ec87c1c231eea0a9e3b1356d Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Wed, 31 Mar 2021 21:22:11 +0100 Subject: [PATCH 08/14] Makes a double tap of the power button toggle the keyboard --- config.def.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index 9d7bebf..95ecb05 100644 --- a/config.def.h +++ b/config.def.h @@ -125,6 +125,8 @@ static const char *backgroundDetails[] = { "background", "--only-notify", NULL } static const char *lockScreen[] = { "screenlock", "--suspend", NULL }; static const char *powerMenu[] = { "rofi-shutdown", NULL }; +static const char *toggleKeyboard[] = { "toggleKeyboard", NULL }; + #include "movestack.c" #define MULTIKEY_THRESHOLD_MS_PRESS 200 @@ -194,10 +196,12 @@ static Key keys[] = { { 0, XF86XK_MonBrightnessUp, 0, spawn, {.v = brightnessUp } }, { 0, XF86XK_MonBrightnessDown, 0, spawn, {.v = brightnessDown } }, // On the pinephone, I want a single press of the power button to put the phone in sleep mode. - // I want a double press to bring up the power menu + // I want a double press to toggle the keyboard + // I want a hold press to bring up the power menu // TODO: Make a command for screen lock { 0, XF86XK_PowerOff, 1, spawn, {.v = lockScreen } }, - { 0, XF86XK_PowerOff, 2, spawn, {.v = powerMenu } }, + { 0, XF86XK_PowerOff, 2, spawn, {.v = toggleKeyboard } }, + { 0, XF86XK_PowerOff, 3, spawn, {.v = powerMenu } }, { MODKEY|ShiftMask, XK_r, 0, quit, {0} }, TAGKEYS( XK_1, 0) From 730577a008411e79c6748e0b0bda4db9540aa3ec Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Mon, 5 Apr 2021 09:26:18 +0100 Subject: [PATCH 09/14] Adds win+left or win+right to switch tag This involved the patch from here: https://lists.suckless.org/dev/1104/7590.html I use this on the pinephone with win+left and win+right bound to a swipe left or right on the bottom edge of the screen --- config.def.h | 2 ++ dwm.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/config.def.h b/config.def.h index 95ecb05..d74e84f 100644 --- a/config.def.h +++ b/config.def.h @@ -195,6 +195,8 @@ static Key keys[] = { { 0, XF86XK_AudioMute, 0, spawn, {.v = volumeToggle } }, { 0, XF86XK_MonBrightnessUp, 0, spawn, {.v = brightnessUp } }, { 0, XF86XK_MonBrightnessDown, 0, spawn, {.v = brightnessDown } }, + { MODKEY, XK_Right, 0, shiftview, {.i = 1 } }, + { MODKEY, XK_Left, 0, shiftview, {.i = -1 } }, // On the pinephone, I want a single press of the power button to put the phone in sleep mode. // I want a double press to toggle the keyboard // I want a hold press to bring up the power menu diff --git a/dwm.c b/dwm.c index cd1419b..34a8a60 100644 --- a/dwm.c +++ b/dwm.c @@ -221,6 +221,7 @@ static void setlayout(const Arg *arg); static void setmfact(const Arg *arg); static void setup(void); static void seturgent(Client *c, int urg); +static void shiftview(const Arg *arg); static void showhide(Client *c); static void sigchld(int unused); static void spawn(const Arg *arg); @@ -1873,6 +1874,26 @@ seturgent(Client *c, int urg) XFree(wmh); } +/** Function to shift the current view to the left/right + * + * @param: "arg->i" stores the number of tags to shift right (positive value) + * or left (negative value) + */ +void +shiftview(const Arg *arg) { + Arg shifted; + + if(arg->i > 0) // left circular shift + shifted.ui = (selmon->tagset[selmon->seltags] << arg->i) + | (selmon->tagset[selmon->seltags] >> (LENGTH(tags) - arg->i)); + + else // right circular shift + shifted.ui = selmon->tagset[selmon->seltags] >> (- arg->i) + | selmon->tagset[selmon->seltags] << (LENGTH(tags) + arg->i); + + view(&shifted); +} + void showhide(Client *c) { From 2718671c22ff815551d302c300839b7addcb1e00 Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Mon, 16 Aug 2021 08:56:38 +0100 Subject: [PATCH 10/14] Makes pause button play / pause --- config.def.h | 1 + 1 file changed, 1 insertion(+) diff --git a/config.def.h b/config.def.h index 7d06a2c..d56adaf 100644 --- a/config.def.h +++ b/config.def.h @@ -165,6 +165,7 @@ static Key keys[] = { { ControlMask, XK_Print, 0, spawn, {.v = activescreenshot } }, { ShiftMask, XK_Print, 0, spawn, {.v = selectscreenshot } }, { 0, XF86XK_AudioPlay, 0, spawn, {.v = playpause } }, + { 0, XF86XK_AudioPause, 0, spawn, {.v = playpause } }, { MODKEY|ShiftMask, XK_d, 0, spawn, {.v = date } }, { MODKEY|ShiftMask, XK_b, 0, spawn, {.v = battery} }, { MODKEY|ShiftMask, XK_Insert, 0, spawn, {.v = greenclip } }, From 2a06bfb40a4c56ea82ac80fa0820c84cab66bda0 Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Tue, 17 Aug 2021 12:42:12 +0100 Subject: [PATCH 11/14] Adds screenrecord --- config.def.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.def.h b/config.def.h index d56adaf..d7b28ce 100644 --- a/config.def.h +++ b/config.def.h @@ -83,6 +83,8 @@ static const char *fullscreenshot[] = { "screenshot", NULL }; static const char *activescreenshot[] = { "screenshot", "window", NULL }; static const char *selectscreenshot[] = { "screenshot", "select", NULL }; +static const char *selectscreenshot[] = { "screenrecord", "select", NULL }; + static const char *greenclip[] = { "rofi", "-modi", "clipboard:greenclip print", "-show", "clipboard", "-run-command", "{cmd}", NULL }; static const char *qutebrowser[] = { "qutebrowser", NULL }; From 42d54181e2b63f94b83ebb424a53bea9c4596a4b Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Thu, 3 Feb 2022 10:11:01 +0000 Subject: [PATCH 12/14] Add act on last keyboard shortcuts --- config.def.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 8394857..0138e2d 100644 --- a/config.def.h +++ b/config.def.h @@ -83,7 +83,7 @@ static const char *fullscreenshot[] = { "screenshot", NULL }; static const char *activescreenshot[] = { "screenshot", "window", NULL }; static const char *selectscreenshot[] = { "screenshot", "select", NULL }; -static const char *selectscreenshot[] = { "screenrecord", "select", NULL }; +static const char *selectscreenrecord[] = { "screenrecord", "select", NULL }; static const char *greenclip[] = { "rofi", "-modi", "clipboard:greenclip print", "-show", "clipboard", "-run-command", "{cmd}", NULL }; @@ -129,6 +129,9 @@ static const char *powerMenu[] = { "rofi-shutdown", NULL }; static const char *toggleKeyboard[] = { "toggleKeyboard", NULL }; +static const char *actOnLast[] = { "actOnLast", NULL }; +static const char *actOnLastDefault[] = { "actOnLast", "--first", NULL }; + #include "movestack.c" #define MULTIKEY_THRESHOLD_MS_PRESS 200 @@ -189,6 +192,8 @@ static Key keys[] = { { MODKEY, XK_w, 0, spawn, {.v = whichproject } }, { MODKEY|ShiftMask, XK_w, 0, spawn, {.v = project } }, { MODKEY, XK_d, 0, spawn, {.v = pass } }, + { MODKEY, XK_o, 0, spawn, {.v = actOnLast } }, + { MODKEY|ShiftMask, XK_o, 0, spawn, {.v = actOnLastDefault } }, //Background { MODKEY, XK_e, 0, spawn, {.v = setBackgroundRandom } }, { MODKEY|ControlMask, XK_e, 0, spawn, {.v = backgroundDetails } }, From 3deebe73023872d401c82b28165ebe91fe31ed7d Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Thu, 3 Feb 2022 10:47:02 +0000 Subject: [PATCH 13/14] Adds screenshot bindings to f10 On my new laptop, I have decided to keep the f keys as f keys which requires hitting the fn key to get additional functions such as play/pause etc. I did this because I often found myself hitting mute (for example) by mistake. However, I don't use f10 for anything else so rather than pushing fn+f10 (prt sc on my keyboard), I just want to push f10. The shift / ctrl modifiers were implemented. --- config.def.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.def.h b/config.def.h index 0138e2d..824016d 100644 --- a/config.def.h +++ b/config.def.h @@ -172,6 +172,9 @@ static Key keys[] = { { 0, XK_Print, 0, spawn, {.v = fullscreenshot } }, { ControlMask, XK_Print, 0, spawn, {.v = activescreenshot } }, { ShiftMask, XK_Print, 0, spawn, {.v = selectscreenshot } }, + { 0, XK_F10, 0, spawn, {.v = fullscreenshot } }, + { ControlMask, XK_F10, 0, spawn, {.v = activescreenshot } }, + { ShiftMask, XK_F10, 0, spawn, {.v = selectscreenshot } }, { 0, XF86XK_AudioPlay, 0, spawn, {.v = playpause } }, { 0, XF86XK_AudioPause, 0, spawn, {.v = playpause } }, { MODKEY|ShiftMask, XK_d, 0, spawn, {.v = date } }, From 73ba8c61bfb3d5868f8c2682ab25c4951b60fd06 Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Thu, 15 Feb 2024 11:20:43 +0000 Subject: [PATCH 14/14] Pushing dwm changes --- config.def.h | 124 ++++++++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 57 deletions(-) diff --git a/config.def.h b/config.def.h index 824016d..78e1843 100644 --- a/config.def.h +++ b/config.def.h @@ -77,20 +77,13 @@ static const char *dmenucmd[] = { "launcher", NULL }; //static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; static const char *termcmd[] = { "folder-shell", NULL }; -static const char *lfcmd[] = { "folder-shell", "lf", NULL }; - static const char *fullscreenshot[] = { "screenshot", NULL }; static const char *activescreenshot[] = { "screenshot", "window", NULL }; static const char *selectscreenshot[] = { "screenshot", "select", NULL }; static const char *selectscreenrecord[] = { "screenrecord", "select", NULL }; -static const char *greenclip[] = { "rofi", "-modi", "clipboard:greenclip print", "-show", "clipboard", "-run-command", "{cmd}", NULL }; - -static const char *qutebrowser[] = { "qutebrowser", NULL }; -static const char *surf[] = { "tabbed", "-c", "surf", "-e", NULL }; static const char *chromium[] = { "chromium", NULL }; -static const char *bigchromium[] = { "chromium", "--force-device-scale-factor=2", NULL }; static const char *firefox[] = { "firefox-developer-edition", NULL }; static const char *date[] = { "datetime", NULL }; @@ -103,7 +96,6 @@ static const char *playpause[] = { "playerctl", "play-pause", NULL }; static const char *logout[] = { "rofi-shutdown", NULL }; -static const char *offlineArchWiki[] = { "offline-aw", NULL }; static const char *manPages[] = { "man-page-pdf", NULL }; static const char *ports[] = { "ports", NULL }; @@ -121,8 +113,6 @@ static const char *volumeToggle[] = { "volume", "toggle", NULL }; static const char *brightnessUp[] = { "brightness", "up", NULL }; static const char *brightnessDown[] = { "brightness", "down", NULL }; -static const char *setBackgroundRandom[] = { "rofi-background", "--earth", NULL }; -static const char *backgroundDetails[] = { "background", "--only-notify", NULL }; static const char *lockScreen[] = { "screenlock", "--suspend", NULL }; static const char *powerMenu[] = { "rofi-shutdown", NULL }; @@ -132,6 +122,9 @@ static const char *toggleKeyboard[] = { "toggleKeyboard", NULL }; static const char *actOnLast[] = { "actOnLast", NULL }; static const char *actOnLastDefault[] = { "actOnLast", "--first", NULL }; +static const char *dunstClose[] = { "dunstctl", "close", NULL }; +static const char *dunstOpenLast[] = { "dunstctl", "history-pop", NULL }; + #include "movestack.c" #define MULTIKEY_THRESHOLD_MS_PRESS 200 @@ -140,72 +133,87 @@ static const char *actOnLastDefault[] = { "actOnLast", "--first", NULL }; static Key keys[] = { /* modifier key count function argument */ - { MODKEY, XK_p, 0, spawn, {.v = dmenucmd } }, { MODKEY, XK_Return, 0, spawn, {.v = termcmd } }, - { MODKEY|ControlMask, XK_Return, 0, spawn, {.v = lfcmd } }, - { MODKEY, XK_b, 0, togglebar, {0} }, - { MODKEY, XK_j, 0, focusstack, {.i = +1 } }, - { MODKEY, XK_k, 0, focusstack, {.i = -1 } }, - { MODKEY|ShiftMask, XK_j, 0, movestack, {.i = +1 } }, - { MODKEY|ShiftMask, XK_k, 0, movestack, {.i = -1 } }, - { MODKEY, XK_i, 0, incnmaster, {.i = +1 } }, - { MODKEY|ShiftMask, XK_i, 0, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, 0, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, 0, setmfact, {.f = +0.05} }, - { MODKEY|ShiftMask, XK_l, 0, spawn, {.v = logout} }, - { MODKEY|ShiftMask, XK_Return, 0, zoom, {0} }, + //{ MODKEY|ShiftMask, XK_Return, 0, zoom, {0} }, + { MODKEY, XK_Tab, 0, toggleAttachBelow, {0} }, - { MODKEY, XK_q, 0, killclient, {0} }, - { MODKEY, XK_t, 0, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_m, 0, setlayout, {.v = &layouts[2]} }, - { MODKEY|ShiftMask, XK_t, 0, setlayout, {.v = &layouts[3]} }, + { MODKEY|ShiftMask, XK_Tab, 0, spawn, {.v = dunstOpenLast} }, + + { MODKEY, XK_space, 0, spawn, {.v = dunstClose} }, + + { MODKEY|ShiftMask, XK_a, 0, spawn, {.v = screenlayout } }, + + { MODKEY, XK_b, 0, togglebar, {0} }, + { MODKEY|ShiftMask, XK_b, 0, spawn, {.v = battery} }, + + { MODKEY, XK_c, 0, spawn, {.v = firefox } }, + { MODKEY|ShiftMask, XK_c, 0, spawn, {.v = chromium } }, + + { MODKEY, XK_d, 0, spawn, {.v = pass } }, + { MODKEY|ShiftMask, XK_d, 0, spawn, {.v = date } }, + { MODKEY, XK_f, 0, setlayout, {.v = &layouts[4]} }, { MODKEY|ShiftMask, XK_f, 0, setlayout, {.v = &layouts[5]} }, - { MODKEY, XK_space, 0, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, 0, togglefloating, {0} }, - { MODKEY, XK_0, 0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, 0, tag, {.ui = ~0 } }, + + { MODKEY, XK_h, 0, setmfact, {.f = -0.05} }, + + { MODKEY, XK_i, 0, incnmaster, {.i = +1 } }, + { MODKEY|ShiftMask, XK_i, 0, incnmaster, {.i = -1 } }, + + { MODKEY, XK_j, 0, focusstack, {.i = +1 } }, + { MODKEY|ShiftMask, XK_j, 0, movestack, {.i = +1 } }, + + { MODKEY, XK_k, 0, focusstack, {.i = -1 } }, + { MODKEY|ShiftMask, XK_k, 0, movestack, {.i = -1 } }, + + { MODKEY, XK_l, 0, setmfact, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_l, 0, spawn, {.v = logout} }, + + { MODKEY, XK_m, 0, setlayout, {.v = &layouts[2]} }, + { MODKEY|ShiftMask, XK_m, 0, spawn, {.v = manPages } }, + + { MODKEY, XK_o, 0, spawn, {.v = actOnLast } }, + { MODKEY|ShiftMask, XK_o, 0, spawn, {.v = actOnLastDefault } }, + + { MODKEY, XK_p, 0, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_p, 0, spawn, {.v = ports } }, + + { MODKEY, XK_q, 0, killclient, {0} }, + + { MODKEY|ShiftMask, XK_r, 0, quit, {0} }, + + { MODKEY, XK_t, 0, setlayout, {.v = &layouts[0]} }, + { MODKEY|ShiftMask, XK_t, 0, setlayout, {.v = &layouts[3]} }, + + { MODKEY, XK_u, 0, spawn, {.v = unicode } }, + + { MODKEY, XK_w, 0, spawn, {.v = whichproject } }, + { MODKEY|ShiftMask, XK_w, 0, spawn, {.v = project } }, + + { MODKEY, XK_y, 0, spawn, {.v = youtube } }, + { MODKEY, XK_comma, 0, focusmon, {.i = -1 } }, - { MODKEY, XK_period, 0, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, 0, tagmon, {.i = -1 } }, + + { MODKEY, XK_period, 0, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_period, 0, tagmon, {.i = +1 } }, + { 0, XK_Print, 0, spawn, {.v = fullscreenshot } }, { ControlMask, XK_Print, 0, spawn, {.v = activescreenshot } }, { ShiftMask, XK_Print, 0, spawn, {.v = selectscreenshot } }, + { 0, XK_F10, 0, spawn, {.v = fullscreenshot } }, { ControlMask, XK_F10, 0, spawn, {.v = activescreenshot } }, { ShiftMask, XK_F10, 0, spawn, {.v = selectscreenshot } }, + { 0, XF86XK_AudioPlay, 0, spawn, {.v = playpause } }, { 0, XF86XK_AudioPause, 0, spawn, {.v = playpause } }, - { MODKEY|ShiftMask, XK_d, 0, spawn, {.v = date } }, - { MODKEY|ShiftMask, XK_b, 0, spawn, {.v = battery} }, - { MODKEY|ShiftMask, XK_Insert, 0, spawn, {.v = greenclip } }, - //Applications - { MODKEY|ShiftMask, XK_q, 0, spawn, {.v = qutebrowser } }, - { MODKEY, XK_s, 0, spawn, {.v = surf } }, - { MODKEY, XK_c, 0, spawn, {.v = firefox } }, - { MODKEY|ShiftMask, XK_c, 0, spawn, {.v = chromium } }, - //Dmenu / Rofi - { MODKEY, XK_u, 0, spawn, {.v = unicode } }, - { MODKEY, XK_y, 0, spawn, {.v = youtube } }, - { MODKEY, XK_a, 0, spawn, {.v = offlineArchWiki } }, - { MODKEY|ShiftMask, XK_a, 0, spawn, {.v = screenlayout } }, - { MODKEY|ShiftMask, XK_m, 0, spawn, {.v = manPages } }, - { MODKEY|ShiftMask, XK_p, 0, spawn, {.v = ports } }, - { MODKEY, XK_w, 0, spawn, {.v = whichproject } }, - { MODKEY|ShiftMask, XK_w, 0, spawn, {.v = project } }, - { MODKEY, XK_d, 0, spawn, {.v = pass } }, - { MODKEY, XK_o, 0, spawn, {.v = actOnLast } }, - { MODKEY|ShiftMask, XK_o, 0, spawn, {.v = actOnLastDefault } }, - //Background - { MODKEY, XK_e, 0, spawn, {.v = setBackgroundRandom } }, - { MODKEY|ControlMask, XK_e, 0, spawn, {.v = backgroundDetails } }, - //Special keys { 0, XF86XK_AudioRaiseVolume, 0, spawn, {.v = volumeUp } }, { 0, XF86XK_AudioLowerVolume, 0, spawn, {.v = volumeDown } }, { 0, XF86XK_AudioMute, 0, spawn, {.v = volumeToggle } }, { 0, XF86XK_MonBrightnessUp, 0, spawn, {.v = brightnessUp } }, { 0, XF86XK_MonBrightnessDown, 0, spawn, {.v = brightnessDown } }, + { MODKEY, XK_Right, 0, shiftview, {.i = 1 } }, { MODKEY, XK_Left, 0, shiftview, {.i = -1 } }, // On the pinephone, I want a single press of the power button to put the phone in sleep mode. @@ -215,7 +223,6 @@ static Key keys[] = { { 0, XF86XK_PowerOff, 1, spawn, {.v = lockScreen } }, { 0, XF86XK_PowerOff, 2, spawn, {.v = toggleKeyboard } }, { 0, XF86XK_PowerOff, 3, spawn, {.v = powerMenu } }, - { MODKEY|ShiftMask, XK_r, 0, quit, {0} }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) @@ -226,6 +233,9 @@ static Key keys[] = { TAGKEYS( XK_7, 6) TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) + + { MODKEY, XK_0, 0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, 0, tag, {.ui = ~0 } }, }; /* button definitions */