dwmc patch
This commit is contained in:
parent
e81decd079
commit
95131de64f
5
Makefile
5
Makefile
@ -41,15 +41,16 @@ dist: clean
|
||||
|
||||
install: all
|
||||
mkdir -p ${DESTDIR}${PREFIX}/bin
|
||||
cp -f dwm dwm-msg ${DESTDIR}${PREFIX}/bin
|
||||
cp -f dwm dwmc dwm-msg ${DESTDIR}${PREFIX}/bin
|
||||
chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
|
||||
chmod 755 ${DESTDIR}${PREFIX}/bin/dwmc
|
||||
chmod 755 ${DESTDIR}${PREFIX}/bin/dwm-msg
|
||||
mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
||||
sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
|
||||
uninstall:
|
||||
rm -f ${DESTDIR}${PREFIX}/bin/dwm\
|
||||
rm -f ${DESTDIR}${PREFIX}/bin/dwm*\
|
||||
${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
|
||||
.PHONY: all options clean dist install uninstall
|
||||
|
@ -68,6 +68,7 @@ Most patches can be found on the suckless website: [https://dwm.suckless.org/pat
|
||||
* [combo](https://dwm.suckless.org/patches/combo/) - Select multiple tags for tag or view by pressing all the right keys as a combo
|
||||
* [cool autostart](https://dwm.suckless.org/patches/cool_autostart/) - Execute commands from `autostart` array in `config.h` on startup and kill processes upon dwm exit
|
||||
* [cyclelayouts](https://dwm.suckless.org/patches/cyclelayouts/) - Cycle through all available layouts
|
||||
* [dwmc](https://dwm.suckless.org/patches/dwmc/) - Simple dwmc client using a fork of [fsignal](https://dwm.suckless.org/patches/fsignal/) to communicate with dwm
|
||||
* [fixborders](https://dwm.suckless.org/patches/alpha/) - Make borders opaque
|
||||
* [ipc](https://github.com/mihirlad55/dwm-ipc) - Allows third party programs (e.g. polybar) to query window manager for information
|
||||
* [movestack](https://dwm.suckless.org/patches/movestack/) - Move clients around in the stack and swap them with the master
|
||||
|
70
config.def.h
70
config.def.h
@ -272,3 +272,73 @@ static IPCCommand ipccommands[] = {
|
||||
IPCCOMMAND( quit, 1, {ARG_TYPE_NONE} )
|
||||
};
|
||||
|
||||
void
|
||||
setlayoutex(const Arg *arg)
|
||||
{
|
||||
setlayout(&((Arg) { .v = &layouts[arg->i] }));
|
||||
}
|
||||
|
||||
void
|
||||
viewex(const Arg *arg)
|
||||
{
|
||||
view(&((Arg) { .ui = 1 << arg->ui }));
|
||||
}
|
||||
|
||||
void
|
||||
viewall(const Arg *arg)
|
||||
{
|
||||
view(&((Arg){.ui = ~0}));
|
||||
}
|
||||
|
||||
void
|
||||
toggleviewex(const Arg *arg)
|
||||
{
|
||||
toggleview(&((Arg) { .ui = 1 << arg->ui }));
|
||||
}
|
||||
|
||||
void
|
||||
tagex(const Arg *arg)
|
||||
{
|
||||
tag(&((Arg) { .ui = 1 << arg->ui }));
|
||||
}
|
||||
|
||||
void
|
||||
toggletagex(const Arg *arg)
|
||||
{
|
||||
toggletag(&((Arg) { .ui = 1 << arg->ui }));
|
||||
}
|
||||
|
||||
void
|
||||
tagall(const Arg *arg)
|
||||
{
|
||||
tag(&((Arg){.ui = ~0}));
|
||||
}
|
||||
|
||||
/* signal definitions */
|
||||
/* signum must be greater than 0 */
|
||||
/* trigger signals using `xsetroot -name "fsignal:<signame> [<type> <value>]"` */
|
||||
static Signal signals[] = {
|
||||
/* signum function */
|
||||
{ "focusstack", focusstack },
|
||||
{ "setmfact", setmfact },
|
||||
{ "togglebar", togglebar },
|
||||
{ "incnmaster", incnmaster },
|
||||
{ "togglefloating", togglefloating },
|
||||
{ "focusmon", focusmon },
|
||||
{ "tagmon", tagmon },
|
||||
{ "zoom", zoom },
|
||||
{ "view", view },
|
||||
{ "viewall", viewall },
|
||||
{ "viewex", viewex },
|
||||
{ "toggleview", view },
|
||||
{ "toggleviewex", toggleviewex },
|
||||
{ "tag", tag },
|
||||
{ "tagall", tagall },
|
||||
{ "tagex", tagex },
|
||||
{ "toggletag", tag },
|
||||
{ "toggletagex", toggletagex },
|
||||
{ "killclient", killclient },
|
||||
{ "quit", quit },
|
||||
{ "setlayout", setlayout },
|
||||
{ "setlayoutex", setlayoutex },
|
||||
};
|
||||
|
53
dwm.c
53
dwm.c
@ -130,6 +130,11 @@ typedef struct {
|
||||
const Arg arg;
|
||||
} Key;
|
||||
|
||||
typedef struct {
|
||||
const char * sig;
|
||||
void (*func)(const Arg *);
|
||||
} Signal;
|
||||
|
||||
typedef struct {
|
||||
const char *symbol;
|
||||
void (*arrange)(Monitor *);
|
||||
@ -202,6 +207,7 @@ static void attach(Client *c);
|
||||
static void attachBelow(Client *c);
|
||||
static void toggleAttachBelow();
|
||||
static void attachstack(Client *c);
|
||||
static int fake_signal(void);
|
||||
static void buttonpress(XEvent *e);
|
||||
static void checkotherwm(void);
|
||||
static void cleanup(void);
|
||||
@ -1313,6 +1319,49 @@ keypress(XEvent *e)
|
||||
keys[i].func(&(keys[i].arg));
|
||||
}
|
||||
|
||||
int
|
||||
fake_signal(void)
|
||||
{
|
||||
char fsignal[256];
|
||||
char indicator[9] = "fsignal:";
|
||||
char str_sig[50];
|
||||
char param[16];
|
||||
int i, len_str_sig, n, paramn;
|
||||
size_t len_fsignal, len_indicator = strlen(indicator);
|
||||
Arg arg;
|
||||
|
||||
// Get root name property
|
||||
if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) {
|
||||
len_fsignal = strlen(fsignal);
|
||||
|
||||
// Check if this is indeed a fake signal
|
||||
if (len_indicator > len_fsignal ? 0 : strncmp(indicator, fsignal, len_indicator) == 0) {
|
||||
paramn = sscanf(fsignal+len_indicator, "%s%n%s%n", str_sig, &len_str_sig, param, &n);
|
||||
|
||||
if (paramn == 1) arg = (Arg) {0};
|
||||
else if (paramn > 2) return 1;
|
||||
else if (strncmp(param, "i", n - len_str_sig) == 0)
|
||||
sscanf(fsignal + len_indicator + n, "%i", &(arg.i));
|
||||
else if (strncmp(param, "ui", n - len_str_sig) == 0)
|
||||
sscanf(fsignal + len_indicator + n, "%u", &(arg.ui));
|
||||
else if (strncmp(param, "f", n - len_str_sig) == 0)
|
||||
sscanf(fsignal + len_indicator + n, "%f", &(arg.f));
|
||||
else return 1;
|
||||
|
||||
// Check if a signal was found, and if so handle it
|
||||
for (i = 0; i < LENGTH(signals); i++)
|
||||
if (strncmp(str_sig, signals[i].sig, len_str_sig) == 0 && signals[i].func)
|
||||
signals[i].func(&(arg));
|
||||
|
||||
// A fake signal was sent
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// No fake signal was sent, so proceed with update
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
killclient(const Arg *arg)
|
||||
{
|
||||
@ -1583,8 +1632,10 @@ propertynotify(XEvent *e)
|
||||
Window trans;
|
||||
XPropertyEvent *ev = &e->xproperty;
|
||||
|
||||
if ((ev->window == root) && (ev->atom == XA_WM_NAME))
|
||||
if ((ev->window == root) && (ev->atom == XA_WM_NAME)) {
|
||||
if (!fake_signal())
|
||||
updatestatus();
|
||||
}
|
||||
else if (ev->state == PropertyDelete)
|
||||
return; /* ignore */
|
||||
else if ((c = wintoclient(ev->window))) {
|
||||
|
40
dwmc
Executable file
40
dwmc
Executable file
@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
signal() {
|
||||
xsetroot -name "fsignal:$*"
|
||||
}
|
||||
|
||||
case $# in
|
||||
1)
|
||||
case $1 in
|
||||
setlayout | view | viewall | togglebar | togglefloating | zoom | killclient | quit)
|
||||
signal $1
|
||||
;;
|
||||
*)
|
||||
echo "Unknown command or missing one argument."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
2)
|
||||
case $1 in
|
||||
view)
|
||||
signal $1 ui $2
|
||||
;;
|
||||
viewex | toggleviewex | tagex | toggletagex | setlayoutex | focusstack | incnmaster | focusmon | tagmon)
|
||||
signal $1 i $2
|
||||
;;
|
||||
setmfact)
|
||||
signal $1 f $2
|
||||
;;
|
||||
*)
|
||||
echo "Unknown command or one too many arguments."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
echo "Too many arguments."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
240
patches/dwm-dwmc-6.2.diff
Normal file
240
patches/dwm-dwmc-6.2.diff
Normal file
@ -0,0 +1,240 @@
|
||||
From d94cb6f1a553d19127f44dbdc96e8bb5041956c2 Mon Sep 17 00:00:00 2001
|
||||
From: Nihal Jere <noocsharp@gmail.com>
|
||||
Date: Sat, 21 Mar 2020 15:16:49 -0500
|
||||
Subject: [PATCH] dwm-client
|
||||
|
||||
---
|
||||
Makefile | 2 +-
|
||||
config.def.h | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
dwm.c | 55 +++++++++++++++++++++++++++++++++++++++--
|
||||
dwmc | 40 ++++++++++++++++++++++++++++++
|
||||
4 files changed, 164 insertions(+), 3 deletions(-)
|
||||
create mode 100755 dwmc
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 77bcbc0..f837f5c 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -38,7 +38,7 @@ dist: clean
|
||||
|
||||
install: all
|
||||
mkdir -p ${DESTDIR}${PREFIX}/bin
|
||||
- cp -f dwm ${DESTDIR}${PREFIX}/bin
|
||||
+ cp -f dwm dwmc ${DESTDIR}${PREFIX}/bin
|
||||
chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
|
||||
mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
||||
sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
diff --git a/config.def.h b/config.def.h
|
||||
index 1c0b587..efbae79 100644
|
||||
--- a/config.def.h
|
||||
+++ b/config.def.h
|
||||
@@ -113,3 +113,73 @@ static Button buttons[] = {
|
||||
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
|
||||
};
|
||||
|
||||
+void
|
||||
+setlayoutex(const Arg *arg)
|
||||
+{
|
||||
+ setlayout(&((Arg) { .v = &layouts[arg->i] }));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+viewex(const Arg *arg)
|
||||
+{
|
||||
+ view(&((Arg) { .ui = 1 << arg->ui }));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+viewall(const Arg *arg)
|
||||
+{
|
||||
+ view(&((Arg){.ui = ~0}));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+toggleviewex(const Arg *arg)
|
||||
+{
|
||||
+ toggleview(&((Arg) { .ui = 1 << arg->ui }));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+tagex(const Arg *arg)
|
||||
+{
|
||||
+ tag(&((Arg) { .ui = 1 << arg->ui }));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+toggletagex(const Arg *arg)
|
||||
+{
|
||||
+ toggletag(&((Arg) { .ui = 1 << arg->ui }));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+tagall(const Arg *arg)
|
||||
+{
|
||||
+ tag(&((Arg){.ui = ~0}));
|
||||
+}
|
||||
+
|
||||
+/* signal definitions */
|
||||
+/* signum must be greater than 0 */
|
||||
+/* trigger signals using `xsetroot -name "fsignal:<signame> [<type> <value>]"` */
|
||||
+static Signal signals[] = {
|
||||
+ /* signum function */
|
||||
+ { "focusstack", focusstack },
|
||||
+ { "setmfact", setmfact },
|
||||
+ { "togglebar", togglebar },
|
||||
+ { "incnmaster", incnmaster },
|
||||
+ { "togglefloating", togglefloating },
|
||||
+ { "focusmon", focusmon },
|
||||
+ { "tagmon", tagmon },
|
||||
+ { "zoom", zoom },
|
||||
+ { "view", view },
|
||||
+ { "viewall", viewall },
|
||||
+ { "viewex", viewex },
|
||||
+ { "toggleview", view },
|
||||
+ { "toggleviewex", toggleviewex },
|
||||
+ { "tag", tag },
|
||||
+ { "tagall", tagall },
|
||||
+ { "tagex", tagex },
|
||||
+ { "toggletag", tag },
|
||||
+ { "toggletagex", toggletagex },
|
||||
+ { "killclient", killclient },
|
||||
+ { "quit", quit },
|
||||
+ { "setlayout", setlayout },
|
||||
+ { "setlayoutex", setlayoutex },
|
||||
+};
|
||||
diff --git a/dwm.c b/dwm.c
|
||||
index 4465af1..aa53706 100644
|
||||
--- a/dwm.c
|
||||
+++ b/dwm.c
|
||||
@@ -106,6 +106,11 @@ typedef struct {
|
||||
const Arg arg;
|
||||
} Key;
|
||||
|
||||
+typedef struct {
|
||||
+ const char * sig;
|
||||
+ void (*func)(const Arg *);
|
||||
+} Signal;
|
||||
+
|
||||
typedef struct {
|
||||
const char *symbol;
|
||||
void (*arrange)(Monitor *);
|
||||
@@ -148,6 +153,7 @@ static void arrange(Monitor *m);
|
||||
static void arrangemon(Monitor *m);
|
||||
static void attach(Client *c);
|
||||
static void attachstack(Client *c);
|
||||
+static int fake_signal(void);
|
||||
static void buttonpress(XEvent *e);
|
||||
static void checkotherwm(void);
|
||||
static void cleanup(void);
|
||||
@@ -998,6 +1004,49 @@ keypress(XEvent *e)
|
||||
keys[i].func(&(keys[i].arg));
|
||||
}
|
||||
|
||||
+int
|
||||
+fake_signal(void)
|
||||
+{
|
||||
+ char fsignal[256];
|
||||
+ char indicator[9] = "fsignal:";
|
||||
+ char str_sig[50];
|
||||
+ char param[16];
|
||||
+ int i, len_str_sig, n, paramn;
|
||||
+ size_t len_fsignal, len_indicator = strlen(indicator);
|
||||
+ Arg arg;
|
||||
+
|
||||
+ // Get root name property
|
||||
+ if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) {
|
||||
+ len_fsignal = strlen(fsignal);
|
||||
+
|
||||
+ // Check if this is indeed a fake signal
|
||||
+ if (len_indicator > len_fsignal ? 0 : strncmp(indicator, fsignal, len_indicator) == 0) {
|
||||
+ paramn = sscanf(fsignal+len_indicator, "%s%n%s%n", str_sig, &len_str_sig, param, &n);
|
||||
+
|
||||
+ if (paramn == 1) arg = (Arg) {0};
|
||||
+ else if (paramn > 2) return 1;
|
||||
+ else if (strncmp(param, "i", n - len_str_sig) == 0)
|
||||
+ sscanf(fsignal + len_indicator + n, "%i", &(arg.i));
|
||||
+ else if (strncmp(param, "ui", n - len_str_sig) == 0)
|
||||
+ sscanf(fsignal + len_indicator + n, "%u", &(arg.ui));
|
||||
+ else if (strncmp(param, "f", n - len_str_sig) == 0)
|
||||
+ sscanf(fsignal + len_indicator + n, "%f", &(arg.f));
|
||||
+ else return 1;
|
||||
+
|
||||
+ // Check if a signal was found, and if so handle it
|
||||
+ for (i = 0; i < LENGTH(signals); i++)
|
||||
+ if (strncmp(str_sig, signals[i].sig, len_str_sig) == 0 && signals[i].func)
|
||||
+ signals[i].func(&(arg));
|
||||
+
|
||||
+ // A fake signal was sent
|
||||
+ return 1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // No fake signal was sent, so proceed with update
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
void
|
||||
killclient(const Arg *arg)
|
||||
{
|
||||
@@ -1215,8 +1264,10 @@ propertynotify(XEvent *e)
|
||||
Window trans;
|
||||
XPropertyEvent *ev = &e->xproperty;
|
||||
|
||||
- if ((ev->window == root) && (ev->atom == XA_WM_NAME))
|
||||
- updatestatus();
|
||||
+ if ((ev->window == root) && (ev->atom == XA_WM_NAME)) {
|
||||
+ if (!fake_signal())
|
||||
+ updatestatus();
|
||||
+ }
|
||||
else if (ev->state == PropertyDelete)
|
||||
return; /* ignore */
|
||||
else if ((c = wintoclient(ev->window))) {
|
||||
diff --git a/dwmc b/dwmc
|
||||
new file mode 100755
|
||||
index 0000000..5ff8dbc
|
||||
--- /dev/null
|
||||
+++ b/dwmc
|
||||
@@ -0,0 +1,40 @@
|
||||
+#!/usr/bin/env sh
|
||||
+
|
||||
+signal() {
|
||||
+ xsetroot -name "fsignal:$*"
|
||||
+}
|
||||
+
|
||||
+case $# in
|
||||
+1)
|
||||
+ case $1 in
|
||||
+ setlayout | view | viewall | togglebar | togglefloating | zoom | killclient | quit)
|
||||
+ signal $1
|
||||
+ ;;
|
||||
+ *)
|
||||
+ echo "Unknown command or missing one argument."
|
||||
+ exit 1
|
||||
+ ;;
|
||||
+ esac
|
||||
+ ;;
|
||||
+2)
|
||||
+ case $1 in
|
||||
+ view)
|
||||
+ signal $1 ui $2
|
||||
+ ;;
|
||||
+ viewex | toggleviewex | tagex | toggletagex | setlayoutex | focusstack | incnmaster | focusmon | tagmon)
|
||||
+ signal $1 i $2
|
||||
+ ;;
|
||||
+ setmfact)
|
||||
+ signal $1 f $2
|
||||
+ ;;
|
||||
+ *)
|
||||
+ echo "Unknown command or one too many arguments."
|
||||
+ exit 1
|
||||
+ ;;
|
||||
+ esac
|
||||
+ ;;
|
||||
+*)
|
||||
+ echo "Too many arguments."
|
||||
+ exit 1
|
||||
+ ;;
|
||||
+esac
|
||||
--
|
||||
2.25.1
|
||||
|
Loading…
x
Reference in New Issue
Block a user