X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=obt%2Flink.c;h=9cc2bac96d7cb3bdcf180d52711d739ed6898590;hb=f14bf9cac2a6a98e34f81c195d4e4bece5df5f16;hp=bdddcf547b12dc1e723a3839e9d9819472010a62;hpb=a6141fe7a4895593d412a18bd24d1859d2d69c34;p=chaz%2Fopenbox diff --git a/obt/link.c b/obt/link.c index bdddcf54..9cc2bac9 100644 --- a/obt/link.c +++ b/obt/link.c @@ -45,10 +45,12 @@ struct _ObtLink { gboolean term; /*!< Run the app in a terminal or not */ ObtLinkAppOpen open; - /* XXX gchar**? or something better, a mime struct.. maybe - glib has something i can use. */ gchar **mime; /*!< Mime types the app can open */ + GQuark *categories; /*!< Array of quarks representing the + application's categories */ + gulong n_categories; /*!< Number of categories for the app */ + ObtLinkAppStartup startup; gchar *startup_wmclass; } app; @@ -125,15 +127,17 @@ ObtLink* obt_link_from_ddfile(const gchar *ddname, GSList *paths, /* parse link->d.app.exec to determine link->d.app.open */ percent = FALSE; for (c = link->d.app.exec; *c; ++c) { - if (*c == '%') percent = !percent; 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"))) { @@ -164,7 +168,26 @@ ObtLink* obt_link_from_ddfile(const gchar *ddname, GSList *paths, } } - /* XXX there's more app specific stuff */ + 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"); @@ -173,6 +196,9 @@ ObtLink* obt_link_from_ddfile(const gchar *ddname, GSList *paths, v->value.string = NULL; } + /* destroy the parsing info */ + g_hash_table_destroy(groups); + return link; } @@ -184,6 +210,29 @@ 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_strfreev(dd->d.app.mime); + 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; +}