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:
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 */
+}