diff --git a/share/ui/inkscape-start.glade b/share/ui/inkscape-start.glade index 7472ccd4fc4fdbd7f73cd98066daccc45415e34c..687eb48ba37014ecfe648cd99baf4f4b1d0bee4e 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 bd2aa91202250b90c6cd8d64e40d4b42c5fc646e..a1f95e432ba5ba3ac4f3723551a1dde83d16a611 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 557bf943a17b5f68b129287ed8f8f18ef1d32ca2..3f6a01004d06d6a27c4659eb5e282a39dd317d77 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 bafce3bbe1f83ecd6bc8b43d238839558acae9d3..6c2c981fa4f23a3e07a1e924ff19542db3c1c361 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 848737b6c67f979304866b14f0223f99118bcda0..52c86d9c5aa16094414da97cec75ccf8ae73791d 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);