nick m's fix for markers etc ; several tweaks for mute/solo ; rename run_in_place...
[ardour.git] / libs / gtkmm2ext / gtk_ui.cc
index ee9d39c91865a82ee5a308e6ff9068931e7bd8a2..7b60d6ba52b33d5e111d315514609478d3c157dd 100644 (file)
@@ -65,7 +65,9 @@ UI::UI (string namestr, int *argc, char ***argv)
        : AbstractUI<UIRequest> (namestr, true)
 {
        theMain = new Main (argc, argv);
+#ifndef GTK_NEW_TOOLTIP_API
        tips = new Tooltips;
+#endif
 
        _active = false;
 
@@ -96,6 +98,7 @@ UI::UI (string namestr, int *argc, char ***argv)
 
        errors->dismiss_button().set_name ("ErrorLogCloseButton");
        errors->signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), (Window *) errors));
+       errors->set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY);
 
        register_thread (pthread_self(), X_("GUI"));
 
@@ -114,7 +117,7 @@ UI::caller_is_ui_thread ()
 }
 
 int
-UI::load_rcfile (string path)
+UI::load_rcfile (string path, bool themechange)
 {
        if (path.length() == 0) {
                return -1;
@@ -129,7 +132,83 @@ UI::load_rcfile (string path)
        }
        
        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;
 }
 
@@ -262,7 +341,7 @@ UI::signal_pipe_callback (void *arg, int fd, GdkInputCondition cond)
        
        /* flush (nonblocking) pipe */
        
-       while (read (fd, buf, 256) > 0);
+       while (read (fd, buf, 256) > 0) {}
        
        ((UI *) arg)->handle_ui_requests ();
 }
@@ -297,7 +376,16 @@ UI::do_request (UIRequest* req)
 
        } else if (req->type == SetTip) {
 
-               /* XXX need to figure out how this works */
+#ifdef GTK_NEW_TOOLTIP_API
+               /* even if the installed GTK is up to date,
+                  at present (November 2008) our included
+                  version of gtkmm is not. so use the GTK
+                  API that we've verified has the right function.
+               */
+               gtk_widget_set_tooltip_text (req->widget->gobj(), req->msg);
+#else
+               tips->set_tip (*req->widget, req->msg, "");
+#endif
 
        } else {
 
@@ -338,7 +426,7 @@ UI::process_error_message (Transmitter::Channel chn, const char *str)
        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
@@ -484,10 +572,31 @@ UI::popup_error (const char *text)
        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;
@@ -504,7 +613,7 @@ UI::flush_pending ()
 bool
 UI::just_hide_it (GdkEventAny *ev, Window *win)
 {
-       win->hide_all ();
+       win->hide ();
        return true;
 }