st-hidecursor-0.8.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       st-hidecursor-0.8.diff (2589B)
       ---
            1 diff --git a/x.c b/x.c
            2 index d43a529..599696f 100644
            3 --- a/x.c
            4 +++ b/x.c
            5 @@ -96,6 +96,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 +        int pointerisvisible;
           14          int scr;
           15          int isfixed; /* is fixed geometry? */
           16          int l, t; /* left and top offset */
           17 @@ -649,6 +654,13 @@ brelease(XEvent *e)
           18  void
           19  bmotion(XEvent *e)
           20  {
           21 +        if (!xw.pointerisvisible) {
           22 +                XDefineCursor(xw.dpy, xw.win, xw.vpointer);
           23 +                xw.pointerisvisible = 1;
           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 @@ -994,10 +1006,10 @@ void
           32  xinit(int cols, int rows)
           33  {
           34          XGCValues gcvalues;
           35 -        Cursor cursor;
           36          Window parent;
           37          pid_t thispid = getpid();
           38          XColor xmousefg, xmousebg;
           39 +        Pixmap blankpm;
           40  
           41          if (!(xw.dpy = XOpenDisplay(NULL)))
           42                  die("Can't open display\n");
           43 @@ -1073,8 +1085,9 @@ xinit(int cols, int rows)
           44                  die("XCreateIC failed. Could not obtain input method.\n");
           45  
           46          /* white cursor, black outline */
           47 -        cursor = XCreateFontCursor(xw.dpy, mouseshape);
           48 -        XDefineCursor(xw.dpy, xw.win, cursor);
           49 +        xw.pointerisvisible = 1;
           50 +        xw.vpointer = XCreateFontCursor(xw.dpy, mouseshape);
           51 +        XDefineCursor(xw.dpy, xw.win, xw.vpointer);
           52  
           53          if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) {
           54                  xmousefg.red   = 0xffff;
           55 @@ -1088,7 +1101,10 @@ xinit(int cols, int rows)
           56                  xmousebg.blue  = 0x0000;
           57          }
           58  
           59 -        XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg);
           60 +        XRecolorCursor(xw.dpy, xw.vpointer, &xmousefg, &xmousebg);
           61 +        blankpm = XCreateBitmapFromData(xw.dpy, xw.win, &(char){0}, 1, 1);
           62 +        xw.bpointer = XCreatePixmapCursor(xw.dpy, blankpm, blankpm,
           63 +                                          &xmousefg, &xmousebg, 0, 0);
           64  
           65          xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
           66          xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
           67 @@ -1571,6 +1587,8 @@ unmap(XEvent *ev)
           68  void
           69  xsetpointermotion(int set)
           70  {
           71 +        if (!set && !xw.pointerisvisible)
           72 +                return;
           73          MODBIT(xw.attrs.event_mask, set, PointerMotionMask);
           74          XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs);
           75  }
           76 @@ -1689,6 +1707,12 @@ kpress(XEvent *ev)
           77          Status status;
           78          Shortcut *bp;
           79  
           80 +        if (xw.pointerisvisible) {
           81 +                XDefineCursor(xw.dpy, xw.win, xw.bpointer);
           82 +                xsetpointermotion(1);
           83 +                xw.pointerisvisible = 0;
           84 +        }
           85 +
           86          if (IS_SET(MODE_KBDLOCK))
           87                  return;
           88