forked from enlightenment/enlightenment
enlightenment_filemanager - call EFM from another process.
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: 73084
This commit is contained in:
parent
c13343daee
commit
97dfa9db2e
|
@ -476,6 +476,13 @@ AC_MSG_WARN([EFM requirements : $efm_requires])
|
|||
|
||||
PKG_CHECK_MODULES(E_FM, [$efm_requires])
|
||||
|
||||
PKG_CHECK_MODULES(E_FM_CMDLINE, [
|
||||
ecore >= 1.2.0
|
||||
ecore-file >= 1.2.0
|
||||
edbus >= 1.2.0
|
||||
dbus-1
|
||||
])
|
||||
|
||||
PKG_CHECK_MODULES(E_FM_OP, [
|
||||
ecore >= 1.2.0
|
||||
ecore-file >= 1.2.0
|
||||
|
@ -964,6 +971,7 @@ src/preload/Makefile
|
|||
data/Makefile
|
||||
data/images/Makefile
|
||||
data/flags/Makefile
|
||||
data/desktop/Makefile
|
||||
data/input_methods/Makefile
|
||||
data/themes/Makefile
|
||||
data/themes/images/Makefile
|
||||
|
|
|
@ -8,4 +8,5 @@ input_methods \
|
|||
etc \
|
||||
icons \
|
||||
backgrounds \
|
||||
flags
|
||||
flags \
|
||||
desktop
|
||||
|
|
|
@ -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;
|
|
@ -21,7 +21,8 @@ INCLUDES = \
|
|||
bin_PROGRAMS = \
|
||||
enlightenment \
|
||||
enlightenment_imc \
|
||||
enlightenment_start
|
||||
enlightenment_start \
|
||||
enlightenment_filemanager
|
||||
|
||||
internal_bindir = $(libdir)/enlightenment/utils
|
||||
internal_bin_PROGRAMS = \
|
||||
|
@ -406,6 +407,10 @@ e_alert_main.c
|
|||
enlightenment_alert_LDADD = @E_ALERT_LIBS@
|
||||
enlightenment_alert_CFLAGS = @E_ALERT_CFLAGS@
|
||||
|
||||
enlightenment_filemanager_SOURCES = e_fm_cmdline.c
|
||||
enlightenment_filemanager_LDADD = @E_FM_CMDLINE_LIBS@
|
||||
enlightenment_filemanager_CFLAGS = @E_FM_CMDLINE_CFLAGS@
|
||||
|
||||
# HACK! why install-data-hook? install-exec-hook is run after bin_PROGRAMS
|
||||
# and before internal_bin_PROGRAMS are installed. install-data-hook is
|
||||
# run after both
|
||||
|
|
|
@ -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