aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--commands.c12
-rw-r--r--commands.h83
-rw-r--r--commands.lst36
-rw-r--r--main.c15
-rw-r--r--nsxiv.h18
6 files changed, 96 insertions, 70 deletions
diff --git a/Makefile b/Makefile
index caf72f5..be93097 100644
--- a/Makefile
+++ b/Makefile
@@ -64,7 +64,7 @@ nsxiv: $(OBJS)
@echo "CC $@"
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
-$(OBJS): Makefile nsxiv.h commands.lst config.h
+$(OBJS): Makefile nsxiv.h config.h
options.o: version.h
window.o: icon/data.h
diff --git a/commands.c b/commands.c
index 3981f0f..e52b381 100644
--- a/commands.c
+++ b/commands.c
@@ -436,15 +436,3 @@ bool ct_reload_all(arg_t _)
tns.dirty = true;
return true;
}
-
-
-#undef G_CMD
-#define G_CMD(c) { -1, cg_##c },
-#undef I_CMD
-#define I_CMD(c) { MODE_IMAGE, ci_##c },
-#undef T_CMD
-#define T_CMD(c) { MODE_THUMB, ct_##c },
-
-const cmd_t cmds[CMD_COUNT] = {
-#include "commands.lst"
-};
diff --git a/commands.h b/commands.h
new file mode 100644
index 0000000..bc0e340
--- /dev/null
+++ b/commands.h
@@ -0,0 +1,83 @@
+#ifndef COMMANDS_H
+#define COMMANDS_H
+#include <stdbool.h>
+
+/* global */
+bool cg_change_gamma();
+bool cg_first();
+bool cg_mark_range();
+bool cg_n_or_last();
+bool cg_navigate_marked();
+bool cg_prefix_external();
+bool cg_quit();
+bool cg_reload_image();
+bool cg_remove_image();
+bool cg_reverse_marks();
+bool cg_scroll_screen();
+bool cg_switch_mode();
+bool cg_toggle_bar();
+bool cg_toggle_fullscreen();
+bool cg_toggle_image_mark();
+bool cg_unmark_all();
+bool cg_zoom();
+/* image mode */
+bool ci_alternate();
+bool ci_cursor_navigate();
+bool ci_drag();
+bool ci_fit_to_win();
+bool ci_flip();
+bool ci_navigate();
+bool ci_navigate_frame();
+bool ci_rotate();
+bool ci_scroll();
+bool ci_scroll_to_edge();
+bool ci_set_zoom();
+bool ci_slideshow();
+bool ci_toggle_alpha();
+bool ci_toggle_animation();
+bool ci_toggle_antialias();
+/* thumbnails mode */
+bool ct_move_sel();
+bool ct_reload_all();
+
+/* global */
+#define g_change_gamma { cg_change_gamma, MODE_ALL }
+#define g_first { cg_first, MODE_ALL }
+#define g_mark_range { cg_mark_range, MODE_ALL }
+#define g_n_or_last { cg_n_or_last, MODE_ALL }
+#define g_navigate_marked { cg_navigate_marked, MODE_ALL }
+#define g_prefix_external { cg_prefix_external, MODE_ALL }
+#define g_quit { cg_quit, MODE_ALL }
+#define g_reload_image { cg_reload_image, MODE_ALL }
+#define g_remove_image { cg_remove_image, MODE_ALL }
+#define g_reverse_marks { cg_reverse_marks, MODE_ALL }
+#define g_scroll_screen { cg_scroll_screen, MODE_ALL }
+#define g_switch_mode { cg_switch_mode, MODE_ALL }
+#define g_toggle_bar { cg_toggle_bar, MODE_ALL }
+#define g_toggle_fullscreen { cg_toggle_fullscreen, MODE_ALL }
+#define g_toggle_image_mark { cg_toggle_image_mark, MODE_ALL }
+#define g_unmark_all { cg_unmark_all, MODE_ALL }
+#define g_zoom { cg_zoom, MODE_ALL }
+
+/* image mode */
+#define i_alternate { ci_alternate, MODE_IMAGE }
+#define i_cursor_navigate { ci_cursor_navigate, MODE_IMAGE }
+#define i_drag { ci_drag, MODE_IMAGE }
+#define i_fit_to_win { ci_fit_to_win, MODE_IMAGE }
+#define i_flip { ci_flip, MODE_IMAGE }
+#define i_navigate { ci_navigate, MODE_IMAGE }
+#define i_navigate_frame { ci_navigate_frame, MODE_IMAGE }
+#define i_rotate { ci_rotate, MODE_IMAGE }
+#define i_scroll { ci_scroll, MODE_IMAGE }
+#define i_scroll_to_edge { ci_scroll_to_edge, MODE_IMAGE }
+#define i_set_zoom { ci_set_zoom, MODE_IMAGE }
+#define i_slideshow { ci_slideshow, MODE_IMAGE }
+#define i_toggle_alpha { ci_toggle_alpha, MODE_IMAGE }
+#define i_toggle_animation { ci_toggle_animation, MODE_IMAGE }
+#define i_toggle_antialias { ci_toggle_antialias, MODE_IMAGE }
+
+/* thumbnails mode */
+#define t_move_sel { ct_move_sel, MODE_THUMB }
+#define t_reload_all { ct_reload_all, MODE_THUMB }
+
+#endif
diff --git a/commands.lst b/commands.lst
deleted file mode 100644
index a97ca1c..0000000
--- a/commands.lst
+++ /dev/null
@@ -1,36 +0,0 @@
-G_CMD(quit)
-G_CMD(switch_mode)
-G_CMD(toggle_fullscreen)
-G_CMD(toggle_bar)
-G_CMD(prefix_external)
-G_CMD(reload_image)
-G_CMD(remove_image)
-G_CMD(first)
-G_CMD(n_or_last)
-G_CMD(scroll_screen)
-G_CMD(zoom)
-G_CMD(toggle_image_mark)
-G_CMD(reverse_marks)
-G_CMD(mark_range)
-G_CMD(unmark_all)
-G_CMD(navigate_marked)
-G_CMD(change_gamma)
-
-I_CMD(navigate)
-I_CMD(cursor_navigate)
-I_CMD(alternate)
-I_CMD(navigate_frame)
-I_CMD(toggle_animation)
-I_CMD(scroll)
-I_CMD(scroll_to_edge)
-I_CMD(drag)
-I_CMD(set_zoom)
-I_CMD(fit_to_win)
-I_CMD(rotate)
-I_CMD(flip)
-I_CMD(toggle_antialias)
-I_CMD(toggle_alpha)
-I_CMD(slideshow)
-
-T_CMD(move_sel)
-T_CMD(reload_all)
diff --git a/main.c b/main.c
index a17e615..ffba285 100644
--- a/main.c
+++ b/main.c
@@ -17,6 +17,7 @@
*/
#include "nsxiv.h"
+#include "commands.h"
#define _MAPPINGS_CONFIG
#include "config.h"
@@ -613,10 +614,10 @@ void on_keypress(XKeyEvent *kev)
} else for (i = 0; i < ARRLEN(keys); i++) {
if (keys[i].ksym == ksym &&
MODMASK(keys[i].mask | sh) == MODMASK(kev->state) &&
- keys[i].cmd >= 0 && keys[i].cmd < CMD_COUNT &&
- (cmds[keys[i].cmd].mode < 0 || cmds[keys[i].cmd].mode == mode))
+ keys[i].cmd.func &&
+ (keys[i].cmd.mode == MODE_ALL || keys[i].cmd.mode == mode))
{
- if (cmds[keys[i].cmd].func(keys[i].arg))
+ if (keys[i].cmd.func(keys[i].arg))
dirty = true;
}
}
@@ -638,10 +639,10 @@ void on_buttonpress(XButtonEvent *bev)
for (i = 0; i < ARRLEN(buttons); i++) {
if (buttons[i].button == bev->button &&
MODMASK(buttons[i].mask) == MODMASK(bev->state) &&
- buttons[i].cmd >= 0 && buttons[i].cmd < CMD_COUNT &&
- (cmds[buttons[i].cmd].mode < 0 || cmds[buttons[i].cmd].mode == mode))
+ buttons[i].cmd.func &&
+ (buttons[i].cmd.mode == MODE_ALL || buttons[i].cmd.mode == mode))
{
- if (cmds[buttons[i].cmd].func(buttons[i].arg))
+ if (buttons[i].cmd.func(buttons[i].arg))
dirty = true;
}
}
@@ -778,7 +779,7 @@ void run(void)
break;
case ClientMessage:
if ((Atom) ev.xclient.data.l[0] == atoms[ATOM_WM_DELETE_WINDOW])
- cmds[g_quit].func(0);
+ cg_quit();
break;
case DestroyNotify:
exit(EXIT_FAILURE);
diff --git a/nsxiv.h b/nsxiv.h
index d65875b..45d1772 100644
--- a/nsxiv.h
+++ b/nsxiv.h
@@ -60,6 +60,7 @@ typedef enum {
} byteorder_t;
typedef enum {
+ MODE_ALL,
MODE_IMAGE,
MODE_THUMB
} appmode_t;
@@ -162,36 +163,25 @@ bool arl_handle(arl_t*);
typedef int arg_t;
typedef bool (*cmd_f)(arg_t);
-#define G_CMD(c) g_##c,
-#define I_CMD(c) i_##c,
-#define T_CMD(c) t_##c,
-
-typedef enum {
-#include "commands.lst"
- CMD_COUNT
-} cmd_id_t;
-
typedef struct {
- int mode;
cmd_f func;
+ appmode_t mode;
} cmd_t;
typedef struct {
unsigned int mask;
KeySym ksym;
- cmd_id_t cmd;
+ cmd_t cmd;
arg_t arg;
} keymap_t;
typedef struct {
unsigned int mask;
unsigned int button;
- cmd_id_t cmd;
+ cmd_t cmd;
arg_t arg;
} button_t;
-extern const cmd_t cmds[CMD_COUNT];
-
/* image.c */