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)
This commit is contained in:
parent
67bed35b7c
commit
3121146ecc
4 changed files with 91 additions and 11 deletions
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
80
obt/link.c
80
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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue