From 879f67451669c1524108580458124026dd3a39ea Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Tue, 9 Mar 2021 23:19:46 +0100 Subject: [PATCH] Improve theming to allow user icon and theme (in gtk) bypass our theming system To do this we check the preferences of both Gtk settings are not set, in this case internaly we use the default icon/theme set on startup when necessary but don`t call to a theming gtk settings update. We also store all necessary default preferences to allow restore user launch settings By the way I fix welcome screen setting icon theme to Adwaita. Adwaita is the default not fallback theme on GTK and always is present in GTK3 package, if we use for icons and the system has other icon theme active there is not problems because both themes fallback to hicolor. Finaly using hicolor as theme name produce wired things so I ensure hicolor is never set (by Adwaita substitution). --- share/ui/inkscape-start.glade | 6 +-- src/inkscape.cpp | 31 ++++++++----- src/preferences.h | 14 ++++++ src/ui/cursor-utils.cpp | 2 +- src/ui/dialog/inkscape-preferences.cpp | 62 +++++++++++++++----------- 5 files changed, 73 insertions(+), 42 deletions(-) diff --git a/share/ui/inkscape-start.glade b/share/ui/inkscape-start.glade index 7472ccd4fc..687eb48ba3 100644 --- a/share/ui/inkscape-start.glade +++ b/share/ui/inkscape-start.glade @@ -900,7 +900,7 @@ along with Inkscape Extensions Manager. If not, see classic Classic Adwaita Adwaita - hicolor + Adwaita 0 0 0 @@ -914,7 +914,7 @@ along with Inkscape Extensions Manager. If not, see symbolic Symbolic Adwaita Adwaita - hicolor + Adwaita 0 0 0 @@ -928,7 +928,7 @@ along with Inkscape Extensions Manager. If not, see symbolic-dark Symbolic Adwaita Dark Adwaita - hicolor + Adwaita 0 0 0 diff --git a/src/inkscape.cpp b/src/inkscape.cpp index bd2aa91202..a1f95e432b 100644 --- a/src/inkscape.cpp +++ b/src/inkscape.cpp @@ -314,7 +314,7 @@ Glib::ustring Application::get_symbolic_colors() gchar colornamederror[64]; gchar colornamed_inverse[64]; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - Glib::ustring themeiconname = prefs->getString("/theme/iconTheme"); + Glib::ustring themeiconname = prefs->getStringOrDefault("/theme/iconTheme", "/theme/defaultIconTheme"); guint32 colorsetbase = 0x2E3436ff; guint32 colorsetbase_inverse = colorsetbase ^ 0xffffff00; guint32 colorsetsuccess = 0x4AD589ff; @@ -435,23 +435,30 @@ void Application::add_gtk_css(bool only_providers) g_object_get(settings, "gtk-icon-theme-name", >kIconThemeName, NULL); g_object_get(settings, "gtk-theme-name", >kThemeName, NULL); g_object_get(settings, "gtk-application-prefer-dark-theme", >kApplicationPreferDarkTheme, NULL); - g_object_set(settings, "gtk-application-prefer-dark-theme", - prefs->getBool("/theme/preferDarkTheme", gtkApplicationPreferDarkTheme), NULL); - prefs->setString("/theme/defaultTheme", Glib::ustring(gtkThemeName)); + prefs->setBool("/theme/defaultPreferDarkTheme", gtkApplicationPreferDarkTheme); + prefs->setString("/theme/defaultGtkTheme", Glib::ustring(gtkThemeName)); prefs->setString("/theme/defaultIconTheme", Glib::ustring(gtkIconThemeName)); Glib::ustring gtkthemename = prefs->getString("/theme/gtkTheme"); if (gtkthemename != "") { g_object_set(settings, "gtk-theme-name", gtkthemename.c_str(), NULL); } else { - prefs->setString("/theme/gtkTheme", Glib::ustring(gtkThemeName)); + Glib::RefPtr display = Gdk::Display::get_default(); + Glib::RefPtr screen = display->get_default_screen(); + Glib::RefPtr icon_theme = Gtk::IconTheme::get_for_screen(screen); + Gtk::IconInfo iconinfo = icon_theme->lookup_icon("tool-pointer", 22, Gtk::ICON_LOOKUP_FORCE_SIZE); + prefs->setBool("/theme/symbolicIcons", iconinfo.is_symbolic()); + } + bool preferdarktheme = prefs->getBool("/theme/preferDarkTheme", false); + if (preferdarktheme) { + g_object_set(settings, "gtk-application-prefer-dark-theme", true, NULL); } themeiconname = prefs->getString("/theme/iconTheme"); - if (themeiconname != "") { + // legacy cleanup + if (themeiconname == "hicolor") { + prefs->setString("/theme/iconTheme", ""); + } else if (themeiconname != "") { g_object_set(settings, "gtk-icon-theme-name", themeiconname.c_str(), NULL); - } else { - prefs->setString("/theme/iconTheme", Glib::ustring(gtkIconThemeName)); } - } g_free(gtkThemeName); @@ -474,8 +481,9 @@ void Application::add_gtk_css(bool only_providers) contrast *= 2.5; shade = 1 + contrast; } + Glib::ustring current_theme = prefs->getStringOrDefault("/theme/gtkTheme", "/theme/defaultGtkTheme"); GtkCssProvider *currentthemeprovider = - gtk_css_provider_get_named(prefs->getString("/theme/gtkTheme").c_str(), variant); + gtk_css_provider_get_named(current_theme.c_str(), variant); std::string cssstring = gtk_css_provider_to_string(currentthemeprovider); std::string appenddefined = ""; if (contrast) { @@ -510,8 +518,7 @@ void Application::add_gtk_css(bool only_providers) } Gtk::StyleContext::add_provider_for_screen(screen, styleprovider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); } - - Glib::ustring gtkthemename = prefs->getString("/theme/gtkTheme"); + Glib::ustring gtkthemename = prefs->getStringOrDefault("/theme/gtkTheme", "/theme/defaultGtkTheme"); gtkthemename += ".css"; style = get_filename(UIS, gtkthemename.c_str(), false, true); if (!style.empty()) { diff --git a/src/preferences.h b/src/preferences.h index 557bf943a1..3f6a01004d 100644 --- a/src/preferences.h +++ b/src/preferences.h @@ -446,6 +446,20 @@ public: return getEntry(pref_path).getString(); } + /** + * Retrieve an UTF-8 string. + * + * @param pref_path Path to the retrieved preference. + * @param def_path Path to the default preference used in case empty. + */ + Glib::ustring getStringOrDefault(Glib::ustring const &pref_path, Glib::ustring const &def_path) { + Glib::ustring val = getEntry(pref_path).getString(); + if (val == "") { + return getEntry(def_path).getString(); + } + return val; + } + /** * Retrieve the unit string. * diff --git a/src/ui/cursor-utils.cpp b/src/ui/cursor-utils.cpp index bafce3bbe1..6c2c981fa4 100644 --- a/src/ui/cursor-utils.cpp +++ b/src/ui/cursor-utils.cpp @@ -59,7 +59,7 @@ load_svg_cursor(Glib::RefPtr display, // Set in preferences Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - Glib::ustring theme_name = prefs->getString("/theme/iconTheme"); + Glib::ustring theme_name = prefs->getStringOrDefault("/theme/iconTheme", "/theme/defaultIconTheme"); if (!theme_name.empty()) { theme_names.push_back(theme_name); } diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 848737b6c6..52c86d9c5a 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -1047,10 +1047,7 @@ void InkscapePreferences::get_highlight_colors(guint32 &colorsetbase, guint32 &c { using namespace Inkscape::IO::Resource; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - Glib::ustring themeiconname = prefs->getString("/theme/iconTheme"); - if (themeiconname == prefs->getString("/theme/defaultIconTheme")) { - themeiconname = "hicolor"; - } + Glib::ustring themeiconname = prefs->getStringOrDefault("/theme/iconTheme", "/theme/defaultIconTheme"); Glib::ustring prefix = ""; if (prefs->getBool("/theme/darkTheme", false)) { prefix = ".dark "; @@ -1117,7 +1114,7 @@ void InkscapePreferences::get_highlight_colors(guint32 &colorsetbase, guint32 &c void InkscapePreferences::resetIconsColors(bool themechange) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - Glib::ustring themeiconname = prefs->getString("/theme/iconTheme"); + Glib::ustring themeiconname = prefs->getStringOrDefault("/theme/iconTheme", "/theme/defaultIconTheme"); if (!prefs->getBool("/theme/symbolicIcons", false)) { _symbolic_base_colors.set_sensitive(false); _symbolic_highlight_colors.set_sensitive(false); @@ -1194,7 +1191,7 @@ void InkscapePreferences::resetIconsColorsWrapper() { resetIconsColors(false); } void InkscapePreferences::changeIconsColors() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - Glib::ustring themeiconname = prefs->getString("/theme/iconTheme"); + Glib::ustring themeiconname = prefs->getStringOrDefault("/theme/iconTheme", "/theme/defaultIconTheme"); guint32 colorsetbase = prefs->getUInt("/theme/" + themeiconname + "/symbolicBaseColor", 0x2E3436ff); guint32 colorsetsuccess = prefs->getUInt("/theme/" + themeiconname + "/symbolicSuccessColor", 0x4AD589ff); guint32 colorsetwarning = prefs->getUInt("/theme/" + themeiconname + "/symbolicWarningColor", 0xF57900ff); @@ -1232,9 +1229,8 @@ void InkscapePreferences::toggleSymbolic() } _symbolic_base_colors.set_sensitive(true); _symbolic_highlight_colors.set_sensitive(true); - Glib::ustring themeiconname = prefs->getString("/theme/iconTheme"); - if (prefs->getBool("/theme/symbolicDefaultHighColors", true) || - prefs->getBool("/theme/symbolicDefaultBaseColors", true) || + Glib::ustring themeiconname = prefs->getStringOrDefault("/theme/iconTheme", "/theme/defaultIconTheme"); + if (prefs->getBool("/theme/symbolicDefaultColors", true) || !prefs->getEntry("/theme/" + themeiconname + "/symbolicBaseColor").isValid()) { resetIconsColors(); } else { @@ -1274,7 +1270,7 @@ void InkscapePreferences::themeChange() Gtk::StyleContext::remove_provider_for_screen(screen, INKSCAPE.themeprovider); } Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - Glib::ustring current_theme = prefs->getString("/theme/gtkTheme"); + Glib::ustring current_theme = prefs->getStringOrDefault("/theme/gtkTheme", "/theme/defaultGtkTheme"); auto settings = Gtk::Settings::get_default(); _dark_theme.get_parent()->set_no_show_all(false); if (dark_themes[current_theme]) { @@ -1315,7 +1311,7 @@ void InkscapePreferences::preferDarkThemeChange() if (window) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool dark_theme = prefs->getBool("/theme/preferDarkTheme", false); - Glib::ustring current_theme = prefs->getString("/theme/gtkTheme"); + Glib::ustring current_theme = prefs->getStringOrDefault("/theme/gtkTheme", "/theme/defaultGtkTheme"); auto settings = Gtk::Settings::get_default(); settings->property_gtk_application_prefer_dark_theme() = dark_theme; bool dark = current_theme.find(":dark") != std::string::npos; @@ -1347,7 +1343,7 @@ void InkscapePreferences::symbolicThemeCheck() { using namespace Inkscape::IO::Resource; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - Glib::ustring themeiconname = prefs->getString("/theme/iconTheme"); + Glib::ustring themeiconname = prefs->getStringOrDefault("/theme/iconTheme", "/theme/defaultIconTheme"); bool symbolic = false; auto settings = Gtk::Settings::get_default(); if (settings) { @@ -1355,7 +1351,8 @@ void InkscapePreferences::symbolicThemeCheck() settings->property_gtk_icon_theme_name() = themeiconname; } } - if (prefs->getString("/theme/defaultIconTheme") != prefs->getString("/theme/iconTheme")) { + if (themeiconname != "Adwaita") { + auto folders = get_foldernames(ICONS, { "application" }); for (auto &folder : folders) { auto path = folder; @@ -1363,7 +1360,7 @@ void InkscapePreferences::symbolicThemeCheck() if (std::string::npos != last_slash_idx) { folder.erase(0, last_slash_idx + 1); } - if (folder == prefs->getString("/theme/iconTheme")) { + if (folder == themeiconname) { #ifdef _WIN32 path += g_win32_locale_filename_from_utf8("/symbolic/actions"); #else @@ -1614,8 +1611,8 @@ void InkscapePreferences::initPageUI() // Theme _page_theme.add_group_header(_("Theme")); _dark_theme.init(_("Use dark theme"), "/theme/preferDarkTheme", false); - Glib::ustring current_theme = prefs->getString("/theme/gtkTheme"); - Glib::ustring default_theme = prefs->getString("/theme/defaultTheme"); + Glib::ustring current_theme = prefs->getStringOrDefault("/theme/gtkTheme", "/theme/defaultGtkTheme"); + Glib::ustring default_theme = prefs->getString("/theme/defaultGtkTheme"); Glib::ustring theme = ""; { dark_themes = get_available_themes(); @@ -1632,11 +1629,16 @@ void InkscapePreferences::initPageUI() values.emplace_back(theme); labels.emplace_back(theme); } + std::sort(labels.begin(), labels.end()); + std::sort(values.begin(), values.end()); + labels.erase(unique(labels.begin(), labels.end()), labels.end()); + values.erase(unique(values.begin(), values.end()), values.end()); + values.emplace_back(""); Glib::ustring default_theme_label = _("Use system theme"); default_theme_label += " (" + default_theme + ")"; labels.emplace_back(default_theme_label); - values.push_back(default_theme); - _gtk_theme.init("/theme/gtkTheme", labels, values, "Adwaita"); + + _gtk_theme.init("/theme/gtkTheme", labels, values, ""); _page_theme.add_line(false, _("Change GTK theme:"), _gtk_theme, "", "", false); _gtk_theme.signal_changed().connect(sigc::mem_fun(*this, &InkscapePreferences::themeChange)); } @@ -1675,25 +1677,30 @@ void InkscapePreferences::initPageUI() if (std::string::npos != last_slash_idx) { folder.erase(0, last_slash_idx + 1); } - if (folder == default_icon_theme || (default_icon_theme == "Adwaita" && folder == "hicolor")) { + // we want use Adwaita intead fallback hicolor theme + if (folder == default_icon_theme || + (folder == "hicolor" && default_icon_theme == "Adwaita")) + { continue; } - labels.push_back(folder); - values.push_back(folder); + if (folder == "hicolor") { + labels.emplace_back("Adwaita"); + values.emplace_back("Adwaita"); + } else { + labels.emplace_back(folder); + values.emplace_back(folder); + } } std::sort(labels.begin(), labels.end()); std::sort(values.begin(), values.end()); labels.erase(unique(labels.begin(), labels.end()), labels.end()); values.erase(unique(values.begin(), values.end()), values.end()); - values.push_back(default_icon_theme); - if (default_icon_theme == "Adwaita") { - default_icon_theme = "hicolor"; - } + values.emplace_back(""); Glib::ustring default_icon_label = _("Use system icons"); default_icon_label += " (" + default_icon_theme + ")"; labels.emplace_back(default_icon_label); - _icon_theme.init("/theme/iconTheme", labels, values, "Adwaita"); + _icon_theme.init("/theme/iconTheme", labels, values, ""); _page_theme.add_line(false, _("Change icon theme:"), _icon_theme, "", "", false); _icon_theme.signal_changed().connect(sigc::mem_fun(*this, &InkscapePreferences::symbolicThemeCheck)); _sys_user_icons_dir_copy.init((char const *)IO::Resource::get_path(IO::Resource::USER, IO::Resource::ICONS, ""), @@ -1701,6 +1708,9 @@ void InkscapePreferences::initPageUI() _page_theme.add_line(true, _("User icons: "), _sys_user_icons_dir_copy, "", _("Location of the user’s icons"), true, Gtk::manage(new Gtk::Box())); } Glib::ustring themeiconname = prefs->getString("/theme/iconTheme"); + if (themeiconname == "") { + themeiconname = prefs->getString("/theme/defaultIconTheme"); + } _symbolic_icons.init(_("Use symbolic icons"), "/theme/symbolicIcons", false); _symbolic_icons.signal_clicked().connect(sigc::mem_fun(*this, &InkscapePreferences::toggleSymbolic)); _page_theme.add_line(true, "", _symbolic_icons, "", "", true); -- GitLab