winpl

LD_PRELOAD-based X11 window manipulator
git clone https://git.sinitax.com/sinitax/winpl
Log | Files | Refs | LICENSE | sfeed.txt

commit 3d8f53f4fbed3bb3073d97f3b3aa8dfd706ad493
parent 5a358e944c7a0e17b252a444624f32003a207bef
Author: Louis Burda <quent.burda@gmail.com>
Date:   Fri, 24 May 2024 16:38:05 +0200

Add option to set window name

Diffstat:
Mloader.c | 16+++++++++++-----
Mwinpl.c | 14++++++++++++++
2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/loader.c b/loader.c @@ -24,6 +24,7 @@ usage(int rc, bool full) fprintf(stderr, "Usage: winpl [OPT].. -- CMD [ARG]..\n"); if (!full) exit(rc); fprintf(stderr, "\n"); + fprintf(stderr, " -ow Always write preload library\n"); fprintf(stderr, " [-ax|-ay] POS Absolute window position\n"); fprintf(stderr, " [-mx|-my] POS Window position relative to monitor\n"); fprintf(stderr, " [-rx|-ry] SCALE Window position relative to monitor\n" @@ -36,6 +37,7 @@ usage(int rc, bool full) fprintf(stderr, " -mp Select monitor based on cursor\n"); fprintf(stderr, " -mf Select monitor based on focus\n"); fprintf(stderr, " -ni Window does not take input (focus)\n"); + fprintf(stderr, " -name NAME Set window name\n"); fprintf(stderr, "\n"); exit(rc); } @@ -62,13 +64,14 @@ write_lib(const char *filename) int main(int argc, char *const *argv) { - char *const *arg, *const *cmd_argv; + char *const *cmd_argv = NULL; + char *const *arg; char pathbuf[PATH_MAX]; struct stat st; + bool overwrite = false; if (argc < 1) return 0; - cmd_argv = NULL; for (arg = argv + 1; *arg; arg++) { if (!strcmp(*arg, "-h")) { usage(0, true); @@ -104,6 +107,10 @@ main(int argc, char *const *argv) setenv("WINPL_MON_FOCUS", "1", true); } else if (!strcmp(*arg, "-ni")) { setenv("WINPL_NO_INPUT", "1", true); + } else if (!strcmp(*arg, "-name")) { + setenv("WINPL_NAME", *++arg, true); + } else if (!strcmp(*arg, "-ow")) { + overwrite = true; } else if (!strcmp(*arg, "--") && *(arg+1)) { cmd_argv = arg + 1; break; @@ -111,10 +118,9 @@ main(int argc, char *const *argv) usage(1, true); } } - if (cmd_argv == NULL) - usage(1, false); + if (!cmd_argv) usage(1, false); - if (stat(libpath, &st)) + if (overwrite || stat(libpath, &st)) write_lib(libpath); setenv("LD_PRELOAD", libpath, true); diff --git a/winpl.c b/winpl.c @@ -27,6 +27,7 @@ static const char prefix[] = "WINPL_"; static const int prefixlen = sizeof(prefix) - 1; static void *lib_xlib = NULL; +static void (*setwmname)(Display *display, Window window, XTextProperty *text); static void warn(const char *fmt, ...) @@ -174,6 +175,9 @@ set_props(Display *display, Window window) pid_t pid, ppid; uid_t uid; + if (!lib_xlib) lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY); + if (!setwmname) setwmname = dlsym (lib_xlib, "XSetWMName"); + uid = getuid(); pid = getpid(); ppid = getppid(); @@ -279,6 +283,11 @@ set_props(Display *display, Window window) "_NET_WM_WINDOW_TYPE_DIALOG", False); set_prop(display, window, "_NET_WM_WINDOW_TYPE", XA_ATOM, 32, &atom); + } else if (!strncmp(key, "NAME", keylen)) { + /* window name / title */ + XTextProperty name; + XStringListToTextProperty((char**)&val, 1, &name); + setwmname(display, window, &name); } else if (!strncmp(key, "NO_INPUT", keylen)) { /* never take input (focus) */ hints.flags = InputHint; @@ -386,3 +395,8 @@ XReparentWindow(Display *display, Window window, Window parent, int x, int y) return (*func) (display, window, parent, x, y); } +void +XSetWMName(Display *display, Window window, XTextProperty *text) +{ + /* keep value set in set_props */ +}