+ /* build the ObtLink (we steal all strings from the parser) */
+ link = g_slice_new0(ObtLink);
+ link->ref = 1;
+ link->display = TRUE;
+
+ v = g_hash_table_lookup(keys, "Type");
+ g_assert(v);
+ link->type = v->value.enumerable;
+
+ 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;
+
+ if ((v = g_hash_table_lookup(keys, "OnlyShowIn")))
+ link->env_required = v->value.environments;
+ else
+ link->env_required = 0;
+
+ if ((v = g_hash_table_lookup(keys, "NotShowIn")))
+ link->env_restricted = v->value.environments;
+ else
+ link->env_restricted = 0;
+
+ /* type-specific keys */
+
+ if (link->type == OBT_LINK_TYPE_APPLICATION) {
+ gchar *c;
+ gboolean percent;
+
+ v = g_hash_table_lookup(keys, "Exec");
+ g_assert(v);
+ link->d.app.exec = v->value.string;
+ v->value.string = NULL;
+
+ /* parse link->d.app.exec to determine link->d.app.open */
+ percent = FALSE;
+ for (c = link->d.app.exec; *c; ++c) {
+ if (percent) {
+ switch (*c) {
+ case 'f': link->d.app.open = OBT_LINK_APP_SINGLE_LOCAL; break;
+ case 'F': link->d.app.open = OBT_LINK_APP_MULTI_LOCAL; break;
+ case 'u': link->d.app.open = OBT_LINK_APP_SINGLE_URL; break;
+ case 'U': link->d.app.open = OBT_LINK_APP_MULTI_URL; break;
+ default: percent = FALSE;
+ }
+ if (percent) break; /* found f/F/u/U */
+ }
+ else if (*c == '%') percent = TRUE;
+ }
+
+ 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);
+ }
+
+ if ((v = g_hash_table_lookup(keys, "Path"))) {
+ /* steal the string */
+ link->d.app.wdir = v->value.string;
+ v->value.string = NULL;
+ }
+
+ if ((v = g_hash_table_lookup(keys, "Terminal")))
+ link->d.app.term = v->value.boolean;
+
+ if ((v = g_hash_table_lookup(keys, "StartupNotify")))
+ link->d.app.startup = v->value.boolean ?
+ OBT_LINK_APP_STARTUP_PROTOCOL_SUPPORT :
+ OBT_LINK_APP_STARTUP_NO_SUPPORT;
+ else {
+ link->d.app.startup = OBT_LINK_APP_STARTUP_LEGACY_SUPPORT;
+ if ((v = g_hash_table_lookup(keys, "StartupWMClass"))) {
+ /* steal the string */
+ link->d.app.startup_wmclass = v->value.string;
+ v->value.string = NULL;
+ }
+ }
+
+ if ((v = g_hash_table_lookup(keys, "Categories"))) {
+ gulong i;
+ gchar *end;
+
+ link->d.app.categories = g_new(GQuark, v->value.strings.n);
+ link->d.app.n_categories = v->value.strings.n;
+
+ for (i = 0; i < v->value.strings.n; ++i) {
+ link->d.app.categories[i] =
+ g_quark_from_string(v->value.strings.a[i]);
+ c = end = end+1; /* next */
+ }
+ }
+
+ if ((v = g_hash_table_lookup(keys, "MimeType"))) {
+ /* steal the string array */
+ link->d.app.mime = v->value.strings.a;
+ v->value.strings.a = NULL;
+ v->value.strings.n = 0;
+ }
+ }
+ else if (link->type == OBT_LINK_TYPE_URL) {
+ v = g_hash_table_lookup(keys, "URL");
+ g_assert(v);
+ link->d.url.addr = v->value.string;
+ v->value.string = NULL;
+ }
+
+ /* destroy the parsing info */
+ g_hash_table_destroy(groups);