summaryrefslogtreecommitdiff
path: root/obt
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2010-03-29 22:38:05 -0400
committerDana Jansens <danakj@orodu.net>2010-03-29 22:38:05 -0400
commit3121146eccd031a56d410eb48f3002558f41b40a (patch)
treee29479b3bc75be258b3b6782e3d95dee47f71e83 /obt
parent67bed35b7c1b1c9470aa8d0ba33974eabd66e089 (diff)
parse some of the .desktop stuff into an ObtLink structure
localized names still don't work. most of the app-specific stuff isn't done yet. categories aren't handled yet (to only show in/not show in some category)
Diffstat (limited to 'obt')
-rw-r--r--obt/ddparse.c15
-rw-r--r--obt/ddparse.h2
-rw-r--r--obt/link.c80
-rw-r--r--obt/link.h5
4 files changed, 91 insertions, 11 deletions
diff --git a/obt/ddparse.c b/obt/ddparse.c
index fe7feb93..6aee25e7 100644
--- a/obt/ddparse.c
+++ b/obt/ddparse.c
@@ -17,6 +17,7 @@
*/
#include "obt/ddparse.h"
+#include "obt/link.h"
#ifdef HAVE_STRING_H
#include <string.h>
#endif
@@ -77,8 +78,8 @@ static void parse_value_free(ObtDDParseValue *v)
v->value.strings.n = 0;
break;
case OBT_DDPARSE_BOOLEAN:
- break;
case OBT_DDPARSE_NUMERIC:
+ case OBT_DDPARSE_ENUM_APPLICATION:
break;
default:
g_assert_not_reached();
@@ -546,6 +547,18 @@ static gboolean parse_desktop_entry_value(gchar *key, const gchar *val,
case OBT_DDPARSE_NUMERIC:
v.value.numeric = parse_value_numeric(val, parse, error);
break;
+ case OBT_DDPARSE_ENUM_APPLICATION:
+ if (val[0] == 'A' && strcmp(val+1, "pplication") == 0)
+ v.value.enumerable = OBT_LINK_TYPE_APPLICATION;
+ else if (val[0] == 'L' && strcmp(val+1, "ink") == 0)
+ v.value.enumerable = OBT_LINK_TYPE_URL;
+ else if (val[0] == 'D' && strcmp(val+1, "irectory") == 0)
+ v.value.enumerable = OBT_LINK_TYPE_DIRECTORY;
+ else {
+ parse_error("Unknown Type", parse, error);
+ return FALSE;
+ }
+ break;
default:
g_assert_not_reached();
}
diff --git a/obt/ddparse.h b/obt/ddparse.h
index b4e0bf41..d409eb5f 100644
--- a/obt/ddparse.h
+++ b/obt/ddparse.h
@@ -27,6 +27,7 @@ typedef enum {
OBT_DDPARSE_LOCALESTRINGS,
OBT_DDPARSE_BOOLEAN,
OBT_DDPARSE_NUMERIC,
+ OBT_DDPARSE_ENUM_APPLICATION,
OBT_DDPARSE_NUM_VALUE_TYPES
} ObtDDParseValueType;
@@ -40,6 +41,7 @@ typedef struct _ObtDDParseValue {
} strings;
gboolean boolean;
gfloat numeric;
+ guint enumerable;
} value;
} ObtDDParseValue;
diff --git a/obt/link.c b/obt/link.c
index 8249118d..9a053707 100644
--- a/obt/link.c
+++ b/obt/link.c
@@ -18,6 +18,7 @@
#include "obt/link.h"
#include "obt/ddparse.h"
+#include "obt/paths.h"
#include <glib.h>
struct _ObtLink {
@@ -25,6 +26,10 @@ struct _ObtLink {
ObtLinkType type;
gchar *name; /*!< Specific name for the object (eg Firefox) */
+ gboolean display; /*<! When false, do not display this link in menus or
+ launchers, etc */
+ gboolean deleted; /*<! When true, the Link could exist but is deleted
+ for the current user */
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 */
@@ -44,20 +49,22 @@ struct _ObtLink {
gchar *startup_wmclass;
} app;
struct _ObtLinkLink {
- gchar *url;
- } link;
+ gchar *addr;
+ } url;
struct _ObtLinkDir {
} dir;
} d;
};
-ObtLink* obt_link_from_ddfile(const gchar *name, GSList *paths)
+ObtLink* obt_link_from_ddfile(const gchar *ddname, GSList *paths,
+ ObtPaths *p)
{
- ObtLink *lnk;
+ ObtLink *link;
GHashTable *groups, *keys;
ObtDDParseGroup *g;
+ ObtDDParseValue *v, *type, *name, *target;
- groups = obt_ddparse_file(name, paths);
+ groups = obt_ddparse_file(ddname, paths);
if (!groups) return NULL;
g = g_hash_table_lookup(groups, "Desktop Entry");
if (!g) {
@@ -67,11 +74,66 @@ ObtLink* obt_link_from_ddfile(const gchar *name, GSList *paths)
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 */
+ /* check that required keys exist */
- return lnk;
+ if (!(type = g_hash_table_lookup(keys, "Type")))
+ { g_hash_table_destroy(groups); return NULL; }
+ if (!(name = g_hash_table_lookup(keys, "Name")))
+ { g_hash_table_destroy(groups); return NULL; }
+
+ if (type->value.enumerable == OBT_LINK_TYPE_APPLICATION) {
+ if (!(target = g_hash_table_lookup(keys, "Exec")))
+ { g_hash_table_destroy(groups); return NULL; }
+ }
+ else if (type->value.enumerable == OBT_LINK_TYPE_URL) {
+ if (!(target = g_hash_table_lookup(keys, "URL")))
+ { g_hash_table_destroy(groups); return NULL; }
+ }
+ else
+ target = NULL;
+
+ /* parse all the optional keys and build ObtLink (steal the strings) */
+ link = g_slice_new0(ObtLink);
+ link->ref = 1;
+ link->type = type->value.enumerable;
+ if (link->type == OBT_LINK_TYPE_APPLICATION)
+ link->d.app.exec = target->value.string, target->value.string = NULL;
+ else if (link->type == OBT_LINK_TYPE_URL)
+ link->d.url.addr = target->value.string, target->value.string = NULL;
+ link->display = TRUE;
+
+ if ((v = g_hash_table_lookup(keys, "Hidden")))
+ link->deleted = v->value.boolean;
+
+ if ((v = g_hash_table_lookup(keys, "NoDisplay")))
+ link->display = !v->value.boolean;
+
+ if ((v = g_hash_table_lookup(keys, "GenericName")))
+ link->generic = v->value.string, v->value.string = NULL;
+
+ if ((v = g_hash_table_lookup(keys, "Comment")))
+ link->comment = v->value.string, v->value.string = NULL;
+
+ if ((v = g_hash_table_lookup(keys, "Icon")))
+ link->icon = v->value.string, v->value.string = NULL;
+
+ /* XXX handle Only/NotShowIn, better know the current environment */
+
+ if (link->type == OBT_LINK_TYPE_APPLICATION) {
+ if ((v = g_hash_table_lookup(keys, "TryExec"))) {
+ /* XXX spawn a thread to check TryExec? */
+ link->display = link->display &&
+ obt_paths_try_exec(p, v->value.string);
+ }
+
+ /* XXX there's more app specific stuff */
+ }
+
+ else if (link->type == OBT_LINK_TYPE_URL) {
+ /* XXX there's URL specific stuff */
+ }
+
+ return link;
}
void obt_link_ref(ObtLink *dd)
diff --git a/obt/link.h b/obt/link.h
index bcac9d99..b0193297 100644
--- a/obt/link.h
+++ b/obt/link.h
@@ -23,6 +23,8 @@
G_BEGIN_DECLS
+struct _ObtPaths;
+
typedef enum {
OBT_LINK_TYPE_APPLICATION = 1,
OBT_LINK_TYPE_URL = 2,
@@ -48,7 +50,8 @@ typedef enum {
typedef struct _ObtLink ObtLink;
-ObtLink* obt_link_from_ddfile(const gchar *name, GSList *paths);
+ObtLink* obt_link_from_ddfile(const gchar *name, GSList *paths,
+ struct _ObtPaths *p);
void obt_link_ref(ObtLink *e);
void obt_link_unref(ObtLink *e);