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.
27 * The .c file extension is so that Doxygen will process it.
31 * @page diagrams Diagrams
32 * @section metadata_write Metadata write sequence
36 * group metadata write sequence
39 * : write to file/sidecar = FALSE;
40 * if (//Preferences / Metadata//\n **Step 1:**\n Save in image file or sidecar file) then (yes)
41 * if (extension in //File Filters / File Types / Writable// list) then (yes)
42 * if (image file writable) then (yes)
43 * : write to file/sidecar = TRUE;
44 * : metadata_file = <image file>;
49 * if (extension in //File Filters / File Types / Sidecar Is Allowed// list) then (yes)
50 * if (sidecar file or folder writable) then (yes)
51 * : write to file/sidecar = TRUE;
52 * : metadata_file = <sidecar file>;
62 * if (write to file/sidecar) then (yes)
64 * group If a metadata file already exists, use it
66 * group Look in user defined option
67 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image folder) then (yes)
68 * : metadata_file = \n<file_dir>/.metadata/<filename>.gq.xmp;
70 * if (XDG_DATA_HOME defined) then (yes)
71 * : metadata_file = \nXDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
73 * : metadata_file = \nHOME/.local/share/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
78 * if (metadata_file exists) then (yes)
80 * group Ignore user defined option and try alternate
81 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image) then (no)
82 * : metadata_file = \n <file_dir>/.metadata/<filename>.gq.xmp;
84 * if (XDG_DATA_HOME defined) then (yes)
85 * : metadata_file = \n XDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
87 * : metadata_file = \n HOME/.local/share/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
93 * if (metadata_file exists) then (yes)
95 * group Try GQview legacy format
96 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image folder) then (yes)
97 * : metadata_file = \n<file_dir>/.metadata/<filename>.meta;
99 * if (XDG_DATA_HOME defined) then (yes)
100 * : metadata_file = \nXDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.meta;
102 * : metadata_file = \nHOME/.local/share/geeqie/metadata/<file_path>/<file_name>.meta;
107 * if (metadata_file exists) then (yes)
109 * group Ignore user defined option and try alternate
110 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image) then (no)
111 * : metadata_file = \n <file_dir>/.metadata/<filename>.meta;
113 * if (XDG_DATA_HOME defined) then (yes)
114 * : metadata_file = \n XDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.meta;
116 * : metadata_file = \n HOME/.local/share/geeqie/metadata/<file_path>/<file_name>.meta;
124 * if (metadata_file exists) then (yes)
126 * group If no metadata file exists, use user defined option
127 * if (//Preferences / Metadata//\n **Step 2:**\n Save in sub-folder local to image folder) then (yes)
128 * : metadata_file = \n<file_dir>/.metadata/<filename>.gq.xmp;
130 * if (XDG_DATA_HOME defined) then (yes)
131 * : metadata_file = \nXDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
133 * : metadata_file = \nHOME/.local/share/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
139 * if (metadata_file writable) then (yes)
141 * if (XDG_DATA_HOME defined) then (yes)
142 * : metadata_file = \nXDG_DATA_HOME/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
144 * : metadata_file = \nHOME/.local/share/geeqie/metadata/<file_path>/<file_name>.gq.xmp;
146 * : Recursively create metadata_file_path\n if necessary;
156 * @ref metadata_write "Metadata write sequence"
161 * @page diagrams Diagrams
162 * @section options_overview Options Overview
164 * #_ConfOptions #_LayoutOptions
171 * options.h : ConfOptions
173 * options.h : Options applicable to **all** Layout Windows
174 * options.h : These are in the <global> section of geeqierc.xml
175 * options.h : Available to all modules via the global variable **options**
176 * typedefs.h : LayoutOptions
178 * typedefs.h : Options applicable to **each** Layout Window
179 * typedefs.h : These are in the <layout> section of geeqierc.xml
180 * typedefs.h : There is one <layout> section for each Layout Window displayed
181 * typedefs.h : Available via **<layout_window>->options**
187 * @page diagrams Diagrams
188 * @section options_diagrams_main Options - New Window From Main
191 * #layout_new_from_default
192 * #load_config_from_file
194 * #setup_default_options
200 * : **init_options()**
202 * Set **options** = ConfOptions from hard-coded init values;
206 * : **setup_default_options()**
208 * set hard-coded ConfOptions:
216 * OSD template string
218 * shell path and options
220 * help search engine;
225 * --new-instance) then (yes)
227 * : **load_options()**
231 * : GQ_SYSTEM_WIDE_DIR
238 * /.geeqie/geeqierc.xml;
242 * : **load_config_from_file()**
244 * set **options** from file
245 * and all <layout window>->options in file;
250 * if (broken config. file
252 * or no layout section loaded
253 * (i.e. session not saved)) then (yes)
255 * : **layout_new_from_default()**;
256 * if (default.xml exists) then (yes)
258 * layout_window default options
259 * from default.xml file;
262 * layout_window default options;
268 * : Send --new-window request to remote
269 * No return to this point
270 * This instance terminates;
274 * : Enter gtk main loop;
281 * @page diagrams Diagrams
282 * @section options_diagrams_remote Options - New Window From Remote
283 * #layout_new_from_default
289 * : **layout_new_from_default()**;
290 * if (default.xml exists) then (yes)
292 * layout_window default options
293 * from default.xml file;
296 * layout_window default options;
299 * : set path from PWD;
304 * @page diagrams Diagrams
305 * @section options_diagrams_menu Options - New Window From Menu
306 * #layout_menu_new_window_cb
307 * #layout_menu_window_from_current_cb
308 * #layout_new_from_default
311 * group layout_util.c
317 * : **layout_new_from_default()**;
318 * if (default.xml exists) then (yes)
320 * layout_window default options
321 * from default.xml file;
324 * layout_window default options;
331 * **layout_menu_window_from_current_cb()**
332 * copy layout_window options
333 * from current window;
338 * **layout_menu_new_window_cb()**
339 * load layout_window options
340 * from saved xml file list;
348 * @ref options_overview "Options Overview"
352 * @page diagrams Diagrams
353 * @section image_load_overview Image Load Overview
355 * object image_change
356 * object image_change_complete
357 * object image_load_begin
358 * object image_loader_start
359 * object image_loader_start_thread
360 * object image_loader_setup_source
361 * object image_loader_thread_run
362 * object image_loader_begin
363 * object image_loader_setuploader
364 * circle "il->memory_mapped"
365 * object exif_get_preview_
366 * object exif_get_preview
367 * object libraw_get_preview
369 * image_change : image.c
370 * image_change_complete : image.c
371 * image_load_begin : image.c
372 * image_loader_start : image_load.c
373 * image_loader_start_thread : image_load.c
374 * image_loader_thread_run : image_load.c
375 * image_loader_begin : image_load.c
376 * image_loader_setuploader : image_load.c
377 * image_loader_setuploader : -
378 * image_loader_setuploader : Select backend using magic
379 * image_loader_setup_source : image_load.c
380 * exif_get_preview : exiv2.cc
381 * exif_get_preview : EXIV2_TEST_VERSION(0,17,90)
382 * exif_get_preview_ : exif.c
383 * exif_get_preview_ : -
384 * exif_get_preview_ : If exiv2 not installed
385 * libraw_get_preview : image_load_libraw.c
387 * image_change --> image_change_complete
388 * image_change_complete --> image_load_begin
389 * image_load_begin --> image_loader_start
390 * image_loader_start --> image_loader_start_thread
391 * image_loader_start_thread --> image_loader_thread_run
392 * image_loader_start_thread --> image_loader_setup_source
393 * image_loader_setup_source --> exif_get_preview_
394 * image_loader_setup_source --> exif_get_preview
395 * image_loader_setup_source --> libraw_get_preview : Try libraw if exiv2 fails
396 * exif_get_preview_ ..> "il->memory_mapped"
397 * exif_get_preview ..> "il->memory_mapped"
398 * libraw_get_preview ..> "il->memory_mapped"
399 * image_loader_thread_run --> image_loader_begin
400 * image_loader_begin --> image_loader_setuploader
401 * "il->memory_mapped" ..> image_loader_setuploader
402 * note left of "il->memory_mapped" : Points to first byte of embedded jpeg (#FFD8)\n if preview found, otherwise to first byte of file
407 * @ref image_load_overview "Image Load Overview"
411 * @page diagrams Diagrams
412 * @section duplicates_data_layout Duplicates Data Layout
414 * #_DupeWindow #_DupeItem #_DupeMatch
418 * database DupeWindow [
419 * <b>DupeWindow->list</b>
432 * One entry for each file
433 * dropped onto the dupes window
455 * group_rank: (sum of all child ranks) / n
459 * <b>group (list)</b>
473 * One entry for each file
486 * DupeWindow -r-> DupeItem
487 * group -r-> DupeMatch