This is used to open a file manager window from another process. It will use DBus interface: org.enlightenment.FileManager.OpenDirectory(path) It returns immediately, but we could enhance the DBus interface and make it act like a real file manager process if that is needed. SVN revision: 73084devs/princeamd/enlightenment-0.17-elive
parent
c13343daee
commit
97dfa9db2e
6 changed files with 180 additions and 2 deletions
@ -0,0 +1,6 @@ |
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
filesdir = $(datadir)/applications
|
||||
files_DATA = \
|
||||
enlightenment_filemanager.desktop
|
||||
|
||||
EXTRA_DIST = $(files_DATA)
|
@ -0,0 +1,14 @@ |
||||
[Desktop Entry] |
||||
Encoding=UTF-8 |
||||
Type=Application |
||||
Name=Enlightenment File Manager |
||||
Generic=File Manager |
||||
Comment=File Manager provided by Enlightenment |
||||
Exec=enlightenment_filemanager %U |
||||
Icon=system-file-manager |
||||
Categories=FileManager;Utility;Core;Enlightenment; |
||||
Terminal=false |
||||
StartupNotify=false |
||||
StartupWMClass=e_fm |
||||
OnlyShowIn=Enlightenment; |
||||
MimeType=x-directory/normal;inode/directory; |
@ -0,0 +1,144 @@ |
||||
# ifdef HAVE_CONFIG_H |
||||
# include "config.h" |
||||
# endif |
||||
|
||||
#include <Ecore.h> |
||||
#include <Ecore_Getopt.h> |
||||
#include <E_DBus.h> |
||||
|
||||
static E_DBus_Connection *conn = NULL; |
||||
static int retval = EXIT_SUCCESS; |
||||
static int pending = 0; |
||||
|
||||
static void |
||||
fm_open_reply(void *data __UNUSED__, DBusMessage *msg __UNUSED__, DBusError *err) |
||||
{ |
||||
if (dbus_error_is_set(err)) |
||||
{ |
||||
retval = EXIT_FAILURE; |
||||
fprintf(stderr, "ERROR: %s: %s", err->name, err->message); |
||||
} |
||||
|
||||
pending--; |
||||
if (!pending) ecore_main_loop_quit(); |
||||
} |
||||
|
||||
static Eina_Bool |
||||
fm_error_quit_last(void *data __UNUSED__) |
||||
{ |
||||
if (!pending) ecore_main_loop_quit(); |
||||
return EINA_FALSE; |
||||
} |
||||
|
||||
static void |
||||
fm_open(const char *path) |
||||
{ |
||||
DBusMessage *msg; |
||||
Eina_Bool sent; |
||||
char *p = ecore_file_realpath(path); |
||||
|
||||
EINA_LOG_DBG("'%s' -> '%s'", path, p); |
||||
if ((!p) || (p[0] == '\0')) |
||||
{ |
||||
fprintf(stderr, "ERROR: Could not get real path '%s'\n", path); |
||||
ecore_idler_add(fm_error_quit_last, NULL); |
||||
free(p); |
||||
return; |
||||
} |
||||
|
||||
msg = dbus_message_new_method_call |
||||
("org.enlightenment.FileManager", |
||||
"/org/enlightenment/FileManager", |
||||
"org.enlightenment.FileManager", "OpenDirectory"); |
||||
if (!msg) |
||||
{ |
||||
fputs("ERROR: Could not create DBus Message\n", stderr); |
||||
ecore_idler_add(fm_error_quit_last, NULL); |
||||
free(p); |
||||
return; |
||||
} |
||||
|
||||
dbus_message_append_args(msg, DBUS_TYPE_STRING, &p, DBUS_TYPE_INVALID); |
||||
free(p); |
||||
|
||||
sent = !!e_dbus_message_send(conn, msg, fm_open_reply, -1, NULL); |
||||
dbus_message_unref(msg); |
||||
|
||||
if (!sent) |
||||
{ |
||||
fputs("ERROR: Could not send DBus Message\n", stderr); |
||||
ecore_idler_add(fm_error_quit_last, NULL); |
||||
return; |
||||
} |
||||
|
||||
pending++; |
||||
} |
||||
|
||||
static const Ecore_Getopt options = { |
||||
"enlightenment_filemanager", |
||||
"%prog [options] [folder1] ... [folderN]", |
||||
PACKAGE_VERSION, |
||||
"(C) 2012 Gustavo Sverzut Barbieri and others", |
||||
"BSD 2-Clause", |
||||
"Opens the Enlightenment File Manager at a given folders.", |
||||
EINA_FALSE, |
||||
{ |
||||
ECORE_GETOPT_VERSION('V', "version"), |
||||
ECORE_GETOPT_COPYRIGHT('C', "copyright"), |
||||
ECORE_GETOPT_LICENSE('L', "license"), |
||||
ECORE_GETOPT_HELP('h', "help"), |
||||
ECORE_GETOPT_SENTINEL |
||||
} |
||||
}; |
||||
|
||||
EAPI int |
||||
main(int argc, char *argv[]) |
||||
{ |
||||
Eina_Bool quit_option = EINA_FALSE; |
||||
Ecore_Getopt_Value values[] = { |
||||
ECORE_GETOPT_VALUE_BOOL(quit_option), |
||||
ECORE_GETOPT_VALUE_BOOL(quit_option), |
||||
ECORE_GETOPT_VALUE_BOOL(quit_option), |
||||
ECORE_GETOPT_VALUE_BOOL(quit_option), |
||||
ECORE_GETOPT_VALUE_NONE |
||||
}; |
||||
int args; |
||||
|
||||
args = ecore_getopt_parse(&options, values, argc, argv); |
||||
if (args < 0) |
||||
{ |
||||
fputs("ERROR: Could not parse command line options.\n", stderr); |
||||
return EXIT_FAILURE; |
||||
} |
||||
|
||||
if (quit_option) return EXIT_SUCCESS; |
||||
|
||||
ecore_init(); |
||||
ecore_file_init(); |
||||
e_dbus_init(); |
||||
|
||||
conn = e_dbus_bus_get(DBUS_BUS_SESSION); |
||||
if (!conn) |
||||
{ |
||||
fputs("ERROR: Could not DBus SESSION bus.\n", stderr); |
||||
retval = EXIT_FAILURE; |
||||
goto end; |
||||
} |
||||
|
||||
retval = EXIT_SUCCESS; |
||||
|
||||
if (args == argc) fm_open("."); |
||||
else |
||||
{ |
||||
for (; args < argc; args++) |
||||
fm_open(argv[args]); |
||||
} |
||||
|
||||
ecore_main_loop_begin(); |
||||
|
||||
end: |
||||
e_dbus_shutdown(); |
||||
ecore_file_shutdown(); |
||||
ecore_shutdown(); |
||||
return retval; |
||||
} |
Loading…
Reference in new issue