From fde9f5bf859e582fb85d43831b90b7588ebfc3d3 Mon Sep 17 00:00:00 2001 From: Bert Date: Mon, 21 Feb 2011 18:26:21 +0100 Subject: Hide cursor on redraw or after 1.5s mouse inactivity --- main.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++-------------- window.c | 19 ++++++++++++++++--- window.h | 1 + 3 files changed, 67 insertions(+), 17 deletions(-) diff --git a/main.c b/main.c index 9eab704..cbb2ee4 100644 --- a/main.c +++ b/main.c @@ -255,13 +255,21 @@ void read_dir_rec(const char *dirname) { /* event handling */ int timeout; +unsigned char hidecur; + int mox, moy; +unsigned char drag; void redraw() { - if (mode == MODE_NORMAL) + if (mode == MODE_NORMAL) { + if (!drag && hidecur) { + win_set_cursor(&win, CURSOR_NONE); + hidecur = 0; + } img_render(&img, &win); - else + } else { tns_render(&tns, &win); + } update_title(); timeout = 0; } @@ -377,11 +385,12 @@ void on_keypress(XKeyEvent *kev) { } break; - /* switch to thumnail mode */ + /* switch to thumbnail mode */ case XK_Return: if (!tns.thumbs) tns_init(&tns, filecnt); mode = MODE_THUMBS; + win_set_cursor(&win, CURSOR_ARROW); tns.sel = fileidx; changed = tns.dirty = 1; break; @@ -403,7 +412,7 @@ void on_keypress(XKeyEvent *kev) { fileidx = tns.sel; load_image(); mode = MODE_NORMAL; - win_set_cursor(&win, CURSOR_ARROW); + win_set_cursor(&win, CURSOR_NONE); changed = 1; break; @@ -479,6 +488,8 @@ void on_buttonpress(XButtonEvent *bev) { mox = bev->x; moy = bev->y; win_set_cursor(&win, CURSOR_HAND); + hidecur = 0; + drag = 1; break; case Button3: if (fileidx > 0) { @@ -518,7 +529,7 @@ void on_buttonpress(XButtonEvent *bev) { fileidx = tns.sel; load_image(); mode = MODE_NORMAL; - win_set_cursor(&win, CURSOR_ARROW); + win_set_cursor(&win, CURSOR_NONE); } else { tns_highlight(&tns, &win, tns.sel, False); tns_highlight(&tns, &win, sel, True); @@ -542,7 +553,7 @@ void on_buttonpress(XButtonEvent *bev) { } void on_motionnotify(XMotionEvent *mev) { - if (!mev || mode != MODE_NORMAL) + if (!mev) return; if (mev->x >= 0 && mev->x <= win.w && mev->y >= 0 && mev->y <= win.h) { @@ -560,7 +571,12 @@ void run() { struct timeval t, t0; XEvent ev; - timeout = 0; + drag = timeout = 0; + + if (mode == MODE_NORMAL) { + hidecur = 1; + timeout = 1500000; + } while (1) { if (mode == MODE_THUMBS && tns.cnt < filecnt) { @@ -582,15 +598,21 @@ void run() { timeout = 75000; } } else if (timeout) { - t.tv_sec = 0; - t.tv_usec = timeout; + t.tv_sec = timeout / 1000000; + t.tv_usec = timeout % 1000000; xfd = ConnectionNumber(win.env.dpy); FD_ZERO(&fds); FD_SET(xfd, &fds); - if (!XPending(win.env.dpy) && !select(xfd + 1, &fds, 0, 0, &t)) + if (!XPending(win.env.dpy) && !select(xfd + 1, &fds, 0, 0, &t)) { /* timeout fired */ - redraw(); + if (hidecur) { + win_set_cursor(&win, CURSOR_NONE); + hidecur = 0; + } else { + redraw(); + } + } } if (!XNextEvent(win.env.dpy, &ev)) { @@ -602,11 +624,25 @@ void run() { on_buttonpress(&ev.xbutton); break; case ButtonRelease: - if (ev.xbutton.button == Button2) - win_set_cursor(&win, CURSOR_ARROW); + if (ev.xbutton.button == Button2) { + drag = 0; + if (mode == MODE_NORMAL) { + win_set_cursor(&win, CURSOR_ARROW); + hidecur = 1; + timeout = 1500000; + } + } break; case MotionNotify: - on_motionnotify(&ev.xmotion); + if (drag) { + on_motionnotify(&ev.xmotion); + } else if (mode == MODE_NORMAL) { + if (!hidecur) { + win_set_cursor(&win, CURSOR_ARROW); + hidecur = 1; + } + timeout = 1500000; + } break; case ConfigureNotify: if (win_configure(&win, &ev.xconfigure)) { diff --git a/window.c b/window.c index 857b3b5..d50d2f2 100644 --- a/window.c +++ b/window.c @@ -27,6 +27,7 @@ #include "window.h" static Cursor carrow; +static Cursor cnone; static Cursor chand; static Cursor cwatch; static GC gc; @@ -52,6 +53,8 @@ void win_open(win_t *win) { XClassHint classhint; XColor col; XGCValues gcval; + char none_data[] = {0, 0, 0, 0, 0, 0, 0, 0}; + Pixmap none; int gmask; if (!win) @@ -69,12 +72,12 @@ void win_open(win_t *win) { e->depth = DefaultDepth(e->dpy, e->scr); if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), BG_COLOR, - &col, &col)) + &col, &col)) win->bgcol = col.pixel; else die("could not allocate color: %s", BG_COLOR); if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), SEL_COLOR, - &col, &col)) + &col, &col)) win->selcol = col.pixel; else die("could not allocate color: %s", BG_COLOR); @@ -112,12 +115,18 @@ void win_open(win_t *win) { die("could not create window"); XSelectInput(e->dpy, win->xwin, StructureNotifyMask | KeyPressMask | - ButtonPressMask | ButtonReleaseMask | Button2MotionMask); + ButtonPressMask | ButtonReleaseMask | PointerMotionMask); carrow = XCreateFontCursor(e->dpy, XC_left_ptr); chand = XCreateFontCursor(e->dpy, XC_fleur); cwatch = XCreateFontCursor(e->dpy, XC_watch); + if (!XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), "black", + &col, &col)) + die("could not allocate color: black"); + none = XCreateBitmapFromData(e->dpy, win->xwin, none_data, 8, 8); + cnone = XCreatePixmapCursor(e->dpy, none, none, &col, &col, 0, 0); + gcval.line_width = 2; gc = XCreateGC(e->dpy, win->xwin, GCLineWidth, &gcval); @@ -145,6 +154,7 @@ void win_close(win_t *win) { return; XFreeCursor(win->env.dpy, carrow); + XFreeCursor(win->env.dpy, cnone); XFreeCursor(win->env.dpy, chand); XFreeCursor(win->env.dpy, cwatch); @@ -307,6 +317,9 @@ void win_set_cursor(win_t *win, win_cur_t cursor) { return; switch (cursor) { + case CURSOR_NONE: + XDefineCursor(win->env.dpy, win->xwin, cnone); + break; case CURSOR_HAND: XDefineCursor(win->env.dpy, win->xwin, chand); break; diff --git a/window.h b/window.h index e06c19f..01fa90c 100644 --- a/window.h +++ b/window.h @@ -25,6 +25,7 @@ typedef enum win_cur_e { CURSOR_ARROW = 0, + CURSOR_NONE, CURSOR_HAND, CURSOR_WATCH } win_cur_t; -- cgit v1.2.3-54-g00ecf