aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--commands.c31
-rw-r--r--main.c57
-rw-r--r--types.h2
4 files changed, 48 insertions, 44 deletions
diff --git a/Makefile b/Makefile
index 07c577a..dcf805a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
all: sxiv
-VERSION = git-20110902
+VERSION = git-20110903
CC = gcc
DESTDIR =
diff --git a/commands.c b/commands.c
index 1bf95af..20ffd42 100644
--- a/commands.c
+++ b/commands.c
@@ -33,7 +33,7 @@ void cleanup();
void remove_file(int, unsigned char);
void load_image(int);
void redraw();
-void hide_cursor();
+void reset_cursor();
void animate();
void set_timeout(timeout_f, int, int);
void reset_timeout(timeout_f);
@@ -56,8 +56,7 @@ int it_switch_mode(arg_t a) {
if (!tns.thumbs)
tns_init(&tns, filecnt);
img_close(&img, 0);
- win_set_cursor(&win, CURSOR_ARROW);
- reset_timeout(hide_cursor);
+ reset_timeout(reset_cursor);
tns.sel = fileidx;
tns.dirty = 1;
mode = MODE_THUMB;
@@ -81,11 +80,14 @@ int it_toggle_fullscreen(arg_t a) {
int it_reload_image(arg_t a) {
if (mode == MODE_IMAGE) {
load_image(fileidx);
- } else if (!tns_load(&tns, tns.sel, &files[tns.sel], True, False)) {
- remove_file(tns.sel, 0);
- tns.dirty = 1;
- if (tns.sel >= tns.cnt)
- tns.sel = tns.cnt - 1;
+ } else {
+ win_set_cursor(&win, CURSOR_WATCH);
+ if (!tns_load(&tns, tns.sel, &files[tns.sel], True, False)) {
+ remove_file(tns.sel, 0);
+ tns.dirty = 1;
+ if (tns.sel >= tns.cnt)
+ tns.sel = tns.cnt - 1;
+ }
}
return 1;
}
@@ -250,7 +252,7 @@ int i_drag(arg_t a) {
}
win_set_cursor(&win, CURSOR_ARROW);
- set_timeout(hide_cursor, TO_CURSOR_HIDE, 1);
+ set_timeout(reset_cursor, TO_CURSOR_HIDE, 1);
reset_timeout(redraw);
return 0;
@@ -369,17 +371,17 @@ int it_shell_cmd(arg_t a) {
return 0;
}
- win_set_cursor(&win, CURSOR_WATCH);
-
if ((pid = fork()) == 0) {
execl("/bin/sh", "/bin/sh", "-c", cmdline, NULL);
warn("could not exec: /bin/sh");
exit(1);
} else if (pid < 0) {
warn("could not fork. command line was: %s", cmdline);
- goto end;
+ return 0;
}
+ win_set_cursor(&win, CURSOR_WATCH);
+
waitpid(pid, &status, 0);
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
warn("child exited with non-zero return value: %d. command line was: %s",
@@ -398,10 +400,5 @@ int it_shell_cmd(arg_t a) {
tns.sel = tns.cnt - 1;
}
-end:
- if (mode == MODE_THUMB)
- win_set_cursor(&win, CURSOR_ARROW);
- /* else: cursor gets reset in redraw() */
-
return 1;
}
diff --git a/main.c b/main.c
index f596733..6fafb8b 100644
--- a/main.c
+++ b/main.c
@@ -49,7 +49,7 @@ typedef struct {
/* timeout handler functions: */
void redraw();
-void hide_cursor();
+void reset_cursor();
void animate();
appmode_t mode;
@@ -65,7 +65,7 @@ char win_title[TITLE_LEN];
timeout_t timeouts[] = {
{ { 0, 0 }, False, redraw },
- { { 0, 0 }, False, hide_cursor },
+ { { 0, 0 }, False, reset_cursor },
{ { 0, 0 }, False, animate }
};
@@ -189,10 +189,9 @@ void load_image(int new) {
if (new < 0 || new >= filecnt)
return;
- /* cursor gets reset in redraw() */
win_set_cursor(&win, CURSOR_WATCH);
+
img_close(&img, 0);
-
while (!img_load(&img, &files[new])) {
remove_file(new, 0);
if (new >= filecnt)
@@ -247,23 +246,34 @@ void update_title() {
}
void redraw() {
- if (mode == MODE_IMAGE) {
+ if (mode == MODE_IMAGE)
img_render(&img, &win);
- if (img.multi.animate) {
- win_set_cursor(&win, CURSOR_NONE);
- } else {
- win_set_cursor(&win, CURSOR_ARROW);
- set_timeout(hide_cursor, TO_CURSOR_HIDE, 1);
- }
- } else {
+ else
tns_render(&tns, &win);
- }
update_title();
reset_timeout(redraw);
+ reset_cursor();
}
-void hide_cursor() {
- win_set_cursor(&win, CURSOR_NONE);
+void reset_cursor() {
+ int i;
+ cursor_t cursor = CURSOR_NONE;
+
+ if (mode == MODE_IMAGE) {
+ for (i = 0; i < LEN(timeouts); i++) {
+ if (timeouts[i].handler == reset_cursor) {
+ if (timeouts[i].active)
+ cursor = CURSOR_ARROW;
+ break;
+ }
+ }
+ } else {
+ if (tns.cnt != filecnt)
+ cursor = CURSOR_WATCH;
+ else
+ cursor = CURSOR_ARROW;
+ }
+ win_set_cursor(&win, cursor);
}
void animate() {
@@ -312,7 +322,7 @@ void on_buttonpress(XButtonEvent *bev) {
if (mode == MODE_IMAGE) {
win_set_cursor(&win, CURSOR_ARROW);
- set_timeout(hide_cursor, TO_CURSOR_HIDE, 1);
+ set_timeout(reset_cursor, TO_CURSOR_HIDE, 1);
for (i = 0; i < LEN(buttons); i++) {
if (buttons[i].button == bev->button &&
@@ -329,15 +339,15 @@ void on_buttonpress(XButtonEvent *bev) {
case Button1:
if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) {
if (sel == tns.sel) {
- load_image(tns.sel);
mode = MODE_IMAGE;
- set_timeout(hide_cursor, TO_CURSOR_HIDE, 1);
+ set_timeout(reset_cursor, TO_CURSOR_HIDE, 1);
+ load_image(tns.sel);
+ redraw();
} else {
tns_highlight(&tns, &win, tns.sel, False);
tns_highlight(&tns, &win, sel, True);
tns.sel = sel;
}
- redraw();
break;
}
break;
@@ -363,18 +373,15 @@ void run() {
!XPending(win.env.dpy))
{
/* load thumbnails */
- win_set_cursor(&win, CURSOR_WATCH);
set_timeout(redraw, TO_REDRAW_THUMBS, 0);
if (tns_load(&tns, tns.cnt, &files[tns.cnt], False, False))
tns.cnt++;
else
remove_file(tns.cnt, 0);
- if (tns.cnt == filecnt) {
+ if (tns.cnt == filecnt)
redraw();
- win_set_cursor(&win, CURSOR_ARROW);
- } else {
+ else
check_timeouts(NULL);
- }
}
while (!XPending(win.env.dpy) && check_timeouts(&timeout)) {
@@ -410,7 +417,7 @@ void run() {
case MotionNotify:
if (mode == MODE_IMAGE) {
win_set_cursor(&win, CURSOR_ARROW);
- set_timeout(hide_cursor, TO_CURSOR_HIDE, 1);
+ set_timeout(reset_cursor, TO_CURSOR_HIDE, 1);
}
break;
}
diff --git a/types.h b/types.h
index bf8d4e2..79c0b5a 100644
--- a/types.h
+++ b/types.h
@@ -35,7 +35,7 @@ typedef struct {
enum {
TO_REDRAW_RESIZE = 75,
TO_REDRAW_THUMBS = 200,
- TO_CURSOR_HIDE = 1500
+ TO_CURSOR_HIDE = 1200
};
typedef void (*timeout_f)(void);