(Re)-implement natural and case sorting
[geeqie.git] / src / typedefs.h
1 /*
2  * Copyright (C) 2006 John Ellis
3  * Copyright (C) 2008 - 2016 The Geeqie Team
4  *
5  * Author: John Ellis
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #ifndef TYPEDEFS_H
23 #define TYPEDEFS_H
24
25 enum ZoomMode {
26         ZOOM_RESET_ORIGINAL     = 0,
27         ZOOM_RESET_FIT_WINDOW   = 1,
28         ZOOM_RESET_NONE         = 2
29 };
30
31 enum ZoomStyle {
32         ZOOM_GEOMETRIC  = 0,
33         ZOOM_ARITHMETIC = 1
34 };
35
36 enum ClipboardDestination {
37         CLIPBOARD_TEXT_PLAIN    = 0,
38         CLIPBOARD_TEXT_URI_LIST = 1,
39         CLIPBOARD_X_SPECIAL_GNOME_COPIED_FILES  = 2,
40         CLIPBOARD_UTF8_STRING   = 3
41 };
42
43 enum ClipboardSelection {
44         CLIPBOARD_PRIMARY       = 0,
45         CLIPBOARD_CLIPBOARD = 1,
46         CLIPBOARD_BOTH = 2
47 };
48
49 enum MouseButton {
50         MOUSE_BUTTON_LEFT       = 1,
51         MOUSE_BUTTON_MIDDLE     = 2,
52         MOUSE_BUTTON_RIGHT      = 3,
53         MOUSE_BUTTON_WHEEL_UP   = 4,
54         MOUSE_BUTTON_WHEEL_DOWN = 5,
55         MOUSE_BUTTON_8  = 8,
56         MOUSE_BUTTON_9  = 9
57 };
58
59 enum DirViewType {
60         DIRVIEW_LIST,
61         DIRVIEW_TREE,
62
63         DIRVIEW_LAST = DIRVIEW_TREE /**< Keep this up to date! */
64 };
65
66 enum FileViewType {
67         FILEVIEW_LIST,
68         FILEVIEW_ICON,
69
70         FILEVIEW_LAST = FILEVIEW_ICON /**< Keep this up to date! */
71 };
72
73 #define CMD_COPY     "geeqie-copy-command.desktop"
74 #define CMD_MOVE     "geeqie-move-command.desktop"
75 #define CMD_RENAME   "geeqie-rename-command.desktop"
76 #define CMD_DELETE   "geeqie-delete-command.desktop"
77 #define CMD_FOLDER   "geeqie-folder-command.desktop"
78
79 enum SortType {
80         SORT_NONE,
81         SORT_NAME,
82         SORT_SIZE,
83         SORT_TIME,
84         SORT_CTIME,
85         SORT_PATH,
86         SORT_NUMBER,
87         SORT_EXIFTIME,
88         SORT_EXIFTIMEDIGITIZED,
89         SORT_RATING,
90         SORT_CLASS
91 };
92
93 /**
94  * @enum DnDAction
95  * drag and drop default action
96  */
97 enum DnDAction {
98         DND_ACTION_ASK,
99         DND_ACTION_COPY,
100         DND_ACTION_MOVE
101 };
102
103 enum AlterType {
104         ALTER_NONE,             /**< do nothing */
105         ALTER_ROTATE_90,
106         ALTER_ROTATE_90_CC,     /**< counterclockwise */
107         ALTER_ROTATE_180,
108         ALTER_MIRROR,
109         ALTER_FLIP,
110 };
111
112 enum LayoutLocation {
113         LAYOUT_HIDE   = 0,
114         LAYOUT_LEFT   = 1 << 0,
115         LAYOUT_RIGHT  = 1 << 1,
116         LAYOUT_TOP    = 1 << 2,
117         LAYOUT_BOTTOM = 1 << 3
118 };
119
120
121 enum ImageState {
122         IMAGE_STATE_NONE        = 0,
123         IMAGE_STATE_IMAGE       = 1 << 0,
124         IMAGE_STATE_LOADING     = 1 << 1,
125         IMAGE_STATE_ERROR       = 1 << 2,
126         IMAGE_STATE_COLOR_ADJ   = 1 << 3,
127         IMAGE_STATE_ROTATE_AUTO = 1 << 4,
128         IMAGE_STATE_ROTATE_USER = 1 << 5,
129         IMAGE_STATE_DELAY_FLIP  = 1 << 6
130 };
131
132 enum ImageSplitMode {
133         SPLIT_NONE = 0,
134         SPLIT_VERT,
135         SPLIT_HOR,
136         SPLIT_TRIPLE,
137         SPLIT_QUAD,
138 };
139
140 enum FileDataChangeType {
141         FILEDATA_CHANGE_DELETE,
142         FILEDATA_CHANGE_MOVE,
143         FILEDATA_CHANGE_RENAME,
144         FILEDATA_CHANGE_COPY,
145         FILEDATA_CHANGE_UNSPECIFIED,
146         FILEDATA_CHANGE_WRITE_METADATA
147 };
148
149 enum MarkToSelectionMode {
150         MTS_MODE_MINUS,
151         MTS_MODE_SET,
152         MTS_MODE_OR,
153         MTS_MODE_AND
154 };
155
156 enum SelectionToMarkMode {
157         STM_MODE_RESET,
158         STM_MODE_SET,
159         STM_MODE_TOGGLE
160 };
161
162 enum FileFormatClass {
163         FORMAT_CLASS_UNKNOWN,
164         FORMAT_CLASS_IMAGE,
165         FORMAT_CLASS_RAWIMAGE,
166         FORMAT_CLASS_META,
167         FORMAT_CLASS_VIDEO,
168         FORMAT_CLASS_COLLECTION,
169         FORMAT_CLASS_DOCUMENT,
170         FORMAT_CLASS_ARCHIVE,
171         FILE_FORMAT_CLASSES
172 };
173
174 extern const gchar *format_class_list[]; /**< defined in preferences.cc */
175
176 /**
177  * @enum SecureSaveErrno
178  * see err field in #SecureSaveInfo
179  */
180 enum SecureSaveErrno {
181         SS_ERR_NONE = 0,
182         SS_ERR_DISABLED, /**< secsave is disabled. */
183         SS_ERR_OUT_OF_MEM, /**< memory allocation failure */
184
185         SS_ERR_OPEN_READ,
186         SS_ERR_OPEN_WRITE,
187         SS_ERR_STAT,
188         SS_ERR_ACCESS,
189         SS_ERR_MKSTEMP,
190         SS_ERR_RENAME,
191         SS_ERR_OTHER,
192 };
193
194 enum NotifyPriority {
195         NOTIFY_PRIORITY_HIGH = 0,
196         NOTIFY_PRIORITY_MEDIUM,
197         NOTIFY_PRIORITY_LOW
198 };
199
200 enum NotifyType {
201         NOTIFY_MARKS            = 1 << 1, /**< changed marks */
202         NOTIFY_PIXBUF           = 1 << 2, /**< image was read into fd->pixbuf */
203         NOTIFY_HISTMAP          = 1 << 3, /**< histmap was read into fd->histmap */
204         NOTIFY_ORIENTATION      = 1 << 4, /**< image was rotated */
205         NOTIFY_METADATA         = 1 << 5, /**< changed image metadata, not yet written */
206         NOTIFY_GROUPING         = 1 << 6, /**< change in fd->sidecar_files or fd->parent */
207         NOTIFY_REREAD           = 1 << 7, /**< changed file size, date, etc., file name remains unchanged */
208         NOTIFY_CHANGE           = 1 << 8  /**< generic change described by fd->change */
209 };
210
211 enum ChangeError {
212         CHANGE_OK                      = 0,
213         CHANGE_WARN_DEST_EXISTS        = 1 << 0,
214         CHANGE_WARN_NO_WRITE_PERM      = 1 << 1,
215         CHANGE_WARN_SAME               = 1 << 2,
216         CHANGE_WARN_CHANGED_EXT        = 1 << 3,
217         CHANGE_WARN_UNSAVED_META       = 1 << 4,
218         CHANGE_WARN_NO_WRITE_PERM_DEST_DIR  = 1 << 5,
219         CHANGE_ERROR_MASK              = ~0xff, /**< the values below are fatal errors */
220         CHANGE_NO_READ_PERM            = 1 << 8,
221         CHANGE_NO_WRITE_PERM_DIR       = 1 << 9,
222         CHANGE_NO_DEST_DIR             = 1 << 10,
223         CHANGE_DUPLICATE_DEST          = 1 << 11,
224         CHANGE_NO_WRITE_PERM_DEST      = 1 << 12,
225         CHANGE_DEST_EXISTS             = 1 << 13,
226         CHANGE_NO_SRC                  = 1 << 14,
227         CHANGE_GENERIC_ERROR           = 1 << 16
228 };
229
230 enum MetadataFormat {
231         METADATA_PLAIN          = 0, /**< format that can be edited and written back */
232         METADATA_FORMATTED      = 1  /**< for display only */
233 };
234
235 enum StartUpPath {
236         STARTUP_PATH_CURRENT    = 0,
237         STARTUP_PATH_LAST,
238         STARTUP_PATH_HOME,
239 };
240
241 enum ToolbarType {
242         TOOLBAR_MAIN,
243         TOOLBAR_STATUS,
244         TOOLBAR_COUNT
245 };
246
247 enum PixbufRendererStereoMode {
248         PR_STEREO_NONE             = 0,   /**< do nothing */
249         PR_STEREO_DUAL             = 1 << 0, /**< independent stereo buffers, for example nvidia opengl */
250         PR_STEREO_FIXED            = 1 << 1,  /**< custom position */
251         PR_STEREO_HORIZ            = 1 << 2,  /**< side by side */
252         PR_STEREO_VERT             = 1 << 3,  /**< above below */
253         PR_STEREO_RIGHT            = 1 << 4,  /**< render right buffer */
254         PR_STEREO_ANAGLYPH_RC      = 1 << 5,  /**< anaglyph red-cyan */
255         PR_STEREO_ANAGLYPH_GM      = 1 << 6,  /**< anaglyph green-magenta */
256         PR_STEREO_ANAGLYPH_YB      = 1 << 7,  /**< anaglyph yellow-blue */
257         PR_STEREO_ANAGLYPH_GRAY_RC = 1 << 8,  /**< anaglyph gray red-cyan*/
258         PR_STEREO_ANAGLYPH_GRAY_GM = 1 << 9,  /**< anaglyph gray green-magenta */
259         PR_STEREO_ANAGLYPH_GRAY_YB = 1 << 10, /**< anaglyph gray yellow-blue */
260         PR_STEREO_ANAGLYPH_DB_RC   = 1 << 11, /**< anaglyph dubois red-cyan */
261         PR_STEREO_ANAGLYPH_DB_GM   = 1 << 12, /**< anaglyph dubois green-magenta */
262         PR_STEREO_ANAGLYPH_DB_YB   = 1 << 13, /**< anaglyph dubois yellow-blue */
263         PR_STEREO_ANAGLYPH         = PR_STEREO_ANAGLYPH_RC |
264                                      PR_STEREO_ANAGLYPH_GM |
265                                      PR_STEREO_ANAGLYPH_YB |
266                                      PR_STEREO_ANAGLYPH_GRAY_RC |
267                                      PR_STEREO_ANAGLYPH_GRAY_GM |
268                                      PR_STEREO_ANAGLYPH_GRAY_YB |
269                                      PR_STEREO_ANAGLYPH_DB_RC |
270                                      PR_STEREO_ANAGLYPH_DB_GM |
271                                      PR_STEREO_ANAGLYPH_DB_YB, /**< anaglyph mask */
272
273         PR_STEREO_MIRROR_LEFT      = 1 << 14, /**< mirror */
274         PR_STEREO_FLIP_LEFT        = 1 << 15, /**< flip */
275
276         PR_STEREO_MIRROR_RIGHT     = 1 << 16, /**< mirror */
277         PR_STEREO_FLIP_RIGHT       = 1 << 17, /**< flip */
278
279         PR_STEREO_MIRROR           = PR_STEREO_MIRROR_LEFT | PR_STEREO_MIRROR_RIGHT, /**< mirror mask*/
280         PR_STEREO_FLIP             = PR_STEREO_FLIP_LEFT | PR_STEREO_FLIP_RIGHT, /**< flip mask*/
281         PR_STEREO_SWAP             = 1 << 18,  /**< swap left and right buffers */
282         PR_STEREO_TEMP_DISABLE     = 1 << 19,  /**< temporarily disable stereo mode if source image is not stereo */
283         PR_STEREO_HALF             = 1 << 20
284 };
285
286 enum StereoPixbufData {
287         STEREO_PIXBUF_DEFAULT  = 0,
288         STEREO_PIXBUF_SBS      = 1,
289         STEREO_PIXBUF_CROSS    = 2,
290         STEREO_PIXBUF_NONE     = 3
291 };
292
293 enum SortModeType {
294         BAR_SORT_MODE_FOLDER = 0,
295         BAR_SORT_MODE_COLLECTION,
296         BAR_SORT_MODE_COUNT
297 };
298
299 enum SortActionType {
300         BAR_SORT_COPY = 0,
301         BAR_SORT_MOVE,
302         BAR_SORT_FILTER,
303         BAR_SORT_ACTION_COUNT
304 };
305
306 enum SortSelectionType {
307         BAR_SORT_SELECTION_IMAGE = 0,
308         BAR_SORT_SELECTION_SELECTED,
309         BAR_SORT_SELECTION_COUNT
310 };
311
312 #define MAX_SPLIT_IMAGES 4
313
314 enum SelectionType {
315         SELECTION_NONE          = 0,
316         SELECTION_SELECTED      = 1 << 0,
317         SELECTION_PRELIGHT      = 1 << 1,
318         SELECTION_FOCUS         = 1 << 2
319 };
320
321 struct ImageLoader;
322 struct ThumbLoader;
323
324 struct AnimationData;
325
326 struct CollectInfo;
327 struct CollectionData;
328 struct CollectTable;
329 struct CollectWindow;
330
331 struct ImageWindow;
332
333 struct FileData;
334 struct FileDataChangeInfo;
335
336 struct LayoutWindow;
337 struct LayoutOptions;
338
339 struct ViewDir;
340 struct ViewDirInfoList;
341 struct ViewDirInfoTree;
342
343 struct ViewFile;
344 struct ViewFileInfoList;
345 struct ViewFileInfoIcon;
346
347 struct SlideShowData;
348 struct FullScreenData;
349
350 struct PixmapFolders;
351 struct Histogram;
352 struct HistMap;
353
354 struct SecureSaveInfo;
355
356 struct ExifData;
357
358 struct EditorDescription;
359
360 struct CommandLine;
361
362 struct Histogram {
363         gint histogram_channel; /**< drawing mode for histogram */
364         gint histogram_mode;     /**< logarithmical or not */
365         guint vgrid; /**< number of vertical divisions, 0 for none */
366         guint hgrid; /**< number of horizontal divisions, 0 for none */
367         struct {
368                 int R; /**< red */
369                 int G; /**< green */
370                 int B; /**< blue */
371                 int A; /**< alpha */
372         } grid_color;  /**< grid color */
373
374 };
375
376
377
378 struct ImageLoader;
379
380 using ThumbLoaderFunc = void (*)(ThumbLoader *, gpointer);
381
382 using FileUtilDoneFunc = void (*)(gboolean, const gchar *, gpointer);
383
384 struct ThumbLoader
385 {
386         gboolean standard_loader;
387
388         ImageLoader *il;
389         FileData *fd;           /**< fd->pixbuf contains final (scaled) image when done */
390
391         gboolean cache_enable;
392         gboolean cache_hit;
393         gdouble percent_done;
394
395         gint max_w;
396         gint max_h;
397
398         ThumbLoaderFunc func_done;
399         ThumbLoaderFunc func_error;
400         ThumbLoaderFunc func_progress;
401
402         gpointer data;
403
404         guint idle_done_id; /**< event source id */
405 };
406
407 struct AnimationData
408 {
409         ImageWindow *iw;
410         LayoutWindow *lw;
411         GdkPixbufAnimation *gpa;
412         GdkPixbufAnimationIter *iter;
413         GdkPixbuf *gpb;
414         FileData *data_adr;
415         gint delay;
416         gboolean valid;
417         GCancellable *cancellable;
418         GFile *in_file;
419         GFileInputStream *gfstream;
420 };
421
422 struct CollectInfo
423 {
424         FileData *fd;
425         GdkPixbuf *pixbuf;
426         guint flag_mask;
427 };
428
429 struct CollectionData
430 {
431         gchar *path;
432         gchar *name;
433         GList *list;
434         SortType sort_method;
435
436         ThumbLoader *thumb_loader;
437         CollectInfo *thumb_info;
438
439         void (*info_updated_func)(CollectionData *, CollectInfo *, gpointer);
440         gpointer info_updated_data;
441
442         gint ref;
443
444         /* geometry */
445         gint window_read;
446         gint window_x;
447         gint window_y;
448         gint window_w;
449         gint window_h;
450
451         gboolean changed; /**< contents changed since save flag */
452
453         GHashTable *existence;
454 };
455
456 struct CollectTable
457 {
458         GtkWidget *scrolled;
459         GtkWidget *listview;
460         gint columns;
461         gint rows;
462
463         CollectionData *cd;
464
465         GList *selection;
466         CollectInfo *prev_selection;
467
468         CollectInfo *click_info;
469
470         GtkWidget *tip_window;
471         guint tip_delay_id; /**< event source id */
472         CollectInfo *tip_info;
473
474         GdkWindow *marker_window;
475         CollectInfo *marker_info;
476
477         GtkWidget *status_label;
478         GtkWidget *extra_label;
479
480         gint focus_row;
481         gint focus_column;
482         CollectInfo *focus_info;
483
484         GtkWidget *popup;
485         CollectInfo *drop_info;
486         GList *drop_list;
487
488         guint sync_idle_id; /**< event source id */
489         guint drop_idle_id; /**< event source id */
490
491         gboolean show_text;
492         gboolean show_stars;
493
494         GList *editmenu_fd_list; /**< file list for edit menu */
495 };
496
497 struct CollectWindow
498 {
499         GtkWidget *window;
500         CollectTable *table;
501         GtkWidget *status_box;
502
503         GtkWidget *close_dialog;
504
505         CollectionData *cd;
506 };
507
508 using ImageTileRequestFunc = gint (*)(ImageWindow *, gint, gint, gint, gint, GdkPixbuf *, gpointer);
509 using ImageTileDisposeFunc = void (*)(ImageWindow *, gint, gint, gint, gint, GdkPixbuf *, gpointer);
510
511 struct ImageWindow
512 {
513         GtkWidget *widget;      /**< use this to add it and show it */
514         GtkWidget *pr;
515         GtkWidget *frame;
516
517         FileData *image_fd;
518
519         gboolean unknown;               /**< failed to load image */
520
521         ImageLoader *il;        /**< @FIXME image loader should probably go to FileData, but it must first support
522                                    sending callbacks to multiple ImageWindows in parallel */
523
524         gint has_frame;  /**< not boolean, see image_new() */
525
526         /* top level (not necessarily parent) window */
527         gboolean top_window_sync;       /**< resize top_window when image dimensions change */
528         GtkWidget *top_window;  /**< window that gets title, and window to resize when 'fitting' */
529         gchar *title;           /**< window title to display left of file name */
530         gchar *title_right;     /**< window title to display right of file name */
531         gboolean title_show_zoom;       /**< option to include zoom in window title */
532
533         gboolean completed;
534         ImageState state;       /**< mask of IMAGE_STATE_* flags about current image */
535
536         void (*func_update)(ImageWindow *imd, gpointer data);
537         void (*func_complete)(ImageWindow *imd, gint preload, gpointer data);
538         void (*func_state)(ImageWindow *imd, ImageState state, gpointer data);
539         ImageTileRequestFunc func_tile_request;
540         ImageTileDisposeFunc func_tile_dispose;
541
542         gpointer data_update;
543         gpointer data_complete;
544         gpointer data_state;
545         gpointer data_tile;
546
547         /* button, scroll functions */
548         void (*func_button)(ImageWindow *, GdkEventButton *event, gpointer);
549         void (*func_drag)(ImageWindow *, GdkEventMotion *event, gdouble dx, gdouble dy, gpointer);
550         void (*func_scroll)(ImageWindow *, GdkEventScroll *event, gpointer);
551         void (*func_focus_in)(ImageWindow *, gpointer);
552
553         gpointer data_button;
554         gpointer data_drag;
555         gpointer data_scroll;
556         gpointer data_focus_in;
557
558         /**
559          * @headerfile func_scroll_notify
560          * scroll notification (for scroll bar implementation)
561          */
562         void (*func_scroll_notify)(ImageWindow *, gint x, gint y, gint width, gint height, gpointer);
563
564         gpointer data_scroll_notify;
565
566         /* collection info */
567         CollectionData *collection;
568         CollectInfo *collection_info;
569
570         /* color profiles */
571         gboolean color_profile_enable;
572         gint color_profile_input;
573         gboolean color_profile_use_image;
574         gint color_profile_from_image;
575         gpointer cm;
576
577         AlterType delay_alter_type;
578
579         FileData *read_ahead_fd;
580         ImageLoader *read_ahead_il;
581
582         gint prev_color_row;
583
584         gboolean auto_refresh;
585
586         gboolean delay_flip;
587         gint orientation;
588         gboolean desaturate;
589         gboolean overunderexposed;
590         gint user_stereo;
591
592         gboolean mouse_wheel_mode;
593 };
594
595 #define FILEDATA_MARKS_SIZE 10
596
597 struct FileDataChangeInfo {
598         FileDataChangeType type;
599         gchar *source;
600         gchar *dest;
601         gint error;
602         gboolean regroup_when_finished;
603 };
604
605 struct FileData {
606         guint magick;
607         gint type;
608         gchar *original_path; /**< key to file_data_pool hash table */
609         gchar *path;
610         const gchar *name;
611         const gchar *extension;
612         gchar *extended_extension;
613         FileFormatClass format_class;
614         gchar *format_name; /**< set by the image loader */
615         gchar *collate_key_name;
616         gchar *collate_key_name_nocase;
617         gchar *collate_key_name_natural;
618         gchar *collate_key_name_nocase_natural;
619         gint64 size;
620         time_t date;
621         time_t cdate;
622         mode_t mode; /**< this is needed at least for notification in view_dir because it is preserved after the file/directory is deleted */
623         gint sidecar_priority;
624
625         guint marks; /**< each bit represents one mark */
626         guint valid_marks; /**< zero bit means that the corresponding mark needs to be reread */
627
628
629         GList *sidecar_files;
630         FileData *parent; /**< parent file if this is a sidecar file, NULL otherwise */
631         FileDataChangeInfo *change; /**< for rename, move ... */
632         GdkPixbuf *thumb_pixbuf;
633
634         GdkPixbuf *pixbuf; /**< full-size image, only complete images, NULL during loading
635                               all FileData with non-NULL pixbuf are referenced by image_cache */
636
637         HistMap *histmap;
638
639         gboolean locked;
640         gint ref;
641         gint version; /**< increased when any field in this structure is changed */
642         gboolean disable_grouping;
643
644         gint user_orientation;
645         gint exif_orientation;
646
647         ExifData *exif;
648         time_t exifdate;
649         time_t exifdate_digitized;
650         GHashTable *modified_xmp; /**< hash table which contains unwritten xmp metadata in format: key->list of string values */
651         GList *cached_metadata;
652         gint rating;
653         gboolean metadata_in_idle_loaded;
654
655         gchar *owner;
656         gchar *group;
657         gchar *sym_link;
658
659         SelectionType selected;  /**< Used by view-file-icon. */
660
661         gint page_num;
662         gint page_total;
663 };
664
665 struct LayoutOptions
666 {
667         gchar *id;
668
669         gchar *order;
670         gint style;
671
672         DirViewType dir_view_type;
673         FileViewType file_view_type;
674
675         struct {
676                 SortType method;
677                 gboolean ascend;
678                 gboolean case_sensitive;
679         } dir_view_list_sort;
680
681         struct {
682                 SortType method;
683                 gboolean ascend;
684                 gboolean case_sensitive;
685         } file_view_list_sort;
686
687         gboolean show_thumbnails;
688         gboolean show_marks;
689         gboolean show_file_filter;
690         gboolean show_directory_date;
691         gboolean show_info_pixel;
692         gboolean split_pane_sync;
693         gboolean ignore_alpha;
694
695         struct {
696                 gint w;
697                 gint h;
698                 gint x;
699                 gint y;
700                 gboolean maximized;
701                 gint hdivider_pos;
702                 gint vdivider_pos;
703         } main_window;
704
705         struct {
706                 gint w;
707                 gint h;
708                 gint x;
709                 gint y;
710                 gint vdivider_pos;
711         } float_window;
712
713         struct {
714                 gint vdivider_pos;
715         } folder_window;
716
717         struct {
718                 gint w;
719                 gint h;
720         } properties_window;
721
722         struct {
723                 guint state;
724                 gint histogram_channel;
725                 gint histogram_mode;
726         } image_overlay;
727
728         struct {
729                 gint w;
730                 gint h;
731                 gint x;
732                 gint y;
733         } log_window;
734
735         struct {
736                 gint w;
737                 gint h;
738                 gint x;
739                 gint y;
740                 gint page_number;
741         } preferences_window;
742
743         struct {
744                 gint w;
745                 gint h;
746                 gint x;
747                 gint y;
748         } search_window;
749
750         struct {
751                 gint w;
752                 gint h;
753                 gint x;
754                 gint y;
755         } dupe_window;
756
757         struct {
758                 gint w;
759                 gint h;
760                 gint x;
761                 gint y;
762         } advanced_exif_window;
763
764         gboolean tools_float;
765         gboolean tools_hidden;
766         gboolean toolbar_hidden;
767
768         struct {
769                 gboolean info;
770                 gboolean sort;
771                 gboolean tools_float;
772                 gboolean tools_hidden;
773                 gboolean hidden;
774         } bars_state;
775
776         gchar *home_path;
777         gchar *last_path;
778
779         StartUpPath startup_path;
780
781         gboolean animate;
782         gint workspace;
783
784         SortActionType action;
785         SortModeType mode;
786         SortSelectionType selection;
787         gchar *filter_key;
788 };
789
790 struct LayoutWindow
791 {
792         LayoutOptions options;
793
794         FileData *dir_fd;
795
796         /* base */
797
798         GtkWidget *window;
799
800         GtkWidget *main_box;
801
802         GtkWidget *group_box;
803         GtkWidget *h_pane;
804         GtkWidget *v_pane;
805
806         /* menus, path selector */
807
808         GtkActionGroup *action_group;
809         GtkActionGroup *action_group_editors;
810         guint ui_editors_id;
811         GtkUIManager *ui_manager;
812         guint toolbar_merge_id[TOOLBAR_COUNT];
813         GList *toolbar_actions[TOOLBAR_COUNT];
814
815         GtkWidget *path_entry;
816
817         /* image */
818
819         LayoutLocation image_location;
820
821         ImageWindow *image;
822
823         ImageWindow *split_images[MAX_SPLIT_IMAGES];
824         ImageSplitMode split_mode;
825         gint active_split_image;
826
827         GtkWidget *split_image_widget;
828         GtkSizeGroup *split_image_sizegroup;
829
830         /* tools window (float) */
831
832         GtkWidget *tools;
833         GtkWidget *tools_pane;
834
835         GtkWidget *menu_tool_bar; /**< Combined menu and toolbar box */
836         GtkWidget *menu_bar; /**< referenced by lw, exist during whole lw lifetime */
837         /* toolbar */
838
839         GtkWidget *toolbar[TOOLBAR_COUNT]; /**< referenced by lw, exist during whole lw lifetime */
840
841         GtkWidget *back_button;
842
843         /* dir view */
844
845         LayoutLocation dir_location;
846
847         ViewDir *vd;
848         GtkWidget *dir_view;
849
850         /* file view */
851
852         LayoutLocation file_location;
853
854         ViewFile *vf;
855
856         GtkWidget *file_view;
857
858         GtkWidget *info_box; /**< status bar */
859         GtkWidget *info_progress_bar; /**< status bar */
860         GtkWidget *info_sort; /**< status bar */
861         GtkWidget *info_status; /**< status bar */
862         GtkWidget *info_details; /**< status bar */
863         GtkWidget *info_zoom; /**< status bar */
864         GtkWidget *info_pixel; /**< status bar */
865
866         /* slide show */
867
868         SlideShowData *slideshow;
869
870         /* full screen */
871
872         FullScreenData *full_screen;
873
874         /* misc */
875
876         GtkWidget *utility_box; /**< referenced by lw, exist during whole lw lifetime */
877         GtkWidget *utility_paned; /**< between image and bar */
878         GtkWidget *bar_sort;
879         GtkWidget *bar;
880
881         gboolean bar_sort_enabled; /**< Set during start-up, and checked when the editors have loaded */
882
883         GtkWidget *exif_window;
884         GtkWidget *sar_window; /**< Search and Run window */
885
886         AnimationData *animation;
887
888         GtkWidget *log_window;
889 };
890
891 struct ViewDir
892 {
893         DirViewType type;
894         gpointer info;
895
896         GtkWidget *widget;
897         GtkWidget *view;
898
899         FileData *dir_fd;
900
901         FileData *click_fd;
902
903         FileData *drop_fd;
904         GList *drop_list;
905         guint drop_scroll_id; /**< event source id */
906
907         /* func list */
908         void (*select_func)(ViewDir *vd, FileData *fd, gpointer data);
909         gpointer select_data;
910
911         void (*dnd_drop_update_func)(ViewDir *vd);
912         void (*dnd_drop_leave_func)(ViewDir *vd);
913
914         LayoutWindow *layout;
915
916         GtkWidget *popup;
917
918         PixmapFolders *pf;
919 };
920
921 struct ViewDirInfoList
922 {
923         GList *list;
924 };
925
926 struct ViewDirInfoTree
927 {
928         guint drop_expand_id; /**< event source id */
929         gint busy_ref;
930 };
931
932
933 struct ViewFile
934 {
935         FileViewType type;      /**< @todo (xsdg): Turn this into a union (see VFLIST and VFICON from view-file.h). */
936
937         gpointer info;
938
939         GtkWidget *widget;
940         GtkWidget *listview;
941         GtkWidget *scrolled;
942         GtkWidget *filter;
943         GtkWidget *filter_check[FILEDATA_MARKS_SIZE];
944
945         struct {
946                 GtkWidget *combo;
947                 GtkWidget *frame;
948                 gint count;
949                 gint last_selected;
950                 gboolean case_sensitive;
951         } file_filter;
952
953         FileData *dir_fd;
954         GList *list;
955
956         SortType sort_method;
957         gboolean sort_ascend;
958         gboolean sort_case;
959
960         /* func list */
961         void (*func_thumb_status)(ViewFile *vf, gdouble val, const gchar *text, gpointer data);
962         gpointer data_thumb_status;
963
964         void (*func_status)(ViewFile *vf, gpointer data);
965         gpointer data_status;
966
967         LayoutWindow *layout;
968
969         GtkWidget *popup;
970
971         /* thumbs updates*/
972         gboolean thumbs_running;
973         ThumbLoader *thumbs_loader;
974         FileData *thumbs_filedata;
975
976         /* marks */
977         gboolean marks_enabled;
978         gint active_mark;
979         gint clicked_mark;
980
981         /* stars */
982         FileData *stars_filedata;
983         guint stars_id;
984
985         /* refresh */
986         guint refresh_idle_id; /**< event source id */
987         time_t time_refresh_set; /**< time when refresh_idle_id was set */
988
989         GList *editmenu_fd_list; /**< file list for edit menu */
990
991         guint read_metadata_in_idle_id;
992 };
993
994 struct ViewFileInfoList
995 {
996         FileData *click_fd;
997         FileData *select_fd;
998
999         gboolean thumbs_enabled;
1000
1001         guint select_idle_id; /**< event source id */
1002 };
1003
1004 struct ViewFileInfoIcon
1005 {
1006         /* table stuff */
1007         gint columns;
1008         gint rows;
1009
1010         GList *selection;
1011         FileData *prev_selection;
1012
1013         GtkWidget *tip_window;
1014         guint tip_delay_id; /**< event source id */
1015         FileData *tip_fd;
1016
1017         FileData *click_fd;
1018
1019         FileData *focus_fd;
1020         gint focus_row;
1021         gint focus_column;
1022
1023         gboolean show_text;
1024 };
1025
1026 struct SlideShowData
1027 {
1028         LayoutWindow *lw;        /**< use this window to display the slideshow */
1029         ImageWindow *imd;        /**< use this window only if lw is not available,
1030                                     @FIXME it is probably required only by img-view.cc and should be dropped with it */
1031
1032         GList *filelist;
1033         CollectionData *cd;
1034         FileData *dir_fd;
1035
1036         GList *list;
1037         GList *list_done;
1038
1039         FileData *slide_fd;
1040
1041         guint slide_count;
1042         guint timeout_id; /**< event source id */
1043
1044         gboolean from_selection;
1045
1046         void (*stop_func)(SlideShowData *, gpointer);
1047         gpointer stop_data;
1048
1049         gboolean paused;
1050 };
1051
1052 struct FullScreenData
1053 {
1054         GtkWidget *window;
1055         ImageWindow *imd;
1056
1057         GtkWidget *normal_window;
1058         ImageWindow *normal_imd;
1059
1060         guint hide_mouse_id; /**< event source id */
1061         guint busy_mouse_id; /**< event source id */
1062
1063         gint cursor_state;
1064
1065         guint saver_block_id; /**< event source id */
1066
1067         void (*stop_func)(FullScreenData *, gpointer);
1068         gpointer stop_data;
1069
1070         gboolean same_region; /**< the returned region will overlap the current location of widget. */
1071 };
1072
1073 struct PixmapFolders
1074 {
1075         GdkPixbuf *close;
1076         GdkPixbuf *open;
1077         GdkPixbuf *deny;
1078         GdkPixbuf *parent;
1079         GdkPixbuf *link;
1080         GdkPixbuf *read_only;
1081 };
1082
1083 struct SecureSaveInfo {
1084         FILE *fp; /**< file stream pointer */
1085         gchar *file_name; /**< final file name */
1086         gchar *tmp_file_name; /**< temporary file name */
1087         gint err; /**< set to non-zero value in case of error */
1088         gboolean secure_save; /**< use secure save for this file, internal use only */
1089         gboolean preserve_perms; /**< whether to preserve perms, TRUE by default */
1090         gboolean preserve_mtime; /**< whether to preserve mtime, FALSE by default */
1091         gboolean unlink_on_error; /**< whether to remove temporary file on save failure, TRUE by default */
1092 };
1093
1094 struct CommandLine
1095 {
1096         int argc;
1097         gchar **argv;
1098         gboolean startup_blank;
1099         gboolean startup_full_screen;
1100         gboolean startup_in_slideshow;
1101         gboolean startup_command_line_collection;
1102         gboolean tools_hide;
1103         gboolean tools_show;
1104         gboolean log_window_show;
1105         gchar *path;
1106         gchar *file;
1107         GList *cmd_list;
1108         GList *collection_list;
1109         gchar *geometry;
1110         gchar *regexp;
1111         gchar *log_file;
1112         SecureSaveInfo *ssi;
1113         gboolean new_instance;
1114 };
1115
1116 /**
1117  * @struct hard_coded_window_keys
1118  * @brief hard coded window shortcut keys
1119  *
1120  * Used for two purposes:\n
1121  * to display the shortcuts keys in popup menus\n
1122  * used by ./doc/create-shortcuts-xml.sh to generate shortcut documentation in the Help files
1123  *
1124  */
1125 struct hard_coded_window_keys {
1126         GdkModifierType mask; /**< modifier key mask */
1127         guint key_value;  /**< GDK_keyval */
1128         const gchar *text;  /**< menu item label - NULL if end of list */
1129 };
1130
1131 #endif
1132 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */