Correctly implemented the "TryExec" key
This commit is contained in:
parent
57e09baba9
commit
1165ee5230
@ -585,8 +585,11 @@ static void _clicked_position_menu(GtkMenu * menu, gint * x, gint * y,
|
|||||||
|
|
||||||
|
|
||||||
/* on_idle */
|
/* on_idle */
|
||||||
static void _idle_path(Main * main, char const * path);
|
static int _idle_access(Main * main, char const * path, int mode);
|
||||||
|
static int _idle_access_path(Main * main, char const * path,
|
||||||
|
char const * filename, int mode);
|
||||||
static gint _idle_apps_compare(gconstpointer a, gconstpointer b);
|
static gint _idle_apps_compare(gconstpointer a, gconstpointer b);
|
||||||
|
static void _idle_path(Main * main, char const * path);
|
||||||
|
|
||||||
static gboolean _on_idle(gpointer data)
|
static gboolean _on_idle(gpointer data)
|
||||||
{
|
{
|
||||||
@ -599,6 +602,73 @@ static gboolean _on_idle(gpointer data)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _idle_access(Main * main, char const * path, int mode)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
char const * p;
|
||||||
|
char * q;
|
||||||
|
size_t i;
|
||||||
|
size_t j;
|
||||||
|
|
||||||
|
if(path[0] == '/')
|
||||||
|
return access(path, mode);
|
||||||
|
if((p = getenv("PATH")) == NULL)
|
||||||
|
return 0;
|
||||||
|
if((q = strdup(p)) == NULL)
|
||||||
|
{
|
||||||
|
main->helper->error(NULL, path, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
errno = ENOENT;
|
||||||
|
for(i = 0, j = 0;; i++)
|
||||||
|
if(q[i] == '\0')
|
||||||
|
{
|
||||||
|
ret = _idle_access_path(main, &q[j], path, mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if(q[i] == ':')
|
||||||
|
{
|
||||||
|
q[i] = '\0';
|
||||||
|
if((ret = _idle_access_path(main, &q[j], path, mode))
|
||||||
|
== 0)
|
||||||
|
break;
|
||||||
|
j = i + 1;
|
||||||
|
}
|
||||||
|
free(q);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _idle_access_path(Main * main, char const * path,
|
||||||
|
char const * filename, int mode)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char * p;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = strlen(path) + 1 + strlen(filename) + 1;
|
||||||
|
if((p = malloc(len)) == NULL)
|
||||||
|
return -main->helper->error(NULL, path, 1);
|
||||||
|
snprintf(p, len, "%s/%s", path, filename);
|
||||||
|
ret = access(p, mode);
|
||||||
|
free(p);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gint _idle_apps_compare(gconstpointer a, gconstpointer b)
|
||||||
|
{
|
||||||
|
Config * ca = (Config *)a;
|
||||||
|
Config * cb = (Config *)b;
|
||||||
|
char const * cap;
|
||||||
|
char const * cbp;
|
||||||
|
const char section[] = "Desktop Entry";
|
||||||
|
const char variable[] = "Name";
|
||||||
|
|
||||||
|
/* these should not fail */
|
||||||
|
cap = config_get(ca, section, variable);
|
||||||
|
cbp = config_get(cb, section, variable);
|
||||||
|
return string_compare(cap, cbp);
|
||||||
|
}
|
||||||
|
|
||||||
static void _idle_path(Main * main, char const * path)
|
static void _idle_path(Main * main, char const * path)
|
||||||
{
|
{
|
||||||
DIR * dir;
|
DIR * dir;
|
||||||
@ -675,7 +745,7 @@ static void _idle_path(Main * main, char const * path)
|
|||||||
continue;
|
continue;
|
||||||
/* skip this entry if the binary cannot be executed */
|
/* skip this entry if the binary cannot be executed */
|
||||||
if((q = config_get(config, section, "TryExec")) != NULL
|
if((q = config_get(config, section, "TryExec")) != NULL
|
||||||
&& access(q, X_OK) != 0
|
&& _idle_access(main, q, X_OK) != 0
|
||||||
&& errno == ENOENT)
|
&& errno == ENOENT)
|
||||||
continue;
|
continue;
|
||||||
main->apps = g_slist_insert_sorted(main->apps, config,
|
main->apps = g_slist_insert_sorted(main->apps, config,
|
||||||
@ -688,21 +758,6 @@ static void _idle_path(Main * main, char const * path)
|
|||||||
config_delete(config);
|
config_delete(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint _idle_apps_compare(gconstpointer a, gconstpointer b)
|
|
||||||
{
|
|
||||||
Config * ca = (Config *)a;
|
|
||||||
Config * cb = (Config *)b;
|
|
||||||
char const * cap;
|
|
||||||
char const * cbp;
|
|
||||||
const char section[] = "Desktop Entry";
|
|
||||||
const char variable[] = "Name";
|
|
||||||
|
|
||||||
/* these should not fail */
|
|
||||||
cap = config_get(ca, section, variable);
|
|
||||||
cbp = config_get(cb, section, variable);
|
|
||||||
return string_compare(cap, cbp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* on_lock */
|
/* on_lock */
|
||||||
static void _on_lock(gpointer data)
|
static void _on_lock(gpointer data)
|
||||||
|
Loading…
Reference in New Issue
Block a user