This commit is contained in:
Anas Elgarhy 2022-07-28 07:54:19 +02:00
parent 95139f7f17
commit aa18032c01
7 changed files with 3558 additions and 195 deletions

View File

@ -0,0 +1,307 @@
diff --git a/config.def.h b/config.def.h
index a2ac963..3bde49d 100644
--- a/config.def.h
+++ b/config.def.h
@@ -47,10 +47,10 @@ static const Layout layouts[] = {
/* key definitions */
#define MODKEY Mod1Mask
#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} },
+ { {0,0,0,0}, {KEY,0,0,0}, view, {.ui = 1 << TAG} }, \
+ { {ControlMask,0,0,0}, {KEY,0,0,0}, toggleview, {.ui = 1 << TAG} }, \
+ { {ShiftMask,0,0,0}, {KEY,0,0,0}, tag, {.ui = 1 << TAG} }, \
+ { {ControlMask|ShiftMask,0,0,0}, {KEY,0,0,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 } }
@@ -62,39 +62,50 @@ static const char *termcmd[] = { "st", NULL };
static Key keys[] = {
/* modifier key function argument */
- { MODKEY, XK_p, spawn, {.v = dmenucmd } },
- { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
- { MODKEY, XK_b, togglebar, {0} },
- { MODKEY, XK_j, focusstack, {.i = +1 } },
- { MODKEY, XK_k, focusstack, {.i = -1 } },
- { MODKEY, XK_i, incnmaster, {.i = +1 } },
- { MODKEY, XK_d, incnmaster, {.i = -1 } },
- { MODKEY, XK_h, setmfact, {.f = -0.05} },
- { MODKEY, XK_l, setmfact, {.f = +0.05} },
- { MODKEY, XK_Return, zoom, {0} },
- { MODKEY, XK_Tab, view, {0} },
- { MODKEY|ShiftMask, XK_c, killclient, {0} },
- { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
- { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
- { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
- { 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 } },
- TAGKEYS( XK_1, 0)
- TAGKEYS( XK_2, 1)
- TAGKEYS( XK_3, 2)
- TAGKEYS( XK_4, 3)
- TAGKEYS( XK_5, 4)
- TAGKEYS( XK_6, 5)
- TAGKEYS( XK_7, 6)
- TAGKEYS( XK_8, 7)
- TAGKEYS( XK_9, 8)
- { MODKEY|ShiftMask, XK_q, quit, {0} },
+ { MODKEY, XK_Escape, setkeymode, {.ui = ModeCommand} },
+};
+
+static Key cmdkeys[] = {
+ /* modifier keys function argument */
+ { 0, XK_Escape, clearcmd, {0} },
+ { ControlMask, XK_g, clearcmd, {0} },
+ { 0, XK_i, setkeymode, {.ui = ModeInsert} },
+};
+static Command commands[] = {
+ /* modifier (4 keys) keysyms (4 keys) function argument */
+ { {0, 0, 0, 0}, { XK_p, 0, 0, 0}, spawn, {.v = dmenucmd } },
+ { {ShiftMask, 0, 0, 0}, { XK_Return, 0, 0, 0}, spawn, {.v = termcmd } },
+ { {0, 0, 0, 0}, { XK_b, 0, 0, 0}, togglebar, {0} },
+ { {0, 0, 0, 0}, { XK_j, 0, 0, 0}, focusstack, {.i = +1 } },
+ { {0, 0, 0, 0}, { XK_k, 0, 0, 0}, focusstack, {.i = -1 } },
+ { {0, 0, 0, 0}, { XK_i, 0, 0, 0}, incnmaster, {.i = +1 } },
+ { {0, 0, 0, 0}, { XK_d, 0, 0, 0}, incnmaster, {.i = -1 } },
+ { {0, 0, 0, 0}, { XK_h, 0, 0, 0}, setmfact, {.f = -0.05} },
+ { {0, 0, 0, 0}, { XK_l, 0, 0, 0}, setmfact, {.f = +0.05} },
+ { {0, 0, 0, 0}, { XK_Return, 0, 0, 0}, zoom, {0} },
+ { {ControlMask, 0, 0, 0}, { XK_i, 0, 0, 0}, view, {0} },
+ { {ShiftMask, 0, 0, 0}, { XK_k, 0, 0, 0}, killclient, {0} },
+ { {0, 0, 0, 0}, { XK_t, 0, 0, 0}, setlayout, {.v = &layouts[0]} },
+ { {0, 0, 0, 0}, { XK_f, 0, 0, 0}, setlayout, {.v = &layouts[1]} },
+ { {0, 0, 0, 0}, { XK_m, 0, 0, 0}, setlayout, {.v = &layouts[2]} },
+ { {0, 0, 0, 0}, { XK_space, 0, 0, 0}, setlayout, {0} },
+ { {ShiftMask, 0, 0, 0}, { XK_space, 0, 0, 0}, togglefloating, {0} },
+ { {0, 0, 0, 0}, { XK_0, 0, 0, 0}, view, {.ui = ~0 } },
+ { {ShiftMask, 0, 0, 0}, { XK_0, 0, 0, 0}, tag, {.ui = ~0 } },
+ { {0, 0, 0, 0}, { XK_comma, 0, 0, 0}, focusmon, {.i = -1 } },
+ { {0, 0, 0, 0}, { XK_period, 0, 0, 0}, focusmon, {.i = +1 } },
+ { {ShiftMask, 0, 0, 0}, { XK_comma, 0, 0, 0}, tagmon, {.i = -1 } },
+ { {ShiftMask, 0, 0, 0}, { XK_period, 0, 0, 0}, tagmon, {.i = +1 } },
+ TAGKEYS(XK_1, 0)
+ TAGKEYS(XK_2, 1)
+ TAGKEYS(XK_3, 2)
+ TAGKEYS(XK_4, 3)
+ TAGKEYS(XK_5, 4)
+ TAGKEYS(XK_6, 5)
+ TAGKEYS(XK_7, 6)
+ TAGKEYS(XK_8, 7)
+ TAGKEYS(XK_9, 8)
+ { {ShiftMask, 0, 0, 0}, { XK_q, 0, 0, 0}, quit, {0} },
};
/* button definitions */
@@ -113,4 +124,3 @@ static Button buttons[] = {
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
};
-
diff --git a/dwm.c b/dwm.c
index 0fc328a..487484e 100644
--- a/dwm.c
+++ b/dwm.c
@@ -60,6 +60,7 @@
/* enums */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { SchemeNorm, SchemeSel }; /* color schemes */
+enum { ModeCommand, ModeInsert };
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
NetWMFullscreen, NetActiveWindow, NetWMWindowType,
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
@@ -99,6 +100,13 @@ struct Client {
Window win;
};
+typedef struct {
+ unsigned int mod[4];
+ KeySym keysym[4];
+ void (*func)(const Arg *);
+ const Arg arg;
+} Command;
+
typedef struct {
unsigned int mod;
KeySym keysym;
@@ -152,6 +160,7 @@ static void buttonpress(XEvent *e);
static void checkotherwm(void);
static void cleanup(void);
static void cleanupmon(Monitor *mon);
+static void clearcmd(const Arg *arg);
static void clientmessage(XEvent *e);
static void configure(Client *c);
static void configurenotify(XEvent *e);
@@ -177,6 +186,7 @@ static void grabbuttons(Client *c, int focused);
static void grabkeys(void);
static void incnmaster(const Arg *arg);
static void keypress(XEvent *e);
+static void keypresscmd(XEvent *e);
static void killclient(const Arg *arg);
static void manage(Window w, XWindowAttributes *wa);
static void mappingnotify(XEvent *e);
@@ -200,6 +210,8 @@ static void sendmon(Client *c, Monitor *m);
static void setclientstate(Client *c, long state);
static void setfocus(Client *c);
static void setfullscreen(Client *c, int fullscreen);
+static void setinsertmode(void);
+static void setkeymode(const Arg *arg);
static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setup(void);
@@ -243,6 +255,8 @@ static int sw, sh; /* X display screen geometry width, height */
static int bh, blw = 0; /* bar geometry */
static int lrpad; /* sum of left and right padding for text */
static int (*xerrorxlib)(Display *, XErrorEvent *);
+static unsigned int cmdmod[4];
+static unsigned int keymode = ModeCommand;
static unsigned int numlockmask = 0;
static void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
@@ -266,6 +280,7 @@ static Cur *cursor[CurLast];
static Clr **scheme;
static Display *dpy;
static Drw *drw;
+static KeySym cmdkeysym[4];
static Monitor *mons, *selmon;
static Window root, wmcheckwin;
@@ -513,6 +528,17 @@ cleanupmon(Monitor *mon)
free(mon);
}
+void
+clearcmd(const Arg *arg)
+{
+ unsigned int i;
+
+ for (i = 0; i < LENGTH(cmdkeysym); i++) {
+ cmdkeysym[i] = 0;
+ cmdmod[i] = 0;
+ }
+}
+
void
clientmessage(XEvent *e)
{
@@ -955,6 +981,13 @@ grabbuttons(Client *c, int focused)
void
grabkeys(void)
{
+ if (keymode == ModeCommand) {
+ XUngrabKey(dpy, AnyKey, AnyModifier, root);
+ XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime);
+ return;
+ }
+
+ XUngrabKeyboard(dpy, CurrentTime);
updatenumlockmask();
{
unsigned int i, j;
@@ -996,6 +1029,11 @@ keypress(XEvent *e)
KeySym keysym;
XKeyEvent *ev;
+ if (keymode == ModeCommand) {
+ keypresscmd(e);
+ return;
+ }
+
ev = &e->xkey;
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
for (i = 0; i < LENGTH(keys); i++)
@@ -1005,6 +1043,53 @@ keypress(XEvent *e)
keys[i].func(&(keys[i].arg));
}
+void
+keypresscmd(XEvent *e) {
+ unsigned int i, j;
+ int matches = 0;
+ KeySym keysym;
+ XKeyEvent *ev;
+
+ ev = &e->xkey;
+ keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
+ if (XK_Shift_L <= keysym && keysym <= XK_Hyper_R) {
+ return;
+ }
+
+ for (i = 0; i < LENGTH(cmdkeys); i++) {
+ if (keysym == cmdkeys[i].keysym
+ && CLEANMASK(cmdkeys[i].mod) == CLEANMASK(ev->state)
+ && cmdkeys[i].func) {
+ cmdkeys[i].func(&(cmdkeys[i].arg));
+ return;
+ }
+ }
+
+ for (j = 0; j < LENGTH(cmdkeysym); j++) {
+ if (cmdkeysym[j] == 0) {
+ cmdkeysym[j] = keysym;
+ cmdmod[j] = ev->state;
+ break;
+ }
+ }
+
+ for (i = 0; i < LENGTH(commands); i++) {
+ matches = 0;
+ for (j = 0; j < LENGTH(cmdkeysym); j++) {
+ if (cmdkeysym[j] == commands[i].keysym[j]
+ && CLEANMASK(cmdmod[j]) == CLEANMASK(commands[i].mod[j]))
+ matches++;
+ }
+ if (matches == LENGTH(cmdkeysym)) {
+ if (commands[i].func)
+ commands[i].func(&(commands[i].arg));
+ clearcmd(NULL);
+ return;
+ }
+ }
+}
+
+
void
killclient(const Arg *arg)
{
@@ -1438,6 +1523,24 @@ setclientstate(Client *c, long state)
PropModeReplace, (unsigned char *)data, 2);
}
+void
+setinsertmode()
+{
+ keymode = ModeInsert;
+ clearcmd(NULL);
+ grabkeys();
+}
+
+void
+setkeymode(const Arg *arg)
+{
+ if(!arg)
+ return;
+ keymode = arg->ui;
+ clearcmd(NULL);
+ grabkeys();
+}
+
int
sendevent(Client *c, Atom proto)
{
@@ -1645,6 +1748,7 @@ sigchld(int unused)
void
spawn(const Arg *arg)
{
+ setinsertmode();
if (arg->v == dmenucmd)
dmenumon[0] = '0' + selmon->num;
if (fork() == 0) {

68
src/config.def.h.orig Normal file
View File

@ -0,0 +1,68 @@
/* See LICENSE file for copyright and license details. */
/* def */
#define WEBBROWSER "google-chrome-stable"
#define TERMINAL "alacritty"
#define SCREENSHOT "spectacle"
#define GUI_FILEMANAGER "pcmanfm"
/* appearance */
static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int gappx = 3; /* gaps size between windows */
static const unsigned int snap = 32; /* snap pixel */
static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */
static const unsigned int systrayonleft = 0; /* 0: systray in the right corner, >0: systray on left of status text */
static const unsigned int systrayspacing = 2; /* systray spacing */
static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/
static const int showsystray = 1; /* 0 means no systray */
static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */
static const char *fonts[] = { "monospace:size=11", "Noto Color Emoji:size=11", "Nerd Font Mono:weight=bold:size=15:antialias=true:hinting=true" };
static const char dmenufont[] = "monospace:size=11";
static const char col_1[] = "#282c34"; // Background color of bar
static const char col_2[] = "#282c34"; // Background color of unfocused windows border
static const char col_3[] = "#d7d7d7";
static const char col_4[] = "#018858"; // Background color of focused windows border and tags (main color acent)
static const char *colors[][3] = {
/* fg bg border */
[SchemeNorm] = { col_3, col_1, col_2 },
[SchemeSel] = { col_3, col_4, col_4 },
};
// Autostart programs
static const char *const autostart[] = {
// Start my build of slstatus
"slstatus", NULL,
// Keyboard layouts switch (requires setxkbmap)
"setxkbmap", "-model", "pc101", "-layout", "us,ar", "-variant", ",,", "-option", "grp:win_space_toggle", NULL,
// "xkbset", "exp", "=sticky", "-twokey", "-latchlock", NULL, // sticky keys
"/bin/stickykeys", NULL, // sticky keys script
"picom", NULL, // Start compositor , for transparency
"nitrogen", "--restore", NULL, // Restores the wallpaper
"nm-applet", NULL, // Start the network manger
"copyq", NULL, // clipboard manger
NULL /* terminate */
};
/* tagging */
// static const char *tags[] = { "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" };
static const char *tags[] = { "", "", "", "", "", "", "", "", "" };
static const Rule rules[] = {
/* xprop(1):
* WM_CLASS(STRING) = instance, class
* WM_NAME(STRING) = title
*/
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, 1, -1 },
{ WEBBROWSER, NULL, NULL, 1 << 8, 0, -1 },
};
/* layout(s) */
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
static const int nmaster = 1; /* number of clients in master area */
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
#include "layouts/layouts.h"
#include "movestack.c"
#include "keys/keys.h"

106
src/config.def.h.rej Normal file
View File

@ -0,0 +1,106 @@
--- config.def.h
+++ config.def.h
@@ -47,10 +47,10 @@ static const Layout layouts[] = {
/* key definitions */
#define MODKEY Mod1Mask
#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} },
+ { {0,0,0,0}, {KEY,0,0,0}, view, {.ui = 1 << TAG} }, \
+ { {ControlMask,0,0,0}, {KEY,0,0,0}, toggleview, {.ui = 1 << TAG} }, \
+ { {ShiftMask,0,0,0}, {KEY,0,0,0}, tag, {.ui = 1 << TAG} }, \
+ { {ControlMask|ShiftMask,0,0,0}, {KEY,0,0,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 } }
@@ -62,39 +62,50 @@ static const char *termcmd[] = { "st", NULL };
static Key keys[] = {
/* modifier key function argument */
- { MODKEY, XK_p, spawn, {.v = dmenucmd } },
- { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
- { MODKEY, XK_b, togglebar, {0} },
- { MODKEY, XK_j, focusstack, {.i = +1 } },
- { MODKEY, XK_k, focusstack, {.i = -1 } },
- { MODKEY, XK_i, incnmaster, {.i = +1 } },
- { MODKEY, XK_d, incnmaster, {.i = -1 } },
- { MODKEY, XK_h, setmfact, {.f = -0.05} },
- { MODKEY, XK_l, setmfact, {.f = +0.05} },
- { MODKEY, XK_Return, zoom, {0} },
- { MODKEY, XK_Tab, view, {0} },
- { MODKEY|ShiftMask, XK_c, killclient, {0} },
- { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
- { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
- { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
- { 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 } },
- TAGKEYS( XK_1, 0)
- TAGKEYS( XK_2, 1)
- TAGKEYS( XK_3, 2)
- TAGKEYS( XK_4, 3)
- TAGKEYS( XK_5, 4)
- TAGKEYS( XK_6, 5)
- TAGKEYS( XK_7, 6)
- TAGKEYS( XK_8, 7)
- TAGKEYS( XK_9, 8)
- { MODKEY|ShiftMask, XK_q, quit, {0} },
+ { MODKEY, XK_Escape, setkeymode, {.ui = ModeCommand} },
+};
+
+static Key cmdkeys[] = {
+ /* modifier keys function argument */
+ { 0, XK_Escape, clearcmd, {0} },
+ { ControlMask, XK_g, clearcmd, {0} },
+ { 0, XK_i, setkeymode, {.ui = ModeInsert} },
+};
+static Command commands[] = {
+ /* modifier (4 keys) keysyms (4 keys) function argument */
+ { {0, 0, 0, 0}, { XK_p, 0, 0, 0}, spawn, {.v = dmenucmd } },
+ { {ShiftMask, 0, 0, 0}, { XK_Return, 0, 0, 0}, spawn, {.v = termcmd } },
+ { {0, 0, 0, 0}, { XK_b, 0, 0, 0}, togglebar, {0} },
+ { {0, 0, 0, 0}, { XK_j, 0, 0, 0}, focusstack, {.i = +1 } },
+ { {0, 0, 0, 0}, { XK_k, 0, 0, 0}, focusstack, {.i = -1 } },
+ { {0, 0, 0, 0}, { XK_i, 0, 0, 0}, incnmaster, {.i = +1 } },
+ { {0, 0, 0, 0}, { XK_d, 0, 0, 0}, incnmaster, {.i = -1 } },
+ { {0, 0, 0, 0}, { XK_h, 0, 0, 0}, setmfact, {.f = -0.05} },
+ { {0, 0, 0, 0}, { XK_l, 0, 0, 0}, setmfact, {.f = +0.05} },
+ { {0, 0, 0, 0}, { XK_Return, 0, 0, 0}, zoom, {0} },
+ { {ControlMask, 0, 0, 0}, { XK_i, 0, 0, 0}, view, {0} },
+ { {ShiftMask, 0, 0, 0}, { XK_k, 0, 0, 0}, killclient, {0} },
+ { {0, 0, 0, 0}, { XK_t, 0, 0, 0}, setlayout, {.v = &layouts[0]} },
+ { {0, 0, 0, 0}, { XK_f, 0, 0, 0}, setlayout, {.v = &layouts[1]} },
+ { {0, 0, 0, 0}, { XK_m, 0, 0, 0}, setlayout, {.v = &layouts[2]} },
+ { {0, 0, 0, 0}, { XK_space, 0, 0, 0}, setlayout, {0} },
+ { {ShiftMask, 0, 0, 0}, { XK_space, 0, 0, 0}, togglefloating, {0} },
+ { {0, 0, 0, 0}, { XK_0, 0, 0, 0}, view, {.ui = ~0 } },
+ { {ShiftMask, 0, 0, 0}, { XK_0, 0, 0, 0}, tag, {.ui = ~0 } },
+ { {0, 0, 0, 0}, { XK_comma, 0, 0, 0}, focusmon, {.i = -1 } },
+ { {0, 0, 0, 0}, { XK_period, 0, 0, 0}, focusmon, {.i = +1 } },
+ { {ShiftMask, 0, 0, 0}, { XK_comma, 0, 0, 0}, tagmon, {.i = -1 } },
+ { {ShiftMask, 0, 0, 0}, { XK_period, 0, 0, 0}, tagmon, {.i = +1 } },
+ TAGKEYS(XK_1, 0)
+ TAGKEYS(XK_2, 1)
+ TAGKEYS(XK_3, 2)
+ TAGKEYS(XK_4, 3)
+ TAGKEYS(XK_5, 4)
+ TAGKEYS(XK_6, 5)
+ TAGKEYS(XK_7, 6)
+ TAGKEYS(XK_8, 7)
+ TAGKEYS(XK_9, 8)
+ { {ShiftMask, 0, 0, 0}, { XK_q, 0, 0, 0}, quit, {0} },
};
/* button definitions */
@@ -113,4 +124,3 @@ static Button buttons[] = {
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
};
-

173
src/dwm.c
View File

@ -73,6 +73,7 @@
/* enums */ /* enums */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */
enum { ModeCommand, ModeInsert };
enum { NetSupported, NetWMName, NetWMState, NetWMCheck, enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz,
NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMFullscreen, NetActiveWindow, NetWMWindowType,
@ -115,16 +116,18 @@ struct Client {
}; };
typedef struct { typedef struct {
unsigned int mod; unsigned int mod[4];
KeySym keysym; KeySym keysym[4];
} Key;
typedef struct {
unsigned int n;
const Key keys[5];
void (*func)(const Arg *); void (*func)(const Arg *);
const Arg arg; const Arg arg;
} Keychord; } Command;
typedef struct {
unsigned int mod;
KeySym keysym;
void (*func)(const Arg *);
const Arg arg;
} Key;
typedef struct { typedef struct {
const char *symbol; const char *symbol;
@ -180,6 +183,7 @@ static void buttonpress(XEvent *e);
static void checkotherwm(void); static void checkotherwm(void);
static void cleanup(void); static void cleanup(void);
static void cleanupmon(Monitor *mon); static void cleanupmon(Monitor *mon);
static void clearcmd(const Arg *arg);
static void clientmessage(XEvent *e); static void clientmessage(XEvent *e);
static void configure(Client *c); static void configure(Client *c);
static void configurenotify(XEvent *e); static void configurenotify(XEvent *e);
@ -206,6 +210,7 @@ static void grabbuttons(Client *c, int focused);
static void grabkeys(void); static void grabkeys(void);
static void incnmaster(const Arg *arg); static void incnmaster(const Arg *arg);
static void keypress(XEvent *e); static void keypress(XEvent *e);
static void keypresscmd(XEvent *e);
static void killclient(const Arg *arg); static void killclient(const Arg *arg);
static void manage(Window w, XWindowAttributes *wa); static void manage(Window w, XWindowAttributes *wa);
static void mappingnotify(XEvent *e); static void mappingnotify(XEvent *e);
@ -233,6 +238,8 @@ static void setclientstate(Client *c, long state);
static void setfocus(Client *c); static void setfocus(Client *c);
static void setfullscreen(Client *c, int fullscreen); static void setfullscreen(Client *c, int fullscreen);
static void fullscreen(const Arg *arg); static void fullscreen(const Arg *arg);
static void setinsertmode(void);
static void setkeymode(const Arg *arg);
static void setlayout(const Arg *arg); static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg); static void setmfact(const Arg *arg);
static void setup(void); static void setup(void);
@ -284,6 +291,8 @@ static int sw, sh; /* X display screen geometry width, height */
static int bh, blw = 0; /* bar geometry */ static int bh, blw = 0; /* bar geometry */
static int lrpad; /* sum of left and right padding for text */ static int lrpad; /* sum of left and right padding for text */
static int (*xerrorxlib)(Display *, XErrorEvent *); static int (*xerrorxlib)(Display *, XErrorEvent *);
static unsigned int cmdmod[4];
static unsigned int keymode = ModeCommand;
static unsigned int numlockmask = 0; static unsigned int numlockmask = 0;
static void (*handler[LASTEvent]) (XEvent *) = { static void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress, [ButtonPress] = buttonpress,
@ -308,9 +317,9 @@ static Cur *cursor[CurLast];
static Clr **scheme; static Clr **scheme;
static Display *dpy; static Display *dpy;
static Drw *drw; static Drw *drw;
static KeySym cmdkeysym[4];
static Monitor *mons, *selmon; static Monitor *mons, *selmon;
static Window root, wmcheckwin; static Window root, wmcheckwin;
unsigned int currentkey = 0;
/* configuration, allows nested code to access above variables */ /* configuration, allows nested code to access above variables */
#include "config.h" #include "config.h"
@ -600,6 +609,17 @@ cleanupmon(Monitor *mon)
free(mon); free(mon);
} }
void
clearcmd(const Arg *arg)
{
unsigned int i;
for (i = 0; i < LENGTH(cmdkeysym); i++) {
cmdkeysym[i] = 0;
cmdmod[i] = 0;
}
}
void void
clientmessage(XEvent *e) clientmessage(XEvent *e)
{ {
@ -1136,18 +1156,25 @@ grabbuttons(Client *c, int focused)
void void
grabkeys(void) grabkeys(void)
{ {
if (keymode == ModeCommand) {
XUngrabKey(dpy, AnyKey, AnyModifier, root);
XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime);
return;
}
XUngrabKeyboard(dpy, CurrentTime);
updatenumlockmask(); updatenumlockmask();
{ {
unsigned int i, k; unsigned int i, j;
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
KeyCode code; KeyCode code;
XUngrabKey(dpy, AnyKey, AnyModifier, root); XUngrabKey(dpy, AnyKey, AnyModifier, root);
for (i = 0; i < LENGTH(keychords); i++) for (i = 0; i < LENGTH(keys); i++)
if ((code = XKeysymToKeycode(dpy, keychords[i].keys[currentkey].keysym))) if ((code = XKeysymToKeycode(dpy, keys[i].keysym)))
for (k = 0; k < LENGTH(modifiers); k++) for (j = 0; j < LENGTH(modifiers); j++)
XGrabKey(dpy, code, keychords[i].keys[currentkey].mod | modifiers[k], root, XGrabKey(dpy, code, keys[i].mod | modifiers[j], root,
True, GrabModeAsync, GrabModeAsync); True, GrabModeAsync, GrabModeAsync);
} }
} }
@ -1173,50 +1200,71 @@ isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info)
void void
keypress(XEvent *e) keypress(XEvent *e)
{ {
XEvent event = *e; unsigned int i;
Keychord *keychord;
unsigned int ran = 0;
KeySym keysym; KeySym keysym;
XKeyEvent *ev; XKeyEvent *ev;
Keychord *newoptions;
Keychord *oldoptions = (Keychord *)malloc(sizeof(keychords));
memcpy(oldoptions, keychords, sizeof(keychords)); if (keymode == ModeCommand) {
size_t numoption = 0; keypresscmd(e);
while(!ran){ return;
ev = &event.xkey;
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
newoptions = (Keychord *)malloc(0);
numoption = 0;
for (keychord = oldoptions; keychord->n != 0 && currentkey < 5; keychord = (Keychord *)((char *)keychord + sizeof(Keychord))){
if(keysym == keychord->keys[currentkey].keysym
&& CLEANMASK(keychord->keys[currentkey].mod) == CLEANMASK(ev->state)
&& keychord->func){
if(keychord->n == currentkey +1){
keychord->func(&(keychord->arg));
ran = 1;
}else{
numoption++;
newoptions = (Keychord *)realloc(newoptions, numoption * sizeof(Keychord));
memcpy((char *)newoptions + (numoption -1) * sizeof(Keychord),keychord, sizeof(Keychord));
}
}
}
currentkey++;
if(numoption == 0)
break;
grabkeys();
while (running && !XNextEvent(dpy, &event) && !ran)
if(event.type == KeyPress)
break;
free(oldoptions);
oldoptions = newoptions;
} }
free(newoptions);
currentkey = 0; ev = &e->xkey;
grabkeys(); keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
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));
} }
void
keypresscmd(XEvent *e) {
unsigned int i, j;
int matches = 0;
KeySym keysym;
XKeyEvent *ev;
ev = &e->xkey;
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
if (XK_Shift_L <= keysym && keysym <= XK_Hyper_R) {
return;
}
for (i = 0; i < LENGTH(cmdkeys); i++) {
if (keysym == cmdkeys[i].keysym
&& CLEANMASK(cmdkeys[i].mod) == CLEANMASK(ev->state)
&& cmdkeys[i].func) {
cmdkeys[i].func(&(cmdkeys[i].arg));
return;
}
}
for (j = 0; j < LENGTH(cmdkeysym); j++) {
if (cmdkeysym[j] == 0) {
cmdkeysym[j] = keysym;
cmdmod[j] = ev->state;
break;
}
}
for (i = 0; i < LENGTH(commands); i++) {
matches = 0;
for (j = 0; j < LENGTH(cmdkeysym); j++) {
if (cmdkeysym[j] == commands[i].keysym[j]
&& CLEANMASK(cmdmod[j]) == CLEANMASK(commands[i].mod[j]))
matches++;
}
if (matches == LENGTH(cmdkeysym)) {
if (commands[i].func)
commands[i].func(&(commands[i].arg));
clearcmd(NULL);
return;
}
}
}
void void
killclient(const Arg *arg) killclient(const Arg *arg)
{ {
@ -1709,6 +1757,24 @@ setclientstate(Client *c, long state)
PropModeReplace, (unsigned char *)data, 2); PropModeReplace, (unsigned char *)data, 2);
} }
void
setinsertmode()
{
keymode = ModeInsert;
clearcmd(NULL);
grabkeys();
}
void
setkeymode(const Arg *arg)
{
if(!arg)
return;
keymode = arg->ui;
clearcmd(NULL);
grabkeys();
}
int int
sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4)
{ {
@ -1965,6 +2031,7 @@ sigchld(int unused)
void void
spawn(const Arg *arg) spawn(const Arg *arg)
{ {
setinsertmode();
if (arg->v == dmenucmd) if (arg->v == dmenucmd)
dmenumon[0] = '0' + selmon->num; dmenumon[0] = '0' + selmon->num;
if (fork() == 0) { if (fork() == 0) {

2641
src/dwm.c.orig Normal file

File diff suppressed because it is too large Load Diff

19
src/dwm.c.rej Normal file
View File

@ -0,0 +1,19 @@
--- dwm.c
+++ dwm.c
@@ -60,6 +60,7 @@
/* enums */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { SchemeNorm, SchemeSel }; /* color schemes */
+enum { ModeCommand, ModeInsert };
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
NetWMFullscreen, NetActiveWindow, NetWMWindowType,
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
@@ -209,6 +219,8 @@ static void sendmon(Client *c, Monitor *m);
static void setclientstate(Client *c, long state);
static void setfocus(Client *c);
static void setfullscreen(Client *c, int fullscreen);
+static void setinsertmode(void);
+static void setkeymode(const Arg *arg);
static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setup(void);

View File

@ -11,158 +11,313 @@ static const char *termcmd[] = { TERMINAL, NULL };
#define MODKEY Mod4Mask // win/super key #define MODKEY Mod4Mask // win/super key
#define TAGKEYS(KEY,TAG) \ #define TAGKEYS(KEY,TAG) \
{1, {{MODKEY, KEY}}, view, {.ui = 1 << TAG} }, \ { {0,0,0,0}, {KEY,0,0,0}, view, {.ui = 1 << TAG} }, \
{1, {{MODKEY|ControlMask, KEY}}, toggleview, {.ui = 1 << TAG} }, \ { {ControlMask,0,0,0}, {KEY,0,0,0}, toggleview, {.ui = 1 << TAG} }, \
{1, {{MODKEY|ShiftMask, KEY}}, tag, {.ui = 1 << TAG} }, \ { {ShiftMask,0,0,0}, {KEY,0,0,0}, tag, {.ui = 1 << TAG} }, \
{1, {{MODKEY|ControlMask|ShiftMask, KEY}}, toggletag, {.ui = 1 << TAG} }, { {ControlMask|ShiftMask,0,0,0}, {KEY,0,0,0}, toggletag, {.ui = 1 << TAG} },
// X11 keysym definitions // X11 keysym definitions
#include <X11/XF86keysym.h> // req (libxinerama1 and libxinerama-dev) #include <X11/XF86keysym.h> // req (libxinerama1 and libxinerama-dev)
static Keychord keychords[] = { static Key keys[] = {
/* modifier key function argument */ /* modifier key function argument */
/* ---------------------------------- Apps Keys ---------------------------------- */ /* ---------------------------------- Apps Keys ---------------------------------- */
// Dmenu (launcher) // Dmenu (launcher)
{1, {{MODKEY|ShiftMask, XK_d}}, spawn, {.v = dmenucmd } }, { MODKEY|ShiftMask, XK_d, spawn, {.v = dmenucmd } },
// Rofi launcher (small) // Rofi launcher (small)
{1, {{MODKEY|ShiftMask|ControlMask, XK_d}}, spawn, SHCMD("rofi -show drun") }, { MODKEY|ShiftMask|ControlMask, XK_d, spawn, SHCMD("rofi -show drun") },
// Start the main terminal // Start the main terminal
{1, {{MODKEY, XK_Return}}, spawn, {.v = termcmd } }, { MODKEY, XK_Return, spawn, {.v = termcmd } },
// Start the alacritty terminal // Start the alacritty terminal
{2, {{MODKEY, XK_t}, {0, XK_a}}, spawn, SHCMD("alacritty") }, // {2, {{MODKEY, XK_t}, {0, XK_a}}, spawn, SHCMD("alacritty") },
// // Start the alacritty terminal with tmux
// {2, {{MODKEY, XK_t}, {ShiftMask, XK_a}}, spawn, SHCMD("alacritty -e tmux") },
// // kitty
// {2, {{MODKEY, XK_t}, {0, XK_k}}, spawn, SHCMD("kitty") },
// // kitty with tmux
// {2, {{MODKEY, XK_t}, {ShiftMask, XK_k}}, spawn, SHCMD("kitty -e tmux") },
// /************************************* File browsers *************************************/
// // GUI filebrowser (pcmanfm)
// {2, {{MODKEY|ShiftMask, XK_f}, {0, XK_g}}, spawn, SHCMD(GUI_FILEMANAGER) },
// // Rofi file browser (small)
// {2, {{MODKEY|ShiftMask, XK_f}, {0, XK_f}}, spawn, SHCMD("rofi -show filebrowser") },
// // ranger
// {2, {{MODKEY|ShiftMask, XK_f}, {0, XK_r}}, spawn, SHCMD(TERMINAL " -e ranger") },
// /************************************* Start the web browers *************************************/
// // Google chrome stable
// {2, {{MODKEY, XK_w}, {0, XK_g}}, spawn, SHCMD(WEBBROWSER) },
// // Tor brower
// {2, {{MODKEY, XK_w}, {0, XK_t}}, spawn, SHCMD("tor-browser") },
// /************************************* Start the caht/email/\* apps *************************************/
// // Discord
// {2, {{MODKEY, XK_c}, {0, XK_d}}, spawn, SHCMD("discord") },
// // Obsidian
// {2, {{MODKEY, XK_c}, {0, XK_o}}, spawn, SHCMD("obsidian") },
// /************************************* Start the dev apps *************************************/
// // Jetbrains toolbox
// {2, {{MODKEY, XK_a}, {0, XK_j}}, spawn, SHCMD("jetbrains-toolbox") },
// // NeoVim
// {2, {{MODKEY, XK_a}, {0, XK_n}}, spawn, SHCMD(TERMINAL " -e nvim") },
// // Vim
// {2, {{MODKEY, XK_a}, {0, XK_v}}, spawn, SHCMD(TERMINAL " -e vim") },
// // emacs
// {2, {{MODKEY, XK_a}, {0, XK_e}}, spawn, SHCMD("emacs") },
// /************************************* Start personalize apps *************************************/
// // nitrogen
// {2, {{MODKEY, XK_p}, {0, XK_b}}, spawn, SHCMD("nitrogen") },
// // nm-connection-editor
// {2, {{MODKEY, XK_p}, {0, XK_n}}, spawn, SHCMD("nm-connection-editor") },
// /************************************* Start multi media apps *************************************/
// // cmus
// {2, {{MODKEY, XK_m}, {0, XK_c}}, spawn, SHCMD("sh -c \"" TERMINAL " -e cmus\" & sh -c \"cmus-rpc --link\"") },
// // vlc
// {2, {{MODKEY, XK_m}, {0, XK_v}}, spawn, SHCMD("vlc") },
// // vlc in the main terminal
// {2, {{MODKEY, XK_m}, {ShiftMask, XK_v}}, spawn, SHCMD(TERMINAL "nvlc") },
// /************************************* Start the emoji piker apps *************************************/
// // Emoji selector (rofi)
// {1, {{Mod4Mask, XK_e}}, spawn, SHCMD("rofi -show emoji") },
// /************************************* dwm keys *************************************/
// // Full screen mode
// {1, {{MODKEY, XK_f}}, fullscreen, {0} },
// // Toggle the slstatus bar (hide/show)
// {1, {{MODKEY, XK_b}}, togglebar, {0} },
// // Change the focus
// {1, {{MODKEY, XK_j}}, focusstack, {.i = +1 } },
// {1, {{MODKEY, XK_k}}, focusstack, {.i = -1 } },
// // Change the stack layout (horizontal/virtecal)
// {1, {{MODKEY, XK_i}}, incnmaster, {.i = +1 } },
// {1, {{MODKEY, XK_d}}, incnmaster, {.i = -1 } },
// // Change the focus window size (in the tile mode)
// {1, {{MODKEY, XK_h}}, setmfact, {.f = -0.05} },
// {1, {{MODKEY, XK_l}}, setmfact, {.f = +0.05} },
// // { MODKEY, XK_Return, zoom, {0} },
// {1, {{MODKEY, XK_Tab}}, view, {0} },
//
// {1, {{MODKEY|ShiftMask, XK_j}}, movestack, {.i = +1 } },
// {1, {{MODKEY|ShiftMask, XK_k}}, movestack, {.i = -1 } },
// // Toogle styky mode
// {1, {{MODKEY|ShiftMask, XK_s}}, togglesticky, {0} },
//
// // Quit from the foucsed window (kill)
// {2, {{MODKEY, XK_q}, {0, XK_q}}, killclient, {0} },
// /************************* Switch between layouts *************************/
// // Tiled layout
// {2, {{MODKEY, XK_s}, {0, XK_t}}, setlayout, {.v = &layouts[0]} },
// // Floating layout
// {2, {{MODKEY, XK_s}, {0, XK_f}}, setlayout, {.v = &layouts[1]} },
// // Monocle layout
// {2, {{MODKEY, XK_s}, {0, XK_m}}, setlayout, {.v = &layouts[2]} },
// // Grid layout
// {2, {{MODKEY, XK_s}, {0, XK_g}}, setlayout, {.v = &layouts[3]} },
// // Spiral layout
// {2, {{MODKEY, XK_s}, {0, XK_r}}, setlayout, {.v = &layouts[4]} },
// // Dwindle layout
// {2, {{MODKEY, XK_s}, {ShiftMask, XK_r}}, setlayout, {.v = &layouts[5]} },
// // Centerd master layout
// {2, {{MODKEY, XK_s}, {0, XK_c}}, setlayout, {.v = &layouts[6]} },
// // Centerd floating master layout
// {2, {{MODKEY, XK_s}, {ShiftMask, XK_c}}, setlayout, {.v = &layouts[7]} },
//
// // Toggle between current layout and tile layout
// {2, {{MODKEY, XK_s}, {0, XK_space}}, setlayout, {0} },
// // Toggle floating window
// {1, {{MODKEY|Mod1Mask, XK_f}}, togglefloating, {0} },
// // View all tags
// {1, {{MODKEY, XK_0}}, view, {.ui = ~0 } },
// // Mirror the current tagg in all tags
// {1, {{MODKEY|ShiftMask, XK_0}}, tag, {.ui = ~0 } },
// // I don't know
// {1, {{MODKEY, XK_comma}}, focusmon, {.i = -1 } },
// {1, {{MODKEY, XK_period}}, focusmon, {.i = +1 } },
// {1, {{MODKEY|ShiftMask, XK_comma}}, tagmon, {.i = -1 } },
// {1, {{MODKEY|ShiftMask, XK_period}}, tagmon, {.i = +1 } },
// /************************* Tag keys *************************/
// TAGKEYS( XK_1, 0)
// TAGKEYS( XK_2, 1)
// TAGKEYS( XK_3, 2)
// TAGKEYS( XK_4, 3)
// TAGKEYS( XK_5, 4)
// TAGKEYS( XK_6, 5)
// TAGKEYS( XK_7, 6)
// TAGKEYS( XK_8, 7)
// TAGKEYS( XK_9, 8)
// /* ---------------------------------- Control Keys ---------------------------------- */
// // Brightness controllers (requires xbacklight)
// {1, {{0, XF86XK_MonBrightnessUp}}, spawn, SHCMD("xbacklight -inc 5") },
// {1, {{0, XF86XK_MonBrightnessDown}}, spawn, SHCMD("xbacklight -dec 5") },
// // Sound controllers (requires pamixer)
// {1, {{0, XF86XK_AudioRaiseVolume}}, spawn, SHCMD("pamixer --allow-boost -i 4") },
// {1, {{0, XF86XK_AudioLowerVolume}}, spawn, SHCMD("pamixer --allow-boost -d 4") },
// {1, {{0, XF86XK_AudioMute}}, spawn, SHCMD("pamixer -t") },
// // Media controls (requires playerctl)
// {1, {{0, XF86XK_AudioPlay}}, spawn, SHCMD("playerctl play-pause") },
// {1, {{0, XF86XK_AudioStop}}, spawn, SHCMD("playerctl stop") },
// {1, {{0, XF86XK_AudioNext}}, spawn, SHCMD("playerctl next") },
// {1, {{0, XF86XK_AudioPrev}}, spawn, SHCMD("playerctl previous") },
// // Mute and unmute mic
// {1, {{0, XF86XK_AudioMicMute}}, spawn, SHCMD("pactl set-source-mute @DEFAULT_SOURCE@ toggle") },
// // Take a screenshot
// {1, {{0, XK_Print}}, spawn, SHCMD(SCREENSHOT) },
// /* ---------------------------------- lock Keys ---------------------------------- */
// // Lock the screen
// {1, {{MODKEY|ShiftMask, XK_x}}, spawn, SHCMD("betterlockscreen -l dim") },
// // Kill dwm (super + shift + alt + q)
// {1, {{MODKEY|ShiftMask|Mod1Mask, XK_q}}, quit, {0} },
{ MODKEY, XK_Escape, setkeymode, {.ui = ModeCommand} },
};
static Key cmdkeys[] = {
/* modifier keys function argument */
{ 0, XK_Escape, clearcmd, {0} },
{ ControlMask, XK_g, clearcmd, {0} },
{ 0, XK_i, setkeymode, {.ui = ModeInsert} },
};
static Command commands[] = {
/* modifier (4 keys) keysyms (4 keys) function argument */
/* ---------------------------------- Apps Keys ---------------------------------- */
// Dmenu (launcher)
{ {ShiftMask, 0, 0, 0}, {XK_d, 0, 0, 0}, spawn, {.v = dmenucmd } },
// Rofi launcher (small)
{ {ShiftMask, ControlMask, 0, 0}, {XK_d, 0, 0, 0}, spawn, SHCMD("rofi -show drun") },
// Start the main terminal
{ {0, 0, 0, 0}, {XK_Return, 0, 0, 0}, spawn, {.v = termcmd } },
// Start the alacritty terminal
{ {0, 0, 0, 0}, {XK_t, XK_a, 0, 0}, spawn, SHCMD("alacritty") },
// Start the alacritty terminal with tmux // Start the alacritty terminal with tmux
{2, {{MODKEY, XK_t}, {ShiftMask, XK_a}}, spawn, SHCMD("alacritty -e tmux") }, { {0, 0, 0, 0}, {XK_t, XK_a, XK_t, 0}, spawn, SHCMD("alacritty -e tmux") },
// kitty // // kitty
{2, {{MODKEY, XK_t}, {0, XK_k}}, spawn, SHCMD("kitty") }, // {2, {{MODKEY, XK_t}, {0, XK_k}}, spawn, SHCMD("kitty") },
// kitty with tmux // // kitty with tmux
{2, {{MODKEY, XK_t}, {ShiftMask, XK_k}}, spawn, SHCMD("kitty -e tmux") }, // {2, {{MODKEY, XK_t}, {ShiftMask, XK_k}}, spawn, SHCMD("kitty -e tmux") },
/************************************* File browsers *************************************/ // /************************************* File browsers *************************************/
// GUI filebrowser (pcmanfm) // // GUI filebrowser (pcmanfm)
{2, {{MODKEY|ShiftMask, XK_f}, {0, XK_g}}, spawn, SHCMD(GUI_FILEMANAGER) }, // {2, {{MODKEY|ShiftMask, XK_f}, {0, XK_g}}, spawn, SHCMD(GUI_FILEMANAGER) },
// Rofi file browser (small) // // Rofi file browser (small)
{2, {{MODKEY|ShiftMask, XK_f}, {0, XK_f}}, spawn, SHCMD("rofi -show filebrowser") }, // {2, {{MODKEY|ShiftMask, XK_f}, {0, XK_f}}, spawn, SHCMD("rofi -show filebrowser") },
// ranger // // ranger
{2, {{MODKEY|ShiftMask, XK_f}, {0, XK_r}}, spawn, SHCMD(TERMINAL " -e ranger") }, // {2, {{MODKEY|ShiftMask, XK_f}, {0, XK_r}}, spawn, SHCMD(TERMINAL " -e ranger") },
/************************************* Start the web browers *************************************/ // /************************************* Start the web browers *************************************/
// Google chrome stable // // Google chrome stable
{2, {{MODKEY, XK_w}, {0, XK_g}}, spawn, SHCMD(WEBBROWSER) }, // {2, {{MODKEY, XK_w}, {0, XK_g}}, spawn, SHCMD(WEBBROWSER) },
// Tor brower // // Tor brower
{2, {{MODKEY, XK_w}, {0, XK_t}}, spawn, SHCMD("tor-browser") }, // {2, {{MODKEY, XK_w}, {0, XK_t}}, spawn, SHCMD("tor-browser") },
/************************************* Start the caht/email/\* apps *************************************/ // /************************************* Start the caht/email/\* apps *************************************/
// Discord // // Discord
{2, {{MODKEY, XK_c}, {0, XK_d}}, spawn, SHCMD("discord") }, // {2, {{MODKEY, XK_c}, {0, XK_d}}, spawn, SHCMD("discord") },
// Obsidian // // Obsidian
{2, {{MODKEY, XK_c}, {0, XK_o}}, spawn, SHCMD("obsidian") }, // {2, {{MODKEY, XK_c}, {0, XK_o}}, spawn, SHCMD("obsidian") },
/************************************* Start the dev apps *************************************/ // /************************************* Start the dev apps *************************************/
// Jetbrains toolbox // // Jetbrains toolbox
{2, {{MODKEY, XK_a}, {0, XK_j}}, spawn, SHCMD("jetbrains-toolbox") }, // {2, {{MODKEY, XK_a}, {0, XK_j}}, spawn, SHCMD("jetbrains-toolbox") },
// NeoVim // // NeoVim
{2, {{MODKEY, XK_a}, {0, XK_n}}, spawn, SHCMD(TERMINAL " -e nvim") }, // {2, {{MODKEY, XK_a}, {0, XK_n}}, spawn, SHCMD(TERMINAL " -e nvim") },
// Vim // // Vim
{2, {{MODKEY, XK_a}, {0, XK_v}}, spawn, SHCMD(TERMINAL " -e vim") }, // {2, {{MODKEY, XK_a}, {0, XK_v}}, spawn, SHCMD(TERMINAL " -e vim") },
// emacs // // emacs
{2, {{MODKEY, XK_a}, {0, XK_e}}, spawn, SHCMD("emacs") }, // {2, {{MODKEY, XK_a}, {0, XK_e}}, spawn, SHCMD("emacs") },
/************************************* Start personalize apps *************************************/ // /************************************* Start personalize apps *************************************/
// nitrogen // // nitrogen
{2, {{MODKEY, XK_p}, {0, XK_b}}, spawn, SHCMD("nitrogen") }, // {2, {{MODKEY, XK_p}, {0, XK_b}}, spawn, SHCMD("nitrogen") },
// nm-connection-editor // // nm-connection-editor
{2, {{MODKEY, XK_p}, {0, XK_n}}, spawn, SHCMD("nm-connection-editor") }, // {2, {{MODKEY, XK_p}, {0, XK_n}}, spawn, SHCMD("nm-connection-editor") },
/************************************* Start multi media apps *************************************/ // /************************************* Start multi media apps *************************************/
// cmus // // cmus
{2, {{MODKEY, XK_m}, {0, XK_c}}, spawn, SHCMD("sh -c \"" TERMINAL " -e cmus\" & sh -c \"cmus-rpc --link\"") }, // {2, {{MODKEY, XK_m}, {0, XK_c}}, spawn, SHCMD("sh -c \"" TERMINAL " -e cmus\" & sh -c \"cmus-rpc --link\"") },
// vlc // // vlc
{2, {{MODKEY, XK_m}, {0, XK_v}}, spawn, SHCMD("vlc") }, // {2, {{MODKEY, XK_m}, {0, XK_v}}, spawn, SHCMD("vlc") },
// vlc in the main terminal // // vlc in the main terminal
{2, {{MODKEY, XK_m}, {ShiftMask, XK_v}}, spawn, SHCMD(TERMINAL "nvlc") }, // {2, {{MODKEY, XK_m}, {ShiftMask, XK_v}}, spawn, SHCMD(TERMINAL "nvlc") },
/************************************* Start the emoji piker apps *************************************/ // /************************************* Start the emoji piker apps *************************************/
// Emoji selector (rofi) // // Emoji selector (rofi)
{1, {{Mod4Mask, XK_e}}, spawn, SHCMD("rofi -show emoji") }, // {1, {{Mod4Mask, XK_e}}, spawn, SHCMD("rofi -show emoji") },
/************************************* dwm keys *************************************/ // /************************************* dwm keys *************************************/
// Full screen mode // // Full screen mode
{1, {{MODKEY, XK_f}}, fullscreen, {0} }, // {1, {{MODKEY, XK_f}}, fullscreen, {0} },
// Toggle the slstatus bar (hide/show) // // Toggle the slstatus bar (hide/show)
{1, {{MODKEY, XK_b}}, togglebar, {0} }, // {1, {{MODKEY, XK_b}}, togglebar, {0} },
// Change the focus // // Change the focus
{1, {{MODKEY, XK_j}}, focusstack, {.i = +1 } }, // {1, {{MODKEY, XK_j}}, focusstack, {.i = +1 } },
{1, {{MODKEY, XK_k}}, focusstack, {.i = -1 } }, // {1, {{MODKEY, XK_k}}, focusstack, {.i = -1 } },
// Change the stack layout (horizontal/virtecal) // // Change the stack layout (horizontal/virtecal)
{1, {{MODKEY, XK_i}}, incnmaster, {.i = +1 } }, // {1, {{MODKEY, XK_i}}, incnmaster, {.i = +1 } },
{1, {{MODKEY, XK_d}}, incnmaster, {.i = -1 } }, // {1, {{MODKEY, XK_d}}, incnmaster, {.i = -1 } },
// Change the focus window size (in the tile mode) // // Change the focus window size (in the tile mode)
{1, {{MODKEY, XK_h}}, setmfact, {.f = -0.05} }, // {1, {{MODKEY, XK_h}}, setmfact, {.f = -0.05} },
{1, {{MODKEY, XK_l}}, setmfact, {.f = +0.05} }, // {1, {{MODKEY, XK_l}}, setmfact, {.f = +0.05} },
// { MODKEY, XK_Return, zoom, {0} }, // // { MODKEY, XK_Return, zoom, {0} },
{1, {{MODKEY, XK_Tab}}, view, {0} }, // {1, {{MODKEY, XK_Tab}}, view, {0} },
//
{1, {{MODKEY|ShiftMask, XK_j}}, movestack, {.i = +1 } }, // {1, {{MODKEY|ShiftMask, XK_j}}, movestack, {.i = +1 } },
{1, {{MODKEY|ShiftMask, XK_k}}, movestack, {.i = -1 } }, // {1, {{MODKEY|ShiftMask, XK_k}}, movestack, {.i = -1 } },
// Toogle styky mode // // Toogle styky mode
{1, {{MODKEY|ShiftMask, XK_s}}, togglesticky, {0} }, // {1, {{MODKEY|ShiftMask, XK_s}}, togglesticky, {0} },
//
// Quit from the foucsed window (kill) // // Quit from the foucsed window (kill)
{2, {{MODKEY, XK_q}, {0, XK_q}}, killclient, {0} }, // {2, {{MODKEY, XK_q}, {0, XK_q}}, killclient, {0} },
/************************* Switch between layouts *************************/ // /************************* Switch between layouts *************************/
// Tiled layout // // Tiled layout
{2, {{MODKEY, XK_s}, {0, XK_t}}, setlayout, {.v = &layouts[0]} }, // {2, {{MODKEY, XK_s}, {0, XK_t}}, setlayout, {.v = &layouts[0]} },
// Floating layout // // Floating layout
{2, {{MODKEY, XK_s}, {0, XK_f}}, setlayout, {.v = &layouts[1]} }, // {2, {{MODKEY, XK_s}, {0, XK_f}}, setlayout, {.v = &layouts[1]} },
// Monocle layout // // Monocle layout
{2, {{MODKEY, XK_s}, {0, XK_m}}, setlayout, {.v = &layouts[2]} }, // {2, {{MODKEY, XK_s}, {0, XK_m}}, setlayout, {.v = &layouts[2]} },
// Grid layout // // Grid layout
{2, {{MODKEY, XK_s}, {0, XK_g}}, setlayout, {.v = &layouts[3]} }, // {2, {{MODKEY, XK_s}, {0, XK_g}}, setlayout, {.v = &layouts[3]} },
// Spiral layout // // Spiral layout
{2, {{MODKEY, XK_s}, {0, XK_r}}, setlayout, {.v = &layouts[4]} }, // {2, {{MODKEY, XK_s}, {0, XK_r}}, setlayout, {.v = &layouts[4]} },
// Dwindle layout // // Dwindle layout
{2, {{MODKEY, XK_s}, {ShiftMask, XK_r}}, setlayout, {.v = &layouts[5]} }, // {2, {{MODKEY, XK_s}, {ShiftMask, XK_r}}, setlayout, {.v = &layouts[5]} },
// Centerd master layout // // Centerd master layout
{2, {{MODKEY, XK_s}, {0, XK_c}}, setlayout, {.v = &layouts[6]} }, // {2, {{MODKEY, XK_s}, {0, XK_c}}, setlayout, {.v = &layouts[6]} },
// Centerd floating master layout // // Centerd floating master layout
{2, {{MODKEY, XK_s}, {ShiftMask, XK_c}}, setlayout, {.v = &layouts[7]} }, // {2, {{MODKEY, XK_s}, {ShiftMask, XK_c}}, setlayout, {.v = &layouts[7]} },
//
// Toggle between current layout and tile layout // // Toggle between current layout and tile layout
{2, {{MODKEY, XK_s}, {0, XK_space}}, setlayout, {0} }, // {2, {{MODKEY, XK_s}, {0, XK_space}}, setlayout, {0} },
// Toggle floating window // // Toggle floating window
{1, {{MODKEY|Mod1Mask, XK_f}}, togglefloating, {0} }, // {1, {{MODKEY|Mod1Mask, XK_f}}, togglefloating, {0} },
// View all tags // // View all tags
{1, {{MODKEY, XK_0}}, view, {.ui = ~0 } }, // {1, {{MODKEY, XK_0}}, view, {.ui = ~0 } },
// Mirror the current tagg in all tags // // Mirror the current tagg in all tags
{1, {{MODKEY|ShiftMask, XK_0}}, tag, {.ui = ~0 } }, // {1, {{MODKEY|ShiftMask, XK_0}}, tag, {.ui = ~0 } },
// I don't know // // I don't know
{1, {{MODKEY, XK_comma}}, focusmon, {.i = -1 } }, // {1, {{MODKEY, XK_comma}}, focusmon, {.i = -1 } },
{1, {{MODKEY, XK_period}}, focusmon, {.i = +1 } }, // {1, {{MODKEY, XK_period}}, focusmon, {.i = +1 } },
{1, {{MODKEY|ShiftMask, XK_comma}}, tagmon, {.i = -1 } }, // {1, {{MODKEY|ShiftMask, XK_comma}}, tagmon, {.i = -1 } },
{1, {{MODKEY|ShiftMask, XK_period}}, tagmon, {.i = +1 } }, // {1, {{MODKEY|ShiftMask, XK_period}}, tagmon, {.i = +1 } },
/************************* Tag keys *************************/ // /************************* Tag keys *************************/
TAGKEYS( XK_1, 0) // TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1) // TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2) // TAGKEYS( XK_3, 2)
TAGKEYS( XK_4, 3) // TAGKEYS( XK_4, 3)
TAGKEYS( XK_5, 4) // TAGKEYS( XK_5, 4)
TAGKEYS( XK_6, 5) // TAGKEYS( XK_6, 5)
TAGKEYS( XK_7, 6) // TAGKEYS( XK_7, 6)
TAGKEYS( XK_8, 7) // TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8) // TAGKEYS( XK_9, 8)
/* ---------------------------------- Control Keys ---------------------------------- */ // /* ---------------------------------- Control Keys ---------------------------------- */
// Brightness controllers (requires xbacklight) // // Brightness controllers (requires xbacklight)
{1, {{0, XF86XK_MonBrightnessUp}}, spawn, SHCMD("xbacklight -inc 5") }, // {1, {{0, XF86XK_MonBrightnessUp}}, spawn, SHCMD("xbacklight -inc 5") },
{1, {{0, XF86XK_MonBrightnessDown}}, spawn, SHCMD("xbacklight -dec 5") }, // {1, {{0, XF86XK_MonBrightnessDown}}, spawn, SHCMD("xbacklight -dec 5") },
// Sound controllers (requires pamixer) // // Sound controllers (requires pamixer)
{1, {{0, XF86XK_AudioRaiseVolume}}, spawn, SHCMD("pamixer --allow-boost -i 4") }, // {1, {{0, XF86XK_AudioRaiseVolume}}, spawn, SHCMD("pamixer --allow-boost -i 4") },
{1, {{0, XF86XK_AudioLowerVolume}}, spawn, SHCMD("pamixer --allow-boost -d 4") }, // {1, {{0, XF86XK_AudioLowerVolume}}, spawn, SHCMD("pamixer --allow-boost -d 4") },
{1, {{0, XF86XK_AudioMute}}, spawn, SHCMD("pamixer -t") }, // {1, {{0, XF86XK_AudioMute}}, spawn, SHCMD("pamixer -t") },
// Media controls (requires playerctl) // // Media controls (requires playerctl)
{1, {{0, XF86XK_AudioPlay}}, spawn, SHCMD("playerctl play-pause") }, // {1, {{0, XF86XK_AudioPlay}}, spawn, SHCMD("playerctl play-pause") },
{1, {{0, XF86XK_AudioStop}}, spawn, SHCMD("playerctl stop") }, // {1, {{0, XF86XK_AudioStop}}, spawn, SHCMD("playerctl stop") },
{1, {{0, XF86XK_AudioNext}}, spawn, SHCMD("playerctl next") }, // {1, {{0, XF86XK_AudioNext}}, spawn, SHCMD("playerctl next") },
{1, {{0, XF86XK_AudioPrev}}, spawn, SHCMD("playerctl previous") }, // {1, {{0, XF86XK_AudioPrev}}, spawn, SHCMD("playerctl previous") },
// Mute and unmute mic // // Mute and unmute mic
{1, {{0, XF86XK_AudioMicMute}}, spawn, SHCMD("pactl set-source-mute @DEFAULT_SOURCE@ toggle") }, // {1, {{0, XF86XK_AudioMicMute}}, spawn, SHCMD("pactl set-source-mute @DEFAULT_SOURCE@ toggle") },
// Take a screenshot // // Take a screenshot
{1, {{0, XK_Print}}, spawn, SHCMD(SCREENSHOT) }, // {1, {{0, XK_Print}}, spawn, SHCMD(SCREENSHOT) },
/* ---------------------------------- lock Keys ---------------------------------- */ // /* ---------------------------------- lock Keys ---------------------------------- */
// Lock the screen // // Lock the screen
{1, {{MODKEY|ShiftMask, XK_x}}, spawn, SHCMD("betterlockscreen -l dim") }, // {1, {{MODKEY|ShiftMask, XK_x}}, spawn, SHCMD("betterlockscreen -l dim") },
// Kill dwm (super + shift + alt + q) // // Kill dwm (super + shift + alt + q)
{1, {{MODKEY|ShiftMask|Mod1Mask, XK_q}}, quit, {0} }, // {1, {{MODKEY|ShiftMask|Mod1Mask, XK_q}}, quit, {0} },
}; };
/* button definitions */ /* button definitions */