X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=obt%2Flink.c;h=b9073de4e87284c40e1487e55d09a72b9d08b76d;hb=b025a0268f302df78589d3cc36aad5f56693799f;hp=8249118d210a8e8e19d08cb9d2247cf30f828477;hpb=0d90bd57abe304ffca4bf5cd1a647d30dea882b7;p=chaz%2Fopenbox diff --git a/obt/link.c b/obt/link.c index 8249118d..b9073de4 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 struct _ObtLink { @@ -25,9 +26,17 @@ struct _ObtLink { ObtLinkType type; gchar *name; /*!< Specific name for the object (eg Firefox) */ + gboolean display; /*ref = 1; - /* XXX turn the values in the .desktop file into an ObtLink */ + /* 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 */ + } + } + + /* XXX do something with mime types */ + } + 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); - return lnk; + return link; } void obt_link_ref(ObtLink *dd) @@ -82,6 +207,28 @@ void obt_link_ref(ObtLink *dd) void obt_link_unref(ObtLink *dd) { if (--dd->ref < 1) { + g_free(dd->name); + g_free(dd->generic); + g_free(dd->comment); + g_free(dd->icon); + if (dd->type == OBT_LINK_TYPE_APPLICATION) { + g_free(dd->d.app.exec); + g_free(dd->d.app.wdir); + g_free(dd->d.app.categories); + g_free(dd->d.app.startup_wmclass); + } + else if (dd->type == OBT_LINK_TYPE_URL) + g_free(dd->d.url.addr); g_slice_free(ObtLink, dd); } } + +const GQuark* obt_link_app_categories(ObtLink *e, gulong *n) +{ + g_return_val_if_fail(e != NULL, NULL); + g_return_val_if_fail(e->type == OBT_LINK_TYPE_APPLICATION, NULL); + g_return_val_if_fail(n != NULL, NULL); + + *n = e->d.app.n_categories; + return e->d.app.categories; +}