Index | Thread | Search

From:
Alexander Arkhipov <aa@manpager.org>
Subject:
xenocara/app/xidle corner locking and debug code fixes
To:
tech@openbsd.org
Date:
Sun, 14 Jan 2024 09:50:08 +0300

Download raw body.

Thread
Hello, tech@,

I noticed a bug in xidle: if you use the program with corner locking,
and then put some window over that corner, then moving the pointer there
doesn't actually activate xidle.

The bug is a little weird. There is code in xidle to handle
VisibilityNotify, but it doesn't get executed because:

1. VisibilityChangeMask is hidden behind an "#if 0"
2. The window is created as InputOnly instead of InputOutput

The first diff below fixes both issues. I've been running this fixed
version for several days now and noticed no problems, and there are no
comments, so I suspect this was left in as a result of mistake.

Another issue I noticed while dealing with the first is that some of the
debug printing doesn't work because at one point std{in,out,err} get
redirected to /dev/null even if DEBUG is defined. The second diff fixes
that. I've also had an idea of instead turning everything hidden behind
"#if*def DEBUG"s into a run-time option (perhaps -v or -debug), but I'd
like to see some feedback before I do that.

Lastly, I'm not sure if the two diffs will apply on top of each other,
but both are trivial enough to be typed in by hand.

These are my very first diffs to tech@, so I'd appreciate some feedback.
Thank you.

Index: xidle.c
===================================================================
RCS file: /var/cvs/xenocara/app/xidle/xidle.c,v
diff -u -p -r1.10 xidle.c
--- xidle.c	25 Oct 2021 09:30:33 -0000	1.10
+++ xidle.c	14 Jan 2024 06:15:14 -0000
@@ -129,15 +129,12 @@ init_x(struct xinfo *xi, int position, i
 
 	attr.override_redirect = True;
 	xi->win = XCreateWindow(dpy, DefaultRootWindow(dpy),
-	    xi->coord_x, xi->coord_y, area, area, 0, 0, InputOnly,
+	    xi->coord_x, xi->coord_y, area, area, 0, 0, InputOutput,
 	    CopyFromParent, CWOverrideRedirect, &attr);
 
 	if (position != none) {
 		XSelectInput(dpy, xi->win, EnterWindowMask|StructureNotifyMask
-#if 0
-			       |VisibilityChangeMask
-#endif
-		);
+		    |VisibilityChangeMask);
 		XMapWindow(dpy, xi->win);
 	}
 

And the second diff:


Index: xidle.c
===================================================================
RCS file: /var/cvs/xenocara/app/xidle/xidle.c,v
diff -u -p -r1.10 xidle.c
--- xidle.c	25 Oct 2021 09:30:33 -0000	1.10
+++ xidle.c	14 Jan 2024 06:16:37 -0000
@@ -327,7 +327,9 @@ main(int argc, char **argv)
 	char *args[10];
 	int area = 2, delay = 2, timeout = 0;
 	int position = north|west;
+#ifndef DEBUG
 	int fd;
+#endif
 	u_long last_serial = 0;
 
 	parse_opts(argc, argv, &x.dpy, &area, &delay, &timeout,
@@ -345,6 +347,7 @@ main(int argc, char **argv)
 	signal(SIGTERM, handler);
 	signal(SIGUSR1, handler);
 
+#ifndef DEBUG
 	fd = open(_PATH_DEVNULL, O_RDWR);
 	if (fd < 0)
 		err(1, _PATH_DEVNULL);
@@ -353,6 +356,7 @@ main(int argc, char **argv)
 	dup2(fd, STDERR_FILENO);
 	if (fd > 2)
 		close(fd);
+#endif
 
 	if (pledge("stdio proc exec", NULL) == -1)
 		err(1, "pledge");

-- 
Alexander