--- config.def.h | 3 +++ st.c | 33 +++++++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/config.def.h b/config.def.h index 6e2be9a..b8d0d23 100644 --- a/config.def.h +++ b/config.def.h _AT_@ -31,6 +31,9 @@ static bool allowaltscreen = true; static unsigned int xfps = 120; static unsigned int actionfps = 30; +/* hide X cursor when typing */ +static bool xcursorhide = true; + /* * blinking timeout (set to 0 to disable blinking) for the terminal blinking * attribute. diff --git a/st.c b/st.c index 3681776..c4bd034 100644 --- a/st.c +++ b/st.c _AT_@ -249,6 +249,8 @@ typedef struct { Draw draw; Visual *vis; XSetWindowAttributes attrs; + Cursor cursor, bcursor; /* visible and blank cursors */ + bool cursorstate; /* is cursor currently visible */ int scr; bool isfixed; /* is fixed geometry? */ int l, t; /* left and top offset */ _AT_@ -1115,6 +1117,13 @@ void bmotion(XEvent *e) { int oldey, oldex, oldsby, oldsey; + if(!xw.cursorstate) { + XDefineCursor(xw.dpy, xw.win, xw.cursor); + xw.cursorstate = true; + if(!IS_SET(MODE_MOUSEMANY)) + xsetpointermotion(0); + } + if(IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) { mousereport(e); return; _AT_@ -2998,9 +3007,11 @@ xzoom(const Arg *arg) { void xinit(void) { XGCValues gcvalues; - Cursor cursor; Window parent; pid_t thispid = getpid(); + XColor xcwhite = {.red = 0xffff, .green = 0xffff, .blue = 0xffff}; + XColor xcblack = {.red = 0x0000, .green = 0x0000, .blue = 0x0000}; + Pixmap blankpm; if(!(xw.dpy = XOpenDisplay(NULL))) die("Can't open display\n"); _AT_@ -3073,11 +3084,13 @@ xinit(void) { die("XCreateIC failed. Could not obtain input method.\n"); /* white cursor, black outline */ - cursor = XCreateFontCursor(xw.dpy, XC_xterm); - XDefineCursor(xw.dpy, xw.win, cursor); - XRecolorCursor(xw.dpy, cursor, - &(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff}, - &(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000}); + xw.cursor = XCreateFontCursor(xw.dpy, XC_xterm); + XRecolorCursor(xw.dpy, xw.cursor, &xcwhite, &xcblack); + XDefineCursor(xw.dpy, xw.win, xw.cursor); + xw.cursorstate = true; + blankpm = XCreateBitmapFromData(xw.dpy, xw.win, &(char){0}, 1, 1); + xw.bcursor = XCreatePixmapCursor(xw.dpy, blankpm, blankpm, + &xcblack, &xcblack, 0, 0); xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); _AT_@ -3533,6 +3546,8 @@ unmap(XEvent *ev) { void xsetpointermotion(int set) { + if(!set && !xw.cursorstate) + return; MODBIT(xw.attrs.event_mask, set, PointerMotionMask); XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); } _AT_@ -3626,6 +3641,12 @@ kpress(XEvent *ev) { Status status; Shortcut *bp; + if(xcursorhide && xw.cursorstate) { + XDefineCursor(xw.dpy, xw.win, xw.bcursor); + xsetpointermotion(1); + xw.cursorstate = false; + } + if(IS_SET(MODE_KBDLOCK)) return; -- 2.0.0 -- Ivan "Colona" DelalandeReceived on Mon Jun 09 2014 - 03:38:24 CEST
This archive was generated by hypermail 2.3.0 : Mon Jun 09 2014 - 03:48:07 CEST