From 1664ecbf1dc1cd60f8f7e2f16ee6ef3dfa664d43 Mon Sep 17 00:00:00 2001 From: Ell Date: Sun, 22 Sep 2019 16:44:23 +0300 Subject: [PATCH] app: add "Swap compression" option to the preferences Add a new "Swap compression" option to the preferences, allowing explicit control over the tile-swap compression algorithm. Previously, control over swap compression was only possible through GEGL command-line options/environment variables. Since the GEGL API to list all available compression algorithms is still private for now, we currently only list the three predefined compression levels -- "best performance" (the default), "balanced", and "best compression" -- and a "none" option, to disable compression altogether. Selecting a custom compression algorithm is possible by entering its name manually. --- app/config/gimpgeglconfig.c | 20 ++- app/config/gimpgeglconfig.h | 1 + app/config/gimprc-blurbs.h | 3 + app/dialogs/preferences-dialog-utils.c | 17 ++ app/dialogs/preferences-dialog-utils.h | 6 + app/dialogs/preferences-dialog.c | 6 +- app/gegl/gimp-gegl.c | 51 +++--- app/widgets/Makefile.am | 2 + app/widgets/gimpcompressioncombobox.c | 212 +++++++++++++++++++++++++ app/widgets/gimpcompressioncombobox.h | 55 +++++++ app/widgets/gimppropwidgets.c | 102 ++++++++++++ app/widgets/gimppropwidgets.h | 27 ++-- app/widgets/meson.build | 1 + app/widgets/widgets-types.h | 1 + 14 files changed, 471 insertions(+), 33 deletions(-) create mode 100644 app/widgets/gimpcompressioncombobox.c create mode 100644 app/widgets/gimpcompressioncombobox.h diff --git a/app/config/gimpgeglconfig.c b/app/config/gimpgeglconfig.c index c876c939fc..1994c4477f 100644 --- a/app/config/gimpgeglconfig.c +++ b/app/config/gimpgeglconfig.c @@ -38,7 +38,9 @@ #include "gimp-intl.h" -#define GIMP_MAX_MEM_PROCESS (MIN (G_MAXSIZE, GIMP_MAX_MEMSIZE)) +#define GIMP_DEFAULT_SWAP_COMPRESSION "fast" + +#define GIMP_MAX_MEM_PROCESS (MIN (G_MAXSIZE, GIMP_MAX_MEMSIZE)) enum @@ -46,6 +48,7 @@ enum PROP_0, PROP_TEMP_PATH, PROP_SWAP_PATH, + PROP_SWAP_COMPRESSION, PROP_NUM_PROCESSORS, PROP_TILE_CACHE_SIZE, PROP_USE_OPENCL, @@ -105,6 +108,13 @@ gimp_gegl_config_class_init (GimpGeglConfigClass *klass) GIMP_PARAM_STATIC_STRINGS | GIMP_CONFIG_PARAM_RESTART); + GIMP_CONFIG_PROP_STRING (object_class, PROP_SWAP_COMPRESSION, + "swap-compression", + "Swap compression", + SWAP_COMPRESSION_BLURB, + GIMP_DEFAULT_SWAP_COMPRESSION, + GIMP_PARAM_STATIC_STRINGS); + n_threads = g_get_num_processors (); max_n_threads = @@ -174,6 +184,7 @@ gimp_gegl_config_finalize (GObject *object) g_free (gegl_config->temp_path); g_free (gegl_config->swap_path); + g_free (gegl_config->swap_compression); gimp_debug_remove_instance (object); @@ -198,6 +209,10 @@ gimp_gegl_config_set_property (GObject *object, g_free (gegl_config->swap_path); gegl_config->swap_path = g_value_dup_string (value); break; + case PROP_SWAP_COMPRESSION: + g_free (gegl_config->swap_compression); + gegl_config->swap_compression = g_value_dup_string (value); + break; case PROP_NUM_PROCESSORS: gegl_config->num_processors = g_value_get_int (value); break; @@ -234,6 +249,9 @@ gimp_gegl_config_get_property (GObject *object, case PROP_SWAP_PATH: g_value_set_string (value, gegl_config->swap_path); break; + case PROP_SWAP_COMPRESSION: + g_value_set_string (value, gegl_config->swap_compression); + break; case PROP_NUM_PROCESSORS: g_value_set_int (value, gegl_config->num_processors); break; diff --git a/app/config/gimpgeglconfig.h b/app/config/gimpgeglconfig.h index 88ade82cea..4806a22065 100644 --- a/app/config/gimpgeglconfig.h +++ b/app/config/gimpgeglconfig.h @@ -37,6 +37,7 @@ struct _GimpGeglConfig gchar *temp_path; gchar *swap_path; + gchar *swap_compression; gint num_processors; guint64 tile_cache_size; gboolean use_opencl; diff --git a/app/config/gimprc-blurbs.h b/app/config/gimprc-blurbs.h index 9cc9a7f3dd..50e7e5bf85 100644 --- a/app/config/gimprc-blurbs.h +++ b/app/config/gimprc-blurbs.h @@ -456,6 +456,9 @@ _("Enable the Seamless Clone tool.") #define SPACE_BAR_ACTION_BLURB \ _("What to do when the space bar is pressed in the image window.") +#define SWAP_COMPRESSION_BLURB \ +_("The compression method used for tile data stored in the swap file.") + #define SWAP_PATH_BLURB \ _("Sets the swap file location. GIMP uses a tile based memory allocation " \ "scheme. The swap file is used to quickly and easily swap tiles out to " \ diff --git a/app/dialogs/preferences-dialog-utils.c b/app/dialogs/preferences-dialog-utils.c index 730bd50315..43a504c6be 100644 --- a/app/dialogs/preferences-dialog-utils.c +++ b/app/dialogs/preferences-dialog-utils.c @@ -390,3 +390,20 @@ prefs_profile_combo_box_add (GObject *config, return combo; } + +GtkWidget * +prefs_compression_combo_box_add (GObject *config, + const gchar *property_name, + const gchar *label, + GtkGrid *grid, + gint grid_top, + GtkSizeGroup *group) +{ + GtkWidget *combo = gimp_prop_compression_combo_box_new (config, + property_name); + + if (combo) + prefs_widget_add_aligned (combo, label, grid, grid_top, FALSE, group); + + return combo; +} diff --git a/app/dialogs/preferences-dialog-utils.h b/app/dialogs/preferences-dialog-utils.h index 2962a2cb26..3b7fae5a96 100644 --- a/app/dialogs/preferences-dialog-utils.h +++ b/app/dialogs/preferences-dialog-utils.h @@ -122,6 +122,12 @@ GtkWidget * prefs_profile_combo_box_add (GObject *config, GtkSizeGroup *group, GObject *profile_path_config, const gchar *profile_path_property_name); +GtkWidget * prefs_compression_combo_box_add (GObject *config, + const gchar *property_name, + const gchar *label, + GtkGrid *grid, + gint grid_top, + GtkSizeGroup *group); #endif /* __PREFERENCES_DIALOG_H__ */ diff --git a/app/dialogs/preferences-dialog.c b/app/dialogs/preferences-dialog.c index df5beeddcd..cb57bd994d 100644 --- a/app/dialogs/preferences-dialog.c +++ b/app/dialogs/preferences-dialog.c @@ -1185,10 +1185,14 @@ prefs_dialog_new (Gimp *gimp, _("Maximum _new image size:"), GTK_GRID (grid), 3, size_group); + prefs_compression_combo_box_add (object, "swap-compression", + _("S_wap compression:"), + GTK_GRID (grid), 4, size_group); + #ifdef ENABLE_MP prefs_spin_button_add (object, "num-processors", 1.0, 4.0, 0, _("Number of _threads to use:"), - GTK_GRID (grid), 4, size_group); + GTK_GRID (grid), 5, size_group); #endif /* ENABLE_MP */ /* Hardware Acceleration */ diff --git a/app/gegl/gimp-gegl.c b/app/gegl/gimp-gegl.c index 6c7987b432..64046b607a 100644 --- a/app/gegl/gimp-gegl.c +++ b/app/gegl/gimp-gegl.c @@ -40,11 +40,12 @@ #include -static void gimp_gegl_notify_swap_path (GimpGeglConfig *config); -static void gimp_gegl_notify_temp_path (GimpGeglConfig *config); -static void gimp_gegl_notify_tile_cache_size (GimpGeglConfig *config); -static void gimp_gegl_notify_num_processors (GimpGeglConfig *config); -static void gimp_gegl_notify_use_opencl (GimpGeglConfig *config); +static void gimp_gegl_notify_temp_path (GimpGeglConfig *config); +static void gimp_gegl_notify_swap_path (GimpGeglConfig *config); +static void gimp_gegl_notify_swap_compression (GimpGeglConfig *config); +static void gimp_gegl_notify_tile_cache_size (GimpGeglConfig *config); +static void gimp_gegl_notify_num_processors (GimpGeglConfig *config); +static void gimp_gegl_notify_use_opencl (GimpGeglConfig *config); /* public functions */ @@ -58,23 +59,27 @@ gimp_gegl_init (Gimp *gimp) config = GIMP_GEGL_CONFIG (gimp->config); - /* make sure swap and temp directories exist */ - gimp_gegl_notify_swap_path (config); + /* make sure temp and swap directories exist */ gimp_gegl_notify_temp_path (config); + gimp_gegl_notify_swap_path (config); g_object_set (gegl_config (), - "tile-cache-size", (guint64) config->tile_cache_size, - "threads", config->num_processors, - "use-opencl", config->use_opencl, + "swap-compression", config->swap_compression, + "tile-cache-size", (guint64) config->tile_cache_size, + "threads", config->num_processors, + "use-opencl", config->use_opencl, NULL); gimp_parallel_init (gimp); + g_signal_connect (config, "notify::temp-path", + G_CALLBACK (gimp_gegl_notify_temp_path), + NULL); g_signal_connect (config, "notify::swap-path", G_CALLBACK (gimp_gegl_notify_swap_path), NULL); - g_signal_connect (config, "notify::temp-path", - G_CALLBACK (gimp_gegl_notify_temp_path), + g_signal_connect (config, "notify::swap-compression", + G_CALLBACK (gimp_gegl_notify_swap_compression), NULL); g_signal_connect (config, "notify::num-processors", G_CALLBACK (gimp_gegl_notify_num_processors), @@ -105,6 +110,17 @@ gimp_gegl_exit (Gimp *gimp) /* private functions */ +static void +gimp_gegl_notify_temp_path (GimpGeglConfig *config) +{ + GFile *file = gimp_file_new_for_config_path (config->temp_path, NULL); + + if (! g_file_query_exists (file, NULL)) + g_file_make_directory_with_parents (file, NULL, NULL); + + g_object_unref (file); +} + static void gimp_gegl_notify_swap_path (GimpGeglConfig *config) { @@ -123,14 +139,11 @@ gimp_gegl_notify_swap_path (GimpGeglConfig *config) } static void -gimp_gegl_notify_temp_path (GimpGeglConfig *config) +gimp_gegl_notify_swap_compression (GimpGeglConfig *config) { - GFile *file = gimp_file_new_for_config_path (config->temp_path, NULL); - - if (! g_file_query_exists (file, NULL)) - g_file_make_directory_with_parents (file, NULL, NULL); - - g_object_unref (file); + g_object_set (gegl_config (), + "swap-compression", config->swap_compression, + NULL); } static void diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am index 9ba197e811..7c510acbc8 100644 --- a/app/widgets/Makefile.am +++ b/app/widgets/Makefile.am @@ -96,6 +96,8 @@ libappwidgets_a_sources = \ gimpcombotagentry.h \ gimpcomponenteditor.c \ gimpcomponenteditor.h \ + gimpcompressioncombobox.c \ + gimpcompressioncombobox.h \ gimpcontainerbox.c \ gimpcontainerbox.h \ gimpcontainercombobox.c \ diff --git a/app/widgets/gimpcompressioncombobox.c b/app/widgets/gimpcompressioncombobox.c new file mode 100644 index 0000000000..917237ebae --- /dev/null +++ b/app/widgets/gimpcompressioncombobox.c @@ -0,0 +1,212 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpcompressioncombobox.c + * Copyright (C) 2004, 2008 Sven Neumann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "config.h" + +#include "stdlib.h" + +#include +#include + +#include "libgimpwidgets/gimpwidgets.h" + +#include "widgets-types.h" + +#include "gimpcompressioncombobox.h" + +#include "gimp-intl.h" + + +enum +{ + COLUMN_ID, + COLUMN_LABEL, + N_COLUMNS +}; + + +/* local function prototypes */ + +static void gimp_compression_combo_box_constructed (GObject *object); + +static gboolean gimp_compression_combo_box_separator_func (GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data); + + +G_DEFINE_TYPE (GimpCompressionComboBox, gimp_compression_combo_box, + GIMP_TYPE_STRING_COMBO_BOX) + +#define parent_class gimp_compression_combo_box_parent_class + + +/* private functions */ + +static void +gimp_compression_combo_box_class_init (GimpCompressionComboBoxClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = gimp_compression_combo_box_constructed; +} + +static void +gimp_compression_combo_box_init (GimpCompressionComboBox *combo_box) +{ +} + +static void +gimp_compression_combo_box_constructed (GObject *object) +{ + GimpCompressionComboBox *combo_box = GIMP_COMPRESSION_COMBO_BOX (object); + GtkCellLayout *layout; + GtkCellRenderer *cell; + GtkListStore *store; + GtkTreeIter iter; + + G_OBJECT_CLASS (parent_class)->constructed (object); + + store = gtk_list_store_new (N_COLUMNS, + G_TYPE_STRING, /* ID */ + G_TYPE_STRING); /* LABEL */ + + gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box), GTK_TREE_MODEL (store)); + g_object_unref (store); + + gtk_combo_box_set_row_separator_func ( + GTK_COMBO_BOX (combo_box), + gimp_compression_combo_box_separator_func, + NULL, + NULL); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COLUMN_ID, "none", + COLUMN_LABEL, C_("compression", "None"), + -1); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COLUMN_ID, NULL, + COLUMN_LABEL, NULL, + -1); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COLUMN_ID, "fast", + COLUMN_LABEL, C_("compression", "Best performance"), + -1); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COLUMN_ID, "balanced", + COLUMN_LABEL, C_("compression", "Balanced"), + -1); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COLUMN_ID, "best", + COLUMN_LABEL, C_("compression", "Best compression"), + -1); + + gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (combo_box), + COLUMN_LABEL); + + layout = GTK_CELL_LAYOUT (combo_box); + + cell = gtk_cell_renderer_text_new (); + + gtk_cell_layout_clear (layout); + gtk_cell_layout_pack_start (layout, cell, TRUE); + gtk_cell_layout_set_attributes (layout, cell, + "text", COLUMN_LABEL, + NULL); +} + +static gboolean +gimp_compression_combo_box_separator_func (GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data) +{ + gchar *value; + gboolean result; + + gtk_tree_model_get (model, iter, COLUMN_ID, &value, -1); + + result = ! value; + + g_free (value); + + return result; +} + + +/* public functions */ + +GtkWidget * +gimp_compression_combo_box_new (void) +{ + return g_object_new (GIMP_TYPE_COMPRESSION_COMBO_BOX, + "has-entry", TRUE, + "id-column", COLUMN_ID, + "label-column", COLUMN_LABEL, + NULL); +} + +void +gimp_compression_combo_box_set_compression (GimpCompressionComboBox *combo_box, + const gchar *compression) +{ + g_return_if_fail (GIMP_IS_COMPRESSION_COMBO_BOX (combo_box)); + g_return_if_fail (compression != NULL); + + if (! gimp_string_combo_box_set_active (GIMP_STRING_COMBO_BOX (combo_box), + compression)) + { + GtkWidget *entry; + + entry = gtk_bin_get_child (GTK_BIN (combo_box)); + + gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), -1); + + gtk_entry_set_text (GTK_ENTRY (entry), compression); + } +} + +gchar * +gimp_compression_combo_box_get_compression (GimpCompressionComboBox *combo_box) +{ + gchar *result; + + g_return_val_if_fail (GIMP_IS_COMPRESSION_COMBO_BOX (combo_box), NULL); + + result = gimp_string_combo_box_get_active (GIMP_STRING_COMBO_BOX (combo_box)); + + if (! result) + { + GtkWidget *entry; + + entry = gtk_bin_get_child (GTK_BIN (combo_box)); + + result = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); + } + + return result; +} diff --git a/app/widgets/gimpcompressioncombobox.h b/app/widgets/gimpcompressioncombobox.h new file mode 100644 index 0000000000..71ac4502e1 --- /dev/null +++ b/app/widgets/gimpcompressioncombobox.h @@ -0,0 +1,55 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpcompressioncombobox.h + * Copyright (C) 2019 Ell + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __GIMP_COMPRESSION_COMBO_BOX_H__ +#define __GIMP_COMPRESSION_COMBO_BOX_H__ + + +#define GIMP_TYPE_COMPRESSION_COMBO_BOX (gimp_compression_combo_box_get_type ()) +#define GIMP_COMPRESSION_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_COMPRESSION_COMBO_BOX, GimpCompressionComboBox)) +#define GIMP_COMPRESSION_COMBO_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_COMPRESSION_COMBO_BOX, GimpCompressionComboBoxClass)) +#define GIMP_IS_COMPRESSION_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_COMPRESSION_COMBO_BOX)) +#define GIMP_IS_COMPRESSION_COMBO_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_COMPRESSION_COMBO_BOX)) +#define GIMP_COMPRESSION_COMBO_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_COMPRESSION_COMBO_BOX, GimpCompressionComboBoxClass)) + + +typedef struct _GimpCompressionComboBoxClass GimpCompressionComboBoxClass; + + +struct _GimpCompressionComboBox +{ + GimpStringComboBox parent_instance; +}; + +struct _GimpCompressionComboBoxClass +{ + GimpStringComboBoxClass parent_instance; +}; + + +GType gimp_compression_combo_box_get_type (void) G_GNUC_CONST; + +GtkWidget * gimp_compression_combo_box_new (void); + +void gimp_compression_combo_box_set_compression (GimpCompressionComboBox *combo_box, + const gchar *compression); +gchar * gimp_compression_combo_box_get_compression (GimpCompressionComboBox *combo_box); + +#endif /* __GIMP_COMPRESSION_COMBO_BOX_H__ */ diff --git a/app/widgets/gimppropwidgets.c b/app/widgets/gimppropwidgets.c index afc5b76d9c..68a1fdaf24 100644 --- a/app/widgets/gimppropwidgets.c +++ b/app/widgets/gimppropwidgets.c @@ -40,6 +40,7 @@ #include "core/gimpviewable.h" #include "gimpcolorpanel.h" +#include "gimpcompressioncombobox.h" #include "gimpdial.h" #include "gimpdnd.h" #include "gimpiconpicker.h" @@ -1745,6 +1746,107 @@ gimp_prop_profile_combo_notify (GObject *config, } +/***************************/ +/* compression combo box */ +/***************************/ + +static void gimp_prop_compression_combo_box_callback (GtkWidget *combo, + GObject *config); +static void gimp_prop_compression_combo_box_notify (GObject *config, + GParamSpec *param_spec, + GtkWidget *combo); + +GtkWidget * +gimp_prop_compression_combo_box_new (GObject *config, + const gchar *property_name) +{ + GParamSpec *param_spec; + GtkWidget *combo; + gchar *value; + + param_spec = check_param_spec_w (config, property_name, + G_TYPE_PARAM_STRING, G_STRFUNC); + if (! param_spec) + return NULL; + + combo = gimp_compression_combo_box_new (); + + g_object_get (config, + property_name, &value, + NULL); + + gimp_compression_combo_box_set_compression ( + GIMP_COMPRESSION_COMBO_BOX (combo), value); + g_free (value); + + set_param_spec (G_OBJECT (combo), combo, param_spec); + + g_signal_connect (combo, "changed", + G_CALLBACK (gimp_prop_compression_combo_box_callback), + config); + + connect_notify (config, property_name, + G_CALLBACK (gimp_prop_compression_combo_box_notify), + combo); + + return combo; +} + +static void +gimp_prop_compression_combo_box_callback (GtkWidget *combo, + GObject *config) +{ + GParamSpec *param_spec; + gchar *compression; + + param_spec = get_param_spec (G_OBJECT (combo)); + if (! param_spec) + return; + + compression = gimp_compression_combo_box_get_compression ( + GIMP_COMPRESSION_COMBO_BOX (combo)); + + g_signal_handlers_block_by_func (config, + gimp_prop_compression_combo_box_notify, + combo); + + g_object_set (config, + param_spec->name, compression, + NULL); + + g_signal_handlers_unblock_by_func (config, + gimp_prop_compression_combo_box_notify, + combo); + + g_free (compression); +} + +static void +gimp_prop_compression_combo_box_notify (GObject *config, + GParamSpec *param_spec, + GtkWidget *combo) +{ + gchar *value; + + g_object_get (config, + param_spec->name, &value, + NULL); + + g_signal_handlers_block_by_func (combo, + gimp_prop_compression_combo_box_callback, + config); + + gimp_compression_combo_box_set_compression ( + GIMP_COMPRESSION_COMBO_BOX (combo), value); + + g_signal_handlers_unblock_by_func (combo, + gimp_prop_compression_combo_box_callback, + config); + + g_free (value); +} + + /*****************/ /* icon picker */ /*****************/ diff --git a/app/widgets/gimppropwidgets.h b/app/widgets/gimppropwidgets.h index 5548b3ec8c..eb4778a935 100644 --- a/app/widgets/gimppropwidgets.h +++ b/app/widgets/gimppropwidgets.h @@ -108,20 +108,23 @@ GtkWidget * gimp_prop_number_pair_entry_new (GObject *config, /* GParamString */ -GtkWidget * gimp_prop_language_combo_box_new (GObject *config, - const gchar *property_name); -GtkWidget * gimp_prop_language_entry_new (GObject *config, - const gchar *property_name); +GtkWidget * gimp_prop_language_combo_box_new (GObject *config, + const gchar *property_name); +GtkWidget * gimp_prop_language_entry_new (GObject *config, + const gchar *property_name); -GtkWidget * gimp_prop_profile_combo_box_new (GObject *config, - const gchar *property_name, - GtkListStore *profile_store, - const gchar *dialog_title, - GObject *profile_path_config, - const gchar *profile_path_property_name); +GtkWidget * gimp_prop_profile_combo_box_new (GObject *config, + const gchar *property_name, + GtkListStore *profile_store, + const gchar *dialog_title, + GObject *profile_path_config, + const gchar *profile_path_property_name); -GtkWidget * gimp_prop_icon_picker_new (GimpViewable *viewable, - Gimp *gimp); +GtkWidget * gimp_prop_compression_combo_box_new (GObject *config, + const gchar *property_name); + +GtkWidget * gimp_prop_icon_picker_new (GimpViewable *viewable, + Gimp *gimp); /* Utility functions */ diff --git a/app/widgets/meson.build b/app/widgets/meson.build index 52aa3009c9..d9fce26a31 100644 --- a/app/widgets/meson.build +++ b/app/widgets/meson.build @@ -40,6 +40,7 @@ libappwidgets_sources = [ 'gimpcolorselectorpalette.c', 'gimpcombotagentry.c', 'gimpcomponenteditor.c', + 'gimpcompressioncombobox.c', 'gimpcontainerbox.c', 'gimpcontainercombobox.c', 'gimpcontainereditor.c', diff --git a/app/widgets/widgets-types.h b/app/widgets/widgets-types.h index 1fb3910bb8..ee15b6016a 100644 --- a/app/widgets/widgets-types.h +++ b/app/widgets/widgets-types.h @@ -178,6 +178,7 @@ typedef struct _GimpColorHistory GimpColorHistory; typedef struct _GimpColormapSelection GimpColormapSelection; typedef struct _GimpColorPanel GimpColorPanel; typedef struct _GimpComboTagEntry GimpComboTagEntry; +typedef struct _GimpCompressionComboBox GimpCompressionComboBox; typedef struct _GimpControllerEditor GimpControllerEditor; typedef struct _GimpControllerList GimpControllerList; typedef struct _GimpCurveView GimpCurveView;