additional DEBUG_TRACE output for slave/diskreader
[ardour.git] / gtk2_ardour / utils.cc
index eddae2974ee67cfe7d7d0ae6bd896e4c62852be7..97c36b7fafabec11705845ca50bc4e55afd85eab 100644 (file)
 #include <cmath>
 #include <list>
 #include <sys/stat.h>
-#include <gtkmm/rc.h>
-#include <gtkmm/window.h>
+
+#include <boost/algorithm/string.hpp>
+
+#include <gtk/gtkpaned.h>
 #include <gtkmm/combo.h>
 #include <gtkmm/label.h>
 #include <gtkmm/paned.h>
-#include <gtk/gtkpaned.h>
-#include <boost/algorithm/string.hpp>
+#include <gtkmm/rc.h>
+#include <gtkmm/stock.h>
+#include <gtkmm/window.h>
 
+#include "pbd/basename.h"
 #include "pbd/file_utils.h"
-
-#include <gtkmm2ext/utils.h>
+#include "pbd/stacktrace.h"
 
 #include "ardour/filesystem_paths.h"
+#include "ardour/search_paths.h"
+
+#include "gtkmm2ext/colors.h"
+#include "gtkmm2ext/utils.h"
 
 #include "canvas/item.h"
-#include "canvas/utils.h"
 
 #include "debug.h"
 #include "public_editor.h"
 #include "keyboard.h"
 #include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "rgb_macros.h"
 #include "gui_thread.h"
 #include "ui_config.h"
@@ -261,6 +267,22 @@ ARDOUR_UI_UTILS::get_font_for_style (string widgetname)
        return Pango::FontDescription (pfd); /* make a copy */
 }
 
+Gdk::Color
+ARDOUR_UI_UTILS::gdk_color_from_rgb (uint32_t rgb)
+{
+       Gdk::Color c;
+       set_color_from_rgb (c, rgb);
+       return c;
+}
+
+Gdk::Color
+ARDOUR_UI_UTILS::gdk_color_from_rgba (uint32_t rgba)
+{
+       Gdk::Color c;
+       set_color_from_rgb (c, rgba >> 8);
+       return c;
+}
+
 void
 ARDOUR_UI_UTILS::set_color_from_rgb (Gdk::Color& c, uint32_t rgb)
 {
@@ -294,7 +316,6 @@ ARDOUR_UI_UTILS::gdk_color_to_rgba (Gdk::Color const& c)
        return RGBA_TO_UINT (r,g,b,a);
 }
 
-
 bool
 ARDOUR_UI_UTILS::relay_key_press (GdkEventKey* ev, Gtk::Window* win)
 {
@@ -308,12 +329,12 @@ ARDOUR_UI_UTILS::emulate_key_event (unsigned int keyval)
        GdkKeymap   *keymap  = gdk_keymap_get_for_display (display);
        GdkKeymapKey *keymapkey = NULL;
        gint n_keys;
-       
+
        if (!gdk_keymap_get_entries_for_keyval(keymap, keyval, &keymapkey, &n_keys)) return false;
        if (n_keys !=1) { g_free(keymapkey); return false;}
 
        Gtk::Window& main_window (ARDOUR_UI::instance()->main_window());
-       
+
        GdkEventKey ev;
        ev.type = GDK_KEY_PRESS;
        ev.window = main_window.get_window()->gobj();
@@ -332,65 +353,6 @@ ARDOUR_UI_UTILS::emulate_key_event (unsigned int keyval)
        return relay_key_press(&ev, &main_window);
 }
 
