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, [$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, [
|
PKG_CHECK_MODULES(E_FM_OP, [
|
||||||
ecore >= 1.2.0
|
ecore >= 1.2.0
|
||||||
ecore-file >= 1.2.0
|
ecore-file >= 1.2.0
|
||||||
|
@ -964,6 +971,7 @@ src/preload/Makefile
|
||||||
data/Makefile
|
data/Makefile
|
||||||
data/images/Makefile
|
data/images/Makefile
|
||||||
data/flags/Makefile
|
data/flags/Makefile
|
||||||
|
data/desktop/Makefile
|
||||||
data/input_methods/Makefile
|
data/input_methods/Makefile
|
||||||
data/themes/Makefile
|
data/themes/Makefile
|
||||||
data/themes/images/Makefile
|
data/themes/images/Makefile
|
||||||
|
|
|
@ -8,4 +8,5 @@ input_methods \
|
||||||
etc \
|
etc \
|
||||||
icons \
|
icons \
|
||||||
backgrounds \
|
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 = \
|
bin_PROGRAMS = \
|
||||||
enlightenment \
|
enlightenment \
|
||||||
enlightenment_imc \
|
enlightenment_imc \
|
||||||
enlightenment_start
|
enlightenment_start \
|
||||||
|
enlightenment_filemanager
|
||||||
|
|
||||||
internal_bindir = $(libdir)/enlightenment/utils
|
internal_bindir = $(libdir)/enlightenment/utils
|
||||||
internal_bin_PROGRAMS = \
|
internal_bin_PROGRAMS = \
|
||||||
|
@ -406,6 +407,10 @@ e_alert_main.c
|
||||||
enlightenment_alert_LDADD = @E_ALERT_LIBS@
|
enlightenment_alert_LDADD = @E_ALERT_LIBS@
|
||||||
enlightenment_alert_CFLAGS = @E_ALERT_CFLAGS@
|
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
|
# HACK! why install-data-hook? install-exec-hook is run after bin_PROGRAMS
|
||||||
# and before internal_bin_PROGRAMS are installed. install-data-hook is
|
# and before internal_bin_PROGRAMS are installed. install-data-hook is
|
||||||
# run after both
|
# 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