[Xfce4-commits] <ristretto:master> Launch default editor configured in $XDG_DATA_DIR/mime.db

Stephan Arts noreply at xfce.org
Fri Mar 30 20:32:06 CEST 2012


Updating branch refs/heads/master
         to 956b4bb92d5b39699df3e9a0a6eb3f99e022caa1 (commit)
       from d64b4b629756357bd71b6fcdc77ca6b05a3de3e3 (commit)

commit 956b4bb92d5b39699df3e9a0a6eb3f99e022caa1
Author: Stephan Arts <stephan at xfce.org>
Date:   Fri Mar 30 01:25:13 2012 +0200

    Launch default editor configured in $XDG_DATA_DIR/mime.db

 configure.in.in   |    1 +
 src/Makefile.am   |    4 +-
 src/db.c          |   23 ------
 src/db.h          |   26 ------
 src/main_window.c |  116 +++++++++++++++-------------
 src/mime_db.c     |  223 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/mime_db.h     |   82 +++++++++++++++++++
 7 files changed, 371 insertions(+), 104 deletions(-)

diff --git a/configure.in.in b/configure.in.in
index 310f9c2..c83c30a 100644
--- a/configure.in.in
+++ b/configure.in.in
@@ -57,6 +57,7 @@ XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.24.0])
 XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.24.0])
 XDT_CHECK_PACKAGE([GOBJECT], [gobject-2.0], [2.24.0])
 XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.18.0])
+XDT_CHECK_PACKAGE([GIO_UNIX], [gio-unix-2.0], [2.18.0])
 XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.34])
 XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.8.0])
 XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.9.0])
diff --git a/src/Makefile.am b/src/Makefile.am
index e86d739..4f55735 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -18,7 +18,7 @@ ristretto_SOURCES = \
 	file.c file.h \
 	privacy_dialog.h privacy_dialog.c \
 	util.c util.h \
-	db.c db.h \
+	mime_db.c mime_db.h \
 	icon_bar.c icon_bar.h \
 	main.c
 
@@ -27,6 +27,7 @@ ristretto_CFLAGS = \
 	$(GLIB_CFLAGS) \
 	$(GTHREAD_CFLAGS) \
 	$(GIO_CFLAGS) \
+	$(GIO_UNIX_CFLAGS) \
 	$(LIBEXIF_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(EXO_CFLAGS) \
@@ -44,6 +45,7 @@ ristretto_LDADD = \
 	$(GLIB_LIBS) \
 	$(GTHREAD_LIBS) \
 	$(GIO_LIBS) \
+	$(GIO_UNIX_LIBS) \
 	$(LIBEXIF_LIBS) \
 	$(XFCONF_LIBS) \
 	$(EXO_LIBS) \
diff --git a/src/db.c b/src/db.c
deleted file mode 100644
index 9989850..0000000
--- a/src/db.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) Stephan Arts 2012 <stephan at xfce.org>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU Library General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <glib.h>
-#include <locale.h>
-
-#include "db.h"
diff --git a/src/db.h b/src/db.h
deleted file mode 100644
index 3d59cdd..0000000
--- a/src/db.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright (c) Stephan Arts 2011 <stephan at xfce.org>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU Library General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef __RISTRETTO_DB_H__
-#define __RISTRETTO_DB_H__
-
-G_BEGIN_DECLS
-
-G_END_DECLS
-
-#endif /* __RSTTO_DB_H__ */
diff --git a/src/main_window.c b/src/main_window.c
index 5e1e0a1..db7462e 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -23,6 +23,7 @@
 #include <string.h>
 
 #include <gio/gio.h>
+#include <gio/gdesktopappinfo.h>
 
 #include <libxfce4ui/libxfce4ui.h>
 #include <libexif/exif-data.h>
@@ -32,6 +33,7 @@
 #include <cairo/cairo.h>
 
 #include "settings.h"
+#include "mime_db.h"
 #include "util.h"
 #include "file.h"
 #include "icon_bar.h"
