diff --git a/.gitignore b/.gitignore index 97143fbec46e..013963d8a64d 100644 --- a/.gitignore +++ b/.gitignore @@ -25,5 +25,6 @@ output*png Brewfile.lock.json CMakeLists.txt.user workspace/ +.idea cmake-build-debug/ .idea/ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 07dbcdd5669f..c67c1eb164f4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -26,6 +26,7 @@ FILE(GLOB SOURCE_FILES "common/curve_tools.c" "common/custom_primaries.c" "common/darktable.c" + "common/darktable_application.c" "common/database.c" "common/datetime.c" "common/dbus.c" diff --git a/src/common/darktable.c b/src/common/darktable.c index 27aba5d0254b..bee362b7987b 100644 --- a/src/common/darktable.c +++ b/src/common/darktable.c @@ -124,7 +124,7 @@ darktable_t darktable; -static int usage(const char *argv0) +int usage(const char *argv0) { #ifdef _WIN32 char *logfile = g_build_filename(g_get_home_dir(), "Documents", "Darktable", "darktable-log.txt", NULL); @@ -752,7 +752,7 @@ void dt_stop_backthumbs_crawler(const gboolean wait) } } -static char *_get_version_string(void) +char *_get_version_string(void) { const char *exiv2_version = EXV_PACKAGE_VERSION "\n"; @@ -946,15 +946,7 @@ int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load dt_pthread_mutex_init(&darktable.metadata_threadsafe, NULL); darktable.control = calloc(1, sizeof(dt_control_t)); - // database - char *dbfilename_from_command = NULL; - char *noiseprofiles_from_command = NULL; - char *datadir_from_command = NULL; - char *moduledir_from_command = NULL; - char *localedir_from_command = NULL; - char *tmpdir_from_command = NULL; - char *configdir_from_command = NULL; - char *cachedir_from_command = NULL; + darktable.dump_pfm_module = NULL; darktable.dump_pfm_pipe = NULL; @@ -976,11 +968,11 @@ int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load darktable.num_openmp_threads = dt_get_num_procs(); darktable.pipe_cache = TRUE; darktable.unmuted = 0; - GSList *config_override = NULL; // keep a copy of argv array for possibly reporting later gchar **myoptions = init_gui && argc > 1 ? g_strdupv(argv) : NULL; + /* for(int k = 1; k < argc; k++) { #ifdef _WIN32 @@ -1361,6 +1353,7 @@ int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load argc -= k; } } + */ /* We now have all command line options ready and check for gimp API questions. Return right now if we @@ -1407,12 +1400,12 @@ int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load // Set directories as requested or default. // Set a result flag so if we can't create certain directories, we can // later, after initializing the GUI, show the user a message and exit. - const uint8_t user_dir_failed = dt_loc_init(datadir_from_command, - moduledir_from_command, - localedir_from_command, - configdir_from_command, - cachedir_from_command, - tmpdir_from_command); + const uint8_t user_dir_failed = dt_loc_init(configs_from_command.datadir_from_command, + configs_from_command.moduledir_from_command, + configs_from_command.localedir_from_command, + configs_from_command.configdir_from_command, + configs_from_command.cachedir_from_command, + configs_from_command.tmpdir_from_command); dt_print_mem_usage("at startup"); @@ -1515,9 +1508,9 @@ int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load dt_confgen_init(); // read actual configuration, needs confgen above for sanitizing values - dt_conf_init(darktable.conf, darktablerc, config_override); + dt_conf_init(darktable.conf, darktablerc, configs_from_command.config_override); - g_slist_free_full(config_override, g_free); + g_slist_free_full(configs_from_command.config_override, g_free); const int last_configure_version = dt_conf_get_int("performance_configuration_version_completed"); @@ -1584,7 +1577,7 @@ int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load // initialize the database darktable_splash_screen_set_progress(_("opening image library")); - darktable.db = dt_database_init(dbfilename_from_command, load_data, init_gui); + darktable.db = dt_database_init(configs_from_command.dbfilename_from_command, load_data, init_gui); if(darktable.db == NULL) { dt_print(DT_DEBUG_ALWAYS, "ERROR : cannot open database"); @@ -1645,7 +1638,7 @@ int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load } else { - if(dbfilename_from_command && !strcmp(dbfilename_from_command, ":memory:")) + if(configs_from_command.dbfilename_from_command && !strcmp(configs_from_command.dbfilename_from_command, ":memory:")) dt_gui_presets_init(); // init preset db schema. } @@ -1788,7 +1781,7 @@ int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load dt_wb_presets_init(NULL); darktable_splash_screen_set_progress(_("loading noise profiles")); - darktable.noiseprofile_parser = dt_noiseprofile_init(noiseprofiles_from_command); + darktable.noiseprofile_parser = dt_noiseprofile_init(configs_from_command.noiseprofiles_from_command); // must come before mipmap_cache, because that one will need to access // image dimensions stored in here: @@ -1834,7 +1827,7 @@ int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load darktable.backthumbs.capable = !dt_gimpmode() && dt_get_num_threads() >= 4 - && !(dbfilename_from_command && !strcmp(dbfilename_from_command, ":memory:")); + && !(configs_from_command.dbfilename_from_command && !strcmp(configs_from_command.dbfilename_from_command, ":memory:")); } else darktable.gui = NULL; diff --git a/src/common/darktable.h b/src/common/darktable.h index 359759598121..3e874010f998 100644 --- a/src/common/darktable.h +++ b/src/common/darktable.h @@ -981,7 +981,23 @@ static inline gboolean dt_check_gimpmode_ok(const char *mode) { return darktable.gimp.mode ? !darktable.gimp.error && strcmp(darktable.gimp.mode, mode) == 0 : FALSE; } - +struct configs_from_command +{ + // database + char *dbfilename_from_command; + char *datadir_from_command; + char *moduledir_from_command; + char *localedir_from_command; + char *tmpdir_from_command; + char *configdir_from_command; + char *cachedir_from_command; + GSList *config_override; + char *noiseprofiles_from_command; + char *lua_command; + int exclude_opencl; + +}; +extern struct configs_from_command configs_from_command; G_END_DECLS // clang-format off diff --git a/src/common/darktable_application.c b/src/common/darktable_application.c new file mode 100644 index 000000000000..11771e127ff5 --- /dev/null +++ b/src/common/darktable_application.c @@ -0,0 +1,441 @@ +#include "control/conf.h" +#include "darktable.h" +// +// Created by mikesolar on 25-10-21. +// +char *_get_version_string(void); +struct configs_from_command configs_from_command={0}; +int usage(const char *argv0); + +#include "darktable_application.h" + +void darktable_application_finalize (GObject *object) +{ + G_OBJECT_CLASS (darktable_application_parent_class)->finalize (object); +} + + +GApplication *darktable_application_new (const gchar *application_id, + GApplicationFlags flags) +{ + g_return_val_if_fail (g_application_id_is_valid (application_id), NULL); + + return g_object_new (darktable_application_get_type (), + "application-id", application_id, + "flags", flags, + NULL); +} + + + +int handle_command(GApplication *application, + gchar ***arguments, + gint *exit_status +) +{ + char **argv = *arguments; + int index=0; + while(argv) + { + index++; + argv++; + } + int argc = index; + gchar **myoptions = argc > 1 ? g_strdupv(argv) : NULL; + + for(int k = 1; k < argc; k++) + { +#ifdef _WIN32 + if(!strcmp(argv[k], "/?")) + { + g_strfreev(myoptions); + return usage(argv[0]); + } +#endif + if(argv[k][0] == '-') + { + if(!strcmp(argv[k], "--help") || !strcmp(argv[k], "-h")) + { + g_strfreev(myoptions); + return usage(argv[0]); + } + + else if(!strcmp(argv[k], "--version") || !strcmp(argv[k], "-v")) + { + char *theversion = _get_version_string(); + printf("%s", theversion); + g_free(theversion); + g_strfreev(myoptions); + return 1; + } + else if(!strcmp(argv[k], "--dump-pfm") && argc > k + 1) + { + darktable.dump_pfm_module = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--bench-module") && argc > k + 1) + { + darktable.bench_module = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--dump-pipe") && argc > k + 1) + { + darktable.dump_pfm_pipe = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--dump-diff-pipe") && argc > k + 1) + { + darktable.dump_diff_pipe = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--library") && argc > k + 1) + { + configs_from_command.dbfilename_from_command = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--datadir") && argc > k + 1) + { + configs_from_command.datadir_from_command = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--moduledir") && argc > k + 1) + { + configs_from_command.moduledir_from_command = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--tmpdir") && argc > k + 1) + { + configs_from_command.tmpdir_from_command = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--configdir") && argc > k + 1) + { + configs_from_command.configdir_from_command = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--cachedir") && argc > k + 1) + { + configs_from_command.cachedir_from_command = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--dumpdir") && argc > k + 1) + { + darktable.tmp_directory = g_strdup(argv[++k]); + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--localedir") && argc > k + 1) + { + configs_from_command.localedir_from_command = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(argv[k][1] == 'd' && argc > k + 1) + { + char *darg = argv[k + 1]; + dt_debug_thread_t dadd = + !strcmp(darg, "common") ? DT_DEBUG_COMMON : // enable common processing options + !strcmp(darg, "all") ? DT_DEBUG_ALL : // enable all debug information except verbose + !strcmp(darg, "cache") ? DT_DEBUG_CACHE : // enable debugging for lib/film/cache module + !strcmp(darg, "control") ? DT_DEBUG_CONTROL : // enable debugging for scheduler module + !strcmp(darg, "dev") ? DT_DEBUG_DEV : // develop module + !strcmp(darg, "input") ? DT_DEBUG_INPUT : // input devices + !strcmp(darg, "camctl") ? DT_DEBUG_CAMCTL : // camera control module + !strcmp(darg, "perf") ? DT_DEBUG_PERF : // performance measurements + !strcmp(darg, "pwstorage") ? DT_DEBUG_PWSTORAGE : // pwstorage module + !strcmp(darg, "opencl") ? DT_DEBUG_OPENCL : // gpu accel via opencl + !strcmp(darg, "sql") ? DT_DEBUG_SQL : // SQLite3 queries + !strcmp(darg, "memory") ? DT_DEBUG_MEMORY : // some stats on mem usage now and then. + !strcmp(darg, "lighttable") ? DT_DEBUG_LIGHTTABLE : // lighttable related stuff. + !strcmp(darg, "nan") ? DT_DEBUG_NAN : // check for NANs when processing the pipe. + !strcmp(darg, "masks") ? DT_DEBUG_MASKS : // masks related stuff. + !strcmp(darg, "lua") ? DT_DEBUG_LUA : // lua errors are reported on console + !strcmp(darg, "print") ? DT_DEBUG_PRINT : // print errors are reported on console + !strcmp(darg, "camsupport") ? DT_DEBUG_CAMERA_SUPPORT : // camera support warnings are reported on console + !strcmp(darg, "ioporder") ? DT_DEBUG_IOPORDER : // iop order information are reported on console + !strcmp(darg, "imageio") ? DT_DEBUG_IMAGEIO : // image importing or exporting messages on console + !strcmp(darg, "undo") ? DT_DEBUG_UNDO : // undo/redo + !strcmp(darg, "signal") ? DT_DEBUG_SIGNAL : // signal information on console + !strcmp(darg, "params") ? DT_DEBUG_PARAMS : // iop module params checks on console + !strcmp(darg, "act_on") ? DT_DEBUG_ACT_ON : + !strcmp(darg, "tiling") ? DT_DEBUG_TILING : + !strcmp(darg, "verbose") ? DT_DEBUG_VERBOSE : + !strcmp(darg, "pipe") ? DT_DEBUG_PIPE : + !strcmp(darg, "expose") ? DT_DEBUG_EXPOSE : + !strcmp(darg, "picker") ? DT_DEBUG_PICKER : + 0; + if(dadd) + darktable.unmuted |= dadd; + else + { + g_strfreev(myoptions); + return usage(argv[0]); + } + k++; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--d-signal-act") && argc > k + 1) + { + if(!strcmp(argv[k + 1], "all")) + darktable.unmuted_signal_dbg_acts = 0xffffffff; // enable all signal debug information + else if(!strcmp(argv[k + 1], "raise")) + darktable.unmuted_signal_dbg_acts |= DT_DEBUG_SIGNAL_ACT_RAISE; // enable debugging for signal raising + else if(!strcmp(argv[k + 1], "connect")) + darktable.unmuted_signal_dbg_acts |= DT_DEBUG_SIGNAL_ACT_CONNECT; // enable debugging for signal connection + else if(!strcmp(argv[k + 1], "disconnect")) + darktable.unmuted_signal_dbg_acts |= DT_DEBUG_SIGNAL_ACT_DISCONNECT; // enable debugging for signal disconnection + else if(!strcmp(argv[k + 1], "print-trace")) + { +#ifdef DT_HAVE_SIGNAL_TRACE + darktable.unmuted_signal_dbg_acts |= DT_DEBUG_SIGNAL_ACT_PRINT_TRACE; // enable printing of signal tracing +#else + dt_print(DT_DEBUG_ALWAYS, "[signal] print-trace not available, skipping"); +#endif + } + else + { + g_strfreev(myoptions); + return usage(argv[0]); + } + k++; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--d-signal") && argc > k + 1) + { + gchar *str = g_ascii_strup(argv[k+1], -1); + + #define CHKSIGDBG(sig) else if(!g_strcmp0(str, #sig)) do {darktable.unmuted_signal_dbg[sig] = TRUE;} while(0) + if(!g_strcmp0(str, "ALL")) + { + for(int sig=0; sig k + 1) + || (!strcmp(argv[k], "--threads") + && argc > k + 1)) + { + const int possible = dt_get_num_procs(); + const int desired = atol(argv[k + 1]); + darktable.num_openmp_threads = CLAMP(desired, 1, possible); + if(desired > possible) + dt_print(DT_DEBUG_ALWAYS, + "[dt_init --threads] requested %d ompthreads restricted to %d", + desired, possible); +#ifdef _OPENMP + dt_print(DT_DEBUG_ALWAYS, + "[dt_init --threads] using %d threads of %d for openmp parallel sections %s", + darktable.num_openmp_threads, (int)dt_get_num_procs(), + omp_get_dynamic() ? "(dynamic)" : "(static)"); +#endif + k++; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--conf") && argc > k + 1) + { + gchar *keyval = g_strdup(argv[++k]), *c = keyval; + argv[k-1] = NULL; + argv[k] = NULL; + gchar *end = keyval + strlen(keyval); + while(*c != '=' && c < end) c++; + if(*c == '=' && *(c + 1) != '\0') + { + *c++ = '\0'; + dt_conf_string_entry_t *entry = g_malloc(sizeof(dt_conf_string_entry_t)); + entry->key = g_strdup(keyval); + entry->value = g_strdup(c); + configs_from_command.config_override = g_slist_append(configs_from_command.config_override, entry); + } + g_free(keyval); + } + else if(!strcmp(argv[k], "--noiseprofiles") && argc > k + 1) + { + configs_from_command.noiseprofiles_from_command = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--luacmd") && argc > k + 1) + { +#ifdef USE_LUA + configs_from_command.lua_command = argv[++k]; +#else + ++k; +#endif + argv[k-1] = NULL; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--disable-opencl")) + { +#ifdef HAVE_OPENCL + configs_from_command.exclude_opencl = TRUE; +#endif + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--disable-pipecache")) + { + darktable.pipe_cache = FALSE; + argv[k] = NULL; + } + else if(!strcmp(argv[k], "--gimp")) + { + argv[k] = NULL; + darktable.gimp.error = TRUE; + + if(argc > k + 1) + { + darktable.gimp.mode = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + + if(dt_check_gimpmode("version")) + { + darktable.gimp.error = FALSE; + } + else if(dt_check_gimpmode("file") && (argc > k + 1)) + { + darktable.gimp.path = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + + if(g_file_test(darktable.gimp.path, G_FILE_TEST_IS_REGULAR)) + darktable.gimp.error = FALSE; + } + else if(dt_check_gimpmode("thumb") && (argc > k + 2)) + { + darktable.gimp.path = argv[++k]; + argv[k-1] = NULL; + argv[k] = NULL; + + if(g_file_test(darktable.gimp.path, G_FILE_TEST_IS_REGULAR)) + { + darktable.gimp.size = atol(argv[k + 1]); + k++; + argv[k-1] = NULL; + argv[k] = NULL; + + if(darktable.gimp.size > 0) + darktable.gimp.error = FALSE; + } + } + } + } + else if(!strcmp(argv[k], "--")) + { + // "--" confuses the argument parser of glib/gtk. remove it. + argv[k] = NULL; + break; + } +#ifdef __APPLE__ + else if(!strncmp(argv[k], "-psn_", 5)) + { + // "-psn_*" argument is added automatically by macOS and should be ignored + argv[k] = NULL; + } +#endif + else + { + g_strfreev(myoptions); + return usage(argv[0]); // fail on unrecognized options + } + } + } + + // remove the NULLs to not confuse gtk_init() later. + for(int i = 1; i < argc; i++) + { + int k; + for(k = i; k < argc; k++) + if(argv[k] != NULL) break; + + if(k > i) + { + k -= i; + for(int j = i + k; j < argc; j++) + { + argv[j-k] = argv[j]; + argv[j] = NULL; + } + argc -= k; + } + } + + /* We now have all command line options ready and check for gimp API questions. + Return right now if we + - check for API version + - check for "file" or "thumb" and the file is not physically available + - have an undefined gimp mode + and let the caller check again and write out protocol messages. + */ + if(dt_check_gimpmode("version") + || (dt_check_gimpmode("file") && !dt_check_gimpmode_ok("file")) + || (dt_check_gimpmode("thumb") && !dt_check_gimpmode_ok("thumb")) + || darktable.gimp.error) + return 0; + return 0; +} + diff --git a/src/common/darktable_application.h b/src/common/darktable_application.h new file mode 100644 index 000000000000..35bb6c76198c --- /dev/null +++ b/src/common/darktable_application.h @@ -0,0 +1,34 @@ +// +// Created by mikesolar on 25-10-21. +// + +#ifndef DARKTABLE_APPLICATION_H +#define DARKTABLE_APPLICATION_H +#include "darktable_application.h" +#include "gio/gio.h" +int handle_command(GApplication *application, + gchar ***arguments, + gint *exit_status +); +typedef GApplication DarkTableApplication; +typedef GApplicationClass DarkTableApplicationClass; + +GType darktable_application_get_type (void); +G_DEFINE_TYPE(DarkTableApplication, darktable_application, G_TYPE_APPLICATION) + +void darktable_application_finalize (GObject *object); + +static void darktable_application_init (DarkTableApplication *app) +{ +} + +static void darktable_application_class_init (DarkTableApplicationClass *class) +{ + G_OBJECT_CLASS (class)->finalize = darktable_application_finalize; + G_APPLICATION_CLASS (class)->local_command_line = handle_command; +} + +GApplication *darktable_application_new (const gchar *application_id, + GApplicationFlags flags); + +#endif //DARKTABLE_APPLICATION_H diff --git a/src/gui/gtk.c b/src/gui/gtk.c index 78608016895e..5a5f00f5729a 100644 --- a/src/gui/gtk.c +++ b/src/gui/gtk.c @@ -1588,10 +1588,12 @@ void dt_gui_gtk_run(dt_gui_gtk_t *gui) dt_osx_focus_window(); #endif /* start the event loop */ + if(dt_control_running()) { g_atomic_int_set(&darktable.gui_running, 1); - gtk_main(); + //gtk_main(); + gtk_window_present(GTK_WINDOW(darktable.gui)); g_atomic_int_set(&darktable.gui_running, 0); } if(darktable.gui->surface) @@ -3351,9 +3353,10 @@ void dt_gui_load_theme(const char *theme) if(!dt_conf_key_exists("use_system_font")) dt_conf_set_bool("use_system_font", TRUE); + GtkSettings *settings = gtk_settings_get_default(); //set font size if(dt_conf_get_bool("use_system_font")) - gtk_settings_reset_property(gtk_settings_get_default(), "gtk-font-name"); + gtk_settings_reset_property(settings, "gtk-font-name"); else { //font name can only use period as decimal separator diff --git a/src/lua/widget/button.c b/src/lua/widget/button.c index 3e0ba5518e3f..1b8c6369b8fb 100644 --- a/src/lua/widget/button.c +++ b/src/lua/widget/button.c @@ -182,6 +182,7 @@ static int image_position_member(lua_State *L) { luaA_to(L, dt_lua_position_type_t, &image_position, 3); // check for image before trying to ellipsize it + // I think this can't be removed when preparation because we can't find alternatives in GTK3. if(gtk_button_get_image(GTK_BUTTON(button->widget))) gtk_button_set_image_position(GTK_BUTTON(button->widget), image_position); else diff --git a/src/main.c b/src/main.c index 366413e38469..5b643b2821ae 100644 --- a/src/main.c +++ b/src/main.c @@ -20,7 +20,7 @@ #include "common/image.h" #include "develop/develop.h" #include "common/gimp.h" -#include "common/image_cache.h" +#include "common/darktable_application.h" #include "gui/gtk.h" #include @@ -36,6 +36,74 @@ #ifdef __APPLE__ int apple_main(int argc, char *argv[]) #else +int g_argc; +char **g_argv; +int exitcode; + +int activate() +{ + if(dt_init(g_argc, g_argv, TRUE, TRUE, NULL)) + { + if(dt_gimpmode()) + printf("\n<<>>\n"); + exit(1); + } + if(dt_check_gimpmode_ok("version")) + { + printf("\n<<>>\n", DT_GIMP_VERSION); + exit(0); + } + + if(dt_check_gimpmode("version") + || (dt_check_gimpmode("file") && !dt_check_gimpmode_ok("file")) + || (dt_check_gimpmode("thumb") && !dt_check_gimpmode_ok("thumb")) + || darktable.gimp.error) + { + printf("\n<<>>\n"); + exit(1); + } + + if(dt_check_gimpmode_ok("file")) + { + const dt_imgid_t id = dt_gimp_load_darkroom(darktable.gimp.path); + if(!dt_is_valid_imgid(id)) + darktable.gimp.error = TRUE; + } + + if(dt_check_gimpmode_ok("thumb")) + { + const dt_imgid_t id = dt_gimp_load_image(darktable.gimp.path); + if(dt_is_valid_imgid(id)) + darktable.gimp.error = !dt_export_gimp_file(id); + else + darktable.gimp.error = TRUE; + + return darktable.gimp.error ? 1 : 0; + } + int status = 0; + if(!dt_gimpmode() || dt_check_gimpmode_ok("file")) + { + dt_gui_gtk_run(darktable.gui); + } + + dt_cleanup(); + + if(dt_gimpmode() && darktable.gimp.error) + printf("\n<<>>\n"); + +#ifdef _WIN32 + if(redirect_output) + { + printf("\n"); + printf("end: %s\n", datetime); + printf("========================================\n"); + printf("\n"); + } +#endif + + exitcode = status?(dt_gimpmode() ? (darktable.gimp.error ? 1 : 0) : 0) : 0; + return exitcode; +} int main(int argc, char *argv[]) #endif { @@ -113,67 +181,17 @@ int main(int argc, char *argv[]) // otherwise windows resizing issues can be observed. g_setenv("GTK_CSD", "0", TRUE); #endif + DarkTableApplication *app=g_application_new("org.darktable", + G_APPLICATION_SEND_ENVIRONMENT + ); + g_argc=argc; + g_argv=argv; + g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); + g_application_run(app, argc, argv); - if(dt_init(argc, argv, TRUE, TRUE, NULL)) - { - if(dt_gimpmode()) - printf("\n<<>>\n"); - exit(1); - } - - if(dt_check_gimpmode_ok("version")) - { - printf("\n<<>>\n", DT_GIMP_VERSION); - exit(0); - } - - if(dt_check_gimpmode("version") - || (dt_check_gimpmode("file") && !dt_check_gimpmode_ok("file")) - || (dt_check_gimpmode("thumb") && !dt_check_gimpmode_ok("thumb")) - || darktable.gimp.error) - { - printf("\n<<>>\n"); - exit(1); - } - - if(dt_check_gimpmode_ok("file")) - { - const dt_imgid_t id = dt_gimp_load_darkroom(darktable.gimp.path); - if(!dt_is_valid_imgid(id)) - darktable.gimp.error = TRUE; - } - - if(dt_check_gimpmode_ok("thumb")) - { - const dt_imgid_t id = dt_gimp_load_image(darktable.gimp.path); - if(dt_is_valid_imgid(id)) - darktable.gimp.error = !dt_export_gimp_file(id); - else - darktable.gimp.error = TRUE; - - return darktable.gimp.error ? 1 : 0; - } - - if(!dt_gimpmode() || dt_check_gimpmode_ok("file")) - dt_gui_gtk_run(darktable.gui); - - dt_cleanup(); - - if(dt_gimpmode() && darktable.gimp.error) - printf("\n<<>>\n"); - -#ifdef _WIN32 - if(redirect_output) - { - printf("\n"); - printf("end: %s\n", datetime); - printf("========================================\n"); - printf("\n"); - } -#endif + g_object_unref (app); + return exitcode; - const int exitcode = dt_gimpmode() ? (darktable.gimp.error ? 1 : 0) : 0; - exit(exitcode); } // clang-format off