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:
Gustavo Sverzut Barbieri 2012-06-30 19:28:49 +00:00
parent c13343daee
commit 97dfa9db2e
6 changed files with 180 additions and 2 deletions

View File

@ -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

View File

@ -8,4 +8,5 @@ input_methods \
etc \
icons \
backgrounds \
flags
flags \
desktop

6
data/desktop/Makefile.am Normal file
View File

@ -0,0 +1,6 @@
MAINTAINERCLEANFILES = Makefile.in
filesdir = $(datadir)/applications
files_DATA = \
enlightenment_filemanager.desktop
EXTRA_DIST = $(files_DATA)

View File

@ -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;

View File

@ -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

144
src/bin/e_fm_cmdline.c Normal file
View File

@ -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;
}