diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | main.c | 20 | ||||
| -rw-r--r-- | thumbs.c | 44 | ||||
| -rw-r--r-- | thumbs.h | 15 | 
4 files changed, 61 insertions, 20 deletions
@@ -1,6 +1,6 @@  all: sxiv -VERSION=git-20110219 +VERSION=git-20110220  CC?=gcc  PREFIX?=/usr/local @@ -397,19 +397,25 @@ void on_keypress(XKeyEvent *kev) {  			/* move selection */  			case XK_h:  			case XK_Left: -				changed = tns_move_selection(&tns, &win, MOVE_LEFT); +				changed = tns_move_selection(&tns, &win, TNS_LEFT);  				break;  			case XK_j:  			case XK_Down: -				changed = tns_move_selection(&tns, &win, MOVE_DOWN); +				changed = tns_move_selection(&tns, &win, TNS_DOWN);  				break;  			case XK_k:  			case XK_Up: -				changed = tns_move_selection(&tns, &win, MOVE_UP); +				changed = tns_move_selection(&tns, &win, TNS_UP);  				break;  			case XK_l:  			case XK_Right: -				changed = tns_move_selection(&tns, &win, MOVE_RIGHT); +				changed = tns_move_selection(&tns, &win, TNS_RIGHT); +				break; + +			/* scroll */ +			case XK_bracketleft: +				break; +			case XK_bracketright:  				break;  		}  	} @@ -524,6 +530,12 @@ void on_buttonpress(XButtonEvent *bev) {  					break;  				}  				break; +			case Button4: +				changed = tns_scroll(&tns, TNS_UP); +				break; +			case Button5: +				changed = tns_scroll(&tns, TNS_DOWN); +				break;  		}  	} @@ -88,21 +88,27 @@ void tns_load(tns_t *tns, win_t *win, const char *filename) {  }  void tns_check_view(tns_t *tns, Bool scrolled) { +	int r; +  	if (!tns)  		return;  	tns->first -= tns->first % tns->cols; +	r = fileidx % tns->cols;  	if (scrolled) {  		/* move selection into visible area */ +		if (fileidx >= tns->first + tns->cols * tns->rows) +			fileidx = tns->first + r + tns->cols * (tns->rows - 1); +		else if (fileidx < tns->first) +			fileidx = tns->first + r;  	} else {  		/* scroll to selection */  		if (tns->first + tns->cols * tns->rows <= fileidx) { -			tns->first = fileidx - fileidx % tns->cols - -			             tns->cols * (tns->rows - 1); +			tns->first = fileidx - r - tns->cols * (tns->rows - 1);  			tns->dirty = 1;  		} else if (tns->first > fileidx) { -			tns->first = fileidx - fileidx % tns->cols; +			tns->first = fileidx - r;  			tns->dirty = 1;  		}  	} @@ -167,7 +173,7 @@ void tns_highlight(tns_t *tns, win_t *win, int n, Bool hl) {  	win_draw(win);  } -int tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) { +int tns_move_selection(tns_t *tns, win_t *win, tnsdir_t dir) {  	int old;  	if (!tns || !win) @@ -176,19 +182,19 @@ int tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) {  	old = fileidx;  	switch (dir) { -		case MOVE_LEFT: +		case TNS_LEFT:  			if (fileidx > 0)  				--fileidx;  			break; -		case MOVE_RIGHT: +		case TNS_RIGHT:  			if (fileidx < tns->cnt - 1)  				++fileidx;  			break; -		case MOVE_UP: +		case TNS_UP:  			if (fileidx >= tns->cols)  				fileidx -= tns->cols;  			break; -		case MOVE_DOWN: +		case TNS_DOWN:  			if (fileidx + tns->cols < tns->cnt)  				fileidx += tns->cols;  			break; @@ -204,6 +210,28 @@ int tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) {  	return fileidx != old;  } +int tns_scroll(tns_t *tns, tnsdir_t dir) { +	int old; + +	if (!tns) +		return 0; + +	old = tns->first; + +	if (dir == TNS_DOWN && tns->first + tns->cols * tns->rows < tns->cnt) +		tns->first += tns->cols; +	else if (dir == TNS_UP && tns->first >= tns->cols) +		tns->first -= tns->cols; + +	if (tns->first != old) { +		tns_check_view(tns, True); +		tns->dirty = 1; +		return 1; +	} else { +		return 0; +	} +} +  int tns_translate(tns_t *tns, int x, int y) {  	int n;  	thumb_t *t; @@ -21,12 +21,12 @@  #include "window.h" -typedef enum movedir_e { -	MOVE_LEFT = 0, -	MOVE_RIGHT, -	MOVE_UP, -	MOVE_DOWN -} movedir_t; +typedef enum tnsdir_e { +	TNS_LEFT = 0, +	TNS_RIGHT, +	TNS_UP, +	TNS_DOWN +} tnsdir_t;  typedef struct thumb_s {  	Pixmap pm; @@ -56,7 +56,8 @@ void tns_load(tns_t*, win_t*, const char*);  void tns_render(tns_t*, win_t*);  void tns_highlight(tns_t*, win_t*, int, Bool); -int tns_move_selection(tns_t*, win_t*, movedir_t); +int tns_move_selection(tns_t*, win_t*, tnsdir_t); +int tns_scroll(tns_t*, tnsdir_t);  int tns_translate(tns_t*, int, int);  | 
