summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main.c97
-rw-r--r--thumbs.c16
-rw-r--r--thumbs.h2
3 files changed, 74 insertions, 41 deletions
diff --git a/main.c b/main.c
index 79b562f..4189f4f 100644
--- a/main.c
+++ b/main.c
@@ -268,11 +268,11 @@ void redraw() {
}
void on_keypress(XKeyEvent *kev) {
- int sel, x, y;
+ int x, y;
unsigned int w, h;
char key;
KeySym ksym;
- int changed;
+ int changed, sel;
if (!kev)
return;
@@ -439,7 +439,7 @@ void on_keypress(XKeyEvent *kev) {
}
void on_buttonpress(XButtonEvent *bev) {
- int changed;
+ int changed, sel;
unsigned int mask;
if (!bev)
@@ -448,46 +448,61 @@ void on_buttonpress(XButtonEvent *bev) {
mask = CLEANMASK(bev->state);
changed = 0;
- switch (bev->button) {
- case Button1:
- if (fileidx + 1 < filecnt) {
- ++fileidx;
- changed = load_image();
- }
- break;
- case Button2:
- mox = bev->x;
- moy = bev->y;
- win_set_cursor(&win, CURSOR_HAND);
- break;
- case Button3:
- if (fileidx > 0) {
- --fileidx;
- changed = load_image();
- }
- break;
- case Button4:
- if (mask == ControlMask)
- changed = img_zoom_in(&img);
- else if (mask == ShiftMask)
+ if (mode == MODE_NORMAL) {
+ switch (bev->button) {
+ case Button1:
+ if (fileidx + 1 < filecnt) {
+ ++fileidx;
+ changed = load_image();
+ }
+ break;
+ case Button2:
+ mox = bev->x;
+ moy = bev->y;
+ win_set_cursor(&win, CURSOR_HAND);
+ break;
+ case Button3:
+ if (fileidx > 0) {
+ --fileidx;
+ changed = load_image();
+ }
+ break;
+ case Button4:
+ if (mask == ControlMask)
+ changed = img_zoom_in(&img);
+ else if (mask == ShiftMask)
+ changed = img_pan(&img, &win, PAN_LEFT);
+ else
+ changed = img_pan(&img, &win, PAN_UP);
+ break;
+ case Button5:
+ if (mask == ControlMask)
+ changed = img_zoom_out(&img);
+ else if (mask == ShiftMask)
+ changed = img_pan(&img, &win, PAN_RIGHT);
+ else
+ changed = img_pan(&img, &win, PAN_DOWN);
+ break;
+ case 6:
changed = img_pan(&img, &win, PAN_LEFT);
- else
- changed = img_pan(&img, &win, PAN_UP);
- break;
- case Button5:
- if (mask == ControlMask)
- changed = img_zoom_out(&img);
- else if (mask == ShiftMask)
+ break;
+ case 7:
changed = img_pan(&img, &win, PAN_RIGHT);
- else
- changed = img_pan(&img, &win, PAN_DOWN);
- break;
- case 6:
- changed = img_pan(&img, &win, PAN_LEFT);
- break;
- case 7:
- changed = img_pan(&img, &win, PAN_RIGHT);
- break;
+ break;
+ }
+ } else {
+ /* thumbnail mode */
+ switch (bev->button) {
+ case Button1:
+ if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) {
+ fileidx = sel;
+ load_image();
+ mode = MODE_NORMAL;
+ changed = 1;
+ break;
+ }
+ break;
+ }
}
if (changed)
diff --git a/thumbs.c b/thumbs.c
index c369395..25a7fc1 100644
--- a/thumbs.c
+++ b/thumbs.c
@@ -170,3 +170,19 @@ void tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) {
break;
}
}
+
+int tns_translate(tns_t *tns, int x, int y) {
+ int n;
+ thumb_t *t;
+
+ if (!tns || x < 5 || y < 5)
+ return -1;
+
+ if ((n = y / thumb_dim * tns-> cols + x / thumb_dim) < tns->cnt) {
+ t = &tns->thumbs[n];
+ if (x > t->x && x < t->x + t->w && y > t->y && y < t->y + t->h)
+ return n;
+ }
+
+ return -1;
+}
diff --git a/thumbs.h b/thumbs.h
index 1fd1209..70d8b3c 100644
--- a/thumbs.h
+++ b/thumbs.h
@@ -57,4 +57,6 @@ void tns_highlight(tns_t*, win_t*, int);
void tns_move_selection(tns_t*, win_t*, movedir_t);
+int tns_translate(tns_t*, int, int);
+
#endif /* THUMBS_H */