sites

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

st-hidecursor-0.6.diff (2672B)


      1 diff --git a/st.c b/st.c
      2 index b89d094..d2979ff 100644
      3 --- a/st.c
      4 +++ b/st.c
      5 @@ -257,6 +257,11 @@ typedef struct {
      6  	Draw draw;
      7  	Visual *vis;
      8  	XSetWindowAttributes attrs;
      9 +	/* Here, we use the term *pointer* to differentiate the cursor
     10 +	 * one sees when hovering the mouse over the terminal from, e.g.,
     11 +	 * a green rectangle where text would be entered. */
     12 +	Cursor vpointer, bpointer; /* visible and hidden pointers */
     13 +	bool pointerisvisible;
     14  	int scr;
     15  	bool isfixed; /* is fixed geometry? */
     16  	int l, t; /* left and top offset */
     17 @@ -1181,6 +1186,13 @@ void
     18  bmotion(XEvent *e) {
     19  	int oldey, oldex, oldsby, oldsey;
     20  
     21 +	if(!xw.pointerisvisible) {
     22 +		XDefineCursor(xw.dpy, xw.win, xw.vpointer);
     23 +		xw.pointerisvisible = true;
     24 +		if(!IS_SET(MODE_MOUSEMANY))
     25 +			xsetpointermotion(0);
     26 +	}
     27 +
     28  	if(IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) {
     29  		mousereport(e);
     30  		return;
     31 @@ -3182,9 +3194,11 @@ xzoomreset(const Arg *arg) {
     32  void
     33  xinit(void) {
     34  	XGCValues gcvalues;
     35 -	Cursor cursor;
     36  	Window parent;
     37  	pid_t thispid = getpid();
     38 +	XColor xcwhite = {.red = 0xffff, .green = 0xffff, .blue = 0xffff};
     39 +	XColor xcblack = {.red = 0x0000, .green = 0x0000, .blue = 0x0000};
     40 +	Pixmap blankpm;
     41  
     42  	if(!(xw.dpy = XOpenDisplay(NULL)))
     43  		die("Can't open display\n");
     44 @@ -3257,11 +3271,13 @@ xinit(void) {
     45  		die("XCreateIC failed. Could not obtain input method.\n");
     46  
     47  	/* white cursor, black outline */
     48 -	cursor = XCreateFontCursor(xw.dpy, XC_xterm);
     49 -	XDefineCursor(xw.dpy, xw.win, cursor);
     50 -	XRecolorCursor(xw.dpy, cursor,
     51 -		&(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff},
     52 -		&(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000});
     53 +	xw.vpointer = XCreateFontCursor(xw.dpy, XC_xterm);
     54 +	XDefineCursor(xw.dpy, xw.win, xw.vpointer);
     55 +	XRecolorCursor(xw.dpy, xw.vpointer, &xcwhite, &xcblack);
     56 +	xw.pointerisvisible = true;
     57 +	blankpm = XCreateBitmapFromData(xw.dpy, xw.win, &(char){0}, 1, 1);
     58 +	xw.bpointer = XCreatePixmapCursor(xw.dpy, blankpm, blankpm,
     59 +	                                  &xcblack, &xcblack, 0, 0);
     60  
     61  	xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
     62  	xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
     63 @@ -3725,6 +3741,8 @@ unmap(XEvent *ev) {
     64  
     65  void
     66  xsetpointermotion(int set) {
     67 +	if(!set && !xw.pointerisvisible)
     68 +		return;
     69  	MODBIT(xw.attrs.event_mask, set, PointerMotionMask);
     70  	XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs);
     71  }
     72 @@ -3818,6 +3836,12 @@ kpress(XEvent *ev) {
     73  	Status status;
     74  	Shortcut *bp;
     75  
     76 +	if(xw.pointerisvisible) {
     77 +		XDefineCursor(xw.dpy, xw.win, xw.bpointer);
     78 +		xsetpointermotion(1);
     79 +		xw.pointerisvisible = false;
     80 +	}
     81 +
     82  	if(IS_SET(MODE_KBDLOCK))
     83  		return;
     84