summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-12-06 15:27:18 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2014-12-07 13:12:48 -0500
commitd586289be5137a7740bc8e3103a7f68c1ad8dd06 (patch)
treedc7e505c68cc79dce8b5a0fa6bdadc2305514b63
parent01747cc5f7e8cc77837525bd3b9862ae7b5f0a52 (diff)
first mostly-working build supporting GTK rethemeing via the Theme Manager
-rw-r--r--gtk2_ardour/color_aliases.h43
-rw-r--r--gtk2_ardour/default_ui_config.in40
-rw-r--r--gtk2_ardour/theme_manager.cc65
-rw-r--r--gtk2_ardour/ui_config.cc151
-rw-r--r--gtk2_ardour/ui_config.h10
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__ */