static void catalog_saved_cb (void **buffer, gsize count, GError *error, gpointer user_data) { DialogData *data = user_data; if (error == NULL) { if (! g_file_equal (data->original_file, data->file_data->file)) { GFile *gio_file; gio_file = gth_catalog_file_to_gio_file (data->original_file); g_file_delete (gio_file, NULL, NULL); g_object_unref (gio_file); gth_monitor_file_renamed (gth_main_get_default_monitor (), data->original_file, data->file_data->file); } gth_catalog_update_metadata (data->catalog, data->file_data); gth_monitor_metadata_changed (gth_main_get_default_monitor (), data->file_data); gth_hook_invoke ("dlg-catalog-properties-saved", data->browser, data->file_data, data->catalog); } else _gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->browser), _("Could not save the catalog"), error); gtk_widget_destroy (data->dialog); }
void gth_browser_activate_file_list_rename (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GthBrowser *browser = GTH_BROWSER (user_data); gth_hook_invoke ("gth-browser-file-list-rename", browser); }
static void import_photos_from_location (GFile *location) { GtkWidget *window; window = gth_browser_new (NULL, NULL); gth_browser_set_close_with_task (GTH_BROWSER (window), TRUE); gth_hook_invoke ("import-photos", window, location, NULL); }
static GthImageSaveData * _gth_image_save_to_buffer_common (GthImage *image, const char *mime_type, GthFileData *file_data, GCancellable *cancellable, GError **p_error) { GthImageSaver *saver; char *buffer; gsize buffer_size; GError *error = NULL; GthImageSaveData *save_data = NULL; saver = gth_main_get_image_saver (mime_type); if (saver == NULL) { if (p_error != NULL) *p_error = g_error_new (GTH_ERROR, GTH_ERROR_GENERIC, _("Could not find a suitable module to save the image as \"%s\""), mime_type); return NULL; } if (gth_image_saver_save_image (saver, image, &buffer, &buffer_size, mime_type, cancellable, &error)) { save_data = g_new0 (GthImageSaveData, 1); save_data->file_data = _g_object_ref (file_data); save_data->image = gth_image_copy (image); save_data->mime_type = mime_type; save_data->buffer = buffer; save_data->buffer_size = buffer_size; save_data->files = NULL; save_data->error = NULL; save_data->cancellable = _g_object_ref (cancellable); if (save_data->file_data != NULL) gth_hook_invoke ("save-image", save_data); if ((save_data->error != NULL) && (p_error != NULL)) *p_error = g_error_copy (*save_data->error); } else { if (p_error != NULL) *p_error = error; else _g_error_free (error); } g_object_unref (saver); return save_data; }
static void save_button_clicked_cb (GtkButton *button, DialogData *data) { GthDateTime *date_time; GFile *gio_file; char *buffer; gsize size; if (strcmp (gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry"))), "") != 0) { GFile *parent; char *uri; char *clean_name; char *display_name; GFile *new_file; parent = g_file_get_parent (data->original_file); uri = g_file_get_uri (data->original_file); clean_name = _g_filename_clear_for_file (gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry")))); display_name = g_strconcat (clean_name, _g_uri_get_file_extension (uri), NULL); new_file = g_file_get_child_for_display_name (parent, display_name, NULL); if ((new_file != NULL) && ! g_file_equal (new_file, data->original_file)) gth_file_data_set_file (data->file_data, new_file); _g_object_unref (new_file); g_free (display_name); g_free (clean_name); g_free (uri); g_object_unref (parent); } gth_catalog_set_name (data->catalog, gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry")))); date_time = gth_datetime_new (); gth_time_selector_get_value (GTH_TIME_SELECTOR (data->time_selector), date_time); gth_catalog_set_date (data->catalog, date_time); gth_datetime_free (date_time); /* invoke the hook to save derived catalogs such as searches */ gth_hook_invoke ("dlg-catalog-properties-save", data->builder, data->file_data, data->catalog); gio_file = gth_catalog_file_to_gio_file (data->file_data->file); buffer = gth_catalog_to_data (data->catalog, &size); _g_file_write_async (gio_file, buffer, size, TRUE, G_PRIORITY_DEFAULT, NULL, catalog_saved_cb, data); g_object_unref (gio_file); }
static void gth_application_startup (GApplication *application) { G_APPLICATION_CLASS (gth_application_parent_class)->startup (application); g_object_set (gtk_settings_get_default (), "gtk-application-prefer-dark-theme", TRUE, NULL); _gth_application_initialize_app_actions (application); gth_pref_initialize (); migrate_data (); gth_main_initialize (); gth_main_register_default_hooks (); gth_main_register_file_source (GTH_TYPE_FILE_SOURCE_VFS); gth_main_register_default_sort_types (); gth_main_register_default_tests (); gth_main_register_default_types (); gth_main_register_default_metadata (); gth_main_activate_extensions (); gth_hook_invoke ("initialize", NULL); }
static void catalog_ready_cb (GObject *object, GError *error, gpointer user_data) { DialogData *data = user_data; if (error != NULL) { _gtk_error_dialog_from_gerror_show (GTK_WINDOW(data->browser), _("Could not load the catalog"), error); gtk_widget_destroy (data->dialog); return; } data->catalog = g_object_ref (object); if (gth_catalog_get_name (data->catalog) != NULL) { gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("name_entry")), gth_catalog_get_name (data->catalog)); } else if (! gth_datetime_valid_date (gth_catalog_get_date (data->catalog))) { char *basename; char *name; char *utf8_name; basename = g_file_get_basename (data->file_data->file); name = _g_uri_remove_extension (basename); utf8_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL); gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("name_entry")), utf8_name); g_free (utf8_name); g_free (name); g_free (basename); } gth_time_selector_set_value (GTH_TIME_SELECTOR (data->time_selector), gth_catalog_get_date (data->catalog)); gth_hook_invoke ("dlg-catalog-properties", data->builder, data->file_data, data->catalog); gtk_widget_show (data->dialog); g_object_unref (object); }
gboolean jpegtran (void *in_buffer, gsize in_buffer_size, void **out_buffer, gsize *out_buffer_size, GthTransform transformation, JpegMcuAction mcu_action, GError **error) { struct jpeg_decompress_struct srcinfo; struct jpeg_compress_struct dstinfo; struct error_handler_data jsrcerr, jdsterr; gboolean success; *out_buffer = NULL; *out_buffer_size = 0; /* Initialize the JPEG decompression object with default error * handling. */ srcinfo.err = jpeg_std_error (&(jsrcerr.pub)); jsrcerr.pub.error_exit = fatal_error_handler; jsrcerr.pub.output_message = output_message_handler; jsrcerr.error = error; jpeg_create_decompress (&srcinfo); /* Initialize the JPEG compression object with default error * handling. */ dstinfo.err = jpeg_std_error (&(jdsterr.pub)); jdsterr.pub.error_exit = fatal_error_handler; jdsterr.pub.output_message = output_message_handler; jdsterr.error = error; jpeg_create_compress (&dstinfo); dstinfo.err->trace_level = 0; dstinfo.arith_code = FALSE; dstinfo.optimize_coding = FALSE; jsrcerr.pub.trace_level = jdsterr.pub.trace_level; srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use; /* Decompression error handler */ if (sigsetjmp (jsrcerr.setjmp_buffer, 1)) { jpeg_destroy_compress (&dstinfo); jpeg_destroy_decompress (&srcinfo); return FALSE; } /* Compression error handler */ if (sigsetjmp (jdsterr.setjmp_buffer, 1)) { jpeg_destroy_compress (&dstinfo); jpeg_destroy_decompress (&srcinfo); return FALSE; } /* Specify data source for decompression */ _jpeg_memory_src (&srcinfo, in_buffer, in_buffer_size); /* Specify data destination for compression */ _jpeg_memory_dest (&dstinfo, out_buffer, out_buffer_size); /* Apply transformation */ success = jpegtran_internal (&srcinfo, &dstinfo, transformation, JCOPYOPT_ALL, mcu_action, error); /* Release memory */ jpeg_destroy_compress (&dstinfo); jpeg_destroy_decompress (&srcinfo); if (success) { gth_hook_invoke ("jpegtran-after", out_buffer, out_buffer_size, &transformation); } else { g_free (*out_buffer); *out_buffer_size = 0; } return success; }
void dlg_preferences (GthBrowser *browser) { DialogData *data; GtkWidget *notebook; GList *children; GList *scan; int page_num; GtkWidget *list_box; GtkTreeSelection *selection; if (gth_browser_get_dialog (browser, "preferences") != NULL) { gtk_window_present (GTK_WINDOW (gth_browser_get_dialog (browser, "preferences"))); return; } data = g_new0 (DialogData, 1); data->browser = browser; data->builder = _gtk_builder_new_from_file ("preferences.ui", NULL); data->dialog = GET_WIDGET ("preferences_dialog"); gtk_container_set_border_width (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (data->dialog))), 0); gth_browser_set_dialog (browser, "preferences", data->dialog); gth_hook_invoke ("dlg-preferences-construct", data->dialog, data->browser, data->builder); /* widgets */ list_box = GET_WIDGET ("tabs_listbox"); notebook = GET_WIDGET ("notebook"); children = gtk_container_get_children (GTK_CONTAINER (notebook)); page_num = 0; for (scan = children; scan; scan = scan->next) { GtkWidget *child = scan->data; const char *name; GtkWidget *row; GtkWidget *box; GtkWidget *label; name = gtk_notebook_get_tab_label_text (GTK_NOTEBOOK (notebook), child); if (name == NULL) continue; if (scan != children) _gtk_list_box_add_separator (GTK_LIST_BOX (list_box)); row = gtk_list_box_row_new (); g_object_set_data (G_OBJECT (row), "gth.page_num", GINT_TO_POINTER (page_num)); gtk_widget_show (row); gtk_container_add (GTK_CONTAINER (list_box), row); box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_container_set_border_width (GTK_CONTAINER (box), 10); gtk_widget_show (box); gtk_container_add (GTK_CONTAINER (row), box); label = gtk_label_new (name); gtk_label_set_ellipsize (GTK_LABEL(label), PANGO_ELLIPSIZE_END); gtk_widget_show (label); gtk_container_add (GTK_CONTAINER (box), label); page_num += 1; } /* Set the signals handlers. */ g_signal_connect (data->dialog, "destroy", G_CALLBACK (destroy_cb), data); g_signal_connect (list_box, "row-activated", G_CALLBACK (list_box_row_activated_cb), data); /* run dialog. */ gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (browser)); gtk_widget_show (data->dialog); }
static void apply_changes (DialogData *data) { gth_hook_invoke ("dlg-preferences-apply", data->dialog, data->browser, data->builder); }