make thumbnail bindings configureable via config.h (#167)
this allows for configuring thumbnail mode mouse bindings similar to image mode bindings. however we can't put the thumbnails bindings into the existing buttons[] array due to fallthrough. For example M3 would switch mode and then end up selecting an image. which is why thumbnail bindings have been put into it's own array `buttons_tns[]` and `buttons[]` has been renamed to `buttons_img[]` for consistency. Closes: https://github.com/nsxiv/nsxiv/issues/131
This commit is contained in:
parent
157cda5b31
commit
7a75c42b37
55
commands.c
55
commands.c
|
@ -42,6 +42,7 @@ extern appmode_t mode;
|
||||||
extern img_t img;
|
extern img_t img;
|
||||||
extern tns_t tns;
|
extern tns_t tns;
|
||||||
extern win_t win;
|
extern win_t win;
|
||||||
|
extern const XButtonEvent *xbutton_ev;
|
||||||
|
|
||||||
extern fileinfo_t *files;
|
extern fileinfo_t *files;
|
||||||
extern int filecnt, fileidx;
|
extern int filecnt, fileidx;
|
||||||
|
@ -436,3 +437,57 @@ bool ct_reload_all(arg_t _)
|
||||||
tns.dirty = true;
|
tns.dirty = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ct_scroll(arg_t dir)
|
||||||
|
{
|
||||||
|
return tns_scroll(&tns, dir, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ct_drag_mark_image(arg_t _)
|
||||||
|
{
|
||||||
|
int sel;
|
||||||
|
|
||||||
|
if ((sel = tns_translate(&tns, xbutton_ev->x, xbutton_ev->y)) >= 0) {
|
||||||
|
XEvent e;
|
||||||
|
bool on = !(files[sel].flags & FF_MARK);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (sel >= 0 && mark_image(sel, on))
|
||||||
|
redraw();
|
||||||
|
XMaskEvent(win.env.dpy,
|
||||||
|
ButtonPressMask | ButtonReleaseMask | PointerMotionMask, &e);
|
||||||
|
if (e.type == ButtonPress || e.type == ButtonRelease)
|
||||||
|
break;
|
||||||
|
while (XCheckTypedEvent(win.env.dpy, MotionNotify, &e));
|
||||||
|
sel = tns_translate(&tns, e.xbutton.x, e.xbutton.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ct_select(arg_t _)
|
||||||
|
{
|
||||||
|
int sel;
|
||||||
|
bool dirty = false;
|
||||||
|
static Time firstclick;
|
||||||
|
|
||||||
|
if ((sel = tns_translate(&tns, xbutton_ev->x, xbutton_ev->y)) >= 0) {
|
||||||
|
if (sel != fileidx) {
|
||||||
|
tns_highlight(&tns, fileidx, false);
|
||||||
|
tns_highlight(&tns, sel, true);
|
||||||
|
fileidx = sel;
|
||||||
|
firstclick = xbutton_ev->time;
|
||||||
|
dirty = true;
|
||||||
|
} else if (xbutton_ev->time - firstclick <= TO_DOUBLE_CLICK) {
|
||||||
|
mode = MODE_IMAGE;
|
||||||
|
set_timeout(reset_cursor, TO_CURSOR_HIDE, true);
|
||||||
|
load_image(fileidx);
|
||||||
|
dirty = true;
|
||||||
|
} else {
|
||||||
|
firstclick = xbutton_ev->time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dirty;
|
||||||
|
}
|
||||||
|
|
|
@ -39,6 +39,9 @@ bool ci_toggle_antialias(arg_t);
|
||||||
/* thumbnails mode */
|
/* thumbnails mode */
|
||||||
bool ct_move_sel(arg_t);
|
bool ct_move_sel(arg_t);
|
||||||
bool ct_reload_all(arg_t);
|
bool ct_reload_all(arg_t);
|
||||||
|
bool ct_scroll(arg_t);
|
||||||
|
bool ct_drag_mark_image(arg_t);
|
||||||
|
bool ct_select(arg_t);
|
||||||
|
|
||||||
/* global */
|
/* global */
|
||||||
#define g_change_gamma { cg_change_gamma, MODE_ALL }
|
#define g_change_gamma { cg_change_gamma, MODE_ALL }
|
||||||
|
@ -79,5 +82,8 @@ bool ct_reload_all(arg_t);
|
||||||
/* thumbnails mode */
|
/* thumbnails mode */
|
||||||
#define t_move_sel { ct_move_sel, MODE_THUMB }
|
#define t_move_sel { ct_move_sel, MODE_THUMB }
|
||||||
#define t_reload_all { ct_reload_all, MODE_THUMB }
|
#define t_reload_all { ct_reload_all, MODE_THUMB }
|
||||||
|
#define t_scroll { ct_scroll, MODE_THUMB }
|
||||||
|
#define t_drag_mark_image { ct_drag_mark_image, MODE_THUMB }
|
||||||
|
#define t_select { ct_select, MODE_THUMB }
|
||||||
|
|
||||||
#endif /* COMMANDS_H */
|
#endif /* COMMANDS_H */
|
||||||
|
|
13
config.def.h
13
config.def.h
|
@ -175,7 +175,7 @@ static const keymap_t keys[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* mouse button mappings for image mode: */
|
/* mouse button mappings for image mode: */
|
||||||
static const button_t buttons[] = {
|
static const button_t buttons_img[] = {
|
||||||
/* modifiers button function argument */
|
/* modifiers button function argument */
|
||||||
{ 0, 1, i_cursor_navigate, None },
|
{ 0, 1, i_cursor_navigate, None },
|
||||||
{ ControlMask, 1, i_drag, DRAG_RELATIVE },
|
{ ControlMask, 1, i_drag, DRAG_RELATIVE },
|
||||||
|
@ -185,6 +185,17 @@ static const button_t buttons[] = {
|
||||||
{ 0, 5, g_zoom, -1 },
|
{ 0, 5, g_zoom, -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* mouse button mappings for thumbnail mode: */
|
||||||
|
static const button_t buttons_tns[] = {
|
||||||
|
/* modifiers button function argument */
|
||||||
|
{ 0, 1, t_select, None },
|
||||||
|
{ 0, 3, t_drag_mark_image, None },
|
||||||
|
{ 0, 4, t_scroll, DIR_UP },
|
||||||
|
{ 0, 5, t_scroll, DIR_DOWN },
|
||||||
|
{ ControlMask, 4, g_scroll_screen, DIR_UP },
|
||||||
|
{ ControlMask, 5, g_scroll_screen, DIR_DOWN },
|
||||||
|
};
|
||||||
|
|
||||||
/* true means NAV_WIDTH is relative (33%), false means absolute (33 pixels) */
|
/* true means NAV_WIDTH is relative (33%), false means absolute (33 pixels) */
|
||||||
static const bool NAV_IS_REL = true;
|
static const bool NAV_IS_REL = true;
|
||||||
/* width of navigation area, 0 disables cursor navigation, */
|
/* width of navigation area, 0 disables cursor navigation, */
|
||||||
|
|
61
main.c
61
main.c
|
@ -57,6 +57,7 @@ arl_t arl;
|
||||||
img_t img;
|
img_t img;
|
||||||
tns_t tns;
|
tns_t tns;
|
||||||
win_t win;
|
win_t win;
|
||||||
|
const XButtonEvent *xbutton_ev;
|
||||||
|
|
||||||
fileinfo_t *files;
|
fileinfo_t *files;
|
||||||
int filecnt, fileidx;
|
int filecnt, fileidx;
|
||||||
|
@ -661,64 +662,19 @@ static void on_keypress(XKeyEvent *kev)
|
||||||
prefix = 0;
|
prefix = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void on_buttonpress(XButtonEvent *bev)
|
static void on_buttonpress(const XButtonEvent *bev)
|
||||||
{
|
{
|
||||||
int sel;
|
|
||||||
bool dirty = false;
|
bool dirty = false;
|
||||||
static Time firstclick;
|
|
||||||
|
|
||||||
if (mode == MODE_IMAGE) {
|
if (mode == MODE_IMAGE) {
|
||||||
set_timeout(reset_cursor, TO_CURSOR_HIDE, true);
|
set_timeout(reset_cursor, TO_CURSOR_HIDE, true);
|
||||||
reset_cursor();
|
reset_cursor();
|
||||||
dirty = process_bindings(buttons, ARRLEN(buttons), bev->button, bev->state, 0);
|
dirty = process_bindings(buttons_img, ARRLEN(buttons_img), bev->button, bev->state, 0);
|
||||||
if (dirty)
|
} else { /* thumbnail mode */
|
||||||
redraw();
|
dirty = process_bindings(buttons_tns, ARRLEN(buttons_tns), bev->button, bev->state, 0);
|
||||||
} else {
|
|
||||||
/* thumbnail mode (hard-coded) */
|
|
||||||
switch (bev->button) {
|
|
||||||
case Button1:
|
|
||||||
if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) {
|
|
||||||
if (sel != fileidx) {
|
|
||||||
tns_highlight(&tns, fileidx, false);
|
|
||||||
tns_highlight(&tns, sel, true);
|
|
||||||
fileidx = sel;
|
|
||||||
firstclick = bev->time;
|
|
||||||
redraw();
|
|
||||||
} else if (bev->time - firstclick <= TO_DOUBLE_CLICK) {
|
|
||||||
mode = MODE_IMAGE;
|
|
||||||
set_timeout(reset_cursor, TO_CURSOR_HIDE, true);
|
|
||||||
load_image(fileidx);
|
|
||||||
redraw();
|
|
||||||
} else {
|
|
||||||
firstclick = bev->time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Button3:
|
|
||||||
if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) {
|
|
||||||
bool on = !(files[sel].flags & FF_MARK);
|
|
||||||
XEvent e;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
if (sel >= 0 && mark_image(sel, on))
|
|
||||||
redraw();
|
|
||||||
XMaskEvent(win.env.dpy,
|
|
||||||
ButtonPressMask | ButtonReleaseMask | PointerMotionMask, &e);
|
|
||||||
if (e.type == ButtonPress || e.type == ButtonRelease)
|
|
||||||
break;
|
|
||||||
while (XCheckTypedEvent(win.env.dpy, MotionNotify, &e));
|
|
||||||
sel = tns_translate(&tns, e.xbutton.x, e.xbutton.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Button4:
|
|
||||||
case Button5:
|
|
||||||
if (tns_scroll(&tns, bev->button == Button4 ? DIR_UP : DIR_DOWN,
|
|
||||||
(bev->state & ControlMask) != 0))
|
|
||||||
redraw();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (dirty)
|
||||||
|
redraw();
|
||||||
prefix = 0;
|
prefix = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -731,13 +687,14 @@ static void run(void)
|
||||||
bool discard, init_thumb, load_thumb, to_set;
|
bool discard, init_thumb, load_thumb, to_set;
|
||||||
XEvent ev, nextev;
|
XEvent ev, nextev;
|
||||||
|
|
||||||
|
xbutton_ev = &ev.xbutton;
|
||||||
while (true) {
|
while (true) {
|
||||||
to_set = check_timeouts(&timeout);
|
to_set = check_timeouts(&timeout);
|
||||||
init_thumb = mode == MODE_THUMB && tns.initnext < filecnt;
|
init_thumb = mode == MODE_THUMB && tns.initnext < filecnt;
|
||||||
load_thumb = mode == MODE_THUMB && tns.loadnext < tns.end;
|
load_thumb = mode == MODE_THUMB && tns.loadnext < tns.end;
|
||||||
|
|
||||||
if ((init_thumb || load_thumb || to_set || info.fd != -1 ||
|
if ((init_thumb || load_thumb || to_set || info.fd != -1 ||
|
||||||
arl.fd != -1) && XPending(win.env.dpy) == 0)
|
arl.fd != -1) && XPending(win.env.dpy) == 0)
|
||||||
{
|
{
|
||||||
if (load_thumb) {
|
if (load_thumb) {
|
||||||
set_timeout(redraw, TO_REDRAW_THUMBS, false);
|
set_timeout(redraw, TO_REDRAW_THUMBS, false);
|
||||||
|
|
Loading…
Reference in a new issue