diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-12-06 15:27:18 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-12-07 13:12:48 -0500 |
commit | d586289be5137a7740bc8e3103a7f68c1ad8dd06 (patch) | |
tree | dc7e505c68cc79dce8b5a0fa6bdadc2305514b63 | |
parent | 01747cc5f7e8cc77837525bd3b9862ae7b5f0a52 (diff) |
first mostly-working build supporting GTK rethemeing via the Theme Manager
-rw-r--r-- | gtk2_ardour/color_aliases.h | 43 | ||||
-rw-r--r-- | gtk2_ardour/default_ui_config.in | 40 | ||||
-rw-r--r-- | gtk2_ardour/theme_manager.cc | 65 | ||||
-rw-r--r-- | gtk2_ardour/ui_config.cc | 151 | ||||
-rw-r--r-- | gtk2_ardour/ui_config.h | 10 |
5 files changed, 237 insertions, 72 deletions
diff --git a/gtk2_ardour/color_aliases.h b/gtk2_ardour/color_aliases.h index df773bd72b..4338b8fe65 100644 --- a/gtk2_ardour/color_aliases.h +++ b/gtk2_ardour/color_aliases.h @@ -1,3 +1,6 @@ +/* No guard clauses - used by ui_config.{cc,h} to define various members and + * methods amd included multiple times + */ COLOR_ALIAS(ActiveCrossfade,"active crossfade","color 1") COLOR_ALIAS(ArrangeBase,"arrange base","color 2") COLOR_ALIAS(AudioBusBase,"audio bus base","color 3") @@ -56,6 +59,46 @@ COLOR_ALIAS(GhostTrackWaveClip,"ghost track wave","color 29") COLOR_ALIAS(GhostTrackWave,"ghost track wave clip","color 29") COLOR_ALIAS(GhostTrackWaveFill,"ghost track wave fill","color 29") COLOR_ALIAS(GhostTrackZeroLine,"ghost track zero line","color 30") +COLOR_ALIAS(GtkArm, "gtk_arm","color 9") +COLOR_ALIAS(GtkAudioBus, "gtk_audio_bus","color 61") +COLOR_ALIAS(GtkAudioTrack, "gtk_audio_track","color 70") +COLOR_ALIAS(GtkAutomationTrackHeader,"gtk_automation_track_header", "color 42") +COLOR_ALIAS(GtkBackground,"gtk_background", "color 12") +COLOR_ALIAS(GtkBases,"gtk_bases", "color 27") +COLOR_ALIAS(GtkBgSelected,"gtk_bg_selected", "color 99") +COLOR_ALIAS(GtkBgTooltip,"gtk_bg_tooltip", "color 52") +COLOR_ALIAS(GtkBrightColor,"gtk_bright_color", "color 74") +COLOR_ALIAS(GtkBrightIndicator,"gtk_bright_indicator", "color 9") +COLOR_ALIAS(GtkContrastingIndicator,"gtk_contrasting_indicator", "color 91") +COLOR_ALIAS(GtkControlBase,"gtk_control_base", "color 61") +COLOR_ALIAS(GtkControlText,"gtk_control_text", "color 26") +COLOR_ALIAS(GtkControlText2,"gtk_control_text2", "color 83") +COLOR_ALIAS(GtkDarkest,"gtk_darkest", "color 29") +COLOR_ALIAS(GtkFgSelected,"gtk_fg_selected", "color 18") +COLOR_ALIAS(GtkFgTooltip,"gtk_fg_tooltip", "color 29") +COLOR_ALIAS(GtkForeground,"gtk_foreground", "color 50") +COLOR_ALIAS(GtkLightTextOnDark,"gtk_light_text_on_dark", "color 31") +COLOR_ALIAS(GtkLightest,"gtk_lightest", "color 13") +COLOR_ALIAS(GtkMidiChannelSelector,"gtk_midi_channel_selector", "color 44") +COLOR_ALIAS(GtkMidiTrack,"gtk_midi_track", "color 58") +COLOR_ALIAS(GtkMonitor,"gtk_monitor", "color 8") +COLOR_ALIAS(GtkMono,"gtk_mono", "color 95") +COLOR_ALIAS(GtkMute,"gtk_mute", "color 52") +COLOR_ALIAS(GtkNotSoBrightIndicator,"gtk_not_so_bright_indicator", "color 32") +COLOR_ALIAS(GtkProcessorFader,"gtk_processor_fader", "color 94") +COLOR_ALIAS(GtkProcessorFaderFrame,"gtk_processor_fader_frame", "color 104") +COLOR_ALIAS(GtkProcessorFrameselected,"gtk_processor_frame_selected", "color 32") +COLOR_ALIAS(GtkProcessorPostfader,"gtk_processor_postfader", "color 79") +COLOR_ALIAS(GtkProcessorPostfaderFrame,"gtk_processor_postfader_frame", "color 103") +COLOR_ALIAS(GtkProcessorPrefader,"gtk_processor_prefader", "color 69") +COLOR_ALIAS(GtkProcessorPrefaderFrame,"gtk_processor_prefader_frame", "color 69") +COLOR_ALIAS(GtkSendBg,"gtk_send_bg", "color 70") +COLOR_ALIAS(GtkSendFg,"gtk_send_fg", "color 24") +COLOR_ALIAS(GtkSolo,"gtk_solo", "color 91") +COLOR_ALIAS(GtkSomewhatBrightc,"gtk_somewhat_bright_indicator", "color 89") +COLOR_ALIAS(GtkTexts,"gtk_texts", "color 50") +COLOR_ALIAS(GtkTrackHeaderInactive,"gtk_track_header_inactive", "color 84") +COLOR_ALIAS(GtkTrackHeaderSelected,"gtk_track_header_selected", "color 93") COLOR_ALIAS(ImageTrack,"image track","color 31") COLOR_ALIAS(InactiveCrossfade,"inactive crossfade","color 32") COLOR_ALIAS(InactiveFadeHandle,"inactive fade handle","color 33") diff --git a/gtk2_ardour/default_ui_config.in b/gtk2_ardour/default_ui_config.in index ed7492fd59..a4b0fb3181 100644 --- a/gtk2_ardour/default_ui_config.in +++ b/gtk2_ardour/default_ui_config.in @@ -129,6 +129,46 @@ <ColorAlias name="ghost track wave clip" alias="color 29"/> <ColorAlias name="ghost track wave fill" alias="color 29"/> <ColorAlias name="ghost track zero line" alias="color 30"/> + <ColorAlias name="gtk_arm" alias="color 9"/> + <ColorAlias name="gtk_audio_bus" alias="color 61"/> + <ColorAlias name="gtk_audio_track" alias="color 70"/> + <ColorAlias name="gtk_automation_track_header" alias="color 42"/> + <ColorAlias name="gtk_background" alias="color 12"/> + <ColorAlias name="gtk_bases" alias="color 27"/> + <ColorAlias name="gtk_bg_selected" alias="color 99"/> + <ColorAlias name="gtk_bg_tooltip" alias="color 52"/> + <ColorAlias name="gtk_bright_color" alias="color 74"/> + <ColorAlias name="gtk_bright_indicator" alias="color 9"/> + <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/> + <ColorAlias name="gtk_control_base" alias="color 61"/> + <ColorAlias name="gtk_control_text" alias="color 26"/> + <ColorAlias name="gtk_control_text2" alias="color 83"/> + <ColorAlias name="gtk_darkest" alias="color 29"/> + <ColorAlias name="gtk_fg_selected" alias="color 18"/> + <ColorAlias name="gtk_fg_tooltip" alias="color 29"/> + <ColorAlias name="gtk_foreground" alias="color 50"/> + <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/> + <ColorAlias name="gtk_lightest" alias="color 13"/> + <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/> + <ColorAlias name="gtk_midi_track" alias="color 58"/> + <ColorAlias name="gtk_monitor" alias="color 8"/> + <ColorAlias name="gtk_mono" alias="color 95"/> + <ColorAlias name="gtk_mute" alias="color 52"/> + <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/> + <ColorAlias name="gtk_processor_fader" alias="color 94"/> + <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/> + <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/> + <ColorAlias name="gtk_processor_postfader" alias="color 79"/> + <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/> + <ColorAlias name="gtk_processor_prefader" alias="color 69"/> + <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/> + <ColorAlias name="gtk_send_bg" alias="color 70"/> + <ColorAlias name="gtk_send_fg" alias="color 24"/> + <ColorAlias name="gtk_solo" alias="color 91"/> + <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/> + <ColorAlias name="gtk_texts" alias="color 50"/> + <ColorAlias name="gtk_track_header_inactive" alias="color 84"/> + <ColorAlias name="gtk_track_header_selected" alias="color 93"/> <ColorAlias name="image track" alias="color 31"/> <ColorAlias name="inactive crossfade" alias="color 32"/> <ColorAlias name="inactive fade handle" alias="color 33"/> diff --git a/gtk2_ardour/theme_manager.cc b/gtk2_ardour/theme_manager.cc index eae9f4aa38..45bf1a6fff 100644 --- a/gtk2_ardour/theme_manager.cc +++ b/gtk2_ardour/theme_manager.cc @@ -225,6 +225,9 @@ ThemeManager::ThemeManager() set_size_request (-1, 400); setup_theme (); setup_aliases (); + + /* Trigger setting up the GTK color scheme and loading the RC file */ + ARDOUR_UI::config()->color_theme_changed (); } ThemeManager::~ThemeManager() @@ -327,23 +330,6 @@ ThemeManager::foobar_response (int result) } void -load_rc_file (const string& filename, bool themechange) -{ - std::string rc_file_path; - - if (!find_file (ardour_config_search_path(), filename, rc_file_path)) { - warning << string_compose (_("Unable to find UI style file %1 in search path %2. %3 will look strange"), - filename, ardour_config_search_path().to_string(), PROGRAM_NAME) - << endmsg; - return; - } - - info << "Loading ui configuration file " << rc_file_path << endmsg; - - Gtkmm2ext::UI::instance()->load_rcfile (rc_file_path, themechange); -} - -void ThemeManager::on_flat_buttons_toggled () { ARDOUR_UI::config()->set_flat_buttons (flat_buttons.get_active()); @@ -413,10 +399,11 @@ ThemeManager::on_dark_theme_button_toggled() { if (!dark_button.get_active()) return; - ARDOUR_UI::config()->set_ui_rc_file("ui_dark.rc"); - ARDOUR_UI::config()->set_dirty (); - - load_rc_file (ARDOUR_UI::config()->get_ui_rc_file(), true); + UIConfiguration* uic (ARDOUR_UI::config()); + + uic->set_ui_rc_file("ui_dark.rc"); + uic->set_dirty (); + uic->load_rc_file (uic->get_ui_rc_file(), true); } void @@ -424,8 +411,11 @@ ThemeManager::on_light_theme_button_toggled() { if (!light_button.get_active()) return; - ARDOUR_UI::config()->set_ui_rc_file("ui_light.rc"); - load_rc_file (ARDOUR_UI::config()->get_ui_rc_file(), true); + UIConfiguration* uic (ARDOUR_UI::config()); + + uic->set_ui_rc_file("ui_light.rc"); + uic->set_dirty (); + uic->load_rc_file (uic->get_ui_rc_file(), true); } void @@ -492,28 +482,13 @@ ThemeManager::setup_theme () row[columns.gdkcolor] = col; } - ColorsChanged.emit(); - - bool env_defined = false; - string rcfile = Glib::getenv("ARDOUR3_UI_RC", env_defined); - - if(!env_defined) { - rcfile = ARDOUR_UI::config()->get_ui_rc_file(); - } - - if (rcfile == "ui_dark.rc") { - dark_button.set_active(); - } else if (rcfile == "ui_light.rc") { - light_button.set_active(); - } - - flat_buttons.set_active (ARDOUR_UI::config()->get_flat_buttons()); - blink_rec_button.set_active (ARDOUR_UI::config()->get_blink_rec_arm()); - waveform_gradient_depth.set_value (ARDOUR_UI::config()->get_waveform_gradient_depth()); - timeline_item_gradient_depth.set_value (ARDOUR_UI::config()->get_timeline_item_gradient_depth()); - all_dialogs.set_active (ARDOUR_UI::config()->get_all_floating_windows_are_dialogs()); + UIConfiguration* uic (ARDOUR_UI::config()); - load_rc_file(rcfile, false); + flat_buttons.set_active (uic->get_flat_buttons()); + blink_rec_button.set_active (uic->get_blink_rec_arm()); + waveform_gradient_depth.set_value (uic->get_waveform_gradient_depth()); + timeline_item_gradient_depth.set_value (uic->get_timeline_item_gradient_depth()); + all_dialogs.set_active (uic->get_all_floating_windows_are_dialogs()); } void @@ -521,9 +496,7 @@ ThemeManager::reset_canvas_colors() { ARDOUR_UI::config()->load_defaults(); setup_theme (); - /* mark dirty ... */ ARDOUR_UI::config()->set_dirty (); - /* but save it immediately */ ARDOUR_UI::config()->save_state (); } diff --git a/gtk2_ardour/ui_config.cc b/gtk2_ardour/ui_config.cc index 7b4d91adfa..7507a0440c 100644 --- a/gtk2_ardour/ui_config.cc +++ b/gtk2_ardour/ui_config.cc @@ -17,11 +17,14 @@ */ +#include <iostream> +#include <sstream> #include <unistd.h> #include <cstdlib> #include <cstdio> /* for snprintf, grrr */ #include <glibmm/miscutils.h> +#include <glib/gstdio.h> #include "pbd/failed_constructor.h" #include "pbd/xml++.h" @@ -30,6 +33,7 @@ #include "pbd/stacktrace.h" #include "gtkmm2ext/rgb_macros.h" +#include "gtkmm2ext/gtk_ui.h" #include "ardour/filesystem_paths.h" @@ -72,7 +76,9 @@ UIConfiguration::UIConfiguration () _dirty (false), aliases_modified (false), - derived_modified (false) + derived_modified (false), + _saved_state_node (""), + _saved_state_version (-1) { _instance = this; @@ -105,6 +111,55 @@ UIConfiguration::~UIConfiguration () { } +void +UIConfiguration::color_theme_changed () +{ + _dirty = true; + + reset_gtk_theme (); + + /* reload the RC file, which will trigger gtk_rc_reset_styles(). + It would be nice if simply resetting the color scheme + or even just calling gtk_rc_reset_styles() would do this + for us, but it appears that we actually have to reload + the RC file for it all to work. + */ + + bool env_defined = false; + string rcfile = Glib::getenv("ARDOUR3_UI_RC", env_defined); + + if (!env_defined) { + rcfile = ARDOUR_UI::config()->get_ui_rc_file(); + } + + load_rc_file (rcfile, true); +} + +void +UIConfiguration::reset_gtk_theme () +{ + stringstream ss; + + ss << "gtk_color_scheme = \"" << hex; + + for (ColorAliases::iterator g = color_aliases.begin(); g != color_aliases.end(); ++g) { + + if (g->first.find ("gtk_") == 0) { + ColorAliases::const_iterator a = color_aliases.find (g->first); + const string gtk_name = g->first.substr (4); + ss << gtk_name << ":#" << std::setw (6) << setfill ('0') << (color (g->second) >> 8) << ';'; + } + } + + ss << '"' << dec << endl; + + /* reset GTK color scheme */ + + cerr << "Reset gtk color scheme\n"; + + Gtk::Settings::get_default()->property_gtk_color_scheme() = ss.str(); +} + UIConfiguration::RelativeHSV UIConfiguration::color_as_relative_hsv (Color c) { @@ -166,24 +221,6 @@ UIConfiguration::color_as_relative_hsv (Color c) } void -UIConfiguration::color_theme_changed () -{ - return; - - map<std::string,RelativeHSV>::iterator current_color; - - /* we need to reset the quantized hues before we start, because - * otherwise when we call RelativeHSV::get() in color_compute() - * we don't get an answer based on the new base colors, but instead - * based on any existing hue quantization. - */ - - for (current_color = relative_colors.begin(); current_color != relative_colors.end(); ++current_color) { - current_color->second.quantized_hue = -1; - } -} - -void UIConfiguration::map_parameters (boost::function<void (std::string)>& functor) { #undef UI_CONFIG_VARIABLE @@ -202,7 +239,7 @@ UIConfiguration::load_defaults () XMLTree tree; found = 1; - info << string_compose (_("Loading default ui configuration file %1"), rcfile) << endl; + info << string_compose (_("Loading default ui configuration file %1"), rcfile) << endmsg; if (!tree.read (rcfile.c_str())) { error << string_compose(_("cannot read default ui configuration file \"%1\""), rcfile) << endmsg; @@ -213,10 +250,15 @@ UIConfiguration::load_defaults () error << string_compose(_("default ui configuration file \"%1\" not loaded successfully."), rcfile) << endmsg; return -1; } - + _dirty = false; } + + cerr << "\n\n\nUIC defaults reloaded, now emitting ColorsChanged\n"; + + ARDOUR_UI_UTILS::ColorsChanged (); + return found; } @@ -242,6 +284,8 @@ UIConfiguration::load_state () error << string_compose(_("default ui configuration file \"%1\" not loaded successfully."), rcfile) << endmsg; return -1; } + + /* make a copy */ } if (find_file (ardour_config_search_path(), ui_config_file_name, rcfile)) { @@ -267,6 +311,10 @@ UIConfiguration::load_state () error << _("could not find any ui configuration file, canvas will look broken.") << endmsg; } + cerr << "\n\n\nUIC loaded state, now emitting ColorsChanged\n"; + + ARDOUR_UI_UTILS::ColorsChanged (); + return 0; } @@ -275,6 +323,10 @@ UIConfiguration::save_state() { XMLTree tree; + if (!dirty()) { + return 0; + } + std::string rcfile(user_config_directory()); rcfile = Glib::build_filename (rcfile, ui_config_file_name); @@ -368,12 +420,19 @@ UIConfiguration::set_state (const XMLNode& root, int /*version*/) } } + XMLNode* relative = find_named_node (root, X_("RelativeColors")); + + if (relative) { + // load_relative_colors (*relative); + } + + XMLNode* aliases = find_named_node (root, X_("ColorAliases")); if (aliases) { load_color_aliases (*aliases); } - + return 0; } @@ -400,6 +459,32 @@ UIConfiguration::load_color_aliases (XMLNode const & node) } } + +#if 0 +void +UIConfiguration::load_relative_colors (XMLNode const & node) +{ + XMLNodeList const nlist = node.children(); + XMLNodeConstIterator niter; + XMLProperty const *name; + XMLProperty const *alias; + + color_aliases.clear (); + + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { + if ((*niter)->name() != X_("RelativeColor")) { + continue; + } + name = (*niter)->property (X_("name")); + alias = (*niter)->property (X_("alias")); + + if (name && alias) { + color_aliases.insert (make_pair (name->value(), alias->value())); + } + } + +} +#endif void UIConfiguration::set_variables (const XMLNode& node) { @@ -436,7 +521,7 @@ UIConfiguration::set_dirty () bool UIConfiguration::dirty () const { - return _dirty; + return _dirty || aliases_modified || derived_modified; } ArdourCanvas::Color @@ -558,9 +643,27 @@ UIConfiguration::set_alias (string const & name, string const & alias) return; } + cerr << "Reset alias for " << name << " to " << alias << endl; + i->second = alias; aliases_modified = true; ARDOUR_UI_UTILS::ColorsChanged (); /* EMIT SIGNAL */ } - + +void +UIConfiguration::load_rc_file (const string& filename, bool themechange) +{ + std::string rc_file_path; + + if (!find_file (ardour_config_search_path(), filename, rc_file_path)) { + warning << string_compose (_("Unable to find UI style file %1 in search path %2. %3 will look strange"), + filename, ardour_config_search_path().to_string(), PROGRAM_NAME) + << endmsg; + return; + } + + info << "Loading ui configuration file " << rc_file_path << endmsg; + + Gtkmm2ext::UI::instance()->load_rcfile (rc_file_path, themechange); +} diff --git a/gtk2_ardour/ui_config.h b/gtk2_ardour/ui_config.h index 9d9bbe8d0c..7ffb4fd28a 100644 --- a/gtk2_ardour/ui_config.h +++ b/gtk2_ardour/ui_config.h @@ -109,6 +109,10 @@ class UIConfiguration : public PBD::Stateful int save_state (); int load_defaults (); + void color_theme_changed (); + + static void load_rc_file (std::string const &, bool themechange); + int set_state (const XMLNode&, int version); XMLNode& get_state (void); XMLNode& get_variables (std::string); @@ -185,9 +189,11 @@ class UIConfiguration : public PBD::Stateful static UIConfiguration* _instance; - void color_theme_changed (); - void load_color_aliases (XMLNode const &); + void reset_gtk_theme (); + + XMLNode _saved_state_node; + int _saved_state_version; }; #endif /* __ardour_ui_configuration_h__ */ |