diff options
| author | Dana Jansens <danakj@orodu.net> | 2010-03-29 22:38:05 -0400 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2010-03-29 22:38:05 -0400 |
| commit | 3121146eccd031a56d410eb48f3002558f41b40a (patch) | |
| tree | e29479b3bc75be258b3b6782e3d95dee47f71e83 | |
| parent | 67bed35b7c1b1c9470aa8d0ba33974eabd66e089 (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)
| -rw-r--r-- | obt/ddparse.c | 15 | ||||
| -rw-r--r-- | obt/ddparse.h | 2 | ||||
| -rw-r--r-- | obt/link.c | 80 | ||||
| -rw-r--r-- | obt/link.h | 5 |
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; @@ -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) @@ -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); |
