/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- obt/link.c for the Openbox window manager Copyright (c) 2009 Dana Jansens This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. See the COPYING file for a copy of the GNU General Public License. */ #include "obt/link.h" #include "obt/ddparse.h" #include "obt/paths.h" #include struct _ObtLink { guint ref; ObtLinkType type; gchar *name; /*!< Specific name for the object (eg Firefox) */ gboolean display; /*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 (*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; } } } 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; } } /* XXX there's more app specific stuff */ } 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; } return link; } void obt_link_ref(ObtLink *dd) { ++dd->ref; } void obt_link_unref(ObtLink *dd) { if (--dd->ref < 1) { g_slice_free(ObtLink, dd); } }