2 * Copyright (C) 2006 John Ellis
3 * Copyright (C) 2008 - 2022 The Geeqie Team
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.
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.
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.
24 * @brief Diagrams to be included in the Doxygen output
26 * The contents are diagrams to be included in the Doxygen output.
30 * @page diagrams Diagrams
31 * @section metadata_write Metadata write sequence
35 * group metadata write sequence
38 * : write to file/sidecar = FALSE;
39 * if (//Preferences / Metadata//\n **Step 1:**\n Save in image file or sidecar file) then (yes)
40 * if (extension in //File Filters / File Types / Writable// list) then (yes)
41 * if (image file writable) then (yes)
42 * : write to file/sidecar = TRUE;
43 * : metadata_file = <image file>;
48 * if (extension in //File Filters / File Types / Sidecar Is Allowed// list) then (yes)
49 * if (sidecar file or folder writable) then (yes)
50 * : write to file/sidecar = TRUE;
51 * : metadata_file = <sidecar file>;
61 * if (write to file/sidecar) then (yes)
63 * group If a metadata file already exists, use it
65 * group Look in user defined option
66 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image folder) then (yes)
67 * : metadata_file = \n<file_dir>/.metadata/<filename>.gq.xmp;
69 * if (XDG_DATA_HOME defined) then (yes)
70 * : metadata_file = \nXDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
72 * : metadata_file = \nHOME/.local/share/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
77 * if (metadata_file exists) then (yes)
79 * group Ignore user defined option and try alternate
80 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image) then (no)
81 * : metadata_file = \n <file_dir>/.metadata/<filename>.gq.xmp;
83 * if (XDG_DATA_HOME defined) then (yes)
84 * : metadata_file = \n XDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
86 * : metadata_file = \n HOME/.local/share/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
92 * if (metadata_file exists) then (yes)
94 * group Try GQview legacy format
95 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image folder) then (yes)
96 * : metadata_file = \n<file_dir>/.metadata/<filename>.meta;
98 * if (XDG_DATA_HOME defined) then (yes)
99 * : metadata_file = \nXDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.meta;
101 * : metadata_file = \nHOME/.local/share/geeqie/metadata/<file_path>/<file_name>.meta;
106 * if (metadata_file exists) then (yes)
108 * group Ignore user defined option and try alternate
109 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image) then (no)
110 * : metadata_file = \n <file_dir>/.metadata/<filename>.meta;
112 * if (XDG_DATA_HOME defined) then (yes)
113 * : metadata_file = \n XDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.meta;
115 * : metadata_file = \n HOME/.local/share/geeqie/metadata/<file_path>/<file_name>.meta;
123 * if (metadata_file exists) then (yes)
125 * group If no metadata file exists, use user defined option
126 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image folder) then (yes)
127 * : metadata_file = \n<file_dir>/.metadata/<filename>.gq.xmp;
129 * if (XDG_DATA_HOME defined) then (yes)
130 * : metadata_file = \nXDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
132 * : metadata_file = \nHOME/.local/share/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
138 * if (metadata_file writable) then (yes)
140 * if (XDG_DATA_HOME defined) then (yes)
141 * : metadata_file = \nXDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
143 * : metadata_file = \nHOME/.local/share/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
145 * : Recursively create metadata_file_path\n if necessary;
155 * @ref metadata_write "Metadata write sequence"
160 * @page diagrams Diagrams
161 * @section options_overview Options Overview
163 * #_ConfOptions #_LayoutOptions
170 * options.h : ConfOptions
172 * options.h : Options applicable to **all** Layout Windows
173 * options.h : These are in the <global> section of geeqierc.xml
174 * options.h : Available to all modules via the global variable **options**
175 * typedefs.h : LayoutOptions
177 * typedefs.h : Options applicable to **each** Layout Window
178 * typedefs.h : These are in the <layout> section of geeqierc.xml
179 * typedefs.h : There is one <layout> section for each Layout Window displayed
180 * typedefs.h : Available via **<layout_window>->options**
186 * @page diagrams Diagrams
187 * @section options_diagrams_main Options - New Window From Main
190 * #layout_new_from_default
191 * #load_config_from_file
193 * #setup_default_options
199 * : **init_options()**
201 * Set **options** = ConfOptions from hard-coded init values;
205 * : **setup_default_options()**
207 * set hard-coded ConfOptions:
215 * OSD template string
217 * shell path and options
219 * help search engine;
224 * --new-instance) then (yes)
226 * : **load_options()**
230 * : GQ_SYSTEM_WIDE_DIR
237 * /.geeqie/geeqierc.xml;
241 * : **load_config_from_file()**
243 * set **options** from file
244 * and all <layout window>->options in file;
249 * if (broken config. file
251 * or no layout section loaded
252 * (i.e. session not saved)) then (yes)
254 * : **layout_new_from_default()**;
255 * if (default.xml exists) then (yes)
257 * layout_window default options
258 * from default.xml file;
261 * layout_window default options;
267 * : Send --new-window request to remote
268 * No return to this point
269 * This instance terminates;
273 * : Enter gtk main loop;
280 * @page diagrams Diagrams
281 * @section options_diagrams_remote Options - New Window From Remote
282 * #layout_new_from_default
288 * : **layout_new_from_default()**;
289 * if (default.xml exists) then (yes)
291 * layout_window default options
292 * from default.xml file;
295 * layout_window default options;
298 * : set path from PWD;
303 * @page diagrams Diagrams
304 * @section options_diagrams_menu Options - New Window From Menu
305 * #layout_menu_new_window_cb
306 * #layout_menu_window_from_current_cb
307 * #layout_new_from_default
310 * group layout_util.c
316 * : **layout_new_from_default()**;
317 * if (default.xml exists) then (yes)
319 * layout_window default options
320 * from default.xml file;
323 * layout_window default options;
330 * **layout_menu_window_from_current_cb()**
331 * copy layout_window options
332 * from current window;
337 * **layout_menu_new_window_cb()**
338 * load layout_window options
339 * from saved xml file list;
347 * @ref options_overview "Options Overview"
351 * @page diagrams Diagrams
352 * @section image_load_overview Image Load Overview
354 * object image_change
355 * object image_change_complete
356 * object image_load_begin
357 * object image_loader_start
358 * object image_loader_start_thread
359 * object image_loader_setup_source
360 * object image_loader_thread_run
361 * object image_loader_begin
362 * object image_loader_setuploader
363 * circle "il->memory_mapped"
364 * object exif_get_preview_
365 * object exif_get_preview
366 * object libraw_get_preview
368 * image_change : image.c
369 * image_change_complete : image.c
370 * image_load_begin : image.c
371 * image_loader_start : image_load.c
372 * image_loader_start_thread : image_load.c
373 * image_loader_thread_run : image_load.c
374 * image_loader_begin : image_load.c
375 * image_loader_setuploader : image_load.c
376 * image_loader_setuploader : -
377 * image_loader_setuploader : Select backend using magic
378 * image_loader_setup_source : image_load.c
379 * exif_get_preview : exiv2.cc
380 * exif_get_preview : EXIV2_TEST_VERSION(0,17,90)
381 * exif_get_preview_ : exif.c
382 * exif_get_preview_ : -
383 * exif_get_preview_ : If exiv2 not installed
384 * libraw_get_preview : image_load_libraw.c
386 * image_change --> image_change_complete
387 * image_change_complete --> image_load_begin
388 * image_load_begin --> image_loader_start
389 * image_loader_start --> image_loader_start_thread
390 * image_loader_start_thread --> image_loader_thread_run
391 * image_loader_start_thread --> image_loader_setup_source
392 * image_loader_setup_source --> exif_get_preview_
393 * image_loader_setup_source --> exif_get_preview
394 * image_loader_setup_source --> libraw_get_preview : Try libraw if exiv2 fails
395 * exif_get_preview_ ..> "il->memory_mapped"
396 * exif_get_preview ..> "il->memory_mapped"
397 * libraw_get_preview ..> "il->memory_mapped"
398 * image_loader_thread_run --> image_loader_begin
399 * image_loader_begin --> image_loader_setuploader
400 * "il->memory_mapped" ..> image_loader_setuploader
401 * note left of "il->memory_mapped" : Points to first byte of embedded jpeg (#FFD8)\n if preview found, otherwise to first byte of file
406 * @ref image_load_overview "Image Load Overview"
410 * @page diagrams Diagrams
411 * @section duplicates_data_layout Duplicates Data Layout
413 * #_DupeWindow #_DupeItem #_DupeMatch
417 * database DupeWindow [
418 * <b>DupeWindow->list</b>
431 * One entry for each file
432 * dropped onto the dupes window
454 * group_rank: (sum of all child ranks) / n
458 * <b>group (list)</b>
472 * One entry for each file
485 * DupeWindow -r-> DupeItem
486 * group -r-> DupeMatch