first mostly-working build supporting GTK rethemeing via the Theme Manager

This commit is contained in:
Paul Davis 2014-12-06 15:27:18 -05:00
parent 01747cc5f7
commit d586289be5
5 changed files with 237 additions and 72 deletions

View File

@ -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")

View File

@ -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"/>

View File

@ -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()
@ -326,23 +329,6 @@ ThemeManager::foobar_response (int result)
color_dialog.hide ();
}
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 ()
{
@ -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();
}
UIConfiguration* uic (ARDOUR_UI::config());
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());
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 ();
}

View File

@ -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)
{
@ -165,24 +220,6 @@ UIConfiguration::color_as_relative_hsv (Color c)
return RelativeHSV (closest_name, delta);
}
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)
{
@ -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);
}

View File

@ -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__ */