diff options
| author | Malfurious <m@lfurio.us> | 2020-06-23 02:03:24 -0400 |
|---|---|---|
| committer | Matt Hunter <m@lfurio.us> | 2026-01-17 19:57:46 -0500 |
| commit | 43cf2f9979f8240fac4911056bb2419110275964 (patch) | |
| tree | 10183aa6364a4e7989cb72cbf22c535d7f0d1479 | |
| parent | ffa5a7703ac2240aac36d07d114a246ee896cf22 (diff) | |
| download | st-43cf2f9979f8240fac4911056bb2419110275964.tar.gz st-43cf2f9979f8240fac4911056bb2419110275964.zip | |
patch: hidecursor
Hide the X cursor whenever a key is pressed and show it back when the
mouse is moved in the terminal window.
An alternative to this patch might be xbanish or unclutter.
| -rw-r--r-- | x.c | 32 |
1 files changed, 28 insertions, 4 deletions
@@ -104,6 +104,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 */ + int pointerisvisible; int scr; int isfixed; /* is fixed geometry? */ int depth; /* bit depth */ @@ -718,6 +723,13 @@ brelease(XEvent *e) void bmotion(XEvent *e) { + if (!xw.pointerisvisible) { + XDefineCursor(xw.dpy, xw.win, xw.vpointer); + xw.pointerisvisible = 1; + if (!IS_SET(MODE_MOUSEMANY)) + xsetpointermotion(0); + } + if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { mousereport(e); return; @@ -1145,12 +1157,12 @@ void xinit(int cols, int rows) { XGCValues gcvalues; - Cursor cursor; Window parent, root; pid_t thispid = getpid(); XColor xmousefg, xmousebg; XWindowAttributes attr; XVisualInfo vis; + Pixmap blankpm; if (!(xw.dpy = XOpenDisplay(NULL))) die("can't open display\n"); @@ -1226,8 +1238,9 @@ xinit(int cols, int rows) } /* white cursor, black outline */ - cursor = XCreateFontCursor(xw.dpy, mouseshape); - XDefineCursor(xw.dpy, xw.win, cursor); + xw.pointerisvisible = 1; + xw.vpointer = XCreateFontCursor(xw.dpy, mouseshape); + XDefineCursor(xw.dpy, xw.win, xw.vpointer); if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) { xmousefg.red = 0xffff; @@ -1241,7 +1254,10 @@ xinit(int cols, int rows) xmousebg.blue = 0x0000; } - XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg); + XRecolorCursor(xw.dpy, xw.vpointer, &xmousefg, &xmousebg); + blankpm = XCreateBitmapFromData(xw.dpy, xw.win, &(char){0}, 1, 1); + xw.bpointer = XCreatePixmapCursor(xw.dpy, blankpm, blankpm, + &xmousefg, &xmousebg, 0, 0); xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); @@ -1756,6 +1772,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); } @@ -1875,6 +1893,12 @@ kpress(XEvent *ev) Status status; Shortcut *bp; + if (xw.pointerisvisible) { + XDefineCursor(xw.dpy, xw.win, xw.bpointer); + xsetpointermotion(1); + xw.pointerisvisible = 0; + } + if (IS_SET(MODE_KBDLOCK)) return; |
