use HSV to pick random colors and avoid over-saturation or over-brightness
[ardour.git] / gtk2_ardour / utils.cc
index aa68519560534977294548c432fc9735dab9ce18..c0fc619f6878b453914d710f12135df31b083e5b 100644 (file)
@@ -31,7 +31,6 @@
 #include <fstream>
 #include <list>
 #include <sys/stat.h>
-#include <libart_lgpl/art_misc.h>
 #include <gtkmm/rc.h>
 #include <gtkmm/window.h>
 #include <gtkmm/combo.h>
@@ -44,8 +43,8 @@
 
 #include <gtkmm2ext/utils.h>
 #include "ardour/rc_configuration.h"
-
 #include "ardour/filesystem_paths.h"
+#include "canvas/item.h"
 
 #include "ardour_ui.h"
 #include "debug.h"
@@ -54,7 +53,6 @@
 #include "utils.h"
 #include "i18n.h"
 #include "rgb_macros.h"
-#include "canvas_impl.h"
 #include "gui_thread.h"
 
 using namespace std;
@@ -201,18 +199,6 @@ xpm2rgba (const char** xpm, uint32_t& w, uint32_t& h)
        return (savergb);
 }
 
-ArdourCanvas::Points*
-get_canvas_points (string /*who*/, uint32_t npoints)
-{
-       // cerr << who << ": wants " << npoints << " canvas points" << endl;
-#ifdef TRAP_EXCESSIVE_POINT_REQUESTS
-       if (npoints > (uint32_t) gdk_screen_width() + 4) {
-               abort ();
-       }
-#endif
-       return new ArdourCanvas::Points (npoints);
-}
-
 Pango::FontDescription
 get_font_for_style (string widgetname)
 {
@@ -301,12 +287,6 @@ rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a, s
        }
 }
 
-bool
-canvas_item_visible (ArdourCanvas::Item* item)
-{
-       return (item->gobj()->object.flags & GNOME_CANVAS_ITEM_VISIBLE) ? true : false;
-}
-
 void
 set_color (Gdk::Color& c, int rgb)
 {
@@ -329,6 +309,35 @@ forward_key_press (GdkEventKey* ev)
         return PublicEditor::instance().on_key_press_event(ev);
 }
 
+bool
+emulate_key_event (Gtk::Widget* w, unsigned int keyval)
+{
+       GdkDisplay  *display = gtk_widget_get_display (GTK_WIDGET(w->gobj()));
+       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;}
+
+       GdkEventKey ev;
+       ev.type = GDK_KEY_PRESS;
+       ev.window = gtk_widget_get_window(GTK_WIDGET(w->gobj()));
+       ev.send_event = FALSE;
+       ev.time = 0;
+       ev.state = 0;
+       ev.keyval = keyval;
+       ev.length = 0;
+       ev.string = const_cast<gchar*> ("");
+       ev.hardware_keycode = keymapkey[0].keycode;
+       ev.group = keymapkey[0].group;
+       g_free(keymapkey);
+
+       forward_key_press(&ev);
+       ev.type = GDK_KEY_RELEASE;
+       return forward_key_press(&ev);
+}
+
 bool
 key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
 {
@@ -461,6 +470,8 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                /* no special handling or there are modifiers in effect: accelerate first */
 
                 DEBUG_TRACE (DEBUG::Accelerators, "\tactivate, then propagate\n");
+               DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tevent send-event:%1 time:%2 length:%3 string:%4 hardware_keycode:%5 group:%6\n",
+                                       ev->send_event, ev->time, ev->length, ev->string, ev->hardware_keycode, ev->group));
 
                if (allow_activating) {
                        DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n");
@@ -676,7 +687,7 @@ set_pango_fontsize ()
 
        /* FT2 rendering - used by GnomeCanvas, sigh */
 
-       pango_ft2_font_map_set_resolution ((PangoFT2FontMap*) pango_ft2_font_map_for_display(), val/1024, val/1024);
+       pango_ft2_font_map_set_resolution ((PangoFT2FontMap*) pango_ft2_font_map_new(), val/1024, val/1024);
 
        /* Cairo rendering, in case there is any */
 
@@ -744,6 +755,13 @@ unique_random_color (list<Gdk::Color>& used_colors)
 
        while (1) {
 
+               double h, s, v;
+
+               h = fmod (random(), 360.0);
+               s = (random() % 65535) / 65535.0;
+               v = (random() % 65535) / 65535.0;
+
+#if 0
                /* avoid neon/glowing tones by limiting them to the
                   "inner section" (paler) of a color wheel/circle.
                */
@@ -753,7 +771,11 @@ unique_random_color (list<Gdk::Color>& used_colors)
                newcolor.set_red (random() % max_saturation);
                newcolor.set_blue (random() % max_saturation);
                newcolor.set_green (random() % max_saturation);
-
+#else
+               s = min (0.5, s); /* not too saturated */
+               v = max (0.9, v);  /* not too bright */
+               newcolor.set_hsv (h, s, v);
+#endif
                if (used_colors.size() == 0) {
                        used_colors.push_back (newcolor);
                        return newcolor;