]> Dogcows Code - chaz/openbox/blobdiff - obt/link.c
Add support for loading SVG icons using librsvg.
[chaz/openbox] / obt / link.c
index bdddcf547b12dc1e723a3839e9d9819472010a62..9cc2bac96d7cb3bdcf180d52711d739ed6898590 100644 (file)
@@ -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;
+}
This page took 0.02331 seconds and 4 git commands to generate.