st-hidecursor-0.5.diff (2423B)
1 diff --git a/st.c b/st.c 2 index 392f12d..52deb92 100644 3 --- a/st.c 4 +++ b/st.c 5 @@ -248,6 +248,8 @@ typedef struct { 6 Draw draw; 7 Visual *vis; 8 XSetWindowAttributes attrs; 9 + Cursor cursor, bcursor; /* visible and blank cursors */ 10 + bool cursorstate; /* is cursor currently visible */ 11 int scr; 12 bool isfixed; /* is fixed geometry? */ 13 int fx, fy, fw, fh; /* fixed geometry */ 14 @@ -1112,6 +1114,13 @@ void 15 bmotion(XEvent *e) { 16 int oldey, oldex, oldsby, oldsey; 17 18 + if(!xw.cursorstate) { 19 + XDefineCursor(xw.dpy, xw.win, xw.cursor); 20 + xw.cursorstate = true; 21 + if(!IS_SET(MODE_MOUSEMANY)) 22 + xsetpointermotion(0); 23 + } 24 + 25 if(IS_SET(MODE_MOUSE)) { 26 mousereport(e); 27 return; 28 @@ -2984,10 +2993,12 @@ xzoom(const Arg *arg) { 29 void 30 xinit(void) { 31 XGCValues gcvalues; 32 - Cursor cursor; 33 Window parent; 34 int sw, sh; 35 pid_t thispid = getpid(); 36 + XColor xcwhite = {.red = 0xffff, .green = 0xffff, .blue = 0xffff}; 37 + XColor xcblack = {.red = 0x0000, .green = 0x0000, .blue = 0x0000}; 38 + Pixmap blankpm; 39 40 if(!(xw.dpy = XOpenDisplay(NULL))) 41 die("Can't open display\n"); 42 @@ -3071,11 +3082,13 @@ xinit(void) { 43 die("XCreateIC failed. Could not obtain input method.\n"); 44 45 /* white cursor, black outline */ 46 - cursor = XCreateFontCursor(xw.dpy, XC_xterm); 47 - XDefineCursor(xw.dpy, xw.win, cursor); 48 - XRecolorCursor(xw.dpy, cursor, 49 - &(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff}, 50 - &(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000}); 51 + xw.cursor = XCreateFontCursor(xw.dpy, XC_xterm); 52 + XDefineCursor(xw.dpy, xw.win, xw.cursor); 53 + XRecolorCursor(xw.dpy, xw.cursor, &xcwhite, &xcblack); 54 + xw.cursorstate = true; 55 + blankpm = XCreateBitmapFromData(xw.dpy, xw.win, &(char){0}, 1, 1); 56 + xw.bcursor = XCreatePixmapCursor(xw.dpy, blankpm, blankpm, 57 + &xcblack, &xcblack, 0, 0); 58 59 xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); 60 xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); 61 @@ -3537,6 +3550,8 @@ unmap(XEvent *ev) { 62 63 void 64 xsetpointermotion(int set) { 65 + if(!set && !xw.cursorstate) 66 + return; 67 MODBIT(xw.attrs.event_mask, set, PointerMotionMask); 68 XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); 69 } 70 @@ -3630,6 +3645,12 @@ kpress(XEvent *ev) { 71 Status status; 72 Shortcut *bp; 73 74 + if(xw.cursorstate) { 75 + XDefineCursor(xw.dpy, xw.win, xw.bcursor); 76 + xsetpointermotion(1); 77 + xw.cursorstate = false; 78 + } 79 + 80 if(IS_SET(MODE_KBDLOCK)) 81 return; 82