]> Dogcows Code - chaz/openbox/blobdiff - obt/link.c
Add a new ObtLink type, which is going to be a generalization of a .desktop entry.
[chaz/openbox] / obt / link.c
diff --git a/obt/link.c b/obt/link.c
new file mode 100644 (file)
index 0000000..8249118
--- /dev/null
@@ -0,0 +1,87 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+   obt/link.c for the Openbox window manager
+   Copyright (c) 2009        Dana Jansens
+
+   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 General Public License for more details.
+
+   See the COPYING file for a copy of the GNU General Public License.
+*/
+
+#include "obt/link.h"
+#include "obt/ddparse.h"
+#include <glib.h>
+
+struct _ObtLink {
+    guint ref;
+
+    ObtLinkType type;
+    gchar *name; /*!< Specific name for the object (eg Firefox) */
+    gchar *generic; /*!< Generic name for the object (eg Web Browser) */
+    gchar *comment; /*!< Comment/description to display for the object */
+    gchar *icon; /*!< Name/path for an icon for the object */
+
+    union _ObtLinkData {
+        struct _ObtLinkApp {
+            gchar *exec; /*!< Executable to run for the app */
+            gchar *wdir; /*!< Working dir to run the app in */
+            gboolean term; /*!< Run the app in a terminal or not */
+            ObtLinkAppOpen open;
+
+            /* XXX gchar**? or something better, a mime struct.. maybe
+               glib has something i can use. */
+            gchar **mime; /*!< Mime types the app can open */
+
+            ObtLinkAppStartup startup;
+            gchar *startup_wmclass;
+        } app;
+        struct _ObtLinkLink {
+            gchar *url;
+        } link;
+        struct _ObtLinkDir {
+        } dir;
+    } d;
+};
+
+ObtLink* obt_link_from_ddfile(const gchar *name, GSList *paths)
+{
+    ObtLink *lnk;
+    GHashTable *groups, *keys;
+    ObtDDParseGroup *g;
+
+    groups = obt_ddparse_file(name, paths);
+    if (!groups) return NULL;
+    g = g_hash_table_lookup(groups, "Desktop Entry");
+    if (!g) {
+        g_hash_table_destroy(groups);
+        return NULL;
+    }
+
+    keys = obt_ddparse_group_keys(g);
+
+    lnk = g_slice_new(ObtLink);
+    lnk->ref = 1;
+    /* XXX turn the values in the .desktop file into an ObtLink */
+
+    return lnk;
+}
+
+void obt_link_ref(ObtLink *dd)
+{
+    ++dd->ref;
+}
+
+void obt_link_unref(ObtLink *dd)
+{
+    if (--dd->ref < 1) {
+        g_slice_free(ObtLink, dd);
+    }
+}
This page took 0.023113 seconds and 4 git commands to generate.