From 01961a507113a495fa8686d87e16fb924a861f28 Mon Sep 17 00:00:00 2001 From: rpf Date: Apr 19, 2020 1:11:52 PM allow unified background for thumbnails diff --git a/src/icon_bar.c b/src/icon_bar.c index 32f9644..3090b44 100644 --- a/src/icon_bar.c +++ b/src/icon_bar.c @@ -183,6 +183,16 @@ static void rstto_icon_bar_update_missing_icon (RsttoIconBar *icon_bar); +static void +cb_rstto_bgcolor_changed ( + GObject *settings, + GParamSpec *pspec, + gpointer user_data); + +static void +cb_rstto_get_bgcolor ( + RsttoIconBar *icon_bar, + RsttoSettings *settings); static RsttoIconBarItem * rstto_icon_bar_item_new (void); @@ -275,6 +285,10 @@ PangoLayout *layout; gboolean show_text; + + GdkRGBA *bg_color; + gboolean bg_override; + gboolean use_thumbnail_background; }; @@ -484,6 +498,9 @@ icon_bar->priv->thumbnail_size = rstto_settings_get_uint_property ( icon_bar->priv->settings, "thumbnail-size"); + cb_rstto_get_bgcolor ( + icon_bar, + icon_bar->priv->settings); rstto_icon_bar_update_missing_icon (icon_bar); @@ -503,6 +520,23 @@ "notify::thumbnail-size", G_CALLBACK (cb_rstto_thumbnail_size_changed), icon_bar); + + // as the following values influence each other use same callback + g_signal_connect ( + G_OBJECT(icon_bar->priv->settings), + "notify::bgcolor", + G_CALLBACK (cb_rstto_bgcolor_changed), + icon_bar); + g_signal_connect ( + G_OBJECT(icon_bar->priv->settings), + "notify::bgcolor-override", + G_CALLBACK (cb_rstto_bgcolor_changed), + icon_bar); + g_signal_connect ( + G_OBJECT(icon_bar->priv->settings), + "notify::use-thumbnail-background", + G_CALLBACK (cb_rstto_bgcolor_changed), + icon_bar); } @@ -512,6 +546,11 @@ { RsttoIconBar *icon_bar = RSTTO_ICON_BAR (widget); + if (icon_bar->priv->bg_color) + { + gdk_rgba_free (icon_bar->priv->bg_color); // free allocation + icon_bar->priv->bg_color = NULL; + } rstto_icon_bar_set_model (icon_bar, NULL); (*GTK_WIDGET_CLASS (rstto_icon_bar_parent_class)->destroy) (widget); @@ -523,7 +562,7 @@ rstto_icon_bar_finalize (GObject *object) { RsttoIconBar *icon_bar = RSTTO_ICON_BAR (object); - + g_object_unref (G_OBJECT (icon_bar->priv->layout)); g_object_unref (G_OBJECT (icon_bar->priv->settings)); g_object_unref (G_OBJECT (icon_bar->priv->thumbnailer)); @@ -886,14 +925,35 @@ GList *lp; /*RsttoFile *file; GtkTreeIter iter;*/ - GdkRGBA bg_color; - - /* Paint the background color - white */ - cairo_save (cr); - gdk_rgba_parse (&bg_color, "white"); - gdk_cairo_set_source_rgba (cr, &bg_color); - cairo_paint (cr); - cairo_restore (cr); + GtkAllocation allocation; + GdkRGBA bg_color_white; + GdkRGBA *bg_color = NULL; + + if (icon_bar->priv->use_thumbnail_background) + { + if (icon_bar->priv->bg_override) + { + bg_color = icon_bar->priv->bg_color; // use set background + } + } + else + { + gdk_rgba_parse (&bg_color_white, "white"); // use former default + bg_color = &bg_color_white; + } + if (bg_color == NULL) + { + GtkStyleContext *context = gtk_widget_get_style_context (widget); + gtk_widget_get_allocation (widget, &allocation); // default to ui background + gtk_render_background (context, cr, 0, 0, allocation.width, allocation.height); + } + else + { + cairo_save (cr); + gdk_cairo_set_source_rgba (cr, bg_color); + cairo_paint (cr); + cairo_restore (cr); + } for (lp = icon_bar->priv->items; lp != NULL; lp = lp->next) { @@ -2097,6 +2157,55 @@ icon_bar->priv->auto_center = auto_center; } +static void +cb_rstto_bgcolor_changed ( + GObject *settings, + GParamSpec *pspec, + gpointer user_data) +{ + RsttoIconBar *icon_bar = RSTTO_ICON_BAR (user_data); + GtkWidget *widget = GTK_WIDGET (user_data); + + cb_rstto_get_bgcolor(icon_bar, icon_bar->priv->settings); + // in our case simple redraw shoud be sufficient + gtk_widget_queue_draw (GTK_WIDGET (icon_bar)); +} + +static void +cb_rstto_get_bgcolor ( + RsttoIconBar *icon_bar, + RsttoSettings *settings) +{ + GValue val_bg_color = {0, }; + GValue val_bg_color_override = {0, }; + GValue val_use_thumbnail_background = {0, }; + + g_value_init (&val_bg_color, GDK_TYPE_RGBA); + g_value_init (&val_bg_color_override, G_TYPE_BOOLEAN); + g_value_init (&val_use_thumbnail_background, G_TYPE_BOOLEAN); + + g_object_get_property ( + G_OBJECT(settings), + "bgcolor", + &val_bg_color); + g_object_get_property ( + G_OBJECT(settings), + "bgcolor-override", + &val_bg_color_override); + g_object_get_property ( + G_OBJECT(settings), + "use-thumbnail-background", + &val_use_thumbnail_background); + + if (icon_bar->priv->bg_color) + { + gdk_rgba_free (icon_bar->priv->bg_color); + } + icon_bar->priv->bg_color = NULL; + icon_bar->priv->bg_override = g_value_get_boolean (&val_bg_color_override); + icon_bar->priv->use_thumbnail_background = g_value_get_boolean (&val_use_thumbnail_background); + icon_bar->priv->bg_color = g_value_get_boxed (&val_bg_color); +} static void rstto_icon_bar_update_missing_icon (RsttoIconBar *icon_bar) diff --git a/src/preferences_dialog.c b/src/preferences_dialog.c index 314261b..14e7dc7 100644 --- a/src/preferences_dialog.c +++ b/src/preferences_dialog.c @@ -55,6 +55,10 @@ cb_invert_zoom_direction_check_button_toggled ( GtkToggleButton *, gpointer user_data); +static void +cb_use_thumbnail_background_toggled ( + GtkToggleButton *, + gpointer user_data); static void cb_hide_thumbnails_fullscreen_check_button_toggled ( @@ -102,6 +106,7 @@ GtkWidget *bgcolor_hbox; GtkWidget *bgcolor_color_button; GtkWidget *bgcolor_override_check_button; + GtkWidget *use_thumbnail_background_check_button; GtkWidget *quality_frame; GtkWidget *quality_vbox; @@ -240,6 +245,7 @@ gboolean bool_show_clock; gboolean bool_limit_quality; gchar *str_desktop_type = NULL; + gboolean bool_use_thumbnail_background; GdkRGBA *bgcolor; GtkWidget *timeout_lbl, *timeout_hscale; @@ -280,6 +286,7 @@ "desktop-type", &str_desktop_type, "show-clock", &bool_show_clock, "limit-quality", &bool_limit_quality, + "use-thumbnail-background", &bool_use_thumbnail_background, NULL); /* @@ -300,6 +307,7 @@ dialog->priv->display_tab.bgcolor_override_check_button = gtk_check_button_new_with_label (_("Override background color:")); dialog->priv->display_tab.bgcolor_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); dialog->priv->display_tab.bgcolor_color_button = gtk_color_button_new (); + dialog->priv->display_tab.use_thumbnail_background_check_button = gtk_check_button_new_with_label (_("Use background color for thumbnails")); gtk_box_pack_start (GTK_BOX (dialog->priv->display_tab.bgcolor_hbox), dialog->priv->display_tab.bgcolor_override_check_button, FALSE, FALSE, 0); @@ -307,6 +315,8 @@ dialog->priv->display_tab.bgcolor_color_button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (dialog->priv->display_tab.bgcolor_vbox), dialog->priv->display_tab.bgcolor_hbox, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (dialog->priv->display_tab.bgcolor_vbox), + dialog->priv->display_tab.use_thumbnail_background_check_button, FALSE, FALSE, 0); /* set current value */ gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (dialog->priv->display_tab.bgcolor_color_button), @@ -314,6 +324,8 @@ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->display_tab.bgcolor_override_check_button), bool_bgcolor_override); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->display_tab.use_thumbnail_background_check_button), + bool_use_thumbnail_background); gtk_widget_set_sensitive (GTK_WIDGET (dialog->priv->display_tab.bgcolor_color_button), bool_bgcolor_override); @@ -322,6 +334,8 @@ "toggled", G_CALLBACK (cb_bgcolor_override_toggled), dialog); g_signal_connect (G_OBJECT (dialog->priv->display_tab.bgcolor_color_button), "color-set", G_CALLBACK (cb_bgcolor_color_set), dialog); + g_signal_connect (G_OBJECT (dialog->priv->display_tab.use_thumbnail_background_check_button), + "toggled", G_CALLBACK (cb_use_thumbnail_background_toggled), dialog); dialog->priv->display_tab.quality_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); dialog->priv->display_tab.quality_frame = xfce_gtk_frame_box_new_with_content (_("Quality"), dialog->priv->display_tab.quality_vbox); @@ -641,6 +655,24 @@ bgcolor_override ); } +static void +cb_use_thumbnail_background_toggled ( + GtkToggleButton *button, + gpointer user_data) +{ + /* Variable Section */ + + RsttoPreferencesDialog *dialog = RSTTO_PREFERENCES_DIALOG (user_data); + gboolean use_thumbnail_background = gtk_toggle_button_get_active ( button ); + + /* Code Section */ + + rstto_settings_set_boolean_property ( + dialog->priv->settings, + "use-thumbnail-background", + use_thumbnail_background ); +} + /** * cb_bgcolor_color_set: * @button: The color-button the user clicked. diff --git a/src/settings.c b/src/settings.c index c16a0fa..16d01a4 100644 --- a/src/settings.c +++ b/src/settings.c @@ -82,6 +82,7 @@ PROP_ERROR_MISSING_THUMBNAILER, PROP_SORT_TYPE, PROP_THUMBNAIL_SIZE, + PROP_USE_THUMBNAIL_BACKGROUND, }; GType @@ -135,6 +136,7 @@ gboolean use_thunar_properties; gboolean maximize_on_startup; RsttoThumbnailSize thumbnail_size; + gboolean use_thumbnail_background; RsttoSortType sort_type; @@ -196,6 +198,7 @@ settings->priv->hide_mouse_cursor_fullscreen_timeout = 1; settings->priv->errors.missing_thumbnailer = TRUE; settings->priv->thumbnail_size = THUMBNAIL_SIZE_NORMAL; + settings->priv->use_thumbnail_background = FALSE; xfconf_g_property_bind ( settings->priv->channel, @@ -287,6 +290,13 @@ settings, "bgcolor-override"); + xfconf_g_property_bind ( + settings->priv->channel, + "/window/use-thumbnail-background", + G_TYPE_BOOLEAN, + settings, + "use-thumbnail-background"); + rstto_xfconf_ensure_gdkrgba (settings->priv->channel, "/window/bgcolor"); xfconf_g_property_bind_gdkrgba ( settings->priv->channel, @@ -639,6 +649,17 @@ object_class, PROP_THUMBNAIL_SIZE, pspec); + + pspec = g_param_spec_boolean ( + "use-thumbnail-background", + "", + "", + FALSE, + G_PARAM_READWRITE); + g_object_class_install_property ( + object_class, + PROP_USE_THUMBNAIL_BACKGROUND, + pspec); } /** @@ -873,6 +894,9 @@ case PROP_THUMBNAIL_SIZE: settings->priv->thumbnail_size = g_value_get_uint (value); break; + case PROP_USE_THUMBNAIL_BACKGROUND: + settings->priv->use_thumbnail_background = g_value_get_boolean (value); + break; default: break; } @@ -964,6 +988,9 @@ value, settings->priv->thumbnail_size); break; + case PROP_USE_THUMBNAIL_BACKGROUND: + g_value_set_boolean (value, settings->priv->use_thumbnail_background); + break; default: break;