-string
-ARDOUR_UI_UTILS::show_gdk_event_state (int state)
-{
-       string s;
-       if (state & GDK_SHIFT_MASK) {
-               s += "+SHIFT";
-       }
-       if (state & GDK_LOCK_MASK) {
-               s += "+LOCK";
-       }
-       if (state & GDK_CONTROL_MASK) {
-               s += "+CONTROL";
-       }
-       if (state & GDK_MOD1_MASK) {
-               s += "+MOD1";
-       }
-       if (state & GDK_MOD2_MASK) {
-               s += "+MOD2";
-       }
-       if (state & GDK_MOD3_MASK) {
-               s += "+MOD3";
-       }
-       if (state & GDK_MOD4_MASK) {
-               s += "+MOD4";
-       }
-       if (state & GDK_MOD5_MASK) {
-               s += "+MOD5";
-       }
-       if (state & GDK_BUTTON1_MASK) {
-               s += "+BUTTON1";
-       }
-       if (state & GDK_BUTTON2_MASK) {
-               s += "+BUTTON2";
-       }
-       if (state & GDK_BUTTON3_MASK) {
-               s += "+BUTTON3";
-       }
-       if (state & GDK_BUTTON4_MASK) {
-               s += "+BUTTON4";
-       }
-       if (state & GDK_BUTTON5_MASK) {
-               s += "+BUTTON5";
-       }
-       if (state & GDK_SUPER_MASK) {
-               s += "+SUPER";
-       }
-       if (state & GDK_HYPER_MASK) {
-               s += "+HYPER";
-       }
-       if (state & GDK_META_MASK) {
-               s += "+META";
-       }
-       if (state & GDK_RELEASE_MASK) {
-               s += "+RELEASE";
-       }
-
-       return s;
-}
-
 Glib::RefPtr<Gdk::Pixbuf>
 ARDOUR_UI_UTILS::get_xpm (std::string name)
 {
@@ -416,6 +378,44 @@ ARDOUR_UI_UTILS::get_xpm (std::string name)
        return xpm_map[name];
 }
 
+void
+ARDOUR_UI_UTILS::get_color_themes (map<std::string,std::string>& themes)
+{
+       Searchpath spath(ARDOUR::theme_search_path());
+
+       for (vector<string>::iterator s = spath.begin(); s != spath.end(); ++s) {
+
+               vector<string> entries;
+
+               find_files_matching_pattern (entries, *s, string ("*") + UIConfiguration::color_file_suffix);
+
+               for (vector<string>::iterator e = entries.begin(); e != entries.end(); ++e) {
+
+                       XMLTree tree;
+
+                       tree.read ((*e).c_str());
+                       XMLNode* root = tree.root();
+
+                       if (!root || root->name() != X_("Ardour")) {
+                               continue;
+                       }
+
+                       XMLProperty const* prop = root->property (X_("theme-name"));
+
+                       if (!prop) {
+                               continue;
+                       }
+
+                       std::string color_name = basename_nosuffix(*e);
+                       size_t sep = color_name.find_first_of("-");
+                       if (sep != string::npos) {
+                               color_name = color_name.substr (0, sep);
+                       }
+                       themes.insert (make_pair (prop->value(), color_name));
+               }
+       }
+}
+
 vector<string>
 ARDOUR_UI_UTILS::get_icon_sets ()
 {
@@ -465,6 +465,12 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set, bool is_imag
                find_file (spath, name, data_file_path);
        }
 
+       if (data_file_path.empty()) {
+               Searchpath rc (ARDOUR::ardour_data_search_path());
+               rc.add_subdirectory_to_paths ("resources");
+               find_file (rc, name, data_file_path);
+       }
+
        if (is_image && data_file_path.empty()) {
 
                if (!icon_set.empty() && icon_set != _("default")) {
@@ -660,20 +666,10 @@ ARDOUR_UI_UTILS::escape_underscores (string const & s)
        return o;
 }
 
-/** Replace < and > with &lt; and &gt; respectively to make < > display correctly in markup strings */
-string
-ARDOUR_UI_UTILS::escape_angled_brackets (string const & s)
-{
-       string o = s;
-       boost::replace_all (o, "<", "&lt;");
-       boost::replace_all (o, ">", "&gt;");
-       return o;
-}
-
 Gdk::Color
 ARDOUR_UI_UTILS::unique_random_color (list<Gdk::Color>& used_colors)
 {
-       Gdk::Color newcolor;
+       Gdk::Color newcolor;
 
        while (1) {
 
@@ -779,3 +775,10 @@ ARDOUR_UI_UTILS::overwrite_file_dialog (Gtk::Window& parent, string title, strin
                return false;
        }
 }
+
+bool
+ARDOUR_UI_UTILS::running_from_source_tree ()
+{
+       gchar const *x = g_getenv ("ARDOUR_THEMES_PATH");
+       return x && (string (x).find ("gtk2_ardour") != string::npos);
+}