API to add system-specific file chooser shortcuts
authorRobin Gareus <robin@gareus.org>
Fri, 16 Oct 2015 17:06:21 +0000 (19:06 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 16 Oct 2015 17:06:21 +0000 (19:06 +0200)
libs/gtkmm2ext/gtkmm2ext/utils.h
libs/gtkmm2ext/utils.cc

index 688f4431c67b36f7fbbd6167f8edee66785977a1..43baf5980b47fdf1b0f463077875fb882fcdb29b 100644 (file)
@@ -28,6 +28,7 @@
 #include <pangomm/fontdescription.h>
 
 #include <gtkmm/container.h>
+#include <gtkmm/filechooser.h>
 #include <gtkmm/treeview.h>
 #include <gdkmm/window.h> /* for WMDecoration */
 #include <gdkmm/pixbuf.h>
@@ -170,6 +171,8 @@ namespace Gtkmm2ext {
         * use a std::string
         */
        LIBGTKMM2EXT_API std::string markup_escape_text (std::string const& s);
+
+       LIBGTKMM2EXT_API void add_volume_shortcuts (Gtk::FileChooser& c);
 };
 
 #endif /*  __gtkmm2ext_utils_h__ */
index 3762f88dd664e01459148a02dd1072161a21c371..a7790e67754dc043dea8f3635ae3c73068b07ef8 100644 (file)
@@ -973,3 +973,31 @@ 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
+}