st-hidecursor-0.6.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.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