@@ -63,58 +65,60 @@
 
 struct _RsttoMainWindowPriv
 {
-    RsttoImageList *image_list;
+    RsttoImageList        *image_list;
 
-    DBusGConnection *connection;
-    DBusGProxy *filemanager_proxy;
+    RsttoMimeDB           *db;
 
-    guint show_fs_toolbar_timeout_id;
-    gint window_save_geometry_timer_id;
+    DBusGConnection       *connection;
+    DBusGProxy            *filemanager_proxy;
+
+    guint                  show_fs_toolbar_timeout_id;
+    gint                   window_save_geometry_timer_id;
     
-    gboolean fs_toolbar_sticky;
+    gboolean               fs_toolbar_sticky;
 
-    RsttoImageListIter *iter;
+    RsttoImageListIter    *iter;
 
-    GtkActionGroup   *action_group;
-    GtkUIManager     *ui_manager;
-    GtkRecentManager *recent_manager;
-    RsttoSettings    *settings_manager;
+    GtkActionGroup        *action_group;
+    GtkUIManager          *ui_manager;
+    GtkRecentManager      *recent_manager;
+    RsttoSettings         *settings_manager;
     RsttoWallpaperManager *wallpaper_manager;
 
-    GtkWidget *menubar;
-    GtkWidget *toolbar;
-    GtkWidget *warning;
-    GtkWidget *warning_label;
-    GtkWidget *image_viewer_menu;
-    GtkWidget *position_menu;
-    GtkWidget *image_viewer;
-    GtkWidget *p_viewer_s_window;
-    GtkWidget *table;
-    GtkWidget *t_bar_s_window;
-    GtkWidget *thumbnailbar;
-    GtkWidget *statusbar;
-    guint statusbar_context_id;
-
-    GtkWidget *back;
-    GtkWidget *forward;
-
-    guint      t_open_merge_id;
-    guint      recent_merge_id;
-    guint      play_merge_id;
-    guint      pause_merge_id;
-    guint      toolbar_play_merge_id;
-    guint      toolbar_pause_merge_id;
-    guint      toolbar_fullscreen_merge_id;
-    guint      toolbar_unfullscreen_merge_id;
-
-    GtkAction *play_action;
-    GtkAction *pause_action;
-    GtkAction *recent_action;
-
-    gboolean playing;
-    gint play_timeout_id;
-
-    GtkFileFilter *filter;
+    GtkWidget             *menubar;
+    GtkWidget             *toolbar;
+    GtkWidget             *warning;
+    GtkWidget             *warning_label;
+    GtkWidget             *image_viewer_menu;
+    GtkWidget             *position_menu;
+    GtkWidget             *image_viewer;
+    GtkWidget             *p_viewer_s_window;
+    GtkWidget             *table;
+    GtkWidget             *t_bar_s_window;
+    GtkWidget             *thumbnailbar;
+    GtkWidget             *statusbar;
+    guint                  statusbar_context_id;
+
+    GtkWidget             *back;
+    GtkWidget             *forward;
+
+    guint                  t_open_merge_id;
+    guint                  recent_merge_id;
+    guint                  play_merge_id;
+    guint                  pause_merge_id;
+    guint                  toolbar_play_merge_id;
+    guint                  toolbar_pause_merge_id;
+    guint                  toolbar_fullscreen_merge_id;
+    guint                  toolbar_unfullscreen_merge_id;
+
+    GtkAction             *play_action;
+    GtkAction             *pause_action;
+    GtkAction             *recent_action;
+
+    gboolean               playing;
+    gint                   play_timeout_id;
+
+    GtkFileFilter         *filter;
 };
 
 enum
@@ -472,11 +476,19 @@ rstto_main_window_init (RsttoMainWindow *window)
 
     guint navigationbar_position = 3;
     guint thumbnail_size = 3;
+    gchar *db_path = NULL;
 
     gtk_window_set_title (GTK_WINDOW (window), RISTRETTO_APP_TITLE);
 
     window->priv = g_new0(RsttoMainWindowPriv, 1);
+
+    db_path = xfce_resource_save_location (
+            XFCE_RESOURCE_DATA, "ristretto/mime.db", TRUE);
     
+    if (db_path != NULL)
+    {
+        window->priv->db = rstto_mime_db_new ( db_path, NULL);
+    }
 
     window->priv->iter = NULL;
 
