fix typo in b9fc616538
[ardour.git] / libs / gtkmm2ext / utils.cc
index 4c85f1928de5d74d203ab1a1da69752f87882db8..b4926ac43b0177761e1293c94fa74f4123fb7a92 100644 (file)
@@ -42,6 +42,7 @@ Gtkmm2ext::init (const char* localedir)
 {
 #ifdef ENABLE_NLS
        (void) bindtextdomain(PACKAGE, localedir);
+       (void) bind_textdomain_codeset (PACKAGE, "UTF-8");
 #endif
 }
 
@@ -75,6 +76,51 @@ Gtkmm2ext::set_size_request_to_display_given_text (Gtk::Widget &w, const gchar *
        w.set_size_request(width + hpadding, height + vpadding);
 }
 
+/** Set width request to display given text, and height to display anything.
+    This is useful for setting many widgets to the same height for consistency. */
+void
+Gtkmm2ext::set_size_request_to_display_given_text_width (Gtk::Widget& w,
+                                                         const gchar* htext,
+                                                         gint         hpadding,
+                                                         gint         vpadding)
+{
+       static const gchar* vtext = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+       w.ensure_style ();
+
+       int hwidth, hheight;
+       get_pixel_size (w.create_pango_layout (htext), hwidth, hheight);
+
+       int vwidth, vheight;
+       get_pixel_size (w.create_pango_layout (vtext), vwidth, vheight);
+
+       w.set_size_request(hwidth + hpadding, vheight + vpadding);
+}
+
+void
+Gtkmm2ext::set_height_request_to_display_any_text (Gtk::Widget& w, gint vpadding)
+{
+       static const gchar* vtext = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+       w.ensure_style ();
+
+       int width, height;
+       get_pixel_size (w.create_pango_layout (vtext), width, height);
+
+       w.set_size_request(-1, height + vpadding);
+}
+
+void
+Gtkmm2ext::set_size_request_to_display_given_text (Gtk::Widget &w, std::string const & text,
+                                                  gint hpadding, gint vpadding)
+{
+       int width, height;
+       w.ensure_style ();
+       
+       get_pixel_size (w.create_pango_layout (text), width, height);
+       w.set_size_request(width + hpadding, height + vpadding);
+}
+
 void
 Gtkmm2ext::set_size_request_to_display_given_text (Gtk::Widget &w, 
                                                   const std::vector<std::string>& strings,
@@ -113,6 +159,33 @@ Gtkmm2ext::set_size_request_to_display_given_text (Gtk::Widget &w,
        w.set_size_request(width_max + hpadding, height_max + vpadding);
 }
 
+/** This version specifies horizontal padding in text to avoid assumptions
+    about font size.  Should be used anywhere padding is used to avoid text,
+    like combo boxes. */
+void
+Gtkmm2ext::set_size_request_to_display_given_text (Gtk::Widget&                    w,
+                                                   const std::vector<std::string>& strings,
+                                                   const std::string&              hpadding,
+                                                   gint                            vpadding)
+{
+       int width_max = 0;
+       int height_max = 0;
+       w.ensure_style ();
+
+       for (vector<string>::const_iterator i = strings.begin(); i != strings.end(); ++i) {
+               int width, height;
+               get_pixel_size (w.create_pango_layout (*i), width, height);
+               width_max = max(width_max,width);
+               height_max = max(height_max, height);
+       }
+
+       int pad_width;
+       int pad_height;
+       get_pixel_size (w.create_pango_layout (hpadding), pad_width, pad_height);
+
+       w.set_size_request(width_max + pad_width, height_max + vpadding);
+}
+
 static inline guint8
 demultiply_alpha (guint8 src,
                   guint8 alpha)
@@ -681,6 +754,33 @@ Gtkmm2ext::disable_tooltips ()
        gtk_rc_parse_string ("gtk-enable-tooltips = 0");
 }
 
+bool
+Gtkmm2ext::event_inside_widget_window (Gtk::Widget& widget, GdkEvent* ev)
+{
+        gdouble evx, evy;
+
+        if (!gdk_event_get_root_coords (ev, &evx, &evy)) {
+                return false;
+        }
+        
+        gint wx;
+        gint wy;
+        gint width, height, depth;
+        gint x, y;
+
+        Glib::RefPtr<Gdk::Window> widget_window = widget.get_window();
+
+        widget_window->get_geometry (x, y, width, height, depth);
+        widget_window->get_root_origin (wx, wy);
+        
+        if ((evx >= wx && evx < wx + width) && 
+            (evy >= wy && evy < wy + height)) {
+                return true;
+        } 
+
+        return false;
+}
+
 const char*
 Gtkmm2ext::event_type_string (int event_type)
 {