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/ddparse.h"
|
||||||
|
#include "obt/link.h"
|
||||||
#ifdef HAVE_STRING_H
|
#ifdef HAVE_STRING_H
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -77,8 +78,8 @@ static void parse_value_free(ObtDDParseValue *v)
|
||||||
v->value.strings.n = 0;
|
v->value.strings.n = 0;
|
||||||
break;
|
break;
|
||||||
case OBT_DDPARSE_BOOLEAN:
|
case OBT_DDPARSE_BOOLEAN:
|
||||||
break;
|
|
||||||
case OBT_DDPARSE_NUMERIC:
|
case OBT_DDPARSE_NUMERIC:
|
||||||
|
case OBT_DDPARSE_ENUM_APPLICATION:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
|
@ -546,6 +547,18 @@ static gboolean parse_desktop_entry_value(gchar *key, const gchar *val,
|
||||||
case OBT_DDPARSE_NUMERIC:
|
case OBT_DDPARSE_NUMERIC:
|
||||||
v.value.numeric = parse_value_numeric(val, parse, error);
|
v.value.numeric = parse_value_numeric(val, parse, error);
|
||||||
break;
|
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:
|
default:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ typedef enum {
|
||||||
OBT_DDPARSE_LOCALESTRINGS,
|
OBT_DDPARSE_LOCALESTRINGS,
|
||||||
OBT_DDPARSE_BOOLEAN,
|
OBT_DDPARSE_BOOLEAN,
|
||||||
OBT_DDPARSE_NUMERIC,
|
OBT_DDPARSE_NUMERIC,
|
||||||
|
OBT_DDPARSE_ENUM_APPLICATION,
|
||||||
OBT_DDPARSE_NUM_VALUE_TYPES
|
OBT_DDPARSE_NUM_VALUE_TYPES
|
||||||
} ObtDDParseValueType;
|
} ObtDDParseValueType;
|
||||||
|
|
||||||
|
@ -40,6 +41,7 @@ typedef struct _ObtDDParseValue {
|
||||||
} strings;
|
} strings;
|
||||||
gboolean boolean;
|
gboolean boolean;
|
||||||
gfloat numeric;
|
gfloat numeric;
|
||||||
|
guint enumerable;
|
||||||
} value;
|
} value;
|
||||||
} ObtDDParseValue;
|
} ObtDDParseValue;
|
||||||
|
|
||||||
|
|
80
obt/link.c
80
obt/link.c
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "obt/link.h"
|
#include "obt/link.h"
|
||||||
#include "obt/ddparse.h"
|
#include "obt/ddparse.h"
|
||||||
|
#include "obt/paths.h"
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
struct _ObtLink {
|
struct _ObtLink {
|
||||||
|
@ -25,6 +26,10 @@ struct _ObtLink {
|
||||||
|
|
||||||
ObtLinkType type;
|
ObtLinkType type;
|
||||||
gchar *name; /*!< Specific name for the object (eg Firefox) */
|
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 *generic; /*!< Generic name for the object (eg Web Browser) */
|
||||||
gchar *comment; /*!< Comment/description to display for the object */
|
gchar *comment; /*!< Comment/description to display for the object */
|
||||||
gchar *icon; /*!< Name/path for an icon for the object */
|
gchar *icon; /*!< Name/path for an icon for the object */
|
||||||
|
@ -44,20 +49,22 @@ struct _ObtLink {
|
||||||
gchar *startup_wmclass;
|
gchar *startup_wmclass;
|
||||||
} app;
|
} app;
|
||||||
struct _ObtLinkLink {
|
struct _ObtLinkLink {
|
||||||
gchar *url;
|
gchar *addr;
|
||||||
} link;
|
} url;
|
||||||
struct _ObtLinkDir {
|
struct _ObtLinkDir {
|
||||||
} dir;
|
} dir;
|
||||||
} d;
|
} 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;
|
GHashTable *groups, *keys;
|
||||||
ObtDDParseGroup *g;
|
ObtDDParseGroup *g;
|
||||||
|
ObtDDParseValue *v, *type, *name, *target;
|
||||||
|
|
||||||
groups = obt_ddparse_file(name, paths);
|
groups = obt_ddparse_file(ddname, paths);
|
||||||
if (!groups) return NULL;
|
if (!groups) return NULL;
|
||||||
g = g_hash_table_lookup(groups, "Desktop Entry");
|
g = g_hash_table_lookup(groups, "Desktop Entry");
|
||||||
if (!g) {
|
if (!g) {
|
||||||
|
@ -67,11 +74,66 @@ ObtLink* obt_link_from_ddfile(const gchar *name, GSList *paths)
|
||||||
|
|
||||||
keys = obt_ddparse_group_keys(g);
|
keys = obt_ddparse_group_keys(g);
|
||||||
|
|
||||||
lnk = g_slice_new(ObtLink);
|
/* check that required keys exist */
|
||||||
lnk->ref = 1;
|
|
||||||
/* XXX turn the values in the .desktop file into an ObtLink */
|
|
||||||
|
|
||||||
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)
|
void obt_link_ref(ObtLink *dd)
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
struct _ObtPaths;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
OBT_LINK_TYPE_APPLICATION = 1,
|
OBT_LINK_TYPE_APPLICATION = 1,
|
||||||
OBT_LINK_TYPE_URL = 2,
|
OBT_LINK_TYPE_URL = 2,
|
||||||
|
@ -48,7 +50,8 @@ typedef enum {
|
||||||
|
|
||||||
typedef struct _ObtLink ObtLink;
|
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_ref(ObtLink *e);
|
||||||
void obt_link_unref(ObtLink *e);
|
void obt_link_unref(ObtLink *e);
|
||||||
|
|
Loading…
Reference in a new issue