Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@ -1,4 +1,4 @@
|
|||||||
This dwm 6.3 (9bffa84, 2022-07-14) side project has a different take on dwm patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. Due to the complexity of some of the patches dwm-flexipatch has diverged from mainstream dwm by making some core patches non-optional for maintenance reasons. For the classic dwm-flexipatch build refer to branch [dwm-flexipatch-1.0](https://github.com/bakkeby/dwm-flexipatch/tree/dwm-flexipatch-1.0).
|
This dwm 6.3 (5e76e7e, 2022-08-06) side project has a different take on dwm patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. Due to the complexity of some of the patches dwm-flexipatch has diverged from mainstream dwm by making some core patches non-optional for maintenance reasons. For the classic dwm-flexipatch build refer to branch [dwm-flexipatch-1.0](https://github.com/bakkeby/dwm-flexipatch/tree/dwm-flexipatch-1.0).
|
||||||
|
|
||||||
For example to include the `alpha` patch then you would only need to flip this setting from 0 to 1 in [patches.h](https://github.com/bakkeby/dwm-flexipatch/blob/master/patches.def.h):
|
For example to include the `alpha` patch then you would only need to flip this setting from 0 to 1 in [patches.h](https://github.com/bakkeby/dwm-flexipatch/blob/master/patches.def.h):
|
||||||
```c
|
```c
|
||||||
@ -19,6 +19,7 @@ Browsing patches? There is a [map of patches](https://coggle.it/diagram/X9IiSSM6
|
|||||||
|
|
||||||
### Changelog:
|
### Changelog:
|
||||||
|
|
||||||
|
2022-08-02 - Added the bidi patch
|
||||||
|
|
||||||
2022-07-05 - Added the tagpreview patch
|
2022-07-05 - Added the tagpreview patch
|
||||||
|
|
||||||
@ -287,6 +288,9 @@ Browsing patches? There is a [map of patches](https://coggle.it/diagram/X9IiSSM6
|
|||||||
- [bartabgroups](https://dwm.suckless.org/patches/bartabgroups/)
|
- [bartabgroups](https://dwm.suckless.org/patches/bartabgroups/)
|
||||||
- turns the titlebar area into a mfact-respecting tab-bar showing each client's title
|
- turns the titlebar area into a mfact-respecting tab-bar showing each client's title
|
||||||
|
|
||||||
|
- [bidi](https://dwm.suckless.org/patches/bidi/)
|
||||||
|
- adds proper support for Right-To-Left (RTL) languages (such as Farsi, Arabic or Hebrew)
|
||||||
|
|
||||||
- [center](https://dwm.suckless.org/patches/center/)
|
- [center](https://dwm.suckless.org/patches/center/)
|
||||||
- adds an iscentered rule to automatically center clients on the current monitor
|
- adds an iscentered rule to automatically center clients on the current monitor
|
||||||
|
|
||||||
|
35
README.org
35
README.org
@ -68,6 +68,7 @@
|
|||||||
- [[#attach-bottom][Attach Bottom]]
|
- [[#attach-bottom][Attach Bottom]]
|
||||||
- [[#auto-start][Auto Start]]
|
- [[#auto-start][Auto Start]]
|
||||||
- [[#auto-resize][Auto Resize]]
|
- [[#auto-resize][Auto Resize]]
|
||||||
|
- [[#bidi-right-to-left-languages][Bidi (Right to Left Languages)]]
|
||||||
- [[#center][Center]]
|
- [[#center][Center]]
|
||||||
- [[#center-transient][Center Transient]]
|
- [[#center-transient][Center Transient]]
|
||||||
- [[#cfacts][CFacts]]
|
- [[#cfacts][CFacts]]
|
||||||
@ -276,7 +277,7 @@ exec dwm
|
|||||||
|
|
||||||
* dwm flexipatch
|
* dwm flexipatch
|
||||||
|
|
||||||
This dwm 6.3 (9bffa84, 2022-07-14) side project has a different take on dwm patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. Due to the complexity of some of the patches dwm-flexipatch has diverged from mainstream dwm by making some core patches non-optional for maintenance reasons. For the classic dwm-flexipatch build refer to branch [[https://github.com/bakkeby/dwm-flexipatch/tree/dwm-flexipatch-1.0][dwm-flexipatch-1.0]].
|
This dwm 6.3 (5e76e7e, 2022-08-06) side project has a different take on dwm patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. Due to the complexity of some of the patches dwm-flexipatch has diverged from mainstream dwm by making some core patches non-optional for maintenance reasons. For the classic dwm-flexipatch build refer to branch [[https://github.com/bakkeby/dwm-flexipatch/tree/dwm-flexipatch-1.0][dwm-flexipatch-1.0]].
|
||||||
|
|
||||||
For example to include the ~alpha~ patch then you would only need to flip this setting from 0 to 1 in [[https://github.com/bakkeby/dwm-flexipatch/blob/master/patches.def.h][patches.h]]:
|
For example to include the ~alpha~ patch then you would only need to flip this setting from 0 to 1 in [[https://github.com/bakkeby/dwm-flexipatch/blob/master/patches.def.h][patches.h]]:
|
||||||
|
|
||||||
@ -296,6 +297,8 @@ Browsing patches? There is a [[https://coggle.it/diagram/X9IiSSM6PTWOM9Wz][map o
|
|||||||
|
|
||||||
** Changelog
|
** Changelog
|
||||||
|
|
||||||
|
2022-08-02 - Added the bidi patch
|
||||||
|
|
||||||
2022-07-05 - Added the tagpreview patch
|
2022-07-05 - Added the tagpreview patch
|
||||||
|
|
||||||
2022-07-04 - Added the shift-tools patch(es) with individual toggles
|
2022-07-04 - Added the shift-tools patch(es) with individual toggles
|
||||||
@ -557,6 +560,9 @@ Browsing patches? There is a [[https://coggle.it/diagram/X9IiSSM6PTWOM9Wz][map o
|
|||||||
- [[https://dwm.suckless.org/patches/bartabgroups/][bartabgroups]]
|
- [[https://dwm.suckless.org/patches/bartabgroups/][bartabgroups]]
|
||||||
- turns the titlebar area into a mfact-respecting tab-bar showing each client's title
|
- turns the titlebar area into a mfact-respecting tab-bar showing each client's title
|
||||||
|
|
||||||
|
- [[https://dwm.suckless.org/patches/bidi/][bidi]]
|
||||||
|
- adds proper support for Right-To-Left (RTL) languages (such as Farsi, Arabic or Hebrew)
|
||||||
|
|
||||||
- [[https://dwm.suckless.org/patches/center/][center]]
|
- [[https://dwm.suckless.org/patches/center/][center]]
|
||||||
- adds an iscentered rule to automatically center clients on the current monitor
|
- adds an iscentered rule to automatically center clients on the current monitor
|
||||||
|
|
||||||
@ -1801,6 +1807,21 @@ https://dwm.suckless.org/patches/autoresize/
|
|||||||
#define AUTORESIZE_PATCH 1
|
#define AUTORESIZE_PATCH 1
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
*** Bidi (Right to Left Languages)
|
||||||
|
|
||||||
|
This patch adds proper support for Right-To-Left languages. (such as Farsi, Arabic or Hebrew).
|
||||||
|
|
||||||
|
You need to uncomment the corresponding lines in =config.mk= to use the =-lfribidi= library when including this patch.
|
||||||
|
|
||||||
|
This patch depends on the following additional library:
|
||||||
|
- fribidi
|
||||||
|
|
||||||
|
https://dwm.suckless.org/patches/bidi/
|
||||||
|
|
||||||
|
#+BEGIN_SRC c :tangle patches.def.h
|
||||||
|
#define BIDI_PATCH 0
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
*** Center
|
*** Center
|
||||||
|
|
||||||
This patch adds an iscentered rule to automatically center clients on the current monitor.
|
This patch adds an iscentered rule to automatically center clients on the current monitor.
|
||||||
@ -3334,10 +3355,13 @@ XCBLIBS = -lX11-xcb -lxcb -lxcb-res
|
|||||||
# This is needed for the winicon and tagpreview patches / BAR_WINICON_PATCH / BAR_TAGPREVIEW_PATCH
|
# This is needed for the winicon and tagpreview patches / BAR_WINICON_PATCH / BAR_TAGPREVIEW_PATCH
|
||||||
#IMLIB2LIBS = -lImlib2
|
#IMLIB2LIBS = -lImlib2
|
||||||
|
|
||||||
# includes and libs
|
# Uncomment for the bidi patch
|
||||||
INCS = -I${X11INC} -I${FREETYPEINC} ${YAJLINC} ${PANGOINC}
|
#BDINC = -I/usr/include/fribidi
|
||||||
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ${XRENDER} ${MPDCLIENT} ${XEXTLIB} ${XCBLIBS} ${KVMLIB} ${PANGOLIB} ${YAJLLIBS} ${IMLIB2LIBS}
|
#BDLIBS = -lfribidi
|
||||||
|
|
||||||
|
# includes and libs
|
||||||
|
INCS = -I${X11INC} -I${FREETYPEINC} ${YAJLINC} ${PANGOINC} ${BDINC}
|
||||||
|
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ${XRENDER} ${MPDCLIENT} ${XEXTLIB} ${XCBLIBS} ${KVMLIB} ${PANGOLIB} ${YAJLLIBS} ${IMLIB2LIBS} $(BDLIBS)
|
||||||
# flags
|
# flags
|
||||||
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
||||||
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
||||||
@ -5143,6 +5167,9 @@ static Signal signals[] = {
|
|||||||
#if STACKER_PATCH
|
#if STACKER_PATCH
|
||||||
{ "pushstack", pushstack },
|
{ "pushstack", pushstack },
|
||||||
#endif // STACKER_PATCH
|
#endif // STACKER_PATCH
|
||||||
|
#if FLOATPOS_PATCH
|
||||||
|
{ "floatpos", floatpos },
|
||||||
|
#endif // FLOATPOS_PATCH
|
||||||
#if FOCUSURGENT_PATCH
|
#if FOCUSURGENT_PATCH
|
||||||
{ "focusurgent", focusurgent },
|
{ "focusurgent", focusurgent },
|
||||||
#endif // FOCUSURGENT_PATCH
|
#endif // FOCUSURGENT_PATCH
|
||||||
|
@ -1466,6 +1466,9 @@ static Signal signals[] = {
|
|||||||
#if STACKER_PATCH
|
#if STACKER_PATCH
|
||||||
{ "pushstack", pushstack },
|
{ "pushstack", pushstack },
|
||||||
#endif // STACKER_PATCH
|
#endif // STACKER_PATCH
|
||||||
|
#if FLOATPOS_PATCH
|
||||||
|
{ "floatpos", floatpos },
|
||||||
|
#endif // FLOATPOS_PATCH
|
||||||
#if FOCUSURGENT_PATCH
|
#if FOCUSURGENT_PATCH
|
||||||
{ "focusurgent", focusurgent },
|
{ "focusurgent", focusurgent },
|
||||||
#endif // FOCUSURGENT_PATCH
|
#endif // FOCUSURGENT_PATCH
|
||||||
|
@ -51,10 +51,13 @@ XCBLIBS = -lX11-xcb -lxcb -lxcb-res
|
|||||||
# This is needed for the winicon and tagpreview patches / BAR_WINICON_PATCH / BAR_TAGPREVIEW_PATCH
|
# This is needed for the winicon and tagpreview patches / BAR_WINICON_PATCH / BAR_TAGPREVIEW_PATCH
|
||||||
#IMLIB2LIBS = -lImlib2
|
#IMLIB2LIBS = -lImlib2
|
||||||
|
|
||||||
# includes and libs
|
# Uncomment for the bidi patch
|
||||||
INCS = -I${X11INC} -I${FREETYPEINC} ${YAJLINC} ${PANGOINC}
|
#BDINC = -I/usr/include/fribidi
|
||||||
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ${XRENDER} ${MPDCLIENT} ${XEXTLIB} ${XCBLIBS} ${KVMLIB} ${PANGOLIB} ${YAJLLIBS} ${IMLIB2LIBS}
|
#BDLIBS = -lfribidi
|
||||||
|
|
||||||
|
# includes and libs
|
||||||
|
INCS = -I${X11INC} -I${FREETYPEINC} ${YAJLINC} ${PANGOINC} ${BDINC}
|
||||||
|
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ${XRENDER} ${MPDCLIENT} ${XEXTLIB} ${XCBLIBS} ${KVMLIB} ${PANGOLIB} ${YAJLLIBS} ${IMLIB2LIBS} $(BDLIBS)
|
||||||
# flags
|
# flags
|
||||||
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
||||||
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
||||||
|
46
drw.c
46
drw.c
@ -9,6 +9,30 @@
|
|||||||
#include "drw.h"
|
#include "drw.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
#if BIDI_PATCH
|
||||||
|
#include <fribidi.h>
|
||||||
|
|
||||||
|
static char fribidi_text[BUFSIZ] = "";
|
||||||
|
|
||||||
|
static void
|
||||||
|
apply_fribidi(const char *str)
|
||||||
|
{
|
||||||
|
FriBidiStrIndex len = strlen(str);
|
||||||
|
FriBidiChar logical[BUFSIZ];
|
||||||
|
FriBidiChar visual[BUFSIZ];
|
||||||
|
FriBidiParType base = FRIBIDI_PAR_ON;
|
||||||
|
FriBidiCharSet charset;
|
||||||
|
|
||||||
|
fribidi_text[0] = 0;
|
||||||
|
if (len > 0) {
|
||||||
|
charset = fribidi_parse_charset("UTF-8");
|
||||||
|
len = fribidi_charset_to_unicode(charset, str, len, logical);
|
||||||
|
fribidi_log2vis(logical, len, &base, visual, NULL, NULL, NULL);
|
||||||
|
len = fribidi_unicode_to_charset(charset, visual, len, fribidi_text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !BAR_PANGO_PATCH
|
#if !BAR_PANGO_PATCH
|
||||||
#define UTF_INVALID 0xFFFD
|
#define UTF_INVALID 0xFFFD
|
||||||
#define UTF_SIZ 4
|
#define UTF_SIZ 4
|
||||||
@ -394,10 +418,15 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int
|
|||||||
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
|
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if BAR_PANGO_PATCH
|
#if BIDI_PATCH
|
||||||
|
int
|
||||||
|
_drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup)
|
||||||
|
#else
|
||||||
int
|
int
|
||||||
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup)
|
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup)
|
||||||
|
#endif // BIDI_PATCH
|
||||||
{
|
{
|
||||||
|
#if BAR_PANGO_PATCH
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int ty;
|
int ty;
|
||||||
unsigned int ew;
|
unsigned int ew;
|
||||||
@ -458,11 +487,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
|
|||||||
XftDrawDestroy(d);
|
XftDrawDestroy(d);
|
||||||
|
|
||||||
return x + (render ? w : 0);
|
return x + (render ? w : 0);
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
int
|
|
||||||
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool ignored)
|
|
||||||
{
|
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int ty;
|
int ty;
|
||||||
unsigned int ew;
|
unsigned int ew;
|
||||||
@ -593,8 +618,17 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
|
|||||||
XftDrawDestroy(d);
|
XftDrawDestroy(d);
|
||||||
|
|
||||||
return x + (render ? w : 0);
|
return x + (render ? w : 0);
|
||||||
}
|
|
||||||
#endif // BAR_PANGO_PATCH
|
#endif // BAR_PANGO_PATCH
|
||||||
|
}
|
||||||
|
|
||||||
|
#if BIDI_PATCH
|
||||||
|
int
|
||||||
|
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup)
|
||||||
|
{
|
||||||
|
apply_fribidi(text);
|
||||||
|
return _drw_text(drw, x, y, w, h, lpad, fribidi_text, invert, markup);
|
||||||
|
}
|
||||||
|
#endif // BIDI_PATCH
|
||||||
|
|
||||||
#if BAR_POWERLINE_TAGS_PATCH || BAR_POWERLINE_STATUS_PATCH
|
#if BAR_POWERLINE_TAGS_PATCH || BAR_POWERLINE_STATUS_PATCH
|
||||||
void
|
void
|
||||||
|
32
dwm.c
32
dwm.c
@ -2222,14 +2222,12 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size)
|
|||||||
text[0] = '\0';
|
text[0] = '\0';
|
||||||
if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems)
|
if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems)
|
||||||
return 0;
|
return 0;
|
||||||
if (name.encoding == XA_STRING)
|
if (name.encoding == XA_STRING) {
|
||||||
strncpy(text, (char *)name.value, size - 1);
|
strncpy(text, (char *)name.value, size - 1);
|
||||||
else {
|
} else if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) {
|
||||||
if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) {
|
|
||||||
strncpy(text, *list, size - 1);
|
strncpy(text, *list, size - 1);
|
||||||
XFreeStringList(list);
|
XFreeStringList(list);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
text[size - 1] = '\0';
|
text[size - 1] = '\0';
|
||||||
XFree(name.value);
|
XFree(name.value);
|
||||||
return 1;
|
return 1;
|
||||||
@ -2625,9 +2623,7 @@ maprequest(XEvent *e)
|
|||||||
}
|
}
|
||||||
#endif // BAR_SYSTRAY_PATCH
|
#endif // BAR_SYSTRAY_PATCH
|
||||||
|
|
||||||
if (!XGetWindowAttributes(dpy, ev->window, &wa))
|
if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect)
|
||||||
return;
|
|
||||||
if (wa.override_redirect)
|
|
||||||
return;
|
return;
|
||||||
#if BAR_ANYBAR_PATCH
|
#if BAR_ANYBAR_PATCH
|
||||||
if (wmclasscontains(ev->window, altbarclass, ""))
|
if (wmclasscontains(ev->window, altbarclass, ""))
|
||||||
@ -3990,9 +3986,7 @@ spawn(const Arg *arg)
|
|||||||
#endif // SPAWNCMD_PATCH
|
#endif // SPAWNCMD_PATCH
|
||||||
setsid();
|
setsid();
|
||||||
execvp(((char **)arg->v)[0], (char **)arg->v);
|
execvp(((char **)arg->v)[0], (char **)arg->v);
|
||||||
fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
|
die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
|
||||||
perror(" failed");
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
}
|
||||||
#if RIODRAW_PATCH
|
#if RIODRAW_PATCH
|
||||||
return pid;
|
return pid;
|
||||||
@ -4963,12 +4957,7 @@ zoom(const Arg *arg)
|
|||||||
c->mon->pertag->prevclient[c->mon->pertag->curtag] = nexttiled(c->mon->clients);
|
c->mon->pertag->prevclient[c->mon->pertag->curtag] = nexttiled(c->mon->clients);
|
||||||
#endif // SWAPFOCUS_PATCH
|
#endif // SWAPFOCUS_PATCH
|
||||||
|
|
||||||
if (!c->mon->lt[c->mon->sellt]->arrange
|
if (!c->mon->lt[c->mon->sellt]->arrange || !c || c->isfloating)
|
||||||
|| (c && c->isfloating)
|
|
||||||
#if ZOOMSWAP_PATCH
|
|
||||||
|| !c
|
|
||||||
#endif // ZOOMSWAP_PATCH
|
|
||||||
)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#if ZOOMSWAP_PATCH
|
#if ZOOMSWAP_PATCH
|
||||||
@ -5021,13 +5010,12 @@ zoom(const Arg *arg)
|
|||||||
}
|
}
|
||||||
focus(c);
|
focus(c);
|
||||||
arrange(c->mon);
|
arrange(c->mon);
|
||||||
|
#elif SWAPFOCUS_PATCH && PERTAG_PATCH
|
||||||
|
if (c == nexttiled(c->mon->clients) && !(c = c->mon->pertag->prevclient[c->mon->pertag->curtag] = nexttiled(c->next)))
|
||||||
|
return;
|
||||||
|
pop(c);
|
||||||
#else
|
#else
|
||||||
if (c == nexttiled(c->mon->clients))
|
if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next)))
|
||||||
#if SWAPFOCUS_PATCH && PERTAG_PATCH
|
|
||||||
if (!c || !(c = c->mon->pertag->prevclient[c->mon->pertag->curtag] = nexttiled(c->next)))
|
|
||||||
#else
|
|
||||||
if (!c || !(c = nexttiled(c->next)))
|
|
||||||
#endif // SWAPFOCUS_PATCH
|
|
||||||
return;
|
return;
|
||||||
pop(c);
|
pop(c);
|
||||||
#endif // ZOOMSWAP_PATCH
|
#endif // ZOOMSWAP_PATCH
|
||||||
|
@ -5,18 +5,19 @@ runautostart(void)
|
|||||||
char *path;
|
char *path;
|
||||||
char *xdgdatahome;
|
char *xdgdatahome;
|
||||||
char *home;
|
char *home;
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
if ((home = getenv("HOME")) == NULL)
|
if ((home = getenv("HOME")) == NULL)
|
||||||
/* this is almost impossible */
|
/* this is almost impossible */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* if $XDG_DATA_HOME is defined, use $XDG_DATA_HOME/dwm,
|
/* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm,
|
||||||
* otherwise use ~/.local/share/dwm as autostart script directory
|
* otherwise use ~/.local/share/dwm as autostart script directory
|
||||||
*/
|
*/
|
||||||
if ((xdgdatahome = getenv("XDG_DATA_HOME")) != NULL) {
|
xdgdatahome = getenv("XDG_DATA_HOME");
|
||||||
|
if (xdgdatahome != NULL && *xdgdatahome != '\0') {
|
||||||
/* space for path segments, separators and nul */
|
/* space for path segments, separators and nul */
|
||||||
if ((pathpfx = malloc(strlen(xdgdatahome) + strlen(dwmdir) + 2)) == NULL)
|
pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2);
|
||||||
return;
|
|
||||||
|
|
||||||
if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) {
|
if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) {
|
||||||
free(pathpfx);
|
free(pathpfx);
|
||||||
@ -24,8 +25,8 @@ runautostart(void)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* space for path segments, separators and nul */
|
/* space for path segments, separators and nul */
|
||||||
if ((pathpfx = malloc(strlen(home) + strlen(localshare) + strlen(dwmdir) + 3)) == NULL)
|
pathpfx = ecalloc(1, strlen(home) + strlen(localshare)
|
||||||
return;
|
+ strlen(dwmdir) + 3);
|
||||||
|
|
||||||
if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) {
|
if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) {
|
||||||
free(pathpfx);
|
free(pathpfx);
|
||||||
@ -34,16 +35,16 @@ runautostart(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check if the autostart script directory exists */
|
/* check if the autostart script directory exists */
|
||||||
struct stat sb;
|
|
||||||
|
|
||||||
if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) {
|
if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) {
|
||||||
/* the XDG conformant path does not exist or are not directories
|
/* the XDG conformant path does not exist or is no directory
|
||||||
* so we try ~/.dwm instead
|
* so we try ~/.dwm instead
|
||||||
*/
|
*/
|
||||||
if (realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3) == NULL) {
|
char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3);
|
||||||
|
if(pathpfx_new == NULL) {
|
||||||
free(pathpfx);
|
free(pathpfx);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
pathpfx = pathpfx_new;
|
||||||
|
|
||||||
if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) {
|
if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) {
|
||||||
free(pathpfx);
|
free(pathpfx);
|
||||||
@ -52,10 +53,7 @@ runautostart(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* try the blocking script first */
|
/* try the blocking script first */
|
||||||
if ((path = malloc(strlen(pathpfx) + strlen(autostartblocksh) + 2)) == NULL) {
|
path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2);
|
||||||
free(pathpfx);
|
|
||||||
return;
|
|
||||||
} else
|
|
||||||
if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) {
|
if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) {
|
||||||
free(path);
|
free(path);
|
||||||
free(pathpfx);
|
free(pathpfx);
|
||||||
@ -65,20 +63,14 @@ runautostart(void)
|
|||||||
system(path);
|
system(path);
|
||||||
|
|
||||||
/* now the non-blocking script */
|
/* now the non-blocking script */
|
||||||
if ((path = realloc(path, strlen(pathpfx) + strlen(autostartsh) + 4)) == NULL) {
|
|
||||||
free(pathpfx);
|
|
||||||
free(path);
|
|
||||||
return;
|
|
||||||
} else
|
|
||||||
if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) {
|
if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) {
|
||||||
free(path);
|
free(path);
|
||||||
free(pathpfx);
|
free(pathpfx);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (access(path, X_OK) == 0) {
|
if (access(path, X_OK) == 0)
|
||||||
system(strcat(path, " &"));
|
system(strcat(path, " &"));
|
||||||
|
|
||||||
free(pathpfx);
|
free(pathpfx);
|
||||||
free(path);
|
free(path);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,6 +100,9 @@ case $# in
|
|||||||
setmfact)
|
setmfact)
|
||||||
signal $1 f $2
|
signal $1 f $2
|
||||||
;;
|
;;
|
||||||
|
floatpos)
|
||||||
|
signal $1 v $2
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Unknown command ($1) or too many arguments"
|
echo "Unknown command ($1) or too many arguments"
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -83,6 +83,8 @@ fake_signal(void)
|
|||||||
#endif // IPC_PATCH
|
#endif // IPC_PATCH
|
||||||
else if (strncmp(param, "f", n - len_str_sig) == 0)
|
else if (strncmp(param, "f", n - len_str_sig) == 0)
|
||||||
sscanf(fsignal + len_indicator + n, "%f", &(arg.f));
|
sscanf(fsignal + len_indicator + n, "%f", &(arg.f));
|
||||||
|
else if (strncmp(param, "v", n - len_str_sig) == 0)
|
||||||
|
arg.v = &(fsignal[len_indicator + n + 1]);
|
||||||
else return 1;
|
else return 1;
|
||||||
|
|
||||||
// Check if a signal was found, and if so handle it
|
// Check if a signal was found, and if so handle it
|
||||||
|
@ -121,6 +121,8 @@
|
|||||||
|
|
||||||
#define AUTORESIZE_PATCH 1
|
#define AUTORESIZE_PATCH 1
|
||||||
|
|
||||||
|
#define BIDI_PATCH 0
|
||||||
|
|
||||||
#define CENTER_PATCH 0
|
#define CENTER_PATCH 0
|
||||||
|
|
||||||
#define CENTER_TRANSIENT_WINDOWS_PATCH 0
|
#define CENTER_TRANSIENT_WINDOWS_PATCH 0
|
||||||
|
Reference in New Issue
Block a user