Krolyxon
Commit 76c2b81

Branches

Refs →

nsxivnsxiv.h

467 lines · 8.1 KB · Objective-C

1/* Copyright 2011-2020 Bert Muennich
2 * Copyright 2021-2022 nsxiv contributors
3 *
4 * This file is a part of nsxiv.
5 *
6 * nsxiv is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published
8 * by the Free Software Foundation; either version 2 of the License,
9 * or (at your option) any later version.
10 *
11 * nsxiv is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with nsxiv. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef NSXIV_H
21#define NSXIV_H
22
23#include <stdbool.h>
24#include <stddef.h>
25
26#include <Imlib2.h>
27#include <X11/Xlib.h>
28
29/*
30 * Annotation for functions called in cleanup().
31 * These functions are not allowed to call error(!0, ...) or exit().
32 */
33#define CLEANUP
34
35#define MIN(a,b) ((a) < (b) ? (a) : (b))
36#define MAX(a,b) ((a) > (b) ? (a) : (b))
37#define ABS(a) ((a) > 0 ? (a) : -(a))
38
39#define ARRLEN(a) (sizeof(a) / sizeof((a)[0]))
40#define STREQ(s1,s2) (strcmp((s1), (s2)) == 0)
41
42typedef enum {
43 MODE_ALL,
44 MODE_IMAGE,
45 MODE_THUMB
46} appmode_t;
47
48typedef enum {
49 DIR_LEFT = 1,
50 DIR_RIGHT = 2,
51 DIR_UP = 4,
52 DIR_DOWN = 8
53} direction_t;
54
55typedef enum {
56 DEGREE_90 = 1,
57 DEGREE_180 = 2,
58 DEGREE_270 = 3
59} degree_t;
60
61typedef enum {
62 FLIP_HORIZONTAL = 1,
63 FLIP_VERTICAL = 2
64} flipdir_t;
65
66typedef enum {
67 SCALE_DOWN,
68 SCALE_FIT,
69 SCALE_FILL,
70 SCALE_WIDTH,
71 SCALE_HEIGHT,
72 SCALE_ZOOM
73} scalemode_t;
74
75typedef enum {
76 DRAG_RELATIVE,
77 DRAG_ABSOLUTE
78} dragmode_t;
79
80typedef enum {
81 CURSOR_ARROW,
82 CURSOR_DRAG_ABSOLUTE,
83 CURSOR_DRAG_RELATIVE,
84 CURSOR_WATCH,
85 CURSOR_LEFT,
86 CURSOR_RIGHT,
87 CURSOR_NONE,
88
89 CURSOR_COUNT
90} cursor_t;
91
92typedef enum {
93 FF_WARN = 1,
94 FF_MARK = 2,
95 FF_TN_INIT = 4
96} fileflags_t;
97
98typedef struct {
99 const char *name; /* as given by user */
100 const char *path; /* always absolute */
101 fileflags_t flags;
102} fileinfo_t;
103
104/* timeouts in milliseconds: */
105enum {
106 TO_REDRAW_RESIZE = 75,
107 TO_REDRAW_THUMBS = 200,
108 TO_CURSOR_HIDE = 1200,
109 TO_DOUBLE_CLICK = 300
110};
111
112typedef void (*timeout_f)(void);
113
114typedef struct arl arl_t;
115typedef struct img img_t;
116typedef struct opt opt_t;
117typedef struct tns tns_t;
118typedef struct win win_t;
119
120
121/* autoreload.c */
122
123struct arl {
124 int fd;
125 int wd_dir;
126 int wd_file;
127 const char *filename;
128};
129
130void arl_init(arl_t*);
131void arl_cleanup(arl_t*);
132void arl_add(arl_t*, const char* /* result of realpath(3) */);
133bool arl_handle(arl_t*);
134
135
136/* commands.c */
137
138typedef int arg_t;
139typedef bool (*cmd_f)(arg_t);
140
141typedef struct {
142 cmd_f func;
143 appmode_t mode;
144} cmd_t;
145
146typedef struct {
147 unsigned int mask;
148 KeySym ksym_or_button;
149 cmd_t cmd;
150 arg_t arg;
151} keymap_t;
152
153typedef keymap_t button_t;
154
155
156/* image.c */
157
158typedef struct {
159 Imlib_Image im;
160 unsigned int delay;
161} img_frame_t;
162
163typedef struct {
164 img_frame_t *frames;
165 unsigned int cap;
166 unsigned int cnt;
167 unsigned int sel;
168 bool animate;
169 unsigned int framedelay;
170 int length;
171} multi_img_t;
172
173struct img {
174 Imlib_Image im;
175 int w;
176 int h;
177
178 win_t *win;
179 float x;
180 float y;
181
182 Imlib_Color_Modifier cmod;
183 int gamma;
184 int brightness;
185 int contrast;
186
187 scalemode_t scalemode;
188 float zoom;
189
190 bool checkpan;
191 bool dirty;
192 bool anti_alias;
193 bool alpha;
194
195 struct {
196 bool on;
197 int delay;
198 } ss;
199
200 multi_img_t multi;
201};
202
203void img_init(img_t*, win_t*);
204bool img_load(img_t*, const fileinfo_t*);
205CLEANUP void img_close(img_t*, bool);
206void img_render(img_t*);
207bool img_fit_win(img_t*, scalemode_t);
208bool img_zoom(img_t*, int);
209bool img_zoom_to(img_t*, float);
210bool img_pos(img_t*, float, float);
211bool img_pan(img_t*, direction_t, int);
212bool img_pan_center(img_t*);
213bool img_pan_edge(img_t*, direction_t);
214void img_rotate(img_t*, degree_t);
215void img_flip(img_t*, flipdir_t);
216void img_toggle_antialias(img_t*);
217void img_update_color_modifiers(img_t*);
218bool img_change_color_modifier(img_t*, int, int*);
219bool img_frame_navigate(img_t*, int);
220bool img_frame_animate(img_t*);
221Imlib_Image img_open(const fileinfo_t*);
222#if HAVE_LIBEXIF
223void exif_auto_orientate(const fileinfo_t*);
224#endif
225
226
227/* options.c */
228
229struct opt {
230 /* file list: */
231 char **filenames;
232 bool from_stdin;
233 bool to_stdout;
234 bool using_null;
235 bool recursive;
236 int filecnt;
237 int startnum;
238
239 /* image: */
240 scalemode_t scalemode;
241 float zoom;
242 bool animate;
243 bool anti_alias;
244 int gamma;
245 unsigned int slideshow;
246 int framerate;
247
248 /* window: */
249 bool fullscreen;
250 bool hide_bar;
251 Window embed; /* unsigned long */
252 char *geometry;
253 char *res_name;
254
255 /* misc flags: */
256 bool quiet;
257 bool thumb_mode;
258 bool clean_cache;
259 bool private_mode;
260};
261
262extern const opt_t *options;
263
264void print_usage(void);
265void parse_options(int, char**);
266
267
268/* thumbs.c */
269
270typedef struct {
271 Imlib_Image im;
272 int w;
273 int h;
274 int x;
275 int y;
276} thumb_t;
277
278struct tns {
279 fileinfo_t *files;
280 thumb_t *thumbs;
281 const int *cnt;
282 int *sel;
283 int initnext;
284 int loadnext;
285 int first, end;
286 int r_first, r_end;
287
288 win_t *win;
289 int x;
290 int y;
291 int cols;
292 int rows;
293 int zl;
294 int bw;
295 int dim;
296
297 bool dirty;
298};
299
300void tns_clean_cache(void);
301void tns_init(tns_t*, fileinfo_t*, const int*, int*, win_t*);
302CLEANUP void tns_free(tns_t*);
303bool tns_load(tns_t*, int, bool, bool);
304void tns_unload(tns_t*, int);
305void tns_render(tns_t*);
306void tns_mark(tns_t*, int, bool);
307void tns_highlight(tns_t*, int, bool);
308bool tns_move_selection(tns_t*, direction_t, int);
309bool tns_scroll(tns_t*, direction_t, bool);
310bool tns_zoom(tns_t*, int);
311int tns_translate(tns_t*, int, int);
312
313
314/* util.c */
315
316#include <dirent.h>
317
318typedef struct {
319 DIR *dir;
320 char *name;
321 int d;
322 bool recursive;
323
324 char **stack;
325 int stcap;
326 int stlen;
327} r_dir_t;
328
329typedef struct {
330 int readfd;
331 int writefd;
332 pid_t pid;
333} spawn_t;
334
335enum {
336 X_READ = (1 << 0),
337 X_WRITE = (1 << 1)
338};
339
340extern const char *progname;
341
342void* emalloc(size_t);
343void* ecalloc(size_t, size_t);
344void* erealloc(void*, size_t);
345char* estrdup(const char*);
346void error(int, int, const char*, ...);
347int r_opendir(r_dir_t*, const char*, bool);
348int r_closedir(r_dir_t*);
349char* r_readdir(r_dir_t*, bool);
350int r_mkdir(char*);
351void construct_argv(char**, unsigned int, ...);
352spawn_t spawn(const char*, char *const [], unsigned int);
353
354
355/* window.c */
356
357#include <X11/Xutil.h>
358#if HAVE_LIBFONTS
359#include <X11/Xft/Xft.h>
360#endif
361
362enum {
363 ATOM_WM_DELETE_WINDOW,
364 ATOM__NET_WM_NAME,
365 ATOM__NET_WM_ICON_NAME,
366 ATOM__NET_WM_ICON,
367 ATOM__NET_WM_STATE,
368 ATOM__NET_WM_PID,
369 ATOM__NET_WM_STATE_FULLSCREEN,
370 ATOM_UTF8_STRING,
371 ATOM_WM_NAME,
372 ATOM_WM_ICON_NAME,
373 ATOM_COUNT
374};
375
376typedef struct {
377 Display *dpy;
378 int scr;
379 int scrw, scrh;
380 Visual *vis;
381 Colormap cmap;
382 int depth;
383} win_env_t;
384
385typedef struct {
386 size_t size;
387 char *p;
388 char *buf;
389} win_bar_t;
390
391struct win {
392 Window xwin;
393 win_env_t env;
394
395 XColor win_bg;
396 XColor win_fg;
397 XColor mrk_fg;
398#if HAVE_LIBFONTS
399 XftColor bar_bg;
400 XftColor bar_fg;
401#endif
402
403 int x;
404 int y;
405 unsigned int w;
406 unsigned int h; /* = win height - bar height */
407 unsigned int bw;
408
409 struct {
410 unsigned int w;
411 unsigned int h;
412 Pixmap pm;
413 } buf;
414
415 struct {
416 unsigned int h;
417 bool top;
418 win_bar_t l;
419 win_bar_t r;
420 } bar;
421};
422
423extern Atom atoms[ATOM_COUNT];
424
425void win_init(win_t*);
426void win_open(win_t*);
427CLEANUP void win_close(win_t*);
428bool win_configure(win_t*, XConfigureEvent*);
429void win_toggle_fullscreen(win_t*);
430void win_toggle_bar(win_t*);
431void win_clear(win_t*);
432void win_draw(win_t*);
433void win_draw_rect(win_t*, int, int, int, int, bool, int, unsigned long);
434void win_set_title(win_t*, const char*, size_t);
435void win_set_cursor(win_t*, cursor_t);
436void win_cursor_pos(win_t*, int*, int*);
437
438/* main.c */
439
440/* timeout handler functions: */
441void redraw(void);
442void reset_cursor(void);
443void animate(void);
444void slideshow(void);
445void clear_resize(void);
446
447void remove_file(int, bool);
448void set_timeout(timeout_f, int, bool);
449void reset_timeout(timeout_f);
450void close_info(void);
451void open_info(void);
452void load_image(int);
453bool mark_image(int, bool);
454int nav_button(void);
455void handle_key_handler(bool);
456
457extern appmode_t mode;
458extern const XButtonEvent *xbutton_ev;
459extern fileinfo_t *files;
460extern int filecnt, fileidx;
461extern int alternate;
462extern int markcnt;
463extern int markidx;
464extern int prefix;
465extern bool title_dirty;
466
467#endif /* NSXIV_H */