@@ -41,8 +41,19 @@ Use the following keys to control sxiv: | |||||
[/] Go 10 images backward/forward | [/] Go 10 images backward/forward | ||||
+,= Zoom in | +,= Zoom in | ||||
- Zoom out | - Zoom out | ||||
h,j,k,l Scroll left/down/up/right | h,j,k,l Pan image left/down/up/right | ||||
<,> Rotate image (counter-)clockwise by 90 degrees | <,> Rotate image (counter-)clockwise by 90 degrees | ||||
f Toggle fullscreen mode (requires an EWMH/NetWM compliant | f Toggle fullscreen mode (requires an EWMH/NetWM compliant | ||||
window manager) | window manager) | ||||
a Toggle anti-aliasing | a Toggle anti-aliasing | ||||
Additionally, sxiv can be controlled via the following mouse commands: | |||||
Button1 Go to the next image | |||||
Button3 Go to the previous image | |||||
ScrollUp Pan image up | |||||
ScrollDown Pan image down | |||||
Shift+ScrollUp Pan image left | |||||
Shift+ScrollDown Pan image right | |||||
Ctrl+ScrollUp Zoom in | |||||
Ctrl+ScrollDown Zoom out |
@@ -1,3 +1,2 @@ | |||||
- mouse scrolling and zooming | |||||
- add some useful command line options | - add some useful command line options | ||||
- view all images in directories (recursive mode) | - view all images in directories (recursive mode) |
@@ -30,14 +30,14 @@ | |||||
#include "window.h" | #include "window.h" | ||||
void on_keypress(XEvent*); | void on_keypress(XEvent*); | ||||
void on_configurenotify(XEvent*); | |||||
void on_buttonpress(XEvent*); | void on_buttonpress(XEvent*); | ||||
void on_configurenotify(XEvent*); | |||||
void update_title(); | void update_title(); | ||||
static void (*handler[LASTEvent])(XEvent*) = { | static void (*handler[LASTEvent])(XEvent*) = { | ||||
[ButtonPress] = on_buttonpress, | |||||
[KeyPress] = on_keypress, | [KeyPress] = on_keypress, | ||||
[ButtonPress] = on_buttonpress, | |||||
[ConfigureNotify] = on_configurenotify | [ConfigureNotify] = on_configurenotify | ||||
}; | }; | ||||
@@ -128,31 +128,6 @@ void cleanup() { | |||||
} | } | ||||
} | } | ||||
void on_buttonpress(XEvent *ev) { | |||||
int changed; | |||||
XButtonEvent *buttonevent; | |||||
changed = 0; | |||||
buttonevent = &ev->xbutton; | |||||
switch (buttonevent->button) { | |||||
case Button4: | |||||
changed = img_zoom_in(&img); | |||||
break; | |||||
case Button5: | |||||
changed = img_zoom_out(&img); | |||||
break; | |||||
default: | |||||
return; | |||||
} | |||||
if (changed) { | |||||
img_render(&img, &win); | |||||
update_title(); | |||||
timeout = 0; | |||||
} | |||||
} | |||||
void on_keypress(XEvent *ev) { | void on_keypress(XEvent *ev) { | ||||
char key; | char key; | ||||
KeySym keysym; | KeySym keysym; | ||||
@@ -272,6 +247,60 @@ void on_keypress(XEvent *ev) { | |||||
} | } | ||||
} | } | ||||
void on_buttonpress(XEvent *ev) { | |||||
int changed; | |||||
unsigned int mask; | |||||
if (!ev) | |||||
return; | |||||
mask = CLEANMASK(ev->xbutton.state); | |||||
changed = 0; | |||||
switch (ev->xbutton.button) { | |||||
case Button1: | |||||
if (fileidx + 1 < filecnt) { | |||||
img_load(&img, filenames[++fileidx]); | |||||
changed = 1; | |||||
} | |||||
break; | |||||
case Button3: | |||||
if (fileidx > 0) { | |||||
img_load(&img, filenames[--fileidx]); | |||||
changed = 1; | |||||
} | |||||
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); | |||||
break; | |||||
case 7: | |||||
changed = img_pan(&img, &win, PAN_RIGHT); | |||||
break; | |||||
} | |||||
if (changed) { | |||||
img_render(&img, &win); | |||||
update_title(); | |||||
timeout = 0; | |||||
} | |||||
} | |||||
void on_configurenotify(XEvent *ev) { | void on_configurenotify(XEvent *ev) { | ||||
if (!ev) | if (!ev) | ||||
return; | return; | ||||
@@ -26,7 +26,7 @@ Quit sxiv. | |||||
.TP | .TP | ||||
.B Escape | .B Escape | ||||
Quit sxiv and return an exit value of 2. | Quit sxiv and return an exit value of 2. | ||||
.SS Navigate image list | .SS Navigate image list | ||||
.TP | .TP | ||||
.BR Space ", " n | .BR Space ", " n | ||||
Go to the next image. | Go to the next image. | ||||
@@ -80,6 +80,34 @@ Toggle fullscreen mode. | |||||
.TP | .TP | ||||
.B a | .B a | ||||
Toggle anti-aliasing. | Toggle anti-aliasing. | ||||
.SH MOUSE COMMANDS | |||||
.SS Navigate image list | |||||
.TP | |||||
.B Button1 | |||||
Go to the next image. | |||||
.TP | |||||
.B Button3 | |||||
Go to the previous image. | |||||
.SS Zooming | |||||
.TP | |||||
.B Ctrl+ScrollUp | |||||
Zoom in. | |||||
.TP | |||||
.B Ctrl+ScrollDown | |||||
Zoom out. | |||||
.SS Panning | |||||
.TP | |||||
.B ScrollUp | |||||
Pan up. | |||||
.TP | |||||
.B ScrollDown | |||||
Pan down. | |||||
.TP | |||||
.B Shift+ScrollUp | |||||
Pan left. | |||||
.TP | |||||
.B Shift+ScrollDown | |||||
Pan right. | |||||
.SH AUTHORS | .SH AUTHORS | ||||
.TP | .TP | ||||
Bert Muennich <ber.t at gmx.com> | Bert Muennich <ber.t at gmx.com> | ||||
@@ -87,4 +115,5 @@ Bert Muennich <ber.t at gmx.com> | |||||
.TP | .TP | ||||
http://github.com/muennich/sxiv | http://github.com/muennich/sxiv | ||||
.SH SEE ALSO | .SH SEE ALSO | ||||
.BR feh (1), qiv (1) | .BR feh (1), | ||||
.BR qiv (1) |
@@ -21,6 +21,8 @@ | |||||
#include <X11/Xlib.h> | #include <X11/Xlib.h> | ||||
#define CLEANMASK(mask) ((mask) & ~LockMask) | |||||
typedef struct win_env_s { | typedef struct win_env_s { | ||||
Display *dpy; | Display *dpy; | ||||
int scr; | int scr; | ||||