Hide cursor on redraw or after 1.5s mouse inactivity
This commit is contained in:
		
							
								
								
									
										64
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								main.c
									
									
									
									
									
								
							@@ -255,13 +255,21 @@ void read_dir_rec(const char *dirname) {
 | 
				
			|||||||
/* event handling */
 | 
					/* event handling */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int timeout;
 | 
					int timeout;
 | 
				
			||||||
 | 
					unsigned char hidecur;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int mox, moy;
 | 
					int mox, moy;
 | 
				
			||||||
 | 
					unsigned char drag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void redraw() {
 | 
					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);
 | 
							img_render(&img, &win);
 | 
				
			||||||
	else
 | 
						} else {
 | 
				
			||||||
		tns_render(&tns, &win);
 | 
							tns_render(&tns, &win);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	update_title();
 | 
						update_title();
 | 
				
			||||||
	timeout = 0;
 | 
						timeout = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -377,11 +385,12 @@ void on_keypress(XKeyEvent *kev) {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* switch to thumnail mode */
 | 
								/* switch to thumbnail mode */
 | 
				
			||||||
			case XK_Return:
 | 
								case XK_Return:
 | 
				
			||||||
				if (!tns.thumbs)
 | 
									if (!tns.thumbs)
 | 
				
			||||||
					tns_init(&tns, filecnt);
 | 
										tns_init(&tns, filecnt);
 | 
				
			||||||
				mode = MODE_THUMBS;
 | 
									mode = MODE_THUMBS;
 | 
				
			||||||
 | 
									win_set_cursor(&win, CURSOR_ARROW);
 | 
				
			||||||
				tns.sel = fileidx;
 | 
									tns.sel = fileidx;
 | 
				
			||||||
				changed = tns.dirty = 1;
 | 
									changed = tns.dirty = 1;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
@@ -403,7 +412,7 @@ void on_keypress(XKeyEvent *kev) {
 | 
				
			|||||||
				fileidx = tns.sel;
 | 
									fileidx = tns.sel;
 | 
				
			||||||
				load_image();
 | 
									load_image();
 | 
				
			||||||
				mode = MODE_NORMAL;
 | 
									mode = MODE_NORMAL;
 | 
				
			||||||
				win_set_cursor(&win, CURSOR_ARROW);
 | 
									win_set_cursor(&win, CURSOR_NONE);
 | 
				
			||||||
				changed = 1;
 | 
									changed = 1;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -479,6 +488,8 @@ void on_buttonpress(XButtonEvent *bev) {
 | 
				
			|||||||
				mox = bev->x;
 | 
									mox = bev->x;
 | 
				
			||||||
				moy = bev->y;
 | 
									moy = bev->y;
 | 
				
			||||||
				win_set_cursor(&win, CURSOR_HAND);
 | 
									win_set_cursor(&win, CURSOR_HAND);
 | 
				
			||||||
 | 
									hidecur = 0;
 | 
				
			||||||
 | 
									drag = 1;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case Button3:
 | 
								case Button3:
 | 
				
			||||||
				if (fileidx > 0) {
 | 
									if (fileidx > 0) {
 | 
				
			||||||
@@ -518,7 +529,7 @@ void on_buttonpress(XButtonEvent *bev) {
 | 
				
			|||||||
						fileidx = tns.sel;
 | 
											fileidx = tns.sel;
 | 
				
			||||||
						load_image();
 | 
											load_image();
 | 
				
			||||||
						mode = MODE_NORMAL;
 | 
											mode = MODE_NORMAL;
 | 
				
			||||||
						win_set_cursor(&win, CURSOR_ARROW);
 | 
											win_set_cursor(&win, CURSOR_NONE);
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						tns_highlight(&tns, &win, tns.sel, False);
 | 
											tns_highlight(&tns, &win, tns.sel, False);
 | 
				
			||||||
						tns_highlight(&tns, &win, sel, True);
 | 
											tns_highlight(&tns, &win, sel, True);
 | 
				
			||||||
@@ -542,7 +553,7 @@ void on_buttonpress(XButtonEvent *bev) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void on_motionnotify(XMotionEvent *mev) {
 | 
					void on_motionnotify(XMotionEvent *mev) {
 | 
				
			||||||
	if (!mev || mode != MODE_NORMAL)
 | 
						if (!mev)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (mev->x >= 0 && mev->x <= win.w && mev->y >= 0 && mev->y <= win.h) {
 | 
						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;
 | 
						struct timeval t, t0;
 | 
				
			||||||
	XEvent ev;
 | 
						XEvent ev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	timeout = 0;
 | 
						drag = timeout = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (mode == MODE_NORMAL) {
 | 
				
			||||||
 | 
							hidecur = 1;
 | 
				
			||||||
 | 
							timeout = 1500000;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (1) {
 | 
						while (1) {
 | 
				
			||||||
		if (mode == MODE_THUMBS && tns.cnt < filecnt) {
 | 
							if (mode == MODE_THUMBS && tns.cnt < filecnt) {
 | 
				
			||||||
@@ -582,15 +598,21 @@ void run() {
 | 
				
			|||||||
				timeout = 75000;
 | 
									timeout = 75000;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else if (timeout) {
 | 
							} else if (timeout) {
 | 
				
			||||||
			t.tv_sec = 0;
 | 
								t.tv_sec = timeout / 1000000;
 | 
				
			||||||
			t.tv_usec = timeout;
 | 
								t.tv_usec = timeout % 1000000;
 | 
				
			||||||
			xfd = ConnectionNumber(win.env.dpy);
 | 
								xfd = ConnectionNumber(win.env.dpy);
 | 
				
			||||||
			FD_ZERO(&fds);
 | 
								FD_ZERO(&fds);
 | 
				
			||||||
			FD_SET(xfd, &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 */
 | 
									/* timeout fired */
 | 
				
			||||||
				redraw();
 | 
									if (hidecur) {
 | 
				
			||||||
 | 
										win_set_cursor(&win, CURSOR_NONE);
 | 
				
			||||||
 | 
										hidecur = 0;
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										redraw();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!XNextEvent(win.env.dpy, &ev)) {
 | 
							if (!XNextEvent(win.env.dpy, &ev)) {
 | 
				
			||||||
@@ -602,11 +624,25 @@ void run() {
 | 
				
			|||||||
					on_buttonpress(&ev.xbutton);
 | 
										on_buttonpress(&ev.xbutton);
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				case ButtonRelease:
 | 
									case ButtonRelease:
 | 
				
			||||||
					if (ev.xbutton.button == Button2)
 | 
										if (ev.xbutton.button == Button2) {
 | 
				
			||||||
						win_set_cursor(&win, CURSOR_ARROW);
 | 
											drag = 0;
 | 
				
			||||||
 | 
											if (mode == MODE_NORMAL) {
 | 
				
			||||||
 | 
												win_set_cursor(&win, CURSOR_ARROW);
 | 
				
			||||||
 | 
												hidecur = 1;
 | 
				
			||||||
 | 
												timeout = 1500000;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				case MotionNotify:
 | 
									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;
 | 
										break;
 | 
				
			||||||
				case ConfigureNotify:
 | 
									case ConfigureNotify:
 | 
				
			||||||
					if (win_configure(&win, &ev.xconfigure)) {
 | 
										if (win_configure(&win, &ev.xconfigure)) {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								window.c
									
									
									
									
									
								
							@@ -27,6 +27,7 @@
 | 
				
			|||||||
#include "window.h"
 | 
					#include "window.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Cursor carrow;
 | 
					static Cursor carrow;
 | 
				
			||||||
 | 
					static Cursor cnone;
 | 
				
			||||||
static Cursor chand;
 | 
					static Cursor chand;
 | 
				
			||||||
static Cursor cwatch;
 | 
					static Cursor cwatch;
 | 
				
			||||||
static GC gc;
 | 
					static GC gc;
 | 
				
			||||||
@@ -52,6 +53,8 @@ void win_open(win_t *win) {
 | 
				
			|||||||
	XClassHint classhint;
 | 
						XClassHint classhint;
 | 
				
			||||||
	XColor col;
 | 
						XColor col;
 | 
				
			||||||
	XGCValues gcval;
 | 
						XGCValues gcval;
 | 
				
			||||||
 | 
						char none_data[] = {0, 0, 0, 0, 0, 0, 0, 0};
 | 
				
			||||||
 | 
						Pixmap none;
 | 
				
			||||||
	int gmask;
 | 
						int gmask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!win)
 | 
						if (!win)
 | 
				
			||||||
@@ -69,12 +72,12 @@ void win_open(win_t *win) {
 | 
				
			|||||||
	e->depth = DefaultDepth(e->dpy, e->scr);
 | 
						e->depth = DefaultDepth(e->dpy, e->scr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), BG_COLOR,
 | 
						if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), BG_COLOR,
 | 
				
			||||||
		                    &col, &col))
 | 
							                   &col, &col))
 | 
				
			||||||
		win->bgcol = col.pixel;
 | 
							win->bgcol = col.pixel;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		die("could not allocate color: %s", BG_COLOR);
 | 
							die("could not allocate color: %s", BG_COLOR);
 | 
				
			||||||
	if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), SEL_COLOR,
 | 
						if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), SEL_COLOR,
 | 
				
			||||||
		                    &col, &col))
 | 
							                   &col, &col))
 | 
				
			||||||
		win->selcol = col.pixel;
 | 
							win->selcol = col.pixel;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		die("could not allocate color: %s", BG_COLOR);
 | 
							die("could not allocate color: %s", BG_COLOR);
 | 
				
			||||||
@@ -112,12 +115,18 @@ void win_open(win_t *win) {
 | 
				
			|||||||
		die("could not create window");
 | 
							die("could not create window");
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	XSelectInput(e->dpy, win->xwin, StructureNotifyMask | KeyPressMask |
 | 
						XSelectInput(e->dpy, win->xwin, StructureNotifyMask | KeyPressMask |
 | 
				
			||||||
	             ButtonPressMask | ButtonReleaseMask | Button2MotionMask);
 | 
						             ButtonPressMask | ButtonReleaseMask | PointerMotionMask);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	carrow = XCreateFontCursor(e->dpy, XC_left_ptr);
 | 
						carrow = XCreateFontCursor(e->dpy, XC_left_ptr);
 | 
				
			||||||
	chand = XCreateFontCursor(e->dpy, XC_fleur);
 | 
						chand = XCreateFontCursor(e->dpy, XC_fleur);
 | 
				
			||||||
	cwatch = XCreateFontCursor(e->dpy, XC_watch);
 | 
						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;
 | 
						gcval.line_width = 2;
 | 
				
			||||||
	gc = XCreateGC(e->dpy, win->xwin, GCLineWidth, &gcval);
 | 
						gc = XCreateGC(e->dpy, win->xwin, GCLineWidth, &gcval);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -145,6 +154,7 @@ void win_close(win_t *win) {
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	XFreeCursor(win->env.dpy, carrow);
 | 
						XFreeCursor(win->env.dpy, carrow);
 | 
				
			||||||
 | 
						XFreeCursor(win->env.dpy, cnone);
 | 
				
			||||||
	XFreeCursor(win->env.dpy, chand);
 | 
						XFreeCursor(win->env.dpy, chand);
 | 
				
			||||||
	XFreeCursor(win->env.dpy, cwatch);
 | 
						XFreeCursor(win->env.dpy, cwatch);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -307,6 +317,9 @@ void win_set_cursor(win_t *win, win_cur_t cursor) {
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (cursor) {
 | 
						switch (cursor) {
 | 
				
			||||||
 | 
							case CURSOR_NONE:
 | 
				
			||||||
 | 
								XDefineCursor(win->env.dpy, win->xwin, cnone);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case CURSOR_HAND:
 | 
							case CURSOR_HAND:
 | 
				
			||||||
			XDefineCursor(win->env.dpy, win->xwin, chand);
 | 
								XDefineCursor(win->env.dpy, win->xwin, chand);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user