forked from enlightenment/efl
add a function to get desktop commands immediately when no remote uri's are passed in
SVN revision: 30386
This commit is contained in:
parent
a6ad878e08
commit
166cdf9873
|
@ -1,5 +1,6 @@
|
||||||
TODO
|
TODO
|
||||||
----
|
----
|
||||||
|
- efreet_desktop_command_* should free the exec strings for you (set free cb on execs list in _build()). need to make sure users of this function are updated when this change is made (e.g. e17's exec cb)
|
||||||
- Efreet_Menu should setup an Ecore_File_Monitor on the .menu files and the
|
- Efreet_Menu should setup an Ecore_File_Monitor on the .menu files and the
|
||||||
app_dir and reload the menu when needed
|
app_dir and reload the menu when needed
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
AC_INIT(configure.in)
|
AC_INIT(configure.in)
|
||||||
AC_CANONICAL_BUILD
|
AC_CANONICAL_BUILD
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
AM_INIT_AUTOMAKE(efreet, 0.0.3.003)
|
AM_INIT_AUTOMAKE(efreet, 0.0.3.004)
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
AC_ISC_POSIX
|
AC_ISC_POSIX
|
||||||
|
|
|
@ -68,7 +68,7 @@ static char *efreet_string_append(char *dest, int *size,
|
||||||
int *len, const char *src);
|
int *len, const char *src);
|
||||||
static char *efreet_string_append_char(char *dest, int *size,
|
static char *efreet_string_append_char(char *dest, int *size,
|
||||||
int *len, char c);
|
int *len, char c);
|
||||||
static void efreet_desktop_command_build(Efreet_Desktop_Command *command);
|
static Ecore_List *efreet_desktop_command_build(Efreet_Desktop_Command *command);
|
||||||
static void efreet_desktop_command_free(Efreet_Desktop_Command *command);
|
static void efreet_desktop_command_free(Efreet_Desktop_Command *command);
|
||||||
static char *efreet_desktop_command_append_quoted(char *dest, int *size,
|
static char *efreet_desktop_command_append_quoted(char *dest, int *size,
|
||||||
int *len, char *src);
|
int *len, char *src);
|
||||||
|
@ -99,6 +99,8 @@ static void efreet_desktop_exec_cb(void *data, Efreet_Desktop *desktop,
|
||||||
char *exec, int remaining);
|
char *exec, int remaining);
|
||||||
|
|
||||||
static void efreet_desktop_type_info_free(Efreet_Desktop_Type_Info *info);
|
static void efreet_desktop_type_info_free(Efreet_Desktop_Type_Info *info);
|
||||||
|
static int efreet_desktop_command_flags_get(Efreet_Desktop *desktop);
|
||||||
|
static void efreet_desktop_command_execs_process(Efreet_Desktop_Command *command, Ecore_List *execs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
|
@ -1045,6 +1047,58 @@ efreet_desktop_command_get(Efreet_Desktop *desktop, Ecore_List *files,
|
||||||
return efreet_desktop_command_progress_get(desktop, files, func, NULL, data);
|
return efreet_desktop_command_progress_get(desktop, files, func, NULL, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param desktop: the desktop entry
|
||||||
|
* @param files an ecore list of local files, as absolute paths, local paths, or file:// uris (or NULL to get exec string with no files appended)
|
||||||
|
* @return Returns an ecore list of exec strings
|
||||||
|
* @brief Get the command to use to execute a desktop entry
|
||||||
|
*
|
||||||
|
* The returned list and each of its elements must be freed.
|
||||||
|
*/
|
||||||
|
Ecore_List *
|
||||||
|
efreet_desktop_command_local_get(Efreet_Desktop *desktop, Ecore_List *files)
|
||||||
|
{
|
||||||
|
Efreet_Desktop_Command *command;
|
||||||
|
char *file;
|
||||||
|
Ecore_List *execs;
|
||||||
|
|
||||||
|
if (!desktop || !desktop->exec) return NULL;
|
||||||
|
|
||||||
|
command = NEW(Efreet_Desktop_Command, 1);
|
||||||
|
if (!command) return 0;
|
||||||
|
|
||||||
|
command->files = ecore_list_new();
|
||||||
|
command->desktop = desktop;
|
||||||
|
|
||||||
|
ecore_list_set_free_cb(command->files,
|
||||||
|
ECORE_FREE_CB(efreet_desktop_command_file_free));
|
||||||
|
|
||||||
|
command->flags = efreet_desktop_command_flags_get(desktop);
|
||||||
|
/* get the required info for each file passed in */
|
||||||
|
if (files)
|
||||||
|
{
|
||||||
|
ecore_list_goto_first(files);
|
||||||
|
while ((file = ecore_list_next(files)))
|
||||||
|
{
|
||||||
|
Efreet_Desktop_Command_File *dcf;
|
||||||
|
|
||||||
|
dcf = efreet_desktop_command_file_process(command, file);
|
||||||
|
if (!dcf) continue;
|
||||||
|
if (dcf->pending)
|
||||||
|
{
|
||||||
|
efreet_desktop_command_file_free(dcf);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ecore_list_append(command->files, dcf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
execs = efreet_desktop_command_build(command);
|
||||||
|
efreet_desktop_command_free(command);
|
||||||
|
|
||||||
|
return execs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param desktop: the desktop entry
|
* @param desktop: the desktop entry
|
||||||
|
@ -1063,7 +1117,6 @@ efreet_desktop_command_progress_get(Efreet_Desktop *desktop, Ecore_List *files,
|
||||||
Efreet_Desktop_Progress_Cb cb_progress,
|
Efreet_Desktop_Progress_Cb cb_progress,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
char *p;
|
|
||||||
Efreet_Desktop_Command *command;
|
Efreet_Desktop_Command *command;
|
||||||
char *file;
|
char *file;
|
||||||
|
|
||||||
|
@ -1081,39 +1134,7 @@ efreet_desktop_command_progress_get(Efreet_Desktop *desktop, Ecore_List *files,
|
||||||
ecore_list_set_free_cb(command->files,
|
ecore_list_set_free_cb(command->files,
|
||||||
ECORE_FREE_CB(efreet_desktop_command_file_free));
|
ECORE_FREE_CB(efreet_desktop_command_file_free));
|
||||||
|
|
||||||
/* first, determine which fields are present in the Exec string */
|
command->flags = efreet_desktop_command_flags_get(desktop);
|
||||||
p = strchr(desktop->exec, '%');
|
|
||||||
while (p)
|
|
||||||
{
|
|
||||||
p++;
|
|
||||||
switch(*p)
|
|
||||||
{
|
|
||||||
case 'f':
|
|
||||||
case 'F':
|
|
||||||
command->flags |= EFREET_DESKTOP_EXEC_FLAG_FULLPATH;
|
|
||||||
break;
|
|
||||||
case 'u':
|
|
||||||
case 'U':
|
|
||||||
command->flags |= EFREET_DESKTOP_EXEC_FLAG_URI;
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
case 'D':
|
|
||||||
command->flags |= EFREET_DESKTOP_EXEC_FLAG_DIR;
|
|
||||||
break;
|
|
||||||
case 'n':
|
|
||||||
case 'N':
|
|
||||||
command->flags |= EFREET_DESKTOP_EXEC_FLAG_FILE;
|
|
||||||
break;
|
|
||||||
case '%':
|
|
||||||
p++;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = strchr(p, '%');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the required info for each file passed in */
|
/* get the required info for each file passed in */
|
||||||
if (files)
|
if (files)
|
||||||
{
|
{
|
||||||
|
@ -1129,11 +1150,86 @@ efreet_desktop_command_progress_get(Efreet_Desktop *desktop, Ecore_List *files,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (command->num_pending == 0) efreet_desktop_command_build(command);
|
if (command->num_pending == 0)
|
||||||
|
{
|
||||||
|
Ecore_List *execs;
|
||||||
|
execs = efreet_desktop_command_build(command);
|
||||||
|
efreet_desktop_command_execs_process(command, execs);
|
||||||
|
ecore_list_destroy(execs);
|
||||||
|
efreet_desktop_command_free(command);
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @brief Determine which file related field codes are present in the Exec string of a .desktop
|
||||||
|
* @params desktop and Efreet Desktop
|
||||||
|
* @return a bitmask of file field codes present in exec string
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
efreet_desktop_command_flags_get(Efreet_Desktop *desktop)
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
const char *p;
|
||||||
|
/* first, determine which fields are present in the Exec string */
|
||||||
|
p = strchr(desktop->exec, '%');
|
||||||
|
while (p)
|
||||||
|
{
|
||||||
|
p++;
|
||||||
|
switch(*p)
|
||||||
|
{
|
||||||
|
case 'f':
|
||||||
|
case 'F':
|
||||||
|
flags |= EFREET_DESKTOP_EXEC_FLAG_FULLPATH;
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
|
case 'U':
|
||||||
|
flags |= EFREET_DESKTOP_EXEC_FLAG_URI;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
case 'D':
|
||||||
|
flags |= EFREET_DESKTOP_EXEC_FLAG_DIR;
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
case 'N':
|
||||||
|
flags |= EFREET_DESKTOP_EXEC_FLAG_FILE;
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = strchr(p, '%');
|
||||||
|
}
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @brief Call the command callback for each exec in the list
|
||||||
|
* @param command
|
||||||
|
* @param execs
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
efreet_desktop_command_execs_process(Efreet_Desktop_Command *command, Ecore_List *execs)
|
||||||
|
{
|
||||||
|
char *exec;
|
||||||
|
int num;
|
||||||
|
num = ecore_list_nodes(execs);
|
||||||
|
ecore_list_goto_first(execs);
|
||||||
|
while ((exec = ecore_list_next(execs)))
|
||||||
|
{
|
||||||
|
command->cb_command(command->data, command->desktop, exec, --num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Builds the actual exec string from the raw string and a list of
|
* @brief Builds the actual exec string from the raw string and a list of
|
||||||
|
@ -1141,14 +1237,13 @@ efreet_desktop_command_progress_get(Efreet_Desktop *desktop, Ecore_List *files,
|
||||||
* efreet_desktop_command_get is called for each exec string created.
|
* efreet_desktop_command_get is called for each exec string created.
|
||||||
*
|
*
|
||||||
* @param command: the command to build
|
* @param command: the command to build
|
||||||
* @return Nothing is returned
|
* @return a list of executable strings
|
||||||
*/
|
*/
|
||||||
static void
|
static Ecore_List *
|
||||||
efreet_desktop_command_build(Efreet_Desktop_Command *command)
|
efreet_desktop_command_build(Efreet_Desktop_Command *command)
|
||||||
{
|
{
|
||||||
Efreet_Desktop_Command_File *file = NULL;
|
Efreet_Desktop_Command_File *file = NULL;
|
||||||
int first = 1;
|
int first = 1;
|
||||||
int num = 0;
|
|
||||||
Ecore_List *execs;
|
Ecore_List *execs;
|
||||||
char *exec;
|
char *exec;
|
||||||
|
|
||||||
|
@ -1243,21 +1338,13 @@ efreet_desktop_command_build(Efreet_Desktop_Command *command)
|
||||||
exec[len++] = '\0';
|
exec[len++] = '\0';
|
||||||
|
|
||||||
ecore_list_append(execs, exec);
|
ecore_list_append(execs, exec);
|
||||||
num++;
|
|
||||||
|
|
||||||
/* If no file was added, then the Exec field doesn't contain any file
|
/* If no file was added, then the Exec field doesn't contain any file
|
||||||
* fields (fFuUdDnN). We only want to run the app once in this case. */
|
* fields (fFuUdDnN). We only want to run the app once in this case. */
|
||||||
if (!file_added) break;
|
if (!file_added) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ecore_list_goto_first(execs);
|
return execs;
|
||||||
while ((exec = ecore_list_next(execs)))
|
|
||||||
{
|
|
||||||
command->cb_command(command->data, command->desktop, exec, --num);
|
|
||||||
}
|
|
||||||
|
|
||||||
efreet_desktop_command_free(command);
|
|
||||||
ecore_list_destroy(execs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1459,7 +1546,6 @@ efreet_desktop_command_file_process(Efreet_Desktop_Command *command, const char
|
||||||
|
|
||||||
snprintf(buf, PATH_MAX, "/tmp/%d-%d-%s", getpid(),
|
snprintf(buf, PATH_MAX, "/tmp/%d-%d-%s", getpid(),
|
||||||
efreet_desktop_command_file_id++, base);
|
efreet_desktop_command_file_id++, base);
|
||||||
printf("nonlocal fullpath: %s\n", buf);
|
|
||||||
f->fullpath = strdup(buf);
|
f->fullpath = strdup(buf);
|
||||||
f->pending = 1;
|
f->pending = 1;
|
||||||
|
|
||||||
|
@ -1580,7 +1666,13 @@ efreet_desktop_cb_download_complete(void *data, const char *file __UNUSED__,
|
||||||
f->command->num_pending--;
|
f->command->num_pending--;
|
||||||
|
|
||||||
if (f->command->num_pending <= 0)
|
if (f->command->num_pending <= 0)
|
||||||
efreet_desktop_command_build(f->command);
|
{
|
||||||
|
Ecore_List *execs;
|
||||||
|
execs = efreet_desktop_command_build(f->command);
|
||||||
|
efreet_desktop_command_execs_process(f->command, execs);
|
||||||
|
ecore_list_destroy(execs);
|
||||||
|
efreet_desktop_command_free(f->command);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -121,6 +121,8 @@ int efreet_desktop_command_get(Efreet_Desktop *desktop,
|
||||||
Ecore_List *files,
|
Ecore_List *files,
|
||||||
Efreet_Desktop_Command_Cb func,
|
Efreet_Desktop_Command_Cb func,
|
||||||
void *data);
|
void *data);
|
||||||
|
Ecore_List * efreet_desktop_command_local_get(Efreet_Desktop *desktop,
|
||||||
|
Ecore_List *files);
|
||||||
|
|
||||||
unsigned int efreet_desktop_category_count_get(Efreet_Desktop *desktop);
|
unsigned int efreet_desktop_category_count_get(Efreet_Desktop *desktop);
|
||||||
void efreet_desktop_category_add(Efreet_Desktop *desktop,
|
void efreet_desktop_category_add(Efreet_Desktop *desktop,
|
||||||
|
|
Loading…
Reference in New Issue