sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

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