diff --git a/app/actions/view-actions.c b/app/actions/view-actions.c index 75899d1ea0..bf6cff0fc3 100644 --- a/app/actions/view-actions.c +++ b/app/actions/view-actions.c @@ -22,6 +22,7 @@ #include "libgimpmath/gimpmath.h" #include "libgimpcolor/gimpcolor.h" +#include "libgimpconfig/gimpconfig.h" #include "libgimpwidgets/gimpwidgets.h" #include "actions-types.h" @@ -70,6 +71,10 @@ static const GimpActionEntry view_actions[] = { "view-zoom-menu", NULL, NC_("view-action", "_Zoom") }, { "view-rotate-menu", NULL, NC_("view-action", "_Flip & Rotate") }, { "view-padding-color-menu", NULL, NC_("view-action", "_Padding Color") }, + + { "view-color-management-menu", NULL, + NC_("view-action", "_Color Management") }, + { "view-move-to-screen-menu", GIMP_STOCK_MOVE_TO_SCREEN, NC_("view-action", "Move to Screen"), NULL, NULL, NULL, GIMP_HELP_VIEW_CHANGE_SCREEN }, @@ -128,6 +133,13 @@ static const GimpActionEntry view_actions[] = G_CALLBACK (view_display_filters_cmd_callback), GIMP_HELP_DISPLAY_FILTER_DIALOG }, + { "view-color-management-reset", GIMP_STOCK_RESET, + NC_("view-action", "As in _Preferences"), NULL, + NC_("view-action", + "Reset color management to what's configured in preferences"), + G_CALLBACK (view_color_management_reset_cmd_callback), + GIMP_HELP_VIEW_COLOR_MANAGEMENT }, + { "view-shrink-wrap", "zoom-fit-best", NC_("view-action", "Shrink _Wrap"), "J", NC_("view-action", "Reduce the image window to the size of the image display"), @@ -457,6 +469,27 @@ static const GimpEnumActionEntry view_rotate_relative_actions[] = GIMP_HELP_VIEW_ROTATE_345 } }; +static const GimpRadioActionEntry view_color_management_mode_actions[] = +{ + { "view-color-management-mode-off", NULL, + NC_("view-action", "_No Color Management"), NULL, + NC_("view-action", "Don't color manage this view"), + GIMP_COLOR_MANAGEMENT_OFF, + GIMP_HELP_VIEW_COLOR_MANAGEMENT }, + + { "view-color-management-mode-display", NULL, + NC_("view-action", "_Color Managed Display"), NULL, + NC_("view-action", "Color manage this view"), + GIMP_COLOR_MANAGEMENT_DISPLAY, + GIMP_HELP_VIEW_COLOR_MANAGEMENT }, + + { "view-color-management-mode-softproof", NULL, + NC_("view-action", "_Print Simulation"), NULL, + NC_("view-action", "Use this view for softproofing"), + GIMP_COLOR_MANAGEMENT_SOFTPROOF, + GIMP_HELP_VIEW_COLOR_MANAGEMENT } +}; + static const GimpEnumActionEntry view_padding_color_actions[] = { { "view-padding-color-theme", NULL, @@ -607,6 +640,13 @@ view_actions_setup (GimpActionGroup *group) G_N_ELEMENTS (view_rotate_relative_actions), G_CALLBACK (view_rotate_relative_cmd_callback)); + gimp_action_group_add_radio_actions (group, "view-action", + view_color_management_mode_actions, + G_N_ELEMENTS (view_color_management_mode_actions), + NULL, + GIMP_COLOR_MANAGEMENT_DISPLAY, + G_CALLBACK (view_color_management_mode_cmd_callback)); + gimp_action_group_add_enum_actions (group, "view-padding-color", view_padding_color_actions, G_N_ELEMENTS (view_padding_color_actions), @@ -657,6 +697,7 @@ view_actions_update (GimpActionGroup *group, GimpImage *image = NULL; GimpDisplayShell *shell = NULL; GimpDisplayOptions *options = NULL; + GimpColorConfig *color_config = NULL; gchar *label = NULL; gboolean fullscreen = FALSE; gboolean revert_enabled = FALSE; /* able to revert zoom? */ @@ -666,6 +707,7 @@ view_actions_update (GimpActionGroup *group, if (display) { GimpImageWindow *window; + const gchar *action = NULL; image = gimp_display_get_image (display); shell = gimp_display_get_shell (display); @@ -682,6 +724,24 @@ view_actions_update (GimpActionGroup *group, flip_horizontally = shell->flip_horizontally; flip_vertically = shell->flip_vertically; + + color_config = gimp_display_shell_get_color_config (shell); + + switch (color_config->mode) + { + case GIMP_COLOR_MANAGEMENT_OFF: + action = "view-color-management-mode-off"; + break; + + case GIMP_COLOR_MANAGEMENT_DISPLAY: + action = "view-color-management-mode-display"; + break; + case GIMP_COLOR_MANAGEMENT_SOFTPROOF: + action = "view-color-management-mode-softproof"; + break; + } + + gimp_action_group_set_action_active (group, action, TRUE); } #define SET_ACTIVE(action,condition) \ @@ -765,6 +825,11 @@ view_actions_update (GimpActionGroup *group, SET_SENSITIVE ("view-navigation-window", image); SET_SENSITIVE ("view-display-filters", image); + SET_SENSITIVE ("view-color-management-mode-off", image); + SET_SENSITIVE ("view-color-management-mode-display", image); + SET_SENSITIVE ("view-color-management-mode-softproof", image); + SET_SENSITIVE ("view-color-management-reset", image); + SET_SENSITIVE ("view-show-selection", image); SET_ACTIVE ("view-show-selection", display && options->show_selection); SET_SENSITIVE ("view-show-layer-boundary", image); diff --git a/app/actions/view-commands.c b/app/actions/view-commands.c index 08e0a41d5d..20410741e0 100644 --- a/app/actions/view-commands.c +++ b/app/actions/view-commands.c @@ -21,6 +21,7 @@ #include #include "libgimpmath/gimpmath.h" +#include "libgimpconfig/gimpconfig.h" #include "libgimpwidgets/gimpwidgets.h" #include "actions-types.h" @@ -485,6 +486,47 @@ view_display_filters_cmd_callback (GtkAction *action, gtk_window_present (GTK_WINDOW (shell->filters_dialog)); } +void +view_color_management_reset_cmd_callback (GtkAction *action, + gpointer data) +{ + GimpDisplayShell *shell; + GimpColorConfig *global_config; + GimpColorConfig *shell_config; + return_if_no_shell (shell, data); + + global_config = GIMP_CORE_CONFIG (shell->display->config)->color_management; + shell_config = gimp_display_shell_get_color_config (shell); + + gimp_config_copy (GIMP_CONFIG (global_config), + GIMP_CONFIG (shell_config), + 0); + shell->color_config_set = FALSE; +} + +void +view_color_management_mode_cmd_callback (GtkAction *action, + GtkAction *current, + gpointer data) +{ + GimpDisplayShell *shell; + GimpColorConfig *color_config; + GimpColorManagementMode value; + return_if_no_shell (shell, data); + + color_config = gimp_display_shell_get_color_config (shell); + + value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action)); + + if (value != color_config->mode) + { + g_object_set (color_config, + "mode", value, + NULL); + shell->color_config_set = TRUE; + } +} + void view_toggle_selection_cmd_callback (GtkAction *action, gpointer data) diff --git a/app/actions/view-commands.h b/app/actions/view-commands.h index 91b3a3a871..3af3289580 100644 --- a/app/actions/view-commands.h +++ b/app/actions/view-commands.h @@ -19,90 +19,97 @@ #define __VIEW_COMMANDS_H__ -void view_new_cmd_callback (GtkAction *action, - gpointer data); -void view_close_cmd_callback (GtkAction *action, - gpointer data); +void view_new_cmd_callback (GtkAction *action, + gpointer data); +void view_close_cmd_callback (GtkAction *action, + gpointer data); -void view_zoom_fit_in_cmd_callback (GtkAction *action, - gpointer data); -void view_zoom_fill_cmd_callback (GtkAction *action, - gpointer data); -void view_zoom_selection_cmd_callback (GtkAction *action, - gpointer data); -void view_zoom_revert_cmd_callback (GtkAction *action, - gpointer data); -void view_zoom_cmd_callback (GtkAction *action, - gint value, - gpointer data); -void view_zoom_explicit_cmd_callback (GtkAction *action, - GtkAction *current, - gpointer data); -void view_zoom_other_cmd_callback (GtkAction *action, - gpointer data); -void view_dot_for_dot_cmd_callback (GtkAction *action, - gpointer data); +void view_zoom_fit_in_cmd_callback (GtkAction *action, + gpointer data); +void view_zoom_fill_cmd_callback (GtkAction *action, + gpointer data); +void view_zoom_selection_cmd_callback (GtkAction *action, + gpointer data); +void view_zoom_revert_cmd_callback (GtkAction *action, + gpointer data); +void view_zoom_cmd_callback (GtkAction *action, + gint value, + gpointer data); +void view_zoom_explicit_cmd_callback (GtkAction *action, + GtkAction *current, + gpointer data); +void view_zoom_other_cmd_callback (GtkAction *action, + gpointer data); +void view_dot_for_dot_cmd_callback (GtkAction *action, + gpointer data); -void view_scroll_horizontal_cmd_callback (GtkAction *action, - gint value, - gpointer data); -void view_scroll_vertical_cmd_callback (GtkAction *action, - gint value, - gpointer data); +void view_scroll_horizontal_cmd_callback (GtkAction *action, + gint value, + gpointer data); +void view_scroll_vertical_cmd_callback (GtkAction *action, + gint value, + gpointer data); -void view_flip_horizontally_cmd_callback (GtkAction *action, - gpointer data); -void view_flip_vertically_cmd_callback (GtkAction *action, - gpointer data); +void view_flip_horizontally_cmd_callback (GtkAction *action, + gpointer data); +void view_flip_vertically_cmd_callback (GtkAction *action, + gpointer data); -void view_rotate_absolute_cmd_callback (GtkAction *action, - gint value, - gpointer data); -void view_rotate_relative_cmd_callback (GtkAction *action, - gint value, - gpointer data); -void view_rotate_other_cmd_callback (GtkAction *action, - gpointer data); +void view_rotate_absolute_cmd_callback (GtkAction *action, + gint value, + gpointer data); +void view_rotate_relative_cmd_callback (GtkAction *action, + gint value, + gpointer data); +void view_rotate_other_cmd_callback (GtkAction *action, + gpointer data); -void view_navigation_window_cmd_callback (GtkAction *action, - gpointer data); -void view_display_filters_cmd_callback (GtkAction *action, - gpointer data); -void view_toggle_selection_cmd_callback (GtkAction *action, - gpointer data); -void view_toggle_layer_boundary_cmd_callback (GtkAction *action, - gpointer data); -void view_toggle_menubar_cmd_callback (GtkAction *action, - gpointer data); -void view_toggle_rulers_cmd_callback (GtkAction *action, - gpointer data); -void view_toggle_scrollbars_cmd_callback (GtkAction *action, - gpointer data); -void view_toggle_statusbar_cmd_callback (GtkAction *action, - gpointer data); -void view_toggle_guides_cmd_callback (GtkAction *action, - gpointer data); -void view_toggle_grid_cmd_callback (GtkAction *action, - gpointer data); -void view_toggle_sample_points_cmd_callback (GtkAction *action, - gpointer data); +void view_navigation_window_cmd_callback (GtkAction *action, + gpointer data); +void view_display_filters_cmd_callback (GtkAction *action, + gpointer data); -void view_snap_to_guides_cmd_callback (GtkAction *action, - gpointer data); -void view_snap_to_grid_cmd_callback (GtkAction *action, - gpointer data); -void view_snap_to_canvas_cmd_callback (GtkAction *action, - gpointer data); -void view_snap_to_vectors_cmd_callback (GtkAction *action, - gpointer data); -void view_padding_color_cmd_callback (GtkAction *action, - gint value, - gpointer data); +void view_color_management_reset_cmd_callback (GtkAction *action, + gpointer data); +void view_color_management_mode_cmd_callback (GtkAction *action, + GtkAction *current, + gpointer data); -void view_shrink_wrap_cmd_callback (GtkAction *action, - gpointer data); -void view_fullscreen_cmd_callback (GtkAction *action, - gpointer data); +void view_toggle_selection_cmd_callback (GtkAction *action, + gpointer data); +void view_toggle_layer_boundary_cmd_callback (GtkAction *action, + gpointer data); +void view_toggle_menubar_cmd_callback (GtkAction *action, + gpointer data); +void view_toggle_rulers_cmd_callback (GtkAction *action, + gpointer data); +void view_toggle_scrollbars_cmd_callback (GtkAction *action, + gpointer data); +void view_toggle_statusbar_cmd_callback (GtkAction *action, + gpointer data); +void view_toggle_guides_cmd_callback (GtkAction *action, + gpointer data); +void view_toggle_grid_cmd_callback (GtkAction *action, + gpointer data); +void view_toggle_sample_points_cmd_callback (GtkAction *action, + gpointer data); + +void view_snap_to_guides_cmd_callback (GtkAction *action, + gpointer data); +void view_snap_to_grid_cmd_callback (GtkAction *action, + gpointer data); +void view_snap_to_canvas_cmd_callback (GtkAction *action, + gpointer data); +void view_snap_to_vectors_cmd_callback (GtkAction *action, + gpointer data); +void view_padding_color_cmd_callback (GtkAction *action, + gint value, + gpointer data); + +void view_shrink_wrap_cmd_callback (GtkAction *action, + gpointer data); +void view_fullscreen_cmd_callback (GtkAction *action, + gpointer data); #endif /* __VIEW_COMMANDS_H__ */ diff --git a/app/display/gimpdisplayshell-handlers.c b/app/display/gimpdisplayshell-handlers.c index 2f0f3afc33..42ead42930 100644 --- a/app/display/gimpdisplayshell-handlers.c +++ b/app/display/gimpdisplayshell-handlers.c @@ -22,6 +22,7 @@ #include "libgimpbase/gimpbase.h" #include "libgimpcolor/gimpcolor.h" +#include "libgimpconfig/gimpconfig.h" #include "libgimpmath/gimpmath.h" #include "libgimpwidgets/gimpwidgets.h" @@ -167,6 +168,9 @@ static void gimp_display_shell_ants_speed_notify_handler (GObject *c static void gimp_display_shell_quality_notify_handler (GObject *config, GParamSpec *param_spec, GimpDisplayShell *shell); +static void gimp_display_shell_color_config_notify_handler (GObject *config, + GParamSpec *param_spec, + GimpDisplayShell *shell); /* public functions */ @@ -174,18 +178,24 @@ static void gimp_display_shell_quality_notify_handler (GObject *c void gimp_display_shell_connect (GimpDisplayShell *shell) { - GimpImage *image; - GimpContainer *vectors; - GList *list; + GimpImage *image; + GimpContainer *vectors; + GimpDisplayConfig *config; + GimpColorConfig *color_config; + GList *list; g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); g_return_if_fail (GIMP_IS_DISPLAY (shell->display)); - image = gimp_display_get_image (shell->display); - vectors = gimp_image_get_vectors (image); + image = gimp_display_get_image (shell->display); g_return_if_fail (GIMP_IS_IMAGE (image)); + vectors = gimp_image_get_vectors (image); + + config = shell->display->config; + color_config = GIMP_CORE_CONFIG (config)->color_management; + g_signal_connect (image, "clean", G_CALLBACK (gimp_display_shell_clean_dirty_handler), shell); @@ -298,71 +308,78 @@ gimp_display_shell_connect (GimpDisplayShell *shell) gimp_display_shell_vectors_add_handler (vectors, list->data, shell); } - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::transparency-size", G_CALLBACK (gimp_display_shell_check_notify_handler), shell); - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::transparency-type", G_CALLBACK (gimp_display_shell_check_notify_handler), shell); - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::image-title-format", G_CALLBACK (gimp_display_shell_title_notify_handler), shell); - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::image-status-format", G_CALLBACK (gimp_display_shell_title_notify_handler), shell); - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::navigation-preview-size", G_CALLBACK (gimp_display_shell_nav_size_notify_handler), shell); - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::monitor-resolution-from-windowing-system", G_CALLBACK (gimp_display_shell_monitor_res_notify_handler), shell); - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::monitor-xresolution", G_CALLBACK (gimp_display_shell_monitor_res_notify_handler), shell); - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::monitor-yresolution", G_CALLBACK (gimp_display_shell_monitor_res_notify_handler), shell); - g_signal_connect (shell->display->config->default_view, + g_signal_connect (config->default_view, "notify::padding-mode", G_CALLBACK (gimp_display_shell_padding_notify_handler), shell); - g_signal_connect (shell->display->config->default_view, + g_signal_connect (config->default_view, "notify::padding-color", G_CALLBACK (gimp_display_shell_padding_notify_handler), shell); - g_signal_connect (shell->display->config->default_fullscreen_view, + g_signal_connect (config->default_fullscreen_view, "notify::padding-mode", G_CALLBACK (gimp_display_shell_padding_notify_handler), shell); - g_signal_connect (shell->display->config->default_fullscreen_view, + g_signal_connect (config->default_fullscreen_view, "notify::padding-color", G_CALLBACK (gimp_display_shell_padding_notify_handler), shell); - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::marching-ants-speed", G_CALLBACK (gimp_display_shell_ants_speed_notify_handler), shell); - g_signal_connect (shell->display->config, + g_signal_connect (config, "notify::zoom-quality", G_CALLBACK (gimp_display_shell_quality_notify_handler), shell); + g_signal_connect (color_config, "notify", + G_CALLBACK (gimp_display_shell_color_config_notify_handler), + shell); + gimp_display_shell_invalidate_preview_handler (image, shell); gimp_display_shell_quick_mask_changed_handler (image, shell); gimp_display_shell_profile_changed_handler (GIMP_COLOR_MANAGED (image), shell); + gimp_display_shell_color_config_notify_handler (G_OBJECT (color_config), + NULL, /* sync all */ + shell); gimp_canvas_layer_boundary_set_layer (GIMP_CANVAS_LAYER_BOUNDARY (shell->layer_boundary), gimp_image_get_active_layer (image)); @@ -371,9 +388,11 @@ gimp_display_shell_connect (GimpDisplayShell *shell) void gimp_display_shell_disconnect (GimpDisplayShell *shell) { - GimpImage *image; - GimpContainer *vectors; - GList *list; + GimpImage *image; + GimpContainer *vectors; + GimpDisplayConfig *config; + GimpColorConfig *color_config; + GList *list; g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); g_return_if_fail (GIMP_IS_DISPLAY (shell->display)); @@ -384,33 +403,41 @@ gimp_display_shell_disconnect (GimpDisplayShell *shell) vectors = gimp_image_get_vectors (image); + config = shell->display->config; + color_config = GIMP_CORE_CONFIG (config)->color_management; + gimp_display_shell_icon_update_stop (shell); gimp_canvas_layer_boundary_set_layer (GIMP_CANVAS_LAYER_BOUNDARY (shell->layer_boundary), NULL); - g_signal_handlers_disconnect_by_func (shell->display->config, + g_signal_handlers_disconnect_by_func (color_config, + gimp_display_shell_color_config_notify_handler, + shell); + shell->color_config_set = FALSE; + + g_signal_handlers_disconnect_by_func (config, gimp_display_shell_quality_notify_handler, shell); - g_signal_handlers_disconnect_by_func (shell->display->config, + g_signal_handlers_disconnect_by_func (config, gimp_display_shell_ants_speed_notify_handler, shell); - g_signal_handlers_disconnect_by_func (shell->display->config->default_fullscreen_view, + g_signal_handlers_disconnect_by_func (config->default_fullscreen_view, gimp_display_shell_padding_notify_handler, shell); - g_signal_handlers_disconnect_by_func (shell->display->config->default_view, + g_signal_handlers_disconnect_by_func (config->default_view, gimp_display_shell_padding_notify_handler, shell); - g_signal_handlers_disconnect_by_func (shell->display->config, + g_signal_handlers_disconnect_by_func (config, gimp_display_shell_monitor_res_notify_handler, shell); - g_signal_handlers_disconnect_by_func (shell->display->config, + g_signal_handlers_disconnect_by_func (config, gimp_display_shell_nav_size_notify_handler, shell); - g_signal_handlers_disconnect_by_func (shell->display->config, + g_signal_handlers_disconnect_by_func (config, gimp_display_shell_title_notify_handler, shell); - g_signal_handlers_disconnect_by_func (shell->display->config, + g_signal_handlers_disconnect_by_func (config, gimp_display_shell_check_notify_handler, shell); @@ -1089,3 +1116,41 @@ gimp_display_shell_quality_notify_handler (GObject *config, { gimp_display_shell_expose_full (shell); } + +static void +gimp_display_shell_color_config_notify_handler (GObject *config, + GParamSpec *param_spec, + GimpDisplayShell *shell) +{ + if (param_spec) + { + gboolean copy = TRUE; + + if (! strcmp (param_spec->name, "mode")) + { + if (shell->color_config_set) + copy = FALSE; + } + + if (copy) + { + GValue value = G_VALUE_INIT; + + g_value_init (&value, param_spec->value_type); + + g_object_get_property (config, + param_spec->name, &value); + g_object_set_property (G_OBJECT (shell->color_config), + param_spec->name, &value); + + g_value_unset (&value); + } + } + else + { + gimp_config_copy (GIMP_CONFIG (config), + GIMP_CONFIG (shell->color_config), + 0); + shell->color_config_set = FALSE; + } +} diff --git a/app/display/gimpdisplayshell-profile.c b/app/display/gimpdisplayshell-profile.c index 745b7add88..190ecdf611 100644 --- a/app/display/gimpdisplayshell-profile.c +++ b/app/display/gimpdisplayshell-profile.c @@ -30,6 +30,8 @@ #include "display-types.h" +#include "config/gimpcoreconfig.h" + #include "gegl/gimp-babl.h" #include "core/gimpimage.h" @@ -37,6 +39,7 @@ #include "gimpdisplay.h" #include "gimpdisplayshell.h" +#include "gimpdisplayshell-actions.h" #include "gimpdisplayshell-filter.h" #include "gimpdisplayshell-profile.h" #include "gimpdisplayxfer.h" @@ -44,24 +47,41 @@ #include "gimp-intl.h" +/* local function prototypes */ + +static void gimp_display_shell_profile_free (GimpDisplayShell *shell); + +static void gimp_display_shell_color_config_notify (GimpColorConfig *config, + const GParamSpec *pspec, + GimpDisplayShell *shell); + + +/* public functions */ + void -gimp_display_shell_profile_dispose (GimpDisplayShell *shell) +gimp_display_shell_profile_init (GimpDisplayShell *shell) { - if (shell->profile_transform) + GimpColorConfig *color_config; + + color_config = GIMP_CORE_CONFIG (shell->display->config)->color_management; + + shell->color_config = gimp_config_duplicate (GIMP_CONFIG (color_config)); + + g_signal_connect (shell->color_config, "notify", + G_CALLBACK (gimp_display_shell_color_config_notify), + shell); +} + +void +gimp_display_shell_profile_finalize (GimpDisplayShell *shell) +{ + if (shell->color_config) { - cmsDeleteTransform (shell->profile_transform); - shell->profile_transform = NULL; - shell->profile_src_format = NULL; - shell->profile_dest_format = NULL; + g_object_unref (shell->color_config); + shell->color_config = NULL; } - if (shell->profile_buffer) - { - g_object_unref (shell->profile_buffer); - shell->profile_buffer = NULL; - shell->profile_data = NULL; - shell->profile_stride = 0; - } + gimp_display_shell_profile_free (shell); } void @@ -72,7 +92,7 @@ gimp_display_shell_profile_update (GimpDisplayShell *shell) const Babl *src_format; const Babl *dest_format; - gimp_display_shell_profile_dispose (shell); + gimp_display_shell_profile_free (shell); image = gimp_display_get_image (shell->display); @@ -201,3 +221,55 @@ gimp_display_shell_profile_convert_buffer (GimpDisplayShell *shell, iter->length); } } + + +/* private functions */ + +static void +gimp_display_shell_profile_free (GimpDisplayShell *shell) +{ + if (shell->profile_transform) + { + cmsDeleteTransform (shell->profile_transform); + shell->profile_transform = NULL; + shell->profile_src_format = NULL; + shell->profile_dest_format = NULL; + } + + if (shell->profile_buffer) + { + g_object_unref (shell->profile_buffer); + shell->profile_buffer = NULL; + shell->profile_data = NULL; + shell->profile_stride = 0; + } +} + +static void +gimp_display_shell_color_config_notify (GimpColorConfig *config, + const GParamSpec *pspec, + GimpDisplayShell *shell) +{ + if (! strcmp (pspec->name, "mode")) + { + const gchar *action = NULL; + + switch (config->mode) + { + case GIMP_COLOR_MANAGEMENT_OFF: + action = "view-color-management-mode-off"; + break; + + case GIMP_COLOR_MANAGEMENT_DISPLAY: + action = "view-color-management-mode-display"; + break; + case GIMP_COLOR_MANAGEMENT_SOFTPROOF: + action = "view-color-management-mode-softproof"; + break; + } + + gimp_display_shell_set_action_active (shell, action, TRUE); + } + + gimp_color_managed_profile_changed (GIMP_COLOR_MANAGED (shell)); +} diff --git a/app/display/gimpdisplayshell-profile.h b/app/display/gimpdisplayshell-profile.h index a961f6c4b5..8730b92861 100644 --- a/app/display/gimpdisplayshell-profile.h +++ b/app/display/gimpdisplayshell-profile.h @@ -19,7 +19,9 @@ #define __GIMP_DISPLAY_SHELL_PROFILE_H__ -void gimp_display_shell_profile_dispose (GimpDisplayShell *shell); +void gimp_display_shell_profile_init (GimpDisplayShell *shell); +void gimp_display_shell_profile_finalize (GimpDisplayShell *shell); + void gimp_display_shell_profile_update (GimpDisplayShell *shell); gboolean gimp_display_shell_profile_can_convert_to_u8 (GimpDisplayShell *shell); diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c index 4a777e2be7..0c79ea0604 100644 --- a/app/display/gimpdisplayshell.c +++ b/app/display/gimpdisplayshell.c @@ -405,7 +405,7 @@ gimp_display_shell_constructed (GObject *object) config = shell->display->config; image = gimp_display_get_image (shell->display); - shell->color_config = g_object_ref (GIMP_CORE_CONFIG (config)->color_management); + gimp_display_shell_profile_init (shell); if (image) { @@ -817,13 +817,7 @@ gimp_display_shell_dispose (GObject *object) shell->checkerboard = NULL; } - if (shell->color_config) - { - g_object_unref (shell->color_config); - shell->color_config = NULL; - } - - gimp_display_shell_profile_dispose (shell); + gimp_display_shell_profile_finalize (shell); if (shell->filter_buffer) { diff --git a/app/display/gimpdisplayshell.h b/app/display/gimpdisplayshell.h index 8310baf2cc..30fa2496ff 100644 --- a/app/display/gimpdisplayshell.h +++ b/app/display/gimpdisplayshell.h @@ -151,6 +151,7 @@ struct _GimpDisplayShell GtkWidget *grid_dialog; /* grid configuration dialog */ GimpColorConfig *color_config; /* color management settings */ + gboolean color_config_set; /* settings changed from defaults */ GimpColorTransform profile_transform; const Babl *profile_src_format; diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h index e82a0035b6..ebcc1a18ce 100644 --- a/app/widgets/gimphelp-ids.h +++ b/app/widgets/gimphelp-ids.h @@ -98,6 +98,7 @@ #define GIMP_HELP_VIEW_ROTATE_270 "gimp-view-rotate-270" #define GIMP_HELP_VIEW_ROTATE_345 "gimp-view-rotate-345" #define GIMP_HELP_VIEW_ROTATE_OTHER "gimp-view-rotate-other" +#define GIMP_HELP_VIEW_COLOR_MANAGEMENT "gimp-view-color-management" #define GIMP_HELP_VIEW_SHOW_SELECTION "gimp-view-show-selection" #define GIMP_HELP_VIEW_SHOW_LAYER_BOUNDARY "gimp-view-show-layer-boundary" #define GIMP_HELP_VIEW_SHOW_GUIDES "gimp-view-show-guides"