/* Copyright 2011 Bert Muennich * * This file is part of sxiv. * * sxiv is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. * * sxiv is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with sxiv. If not, see . */ #ifndef SXIV_H #define SXIV_H #include #include #include #include #include #include #include /* * Annotation for functions called in cleanup(). * These functions are not allowed to call error(!0, ...) or exit(). */ #define CLEANUP #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #define ARRLEN(a) (sizeof(a) / sizeof((a)[0])) #define STREQ(s1,s2) (strcmp((s1), (s2)) == 0) #define TV_DIFF(t1,t2) (((t1)->tv_sec - (t2)->tv_sec ) * 1000 + \ ((t1)->tv_usec - (t2)->tv_usec) / 1000) #define TV_SET_MSEC(tv,t) { \ (tv)->tv_sec = (t) / 1000; \ (tv)->tv_usec = (t) % 1000 * 1000; \ } #define TV_ADD_MSEC(tv,t) { \ (tv)->tv_sec += (t) / 1000; \ (tv)->tv_usec += (t) % 1000 * 1000; \ } typedef enum { BO_BIG_ENDIAN, BO_LITTLE_ENDIAN } byteorder_t; typedef enum { MODE_IMAGE, MODE_THUMB } appmode_t; typedef enum { DIR_LEFT = 1, DIR_RIGHT = 2, DIR_UP = 4, DIR_DOWN = 8 } direction_t; typedef enum { DEGREE_90 = 1, DEGREE_180 = 2, DEGREE_270 = 3 } degree_t; typedef enum { FLIP_HORIZONTAL = 1, FLIP_VERTICAL = 2 } flipdir_t; typedef enum { SCALE_DOWN, SCALE_FIT, SCALE_WIDTH, SCALE_HEIGHT, SCALE_ZOOM } scalemode_t; typedef enum { DRAG_RELATIVE, DRAG_ABSOLUTE } dragmode_t; typedef enum { CURSOR_ARROW, CURSOR_DRAG, CURSOR_WATCH, CURSOR_LEFT, CURSOR_RIGHT, CURSOR_NONE, CURSOR_COUNT } cursor_t; typedef enum { FF_WARN = 1, FF_MARK = 2, FF_TN_INIT = 4 } fileflags_t; typedef struct { const char *name; /* as given by user */ const char *path; /* always absolute */ fileflags_t flags; } fileinfo_t; /* timeouts in milliseconds: */ enum { TO_REDRAW_RESIZE = 75, TO_REDRAW_THUMBS = 200, TO_CURSOR_HIDE = 1200, TO_DOUBLE_CLICK = 300 }; typedef void (*timeout_f)(void); typedef struct arl arl_t; typedef struct img img_t; typedef struct opt opt_t; typedef struct tns tns_t; typedef struct win win_t; /* autoreload.c */ struct arl { int fd; int wd_dir; int wd_file; char *filename; }; void arl_init(arl_t*); void arl_cleanup(arl_t*); void arl_setup(arl_t*, const char* /* result of realpath(3) */); bool arl_handle(arl_t*); /* commands.c */ 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; } cmd_t; typedef struct { unsigned int mask; KeySym ksym; cmd_id_t cmd; arg_t arg; } keymap_t; typedef struct { unsigned int mask; unsigned int button; cmd_id_t cmd; arg_t arg; } button_t; extern const cmd_t cmds[CMD_COUNT]; /* image.c */ typedef struct { Imlib_Image im; unsigned int delay; } img_frame_t; typedef struct { img_frame_t *frames; int cap; int cnt; int sel; bool animate; int framedelay; int length; } multi_img_t; struct img { Imlib_Image im; int w; int h; win_t *win; float x; float y; scalemode_t scalemode; float zoom; bool checkpan; bool dirty; bool aa; bool alpha; Imlib_Color_Modifier cmod; int gamma; struct { bool on; int delay; } ss; multi_img_t multi; }; void img_init(img_t*, win_t*); bool img_load(img_t*, const fileinfo_t*); CLEANUP void img_close(img_t*, bool); void img_render(img_t*); bool img_fit_win(img_t*, scalemode_t); bool img_zoom(img_t*, float); bool img_zoom_in(img_t*); bool img_zoom_out(img_t*); bool img_pos(img_t*, float, float); bool img_move(img_t*, float, float); bool img_pan(img_t*, direction_t, int); bool img_pan_edge(img_t*, direction_t); void img_rotate(img_t*, degree_t); void img_flip(img_t*, flipdir_t); void img_toggle_antialias(img_t*); bool img_change_gamma(img_t*, int); bool img_frame_navigate(img_t*, int); bool img_frame_animate(img_t*); /* options.c */ struct opt { /* file list: */ char **filenames; bool from_stdin; bool to_stdout; bool recursive; int filecnt; int startnum; /* image: */ scalemode_t scalemode; float zoom; bool animate; int gamma; int slideshow; int framerate; /* window: */ bool fullscreen; bool hide_bar; long embed; char *geometry; char *res_name; /* misc flags: */ bool quiet; bool thumb_mode; bool clean_cache; bool private_mode; }; extern const opt_t *options; void print_usage(void); void print_version(void); void parse_options(int, char**); /* thumbs.c */ typedef struct { Imlib_Image im; int w; int h; int x; int y; } thumb_t; struct tns { fileinfo_t *files; thumb_t *thumbs; const int *cnt; int *sel; int initnext; int loadnext; int first, end; int r_first, r_end; win_t *win; int x; int y; int cols; int rows; int zl; int bw; int dim; bool dirty; }; void tns_clean_cache(tns_t*); void tns_init(tns_t*, fileinfo_t*, const int*, int*, win_t*); CLEANUP void tns_free(tns_t*); bool tns_load(tns_t*, int, bool, bool); void tns_unload(tns_t*, int); void tns_render(tns_t*); void tns_mark(tns_t*, int, bool); void tns_highlight(tns_t*, int, bool); bool tns_move_selection(tns_t*, direction_t, int); bool tns_scroll(tns_t*, direction_t, bool); bool tns_zoom(tns_t*, int); int tns_translate(tns_t*, int, int); /* util.c */ #include typedef struct { DIR *dir; char *name; int d; bool recursive; char **stack; int stcap; int stlen; } r_dir_t; extern const char *progname; void* emalloc(size_t); void* erealloc(void*, size_t); char* estrdup(const char*); void error(int, int, const char*, ...); void size_readable(float*, const char**); int r_opendir(r_dir_t*, const char*, bool); int r_closedir(r_dir_t*); char* r_readdir(r_dir_t*, bool); int r_mkdir(char*); /* window.c */ #include #include enum { BAR_L_LEN = 512, BAR_R_LEN = 64 }; enum { ATOM_WM_DELETE_WINDOW, ATOM__NET_WM_NAME, ATOM__NET_WM_ICON_NAME, ATOM__NET_WM_ICON, ATOM__NET_WM_STATE, ATOM__NET_WM_STATE_FULLSCREEN, ATOM__NET_SUPPORTED, ATOM_COUNT }; typedef struct { Display *dpy; int scr; int scrw, scrh; Visual *vis; Colormap cmap; int depth; } win_env_t; typedef struct { size_t size; char *p; char *buf; } win_bar_t; struct win { Window xwin; win_env_t env; bool light; /* bg is lighter than fg */ XftColor bg; XftColor fg; XftColor black; int x; int y; unsigned int w; unsigned int h; /* = win height - bar height */ unsigned int bw; bool fullscreen; struct { int w; int h; Pixmap pm; } buf; struct { unsigned int h; win_bar_t l; win_bar_t r; } bar; }; extern Atom atoms[ATOM_COUNT]; void win_init(win_t*); void win_open(win_t*); CLEANUP void win_close(win_t*); bool win_configure(win_t*, XConfigureEvent*); void win_toggle_fullscreen(win_t*); void win_toggle_bar(win_t*); void win_clear(win_t*); void win_draw(win_t*); void win_draw_rect(win_t*, int, int, int, int, bool, int, unsigned long); void win_set_title(win_t*, const char*); void win_set_cursor(win_t*, cursor_t); void win_cursor_pos(win_t*, int*, int*); #endif /* SXIV_H */