+ PersistentTooltip::set_tooltips_enabled (false);
+}
+
+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)
+{
+ switch (event_type) {
+ case GDK_NOTHING:
+ return "nothing";
+ case GDK_DELETE:
+ return "delete";
+ case GDK_DESTROY:
+ return "destroy";
+ case GDK_EXPOSE:
+ return "expose";
+ case GDK_MOTION_NOTIFY:
+ return "motion_notify";
+ case GDK_BUTTON_PRESS:
+ return "button_press";
+ case GDK_2BUTTON_PRESS:
+ return "2button_press";
+ case GDK_3BUTTON_PRESS:
+ return "3button_press";
+ case GDK_BUTTON_RELEASE:
+ return "button_release";
+ case GDK_KEY_PRESS:
+ return "key_press";
+ case GDK_KEY_RELEASE:
+ return "key_release";
+ case GDK_ENTER_NOTIFY:
+ return "enter_notify";
+ case GDK_LEAVE_NOTIFY:
+ return "leave_notify";
+ case GDK_FOCUS_CHANGE:
+ return "focus_change";
+ case GDK_CONFIGURE:
+ return "configure";
+ case GDK_MAP:
+ return "map";
+ case GDK_UNMAP:
+ return "unmap";
+ case GDK_PROPERTY_NOTIFY:
+ return "property_notify";
+ case GDK_SELECTION_CLEAR:
+ return "selection_clear";
+ case GDK_SELECTION_REQUEST:
+ return "selection_request";
+ case GDK_SELECTION_NOTIFY:
+ return "selection_notify";
+ case GDK_PROXIMITY_IN:
+ return "proximity_in";
+ case GDK_PROXIMITY_OUT:
+ return "proximity_out";
+ case GDK_DRAG_ENTER:
+ return "drag_enter";
+ case GDK_DRAG_LEAVE:
+ return "drag_leave";
+ case GDK_DRAG_MOTION:
+ return "drag_motion";
+ case GDK_DRAG_STATUS:
+ return "drag_status";
+ case GDK_DROP_START:
+ return "drop_start";
+ case GDK_DROP_FINISHED:
+ return "drop_finished";
+ case GDK_CLIENT_EVENT:
+ return "client_event";
+ case GDK_VISIBILITY_NOTIFY:
+ return "visibility_notify";
+ case GDK_NO_EXPOSE:
+ return "no_expose";
+ case GDK_SCROLL:
+ return "scroll";
+ case GDK_WINDOW_STATE:
+ return "window_state";
+ case GDK_SETTING:
+ return "setting";
+ case GDK_OWNER_CHANGE:
+ return "owner_change";
+ case GDK_GRAB_BROKEN:
+ return "grab_broken";
+ case GDK_DAMAGE:
+ return "damage";
+ }
+
+ return "unknown";
+}
+
+std::string
+Gtkmm2ext::markup_escape_text (std::string const& s)
+{
+ return Glib::Markup::escape_text (s);
+}
+
+void
+Gtkmm2ext::add_volume_shortcuts (Gtk::FileChooser& c)
+{
+#ifdef __APPLE__
+ try {
+ /* This is a first order approach, listing all mounted volumes (incl network).
+ * One could use `diskutil` or `mount` to query local disks only, or
+ * something even fancier if deemed appropriate.
+ */
+ Glib::Dir dir("/Volumes");
+ for (Glib::DirIterator di = dir.begin(); di != dir.end(); di++) {
+ string fullpath = Glib::build_filename ("/Volumes", *di);
+ if (!Glib::file_test (fullpath, Glib::FILE_TEST_IS_DIR)) continue;
+
+ try { /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
+ c.add_shortcut_folder (fullpath);
+ }
+ catch (Glib::Error& e) {
+ std::cerr << "add_shortcut_folder() threw Glib::Error: " << e.what() << std::endl;
+ }
+ }
+ }
+ catch (Glib::FileError& e) {
+ std::cerr << "listing /Volumnes failed: " << e.what() << std::endl;
+ }
+#endif
+}
+
+float
+Gtkmm2ext::paned_position_as_fraction (Gtk::Paned& paned, bool h)
+{
+ const guint pos = gtk_paned_get_position (const_cast<GtkPaned*>(static_cast<const Gtk::Paned*>(&paned)->gobj()));
+ return (double) pos / (h ? paned.get_allocation().get_height() : paned.get_allocation().get_width());
+}
+
+void
+Gtkmm2ext::paned_set_position_as_fraction (Gtk::Paned& paned, float fraction, bool h)
+{
+ gint v = (h ? paned.get_allocation().get_height() : paned.get_allocation().get_width());
+
+ if (v < 1) {
+ return;
+ }
+
+ paned.set_position ((guint) floor (fraction * v));