The hide X cursor patch when typing predates and conflicts with
580302f (Support the DECSCUSR CSI escape sequence) because they both
introduced a 'cursor' member in struct XWindow. Essentially
s/cursor/pointer/ in the hide X cursor patch.

If there are no objections, I'd like to update the one on the wiki with
the attached.
From 700158aa952756a52b043fa6c665053d48cb2de2 Mon Sep 17 00:00:00 2001
From: Colona <col...@ycc.fr>
Date: Mon, 9 Jun 2014 01:00:20 -0700
Subject: [PATCH] Hide X cursor when typing.

Hide the X cursor when typing in the terminal. The cursor is displayed again
when the mouse is moved.

[ s/cursor/pointer - Alex Pilon ]
---
 st.c | 36 ++++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

diff --git a/st.c b/st.c
index 39d3fee..b95a4a5 100644
--- a/st.c
+++ b/st.c
@@ -248,6 +248,11 @@ typedef struct {
 	Draw draw;
 	Visual *vis;
 	XSetWindowAttributes attrs;
+	/* Here, we use the term *pointer* to differentiate the cursor
+	 * one sees when hovering the mouse over the terminal from, e.g.,
+	 * a green rectangle where text would be entered. */
+	Cursor vpointer, bpointer; /* visible and hidden pointers */
+	bool pointerisvisible;
 	int scr;
 	bool isfixed; /* is fixed geometry? */
 	int l, t; /* left and top offset */
@@ -1155,6 +1160,13 @@ void
 bmotion(XEvent *e) {
 	int oldey, oldex, oldsby, oldsey;
 
+	if(!xw.pointerisvisible) {
+		XDefineCursor(xw.dpy, xw.win, xw.vpointer);
+		xw.pointerisvisible = true;
+		if(!IS_SET(MODE_MOUSEMANY))
+			xsetpointermotion(0);
+	}
+
 	if(IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) {
 		mousereport(e);
 		return;
@@ -3173,9 +3185,11 @@ xzoomreset(const Arg *arg) {
 void
 xinit(void) {
 	XGCValues gcvalues;
-	Cursor cursor;
 	Window parent;
 	pid_t thispid = getpid();
+	XColor xcwhite = {.red = 0xffff, .green = 0xffff, .blue = 0xffff};
+	XColor xcblack = {.red = 0x0000, .green = 0x0000, .blue = 0x0000};
+	Pixmap blankpm;
 
 	if(!(xw.dpy = XOpenDisplay(NULL)))
 		die("Can't open display\n");
@@ -3248,11 +3262,13 @@ xinit(void) {
 		die("XCreateIC failed. Could not obtain input method.\n");
 
 	/* white cursor, black outline */
-	cursor = XCreateFontCursor(xw.dpy, XC_xterm);
-	XDefineCursor(xw.dpy, xw.win, cursor);
-	XRecolorCursor(xw.dpy, cursor,
-		&(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff},
-		&(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000});
+	xw.vpointer = XCreateFontCursor(xw.dpy, XC_xterm);
+	XDefineCursor(xw.dpy, xw.win, xw.vpointer);
+	XRecolorCursor(xw.dpy, xw.vpointer, &xcwhite, &xcblack);
+	xw.pointerisvisible = true;
+	blankpm = XCreateBitmapFromData(xw.dpy, xw.win, &(char){0}, 1, 1);
+	xw.bpointer = XCreatePixmapCursor(xw.dpy, blankpm, blankpm,
+	                                  &xcblack, &xcblack, 0, 0);
 
 	xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
 	xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
@@ -3739,6 +3755,8 @@ unmap(XEvent *ev) {
 
 void
 xsetpointermotion(int set) {
+	if(!set && !xw.pointerisvisible)
+		return;
 	MODBIT(xw.attrs.event_mask, set, PointerMotionMask);
 	XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs);
 }
@@ -3832,6 +3850,12 @@ kpress(XEvent *ev) {
 	Status status;
 	Shortcut *bp;
 
+	if(xw.pointerisvisible) {
+		XDefineCursor(xw.dpy, xw.win, xw.bpointer);
+		xsetpointermotion(1);
+		xw.pointerisvisible = false;
+	}
+
 	if(IS_SET(MODE_KBDLOCK))
 		return;
 
-- 
2.3.3

Attachment: pgpvVd2m3MnsQ.pgp
Description: PGP signature

Reply via email to