expand bbox for Canvas::Line to get rid of artifacts caused when moving them around...
[ardour.git] / gtk2_ardour / utils.cc
index 96bee1a87ba0b951067f2f7c8226f3fc73ce9065..c9e67d1139c2851c0baabe411ceb3de0518475e2 100644 (file)
 #include <pango/pangocairo.h> // for fontmap resolution control for GnomeCanvas
 
 #include <cstdlib>
+#include <clocale>
+#include <cstring>
 #include <cctype>
 #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>
 #include <gtkmm/label.h>
 #include <gtkmm/paned.h>
 #include <gtk/gtkpaned.h>
+#include <boost/algorithm/string.hpp>
 
 #include "pbd/file_utils.h"
 
 #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"
@@ -51,7 +53,6 @@
 #include "utils.h"
 #include "i18n.h"
 #include "rgb_macros.h"
-#include "canvas_impl.h"
 #include "gui_thread.h"
 
 using namespace std;
@@ -198,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)
 {
@@ -225,13 +214,13 @@ get_font_for_style (string widgetname)
 
        Glib::RefPtr<const Pango::Layout> layout = foobar.get_layout();
 
-       PangoFontDescription *pfd = (PangoFontDescription *)pango_layout_get_font_description((PangoLayout *)layout->gobj());
+       PangoFontDescription *pfd = const_cast<PangoFontDescription *> (pango_layout_get_font_description(const_cast<PangoLayout *>(layout->gobj())));
 
        if (!pfd) {
 
                /* layout inherited its font description from a PangoContext */
 
-               PangoContext* ctxt = (PangoContext*) pango_layout_get_context ((PangoLayout*) layout->gobj());
+               PangoContext* ctxt = (PangoContext*) pango_layout_get_context (const_cast<PangoLayout*>(layout->gobj()));
                pfd =  pango_context_get_font_description (ctxt);
                return Pango::FontDescription (pfd); /* make a copy */
        }
@@ -298,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)
 {
@@ -343,11 +326,16 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
        }
 
 #ifdef GTKOSX
-       /* should this be universally true? */
+        /* at one time this appeared to be necessary. As of July 2012, it does not
+           appear to be. if it ever is necessar, figure out if it should apply
+           to all platforms.
+        */
+#if 0 
        if (Keyboard::some_magic_widget_has_focus ()) {
-               allow_activating = false;
+                allow_activating = false;
        }
 #endif
+#endif
 
 
         DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 focus = %7 Key event: code = %2  state = %3 special handling ? %4 magic widget focus ? %5 allow_activation ? %6\n",
@@ -455,7 +443,9 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                 DEBUG_TRACE (DEBUG::Accelerators, "\tactivate, then propagate\n");
 
                if (allow_activating) {
+                       DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n");
                        if (gtk_window_activate_key (win, ev)) {
+                               DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
                                return true;
                        }
                } else {
@@ -497,14 +487,14 @@ get_xpm (std::string name)
 
                spath.add_subdirectory_to_paths("pixmaps");
 
-               sys::path data_file_path;
+               std::string data_file_path;
 
                if(!find_file_in_search_path (spath, name, data_file_path)) {
                        fatal << string_compose (_("cannot find XPM file for %1"), name) << endmsg;
                }
 
                try {
-                       xpm_map[name] =  Gdk::Pixbuf::create_from_file (data_file_path.to_string());
+                       xpm_map[name] =  Gdk::Pixbuf::create_from_file (data_file_path);
                } catch(const Glib::Error& e)   {
                        warning << "Caught Glib::Error: " << e.what() << endmsg;
                }
@@ -523,13 +513,13 @@ get_icon_path (const char* cname)
 
        spath.add_subdirectory_to_paths("icons");
 
-       sys::path data_file_path;
+       std::string data_file_path;
 
        if (!find_file_in_search_path (spath, name, data_file_path)) {
                fatal << string_compose (_("cannot find icon image for %1 using %2"), name, spath.to_string()) << endmsg;
        }
 
-       return data_file_path.to_string();
+       return data_file_path;
 }
 
 Glib::RefPtr<Gdk::Pixbuf>
@@ -541,7 +531,7 @@ get_icon (const char* cname)
        } catch (const Gdk::PixbufError &e) {
                cerr << "Caught PixbufError: " << e.what() << endl;
        } catch (...) {
-               g_message("Caught ... ");
+               error << string_compose (_("Caught exception while loading icon named %1"), cname) << endmsg;
        }
 
        return img;
@@ -578,11 +568,48 @@ longest (vector<string>& strings)
 bool
 key_is_legal_for_numeric_entry (guint keyval)
 {
+       /* we assume that this does not change over the life of the process 
+        */
+
+       static int comma_decimal = -1;
+
        switch (keyval) {
-       case GDK_minus:
-       case GDK_plus:
        case GDK_period:
        case GDK_comma:
+               if (comma_decimal < 0) {
+                       std::lconv* lc = std::localeconv();
+                       if (strchr (lc->decimal_point, ',') != 0) {
+                               comma_decimal = 1;
+                       } else {
+                               comma_decimal = 0;
+                       }
+               }
+               break;
+       default:
+               break;
+       }
+
+       switch (keyval) {
+       case GDK_decimalpoint:
+       case GDK_KP_Separator:
+               return true;
+
+       case GDK_period:
+               if (comma_decimal) {
+                       return false;
+               } else {
+                       return true;
+               }
+               break;
+       case GDK_comma:
+               if (comma_decimal) {
+                       return true;
+               } else {
+                       return false;
+               }
+               break;
+       case GDK_minus:
+       case GDK_plus:
        case GDK_0:
        case GDK_1:
        case GDK_2:
@@ -629,7 +656,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 */
 
@@ -680,6 +707,16 @@ escape_underscores (string const & s)
        return o;
 }
 
+/** Replace < and > with &lt; and &gt; respectively to make < > display correctly in markup strings */
+string
+escape_angled_brackets (string const & s)
+{
+       string o = s;
+       boost::replace_all (o, "<", "&lt;");
+       boost::replace_all (o, ">", "&gt;");
+       return o;
+}
+
 Gdk::Color
 unique_random_color (list<Gdk::Color>& used_colors)
 {