: AbstractUI<UIRequest> (namestr, true)
{
theMain = new Main (argc, argv);
- tips = new Tooltips;
_active = false;
}
int
-UI::load_rcfile (string path)
+UI::load_rcfile (string path, bool themechange)
{
if (path.length() == 0) {
return -1;
}
RC rc (path.c_str());
- RC::reset_styles(Gtk::Settings::get_default());
+ // RC::reset_styles (Gtk::Settings::get_default());
+ gtk_rc_reset_styles (gtk_settings_get_default());
+ theme_changed.emit();
+
+ if (themechange) {
+ return 0; //Don't continue on every time there is a theme change
+ }
+
+ /* have to pack widgets into a toplevel window so that styles will stick */
+
+ Window temp_window (WINDOW_TOPLEVEL);
+ HBox box;
+ Label a_widget1;
+ Label a_widget2;
+ Label a_widget3;
+ Label a_widget4;
+ RefPtr<Gtk::Style> style;
+ RefPtr<TextBuffer> buffer (errors->text().get_buffer());
+
+ box.pack_start (a_widget1);
+ box.pack_start (a_widget2);
+ box.pack_start (a_widget3);
+ box.pack_start (a_widget4);
+
+ error_ptag = buffer->create_tag();
+ error_mtag = buffer->create_tag();
+ fatal_ptag = buffer->create_tag();
+ fatal_mtag = buffer->create_tag();
+ warning_ptag = buffer->create_tag();
+ warning_mtag = buffer->create_tag();
+ info_ptag = buffer->create_tag();
+ info_mtag = buffer->create_tag();
+
+ a_widget1.set_name ("FatalMessage");
+ a_widget1.ensure_style ();
+ style = a_widget1.get_style();
+
+ fatal_ptag->property_font_desc().set_value(style->get_font());
+ fatal_ptag->property_foreground_gdk().set_value(style->get_fg(STATE_ACTIVE));
+ fatal_ptag->property_background_gdk().set_value(style->get_bg(STATE_ACTIVE));
+ fatal_mtag->property_font_desc().set_value(style->get_font());
+ fatal_mtag->property_foreground_gdk().set_value(style->get_fg(STATE_NORMAL));
+ fatal_mtag->property_background_gdk().set_value(style->get_bg(STATE_NORMAL));
+
+ a_widget2.set_name ("ErrorMessage");
+ a_widget2.ensure_style ();
+ style = a_widget2.get_style();
+
+ error_ptag->property_font_desc().set_value(style->get_font());
+ error_ptag->property_foreground_gdk().set_value(style->get_fg(STATE_ACTIVE));
+ error_ptag->property_background_gdk().set_value(style->get_bg(STATE_ACTIVE));
+ error_mtag->property_font_desc().set_value(style->get_font());
+ error_mtag->property_foreground_gdk().set_value(style->get_fg(STATE_NORMAL));
+ error_mtag->property_background_gdk().set_value(style->get_bg(STATE_NORMAL));
+
+ a_widget3.set_name ("WarningMessage");
+ a_widget3.ensure_style ();
+ style = a_widget3.get_style();
+
+ warning_ptag->property_font_desc().set_value(style->get_font());
+ warning_ptag->property_foreground_gdk().set_value(style->get_fg(STATE_ACTIVE));
+ warning_ptag->property_background_gdk().set_value(style->get_bg(STATE_ACTIVE));
+ warning_mtag->property_font_desc().set_value(style->get_font());
+ warning_mtag->property_foreground_gdk().set_value(style->get_fg(STATE_NORMAL));
+ warning_mtag->property_background_gdk().set_value(style->get_bg(STATE_NORMAL));
+
+ a_widget4.set_name ("InfoMessage");
+ a_widget4.ensure_style ();
+ style = a_widget4.get_style();
+
+ info_ptag->property_font_desc().set_value(style->get_font());
+ info_ptag->property_foreground_gdk().set_value(style->get_fg(STATE_ACTIVE));
+ info_ptag->property_background_gdk().set_value(style->get_bg(STATE_ACTIVE));
+ info_mtag->property_font_desc().set_value(style->get_font());
+ info_mtag->property_foreground_gdk().set_value(style->get_fg(STATE_NORMAL));
+ info_mtag->property_background_gdk().set_value(style->get_bg(STATE_NORMAL));
+
return 0;
}
RefPtr<Style> style;
RefPtr<TextBuffer::Tag> ptag;
RefPtr<TextBuffer::Tag> mtag;
- char *prefix;
+ const char *prefix;
size_t prefix_len;
bool fatal_received = false;
#ifndef OLD_STYLE_ERRORS
pup->touch ();
}
+#ifdef GTKOSX
+extern "C" {
+ int gdk_quartz_in_carbon_menu_event_handler ();
+}
+#endif
void
UI::flush_pending ()
{
+#ifdef GTKOSX
+ /* as of february 11th 2008, gtk/osx has a problem in that mac menu events
+ are handled using Carbon with an "internal" event handling system that
+ doesn't pass things back to the glib/gtk main loop. this makes
+ gtk_main_iteration() block if we call it while in a menu event handler
+ because glib gets confused and thinks there are two threads running
+ g_main_poll_func().
+
+ this hack (relies on code in gtk2_ardour/sync-menu.c) works
+ around that.
+ */
+
+ if (gdk_quartz_in_carbon_menu_event_handler()) {
+ return;
+ }
+#endif
if (!caller_is_ui_thread()) {
error << "non-UI threads cannot call UI::flush_pending()"
<< endmsg;
bool
UI::just_hide_it (GdkEventAny *ev, Window *win)
{
- win->hide_all ();
+ win->hide ();
return true;
}