@@ -2862,16 +2874,12 @@ cb_rstto_main_window_edit (
 {
     RsttoFile *r_file = rstto_image_list_iter_get_file(window->priv->iter);
     const gchar *content_type = rstto_file_get_content_type (r_file);
-    GList *app_infos = g_app_info_get_all_for_type (content_type);
-    GList *iter = app_infos;
+    const gchar *editor = rstto_mime_db_lookup (window->priv->db, content_type);
+    GList *files = g_list_prepend (NULL, rstto_file_get_file (r_file));
 
-    while (iter)
-    {
-        g_debug("N: %s", g_app_info_get_name (iter->data));
-        g_debug("DN:%s", g_app_info_get_display_name (iter->data));
-        g_debug("D: %s", g_app_info_get_description (iter->data));
-        iter = g_list_next (iter);
-    }
+    GDesktopAppInfo *app_info = g_desktop_app_info_new (editor);
+    g_app_info_launch (G_APP_INFO(app_info), files, NULL, NULL);
+    g_list_free (files);
 }
 
 /**
diff --git a/src/mime_db.c b/src/mime_db.c
new file mode 100644
index 0000000..59d1b08
--- /dev/null
+++ b/src/mime_db.c
@@ -0,0 +1,223 @@
+/*
+ *  Copyright (c) Stephan Arts 2012 <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <locale.h>
+
+#include <libxfce4util/libxfce4util.h>
+
+#include "mime_db.h"
+
+static void
+rstto_mime_db_init (GObject *);
+static void
+rstto_mime_db_class_init (GObjectClass *);
+
+static void
+rstto_mime_db_dispose (GObject *object);
+static void
+rstto_mime_db_finalize (GObject *object);
+
+static void
+rstto_mime_db_set_property (
+        GObject      *object,
+        guint         property_id,
+        const GValue *value,
+        GParamSpec   *pspec );
+
+static void
+rstto_mime_db_get_property (
+        GObject    *object,
+        guint       property_id,
+        GValue     *value,
+        GParamSpec *pspec);
+
+enum
+{
+    PROP_0,
+    PROP_FILE
+};
+
+static GObjectClass *parent_class = NULL;
+
+GType
+rstto_mime_db_get_type (void)
+{
+    static GType rstto_mime_db_type = 0;
+
+    if (!rstto_mime_db_type)
+    {
+        static const GTypeInfo rstto_mime_db_info = 
+        {
+            sizeof (RsttoMimeDBClass),
+            (GBaseInitFunc) NULL,
+            (GBaseFinalizeFunc) NULL,
+            (GClassInitFunc) rstto_mime_db_class_init,
+            (GClassFinalizeFunc) NULL,
+            NULL,
+            sizeof (RsttoMimeDB),
+            0,
+            (GInstanceInitFunc) rstto_mime_db_init,
+            NULL
+        };
+
+        rstto_mime_db_type = g_type_register_static (G_TYPE_OBJECT, "RsttoMimeDB", &rstto_mime_db_info, 0);
+    }
+    return rstto_mime_db_type;
+}
+
+struct _RsttoMimeDBPriv
+{
+    GFile   *file;
+    XfceRc  *rc;
+};
+
+static void
+rstto_mime_db_init (GObject *object)
+{
+    RsttoMimeDB *mime_db = RSTTO_MIME_DB (object);
+
+    mime_db->priv = g_new0 (RsttoMimeDBPriv, 1);
+}
+
+static void
+rstto_mime_db_class_init (GObjectClass *object_class)
+{
+    RsttoMimeDBClass *mime_db_class = RSTTO_MIME_DB_CLASS (object_class);
+
+    parent_class = g_type_class_peek_parent (mime_db_class);
+
+    object_class->dispose = rstto_mime_db_dispose;
+    object_class->finalize = rstto_mime_db_finalize;
+
+    object_class->set_property = rstto_mime_db_set_property;
+    object_class->get_property = rstto_mime_db_get_property;
+
+}
+
+/**
+ * rstto_mime_db_dispose:
+ * @object:
+ *
+ */
+static void
+rstto_mime_db_dispose (GObject *object)
+{
+    RsttoMimeDB *mime_db = RSTTO_MIME_DB (object);
+
+    if (mime_db->priv)
+    {
+        xfce_rc_close (mime_db->priv->rc);
+        g_free (mime_db->priv);
+        mime_db->priv = NULL;
+    }
+}
+
+/**
+ * rstto_mime_db_finalize:
+ * @object:
+ *
+ */
+static void
+rstto_mime_db_finalize (GObject *object)
+{
+}
+
+static void
+rstto_mime_db_set_property (
+        GObject      *object,
+        guint         property_id,
+        const GValue *value,
+        GParamSpec   *pspec )
+{
+    switch (property_id)
+    {
+        case PROP_FILE:
+            break;
+        default:
+            break;
+    }
+}
+
+static void
+rstto_mime_db_get_property (
+        GObject    *object,
+        guint       property_id,
+        GValue     *value,
+        GParamSpec *pspec)
+{
+
+    switch (property_id)
+    {
+        case PROP_FILE:
+            break;
+        default:
+            break;
+    }
+
+}
+
+RsttoMimeDB *
+rstto_mime_db_new (const gchar *path, GError **error)
+{
+    
+    RsttoMimeDB   *mime_db = NULL;
+    XfceRc        *rc = NULL;
+
+    rc = xfce_rc_simple_open (path, FALSE);
+
+    if (rc != NULL)
+    {
+        mime_db = g_object_new (RSTTO_TYPE_MIME_DB, NULL);
+        mime_db->priv->rc = rc;
+
+        xfce_rc_set_group (rc, "preferred-editor");
+    }
+
+    return mime_db;
+}
+
+
+const gchar *
+rstto_mime_db_lookup (
+        RsttoMimeDB *mime_db,
+        const gchar *key)
+{
+    return xfce_rc_read_entry (mime_db->priv->rc, key, NULL);
+}
+
+
+void
+rstto_mime_db_store (
+        RsttoMimeDB *mime_db,
+        const gchar *key,
+        const gchar *value)
+{
+    xfce_rc_write_entry (mime_db->priv->rc, key, value);
+    xfce_rc_flush (mime_db->priv->rc);
+}
+
diff --git a/src/mime_db.h b/src/mime_db.h
new file mode 100644
index 0000000..e5d1e78
--- /dev/null
+++ b/src/mime_db.h
@@ -0,0 +1,82 @@
+/*
+ *  Copyright (c) Stephan Arts 2011 <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RISTRETTO_MIME_DB_H__
+#define __RISTRETTO_MIME_DB_H__
+
+G_BEGIN_DECLS
+
+
+#define RSTTO_TYPE_MIME_DB rstto_mime_db_get_type()
+
+#define RSTTO_MIME_DB(obj)( \
+        G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                RSTTO_TYPE_MIME_DB, \
+                RsttoMimeDB))
+
+#define RSTTO_IS_MIME_DB(obj)( \
+        G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                RSTTO_TYPE_MIME_DB))
+
+#define RSTTO_MIME_DB_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_CAST ((klass), \
+                RSTTO_TYPE_MIME_DB, \
+                RsttoMimeDBClass))
+
+#define RSTTO_IS_MIME_DB_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                RSTTO_TYPE_MIME_DB()))
+
+
+typedef struct _RsttoMimeDB RsttoMimeDB;
+typedef struct _RsttoMimeDBPriv RsttoMimeDBPriv;
+
+struct _RsttoMimeDB
+{
+    GObject parent;
+
+    RsttoMimeDBPriv *priv;
+};
+
+typedef struct _RsttoMimeDBClass RsttoMimeDBClass;
+
+struct _RsttoMimeDBClass
+{
+    GObjectClass parent_class;
+};
+
+GType
+rstto_mime_db_get_type ();
+
+RsttoMimeDB *
+rstto_mime_db_new (const gchar *path, GError **);
+
+const gchar *
+rstto_mime_db_lookup (
+        RsttoMimeDB *mime_db,
+        const gchar *key);
+
+void
+rstto_mime_db_store (
+        RsttoMimeDB *mime_db,
+        const gchar *key,
+        const gchar *value);
+
+G_END_DECLS
+
+#endif /* __RSTTO_MIME_DB_H__ */


More information about the Xfce4-commits mailing list