lots of debugging - but most of all - removable device support now uses
e_dbus (optional if you built it) and uses dbus for mount, unmount dev and volume detection, creates icons and changes their state etc. and automounts on double-click of volume etc. may have bugs. pants on. SVN revision: 30346
This commit is contained in:
parent
9f46c09a1d
commit
a4dab7ebed
12
configure.in
12
configure.in
|
@ -188,6 +188,18 @@ e_cflags="-DUSE_E_CONFIG_H "$E_CFLAGS" "
|
||||||
AC_SUBST(e_libs)
|
AC_SUBST(e_libs)
|
||||||
AC_SUBST(e_cflags)
|
AC_SUBST(e_cflags)
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(E_DBUS, edbus, have_edbus=yes, have_edbus=no)
|
||||||
|
PKG_CHECK_MODULES(E_HAL, ehal, have_ehal=yes, have_ehal=no)
|
||||||
|
AC_SUBST(E_DBUS_LIBS)
|
||||||
|
AC_SUBST(E_DBUS_CFLAGS)
|
||||||
|
AC_SUBST(E_HAL_LIBS)
|
||||||
|
AC_SUBST(E_HAL_CFLAGS)
|
||||||
|
if test x$have_edbus = "xyes"; then
|
||||||
|
if test x$have_ehal = "xyes"; then
|
||||||
|
AC_DEFINE(HAVE_EDBUS, 1, [E_Dbus support])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
profile="SLOW_PC"
|
profile="SLOW_PC"
|
||||||
AC_ARG_WITH(profile,
|
AC_ARG_WITH(profile,
|
||||||
[ --with-profile=TARGET_PROFILE specify a target format profile of:
|
[ --with-profile=TARGET_PROFILE specify a target format profile of:
|
||||||
|
|
|
@ -9260,7 +9260,49 @@ FILEMAN_ICON_CLICKABLE("folder");
|
||||||
FILEMAN_ICON_CLICKABLE("file");
|
FILEMAN_ICON_CLICKABLE("file");
|
||||||
FILEMAN_ICON("home");
|
FILEMAN_ICON("home");
|
||||||
FILEMAN_ICON("desktop");
|
FILEMAN_ICON("desktop");
|
||||||
FILEMAN_ICON("hd");
|
|
||||||
|
group {
|
||||||
|
name: "e/icons/fileman/hd";
|
||||||
|
parts {
|
||||||
|
part {
|
||||||
|
name: "icon";
|
||||||
|
mouse_events: 0;
|
||||||
|
description {
|
||||||
|
state: "default" 0.0;
|
||||||
|
aspect: 1.0 1.0;
|
||||||
|
aspect_preference: BOTH;
|
||||||
|
align: 0.5 0.0;
|
||||||
|
color: 255 255 255 128;
|
||||||
|
image {
|
||||||
|
normal: "e17_icon_fileman_hd.png";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description {
|
||||||
|
state: "disabled" 0.0;
|
||||||
|
inherit: "default" 0.0;
|
||||||
|
color: 255 255 255 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
programs {
|
||||||
|
program {
|
||||||
|
name: "full";
|
||||||
|
signal: "e,state,removable,full";
|
||||||
|
source: "e";
|
||||||
|
action: STATE_SET "disabled" 0.0;
|
||||||
|
transition: LINEAR 0.5;
|
||||||
|
target: "icon";
|
||||||
|
}
|
||||||
|
program {
|
||||||
|
name: "empty";
|
||||||
|
signal: "e,state,removable,empty";
|
||||||
|
source: "e";
|
||||||
|
action: STATE_SET "default" 0.0;
|
||||||
|
transition: LINEAR 0.5;
|
||||||
|
target: "icon";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FILEMAN_MIME("application/pdf","pdf");
|
FILEMAN_MIME("application/pdf","pdf");
|
||||||
FILEMAN_MIME("text/x-csrc","c");
|
FILEMAN_MIME("text/x-csrc","c");
|
||||||
|
|
|
@ -190,7 +190,8 @@ e_mouse.h \
|
||||||
e_order.h \
|
e_order.h \
|
||||||
e_exec.h \
|
e_exec.h \
|
||||||
e_widget_font_preview.h \
|
e_widget_font_preview.h \
|
||||||
e_fm_custom.h
|
e_fm_custom.h \
|
||||||
|
e_fm_shared.h
|
||||||
|
|
||||||
enlightenment_src = \
|
enlightenment_src = \
|
||||||
e_user.c \
|
e_user.c \
|
||||||
|
@ -395,7 +396,8 @@ e_fm_main.c \
|
||||||
e_user.c \
|
e_user.c \
|
||||||
e_sha1.c
|
e_sha1.c
|
||||||
|
|
||||||
enlightenment_fm_LDFLAGS = @e_libs@ @dlopen_libs@
|
enlightenment_fm_LDFLAGS = @e_libs@ @dlopen_libs@ @E_DBUS_LIBS@ @E_HAL_LIBS@
|
||||||
|
enlightenment_fm_CFLAGS = $(INCLUDES) @E_DBUS_CFLAGS@ @E_HAL_CFLAGS@
|
||||||
|
|
||||||
enlightenment_sys_SOURCES = \
|
enlightenment_sys_SOURCES = \
|
||||||
e_sys_main.c
|
e_sys_main.c
|
||||||
|
@ -408,4 +410,3 @@ install-exec-hook:
|
||||||
|
|
||||||
installed_headersdir = $(prefix)/include/enlightenment
|
installed_headersdir = $(prefix)/include/enlightenment
|
||||||
installed_headers_DATA = $(ENLIGHTENMENTHEADERS)
|
installed_headers_DATA = $(ENLIGHTENMENTHEADERS)
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
#include <utime.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
|
|
1389
src/bin/e_fm.c
1389
src/bin/e_fm.c
File diff suppressed because it is too large
Load Diff
|
@ -33,27 +33,10 @@ typedef struct _E_Fm2_Config E_Fm2_Config;
|
||||||
typedef struct _E_Fm2_Icon E_Fm2_Icon;
|
typedef struct _E_Fm2_Icon E_Fm2_Icon;
|
||||||
typedef struct _E_Fm2_Icon_Info E_Fm2_Icon_Info;
|
typedef struct _E_Fm2_Icon_Info E_Fm2_Icon_Info;
|
||||||
|
|
||||||
typedef struct _E_Fm2_Removable_Add E_Fm2_Removable_Add;
|
|
||||||
typedef struct _E_Fm2_Removable_Del E_Fm2_Removable_Del;
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#ifndef E_FM_H
|
#ifndef E_FM_H
|
||||||
#define E_FM_H
|
#define E_FM_H
|
||||||
|
|
||||||
struct _E_Fm2_Removable_Add
|
|
||||||
{
|
|
||||||
const char *uuid;
|
|
||||||
const char *label;
|
|
||||||
const char *mount;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _E_Fm2_Removable_Del
|
|
||||||
{
|
|
||||||
const char *uuid;
|
|
||||||
const char *label;
|
|
||||||
const char *mount;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _E_Fm2_Config
|
struct _E_Fm2_Config
|
||||||
{
|
{
|
||||||
/* general view mode */
|
/* general view mode */
|
||||||
|
@ -126,6 +109,7 @@ struct _E_Fm2_Icon_Info
|
||||||
unsigned char icon_type;
|
unsigned char icon_type;
|
||||||
unsigned char mount : 1;
|
unsigned char mount : 1;
|
||||||
unsigned char removable : 1;
|
unsigned char removable : 1;
|
||||||
|
unsigned char removable_full : 1;
|
||||||
unsigned char deleted : 1;
|
unsigned char deleted : 1;
|
||||||
unsigned char broken_link : 1;
|
unsigned char broken_link : 1;
|
||||||
};
|
};
|
||||||
|
@ -174,8 +158,5 @@ EAPI E_Fm2_Icon_Info *e_fm2_icon_file_info_get(E_Fm2_Icon *ic);
|
||||||
EAPI void e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e);
|
EAPI void e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e);
|
||||||
EAPI void e_fm2_client_del(Ecore_Ipc_Event_Client_Del *e);
|
EAPI void e_fm2_client_del(Ecore_Ipc_Event_Client_Del *e);
|
||||||
|
|
||||||
extern EAPI int E_EVENT_REMOVABLE_ADD;
|
|
||||||
extern EAPI int E_EVENT_REMOVABLE_DEL;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -31,6 +31,14 @@
|
||||||
#include <Ecore_Ipc.h>
|
#include <Ecore_Ipc.h>
|
||||||
#include <Ecore_File.h>
|
#include <Ecore_File.h>
|
||||||
#include <Evas.h>
|
#include <Evas.h>
|
||||||
|
#include <Eet.h>
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
/* E_DBUS support */
|
||||||
|
#ifdef HAVE_EDBUS
|
||||||
|
#include <E_DBus.h>
|
||||||
|
#include <E_Hal.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* FIXME: things to add to the slave enlightenment_fm process and ipc to e:
|
/* FIXME: things to add to the slave enlightenment_fm process and ipc to e:
|
||||||
*
|
*
|
||||||
|
@ -116,12 +124,65 @@ static char *_e_str_list_remove(Evas_List **list, char *str);
|
||||||
static void _e_path_fix_order(const char *path, const char *rel, int rel_to, int x, int y);
|
static void _e_path_fix_order(const char *path, const char *rel, int rel_to, int x, int y);
|
||||||
static void _e_dir_del(E_Dir *ed);
|
static void _e_dir_del(E_Dir *ed);
|
||||||
|
|
||||||
|
#ifdef HAVE_EDBUS
|
||||||
|
|
||||||
|
#ifndef EAPI
|
||||||
|
#define EAPI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define E_FM_SHARED_DATATYPES
|
||||||
|
#include "e_fm_shared.h"
|
||||||
|
#undef E_FM_SHARED_DATATYPES
|
||||||
|
|
||||||
|
static void _e_dbus_cb_dev_all(void *user_data, void *reply_data, DBusError *error);
|
||||||
|
static void _e_dbus_cb_dev_store(void *user_data, void *reply_data, DBusError *error);
|
||||||
|
static void _e_dbus_cb_dev_vol(void *user_data, void *reply_data, DBusError *error);
|
||||||
|
static void _e_dbus_cb_store_is(void *user_data, void *reply_data, DBusError *error);
|
||||||
|
static void _e_dbus_cb_vol_is(void *user_data, void *reply_data, DBusError *error);
|
||||||
|
static void _e_dbus_cb_dev_add(void *data, DBusMessage *msg);
|
||||||
|
static void _e_dbus_cb_dev_del(void *data, DBusMessage *msg);
|
||||||
|
static void _e_dbus_cb_cap_add(void *data, DBusMessage *msg);
|
||||||
|
static void _e_dbus_cb_store_prop(void *data, void *reply_data, DBusError *error);
|
||||||
|
static void _e_dbus_cb_vol_prop(void *data, void *reply_data, DBusError *error);
|
||||||
|
static void _e_dbus_cb_vol_mounted(void *user_data, void *method_return, DBusError *error);
|
||||||
|
static void _e_dbus_cb_vol_unmounted(void *user_data, void *method_return, DBusError *error);
|
||||||
|
|
||||||
|
EAPI E_Storage *e_storage_add(const char *udi);
|
||||||
|
EAPI void e_storage_del(const char *udi);
|
||||||
|
EAPI E_Storage *e_storage_find(const char *udi);
|
||||||
|
|
||||||
|
EAPI E_Volume *e_volume_add(const char *udi);
|
||||||
|
EAPI void e_volume_del(const char *udi);
|
||||||
|
EAPI E_Volume *e_volume_find(const char *udi);
|
||||||
|
|
||||||
|
EAPI void e_volume_mount(E_Volume *v);
|
||||||
|
EAPI void e_volume_unmount(E_Volume *v);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* local subsystem globals */
|
/* local subsystem globals */
|
||||||
static Ecore_Ipc_Server *_e_ipc_server = NULL;
|
static Ecore_Ipc_Server *_e_ipc_server = NULL;
|
||||||
|
|
||||||
static Evas_List *_e_dirs = NULL;
|
static Evas_List *_e_dirs = NULL;
|
||||||
static Evas_List *_e_fops = NULL;
|
static Evas_List *_e_fops = NULL;
|
||||||
static int _e_sync_num = 0;
|
static int _e_sync_num = 0;
|
||||||
|
#ifdef HAVE_EDBUS
|
||||||
|
static E_DBus_Connection *_e_dbus_conn = NULL;
|
||||||
|
|
||||||
|
/* contains:
|
||||||
|
* _e_volume_edd
|
||||||
|
* _e_storage_edd
|
||||||
|
* _e_volume_free()
|
||||||
|
* _e_storage_free()
|
||||||
|
* _e_volume_edd_new()
|
||||||
|
* _e_storage_edd_new()
|
||||||
|
* _e_storage_volume_edd_init()
|
||||||
|
* _e_storage_volume_edd_shutdown()
|
||||||
|
*/
|
||||||
|
#define E_FM_SHARED_CODEC
|
||||||
|
#include "e_fm_shared.h"
|
||||||
|
#undef E_FM_SHARED_CODEC
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* externally accessible functions */
|
/* externally accessible functions */
|
||||||
int
|
int
|
||||||
|
@ -144,10 +205,36 @@ main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
ecore_init();
|
ecore_init();
|
||||||
|
ecore_string_init();
|
||||||
ecore_app_args_set(argc, (const char **)argv);
|
ecore_app_args_set(argc, (const char **)argv);
|
||||||
ecore_file_init();
|
ecore_file_init();
|
||||||
ecore_ipc_init();
|
ecore_ipc_init();
|
||||||
|
|
||||||
|
#ifdef HAVE_EDBUS
|
||||||
|
_e_storage_volume_edd_init();
|
||||||
|
e_dbus_init();
|
||||||
|
_e_dbus_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
|
||||||
|
|
||||||
|
e_hal_manager_get_all_devices(_e_dbus_conn, _e_dbus_cb_dev_all, NULL);
|
||||||
|
e_hal_manager_find_device_by_capability(_e_dbus_conn, "storage",
|
||||||
|
_e_dbus_cb_dev_store, NULL);
|
||||||
|
e_hal_manager_find_device_by_capability(_e_dbus_conn, "volume",
|
||||||
|
_e_dbus_cb_dev_vol, NULL);
|
||||||
|
|
||||||
|
e_dbus_signal_handler_add(_e_dbus_conn, "org.freedesktop.Hal",
|
||||||
|
"/org/freedesktop/Hal/Manager",
|
||||||
|
"org.freedesktop.Hal.Manager",
|
||||||
|
"DeviceAdded", _e_dbus_cb_dev_add, NULL);
|
||||||
|
e_dbus_signal_handler_add(_e_dbus_conn, "org.freedesktop.Hal",
|
||||||
|
"/org/freedesktop/Hal/Manager",
|
||||||
|
"org.freedesktop.Hal.Manager",
|
||||||
|
"DeviceRemoved", _e_dbus_cb_dev_del, NULL);
|
||||||
|
e_dbus_signal_handler_add(_e_dbus_conn, "org.freedesktop.Hal",
|
||||||
|
"/org/freedesktop/Hal/Manager",
|
||||||
|
"org.freedesktop.Hal.Manager",
|
||||||
|
"NewCapability", _e_dbus_cb_cap_add, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (_e_ipc_init()) ecore_main_loop_begin();
|
if (_e_ipc_init()) ecore_main_loop_begin();
|
||||||
|
|
||||||
if (_e_ipc_server)
|
if (_e_ipc_server)
|
||||||
|
@ -156,13 +243,526 @@ main(int argc, char **argv)
|
||||||
_e_ipc_server = NULL;
|
_e_ipc_server = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_EDBUS
|
||||||
|
e_dbus_connection_unref(_e_dbus_conn);
|
||||||
|
e_dbus_shutdown();
|
||||||
|
_e_storage_volume_edd_shutdown();
|
||||||
|
#endif
|
||||||
|
|
||||||
ecore_ipc_shutdown();
|
ecore_ipc_shutdown();
|
||||||
ecore_file_shutdown();
|
ecore_file_shutdown();
|
||||||
|
ecore_string_shutdown();
|
||||||
ecore_shutdown();
|
ecore_shutdown();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_EDBUS
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_dev_all(void *user_data, void *reply_data, DBusError *error)
|
||||||
|
{
|
||||||
|
E_Hal_Manager_Get_All_Devices_Return *ret = reply_data;
|
||||||
|
char *device;
|
||||||
|
|
||||||
|
if (!ret || !ret->strings) return;
|
||||||
|
|
||||||
|
if (dbus_error_is_set(error))
|
||||||
|
{
|
||||||
|
dbus_error_free(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ecore_list_goto_first(ret->strings);
|
||||||
|
while ((device = ecore_list_next(ret->strings)))
|
||||||
|
{
|
||||||
|
// printf("DB INIT DEV+: %s\n", device);
|
||||||
|
if (!strncmp(device, "/org/freedesktop/Hal/devices/storage_serial",
|
||||||
|
strlen("/org/freedesktop/Hal/devices/storage_serial")))
|
||||||
|
{
|
||||||
|
char *udi;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
udi = device;
|
||||||
|
ret = e_hal_device_query_capability(_e_dbus_conn, udi, "storage",
|
||||||
|
_e_dbus_cb_store_is, strdup(udi));
|
||||||
|
e_hal_device_query_capability(_e_dbus_conn, udi, "volume",
|
||||||
|
_e_dbus_cb_vol_is, strdup(udi));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_dev_store(void *user_data, void *reply_data, DBusError *error)
|
||||||
|
{
|
||||||
|
E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;
|
||||||
|
char *device;
|
||||||
|
|
||||||
|
if (!ret || !ret->strings) return;
|
||||||
|
|
||||||
|
if (dbus_error_is_set(error))
|
||||||
|
{
|
||||||
|
dbus_error_free(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ecore_list_goto_first(ret->strings);
|
||||||
|
while ((device = ecore_list_next(ret->strings)))
|
||||||
|
{
|
||||||
|
// printf("DB STORE+: %s\n", device);
|
||||||
|
e_storage_add(device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_dev_vol(void *user_data, void *reply_data, DBusError *error)
|
||||||
|
{
|
||||||
|
E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;
|
||||||
|
char *device;
|
||||||
|
|
||||||
|
if (!ret || !ret->strings) return;
|
||||||
|
|
||||||
|
if (dbus_error_is_set(error))
|
||||||
|
{
|
||||||
|
dbus_error_free(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ecore_list_goto_first(ret->strings);
|
||||||
|
while ((device = ecore_list_next(ret->strings)))
|
||||||
|
{
|
||||||
|
// printf("DB VOL+: %s\n", device);
|
||||||
|
e_volume_add(device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_store_is(void *user_data, void *reply_data, DBusError *error)
|
||||||
|
{
|
||||||
|
char *udi = user_data;
|
||||||
|
E_Hal_Device_Query_Capability_Return *ret = reply_data;
|
||||||
|
|
||||||
|
if (dbus_error_is_set(error))
|
||||||
|
{
|
||||||
|
dbus_error_free(error);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret && ret->boolean)
|
||||||
|
{
|
||||||
|
// printf("DB STORE IS+: %s\n", udi);
|
||||||
|
e_storage_add(udi);
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
free(udi);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_vol_is(void *user_data, void *reply_data, DBusError *error)
|
||||||
|
{
|
||||||
|
char *udi = user_data;
|
||||||
|
E_Hal_Device_Query_Capability_Return *ret = reply_data;
|
||||||
|
|
||||||
|
if (dbus_error_is_set(error))
|
||||||
|
{
|
||||||
|
dbus_error_free(error);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret && ret->boolean)
|
||||||
|
{
|
||||||
|
// printf("DB VOL IS+: %s\n", udi);
|
||||||
|
e_volume_add(udi);
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
free(udi);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_dev_add(void *data, DBusMessage *msg)
|
||||||
|
{
|
||||||
|
DBusError err;
|
||||||
|
char *udi;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
dbus_error_init(&err);
|
||||||
|
dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
|
||||||
|
udi = strdup(udi);
|
||||||
|
// printf("DB DEV+: %s\n", udi);
|
||||||
|
ret = e_hal_device_query_capability(_e_dbus_conn, udi, "storage",
|
||||||
|
_e_dbus_cb_store_is, strdup(udi));
|
||||||
|
e_hal_device_query_capability(_e_dbus_conn, udi, "volume",
|
||||||
|
_e_dbus_cb_vol_is, strdup(udi));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_dev_del(void *data, DBusMessage *msg)
|
||||||
|
{
|
||||||
|
DBusError err;
|
||||||
|
char *udi;
|
||||||
|
|
||||||
|
dbus_error_init(&err);
|
||||||
|
|
||||||
|
dbus_message_get_args(msg,
|
||||||
|
&err, DBUS_TYPE_STRING,
|
||||||
|
&udi, DBUS_TYPE_INVALID);
|
||||||
|
// printf("DB DEV-: %s\n", udi);
|
||||||
|
e_storage_del(udi);
|
||||||
|
e_volume_del(udi);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_cap_add(void *data, DBusMessage *msg)
|
||||||
|
{
|
||||||
|
DBusError err;
|
||||||
|
char *udi, *capability;
|
||||||
|
|
||||||
|
dbus_error_init(&err);
|
||||||
|
|
||||||
|
dbus_message_get_args(msg,
|
||||||
|
&err, DBUS_TYPE_STRING,
|
||||||
|
&udi, DBUS_TYPE_STRING,
|
||||||
|
&capability, DBUS_TYPE_INVALID);
|
||||||
|
if (!strcmp(capability, "storage"))
|
||||||
|
{
|
||||||
|
// printf("DB STORE CAP+: %s\n", udi);
|
||||||
|
e_storage_add(udi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_store_prop(void *data, void *reply_data, DBusError *error)
|
||||||
|
{
|
||||||
|
E_Storage *s = data;
|
||||||
|
E_Hal_Properties *ret = reply_data;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
if (!ret) goto error;
|
||||||
|
if (dbus_error_is_set(error))
|
||||||
|
{
|
||||||
|
dbus_error_free(error);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->bus = e_hal_property_string_get(ret, "storage.bus", &err);
|
||||||
|
if (err) goto error;
|
||||||
|
s->drive_type = e_hal_property_string_get(ret, "storage.drive_type", &err);
|
||||||
|
if (err) goto error;
|
||||||
|
s->model = e_hal_property_string_get(ret, "storage.model", &err);
|
||||||
|
if (err) goto error;
|
||||||
|
s->vendor = e_hal_property_string_get(ret, "storage.vendor", &err);
|
||||||
|
if (err) goto error;
|
||||||
|
s->serial = e_hal_property_string_get(ret, "storage.serial", &err);
|
||||||
|
|
||||||
|
s->removable = e_hal_property_bool_get(ret, "storage.removable", &err);
|
||||||
|
if (err) goto error;
|
||||||
|
|
||||||
|
if (s->removable)
|
||||||
|
{
|
||||||
|
s->media_available = e_hal_property_bool_get(ret, "storage.removable.media_available", &err);
|
||||||
|
s->media_size = e_hal_property_uint64_get(ret, "storage.removable.media_size", &err);
|
||||||
|
}
|
||||||
|
|
||||||
|
s->requires_eject = e_hal_property_bool_get(ret, "storage.requires_eject", &err);
|
||||||
|
s->hotpluggable = e_hal_property_bool_get(ret, "storage.hotpluggable", &err);
|
||||||
|
s->media_check_enabled = e_hal_property_bool_get(ret, "storage.media_check_enabled", &err);
|
||||||
|
|
||||||
|
s->icon.drive = e_hal_property_string_get(ret, "storage.icon.drive", &err);
|
||||||
|
s->icon.volume = e_hal_property_string_get(ret, "storage.icon.volume", &err);
|
||||||
|
|
||||||
|
printf("++STO:\n udi: %s\n bus: %s\n drive_type: %s\n model: %s\n vendor: %s\n serial: %s\n icon.drive: %s\n icon.volume: %s\n\n", s->udi, s->bus, s->drive_type, s->model, s->vendor, s->serial, s->icon.drive, s->icon.volume);
|
||||||
|
s->validated = 1;
|
||||||
|
{
|
||||||
|
void *msg_data;
|
||||||
|
int msg_size;
|
||||||
|
|
||||||
|
msg_data = eet_data_descriptor_encode(_e_storage_edd, s, &msg_size);
|
||||||
|
if (msg_data)
|
||||||
|
{
|
||||||
|
ecore_ipc_server_send(_e_ipc_server,
|
||||||
|
6/*E_IPC_DOMAIN_FM*/,
|
||||||
|
8/*storage add*/,
|
||||||
|
0, 0, 0, msg_data, msg_size);
|
||||||
|
free(msg_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
error:
|
||||||
|
printf("ERR %s\n", s->udi);
|
||||||
|
e_storage_del(s->udi);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Evas_List *_e_stores = NULL;
|
||||||
|
|
||||||
|
EAPI E_Storage *
|
||||||
|
e_storage_add(const char *udi)
|
||||||
|
{
|
||||||
|
E_Storage *s;
|
||||||
|
|
||||||
|
if (!udi) return NULL;
|
||||||
|
if (e_storage_find(udi)) return NULL;
|
||||||
|
s = calloc(1, sizeof(E_Storage));
|
||||||
|
if (!s) return NULL;
|
||||||
|
s->udi = strdup(udi);
|
||||||
|
_e_stores = evas_list_append(_e_stores, s);
|
||||||
|
e_hal_device_get_all_properties(_e_dbus_conn, s->udi,
|
||||||
|
_e_dbus_cb_store_prop, s);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
e_storage_del(const char *udi)
|
||||||
|
{
|
||||||
|
E_Storage *s;
|
||||||
|
|
||||||
|
s = e_storage_find(udi);
|
||||||
|
if (!s) return;
|
||||||
|
if (s->validated)
|
||||||
|
{
|
||||||
|
printf("--STO %s\n", s->udi);
|
||||||
|
ecore_ipc_server_send(_e_ipc_server,
|
||||||
|
6/*E_IPC_DOMAIN_FM*/,
|
||||||
|
9/*storage del*/,
|
||||||
|
0, 0, 0, s->udi, strlen(s->udi) + 1);
|
||||||
|
}
|
||||||
|
_e_stores = evas_list_remove(_e_stores, s);
|
||||||
|
_e_storage_free(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
E_Storage *
|
||||||
|
e_storage_find(const char *udi)
|
||||||
|
{
|
||||||
|
Evas_List *l;
|
||||||
|
|
||||||
|
for (l = _e_stores; l; l = l->next)
|
||||||
|
{
|
||||||
|
E_Storage *s;
|
||||||
|
|
||||||
|
s = l->data;
|
||||||
|
if (!strcmp(udi, s->udi)) return s;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_vol_prop(void *data, void *reply_data, DBusError *error)
|
||||||
|
{
|
||||||
|
E_Volume *v = data;
|
||||||
|
E_Storage *s = NULL;
|
||||||
|
E_Hal_Device_Get_All_Properties_Return *ret = reply_data;
|
||||||
|
int err = 0;
|
||||||
|
char *str = NULL;
|
||||||
|
|
||||||
|
if (!ret) goto error;
|
||||||
|
if (dbus_error_is_set(error))
|
||||||
|
{
|
||||||
|
dbus_error_free(error);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* skip volumes with volume.ignore set */
|
||||||
|
if (e_hal_property_bool_get(ret, "volume.ignore", &err) || err)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* skip volumes that aren't filesystems */
|
||||||
|
str = e_hal_property_string_get(ret, "volume.fsusage", &err);
|
||||||
|
if (err || !str) goto error;
|
||||||
|
if (strcmp(str, "filesystem")) goto error;
|
||||||
|
free(str);
|
||||||
|
str = NULL;
|
||||||
|
|
||||||
|
v->uuid = e_hal_property_string_get(ret, "volume.uuid", &err);
|
||||||
|
if (err) goto error;
|
||||||
|
|
||||||
|
v->label = e_hal_property_string_get(ret, "volume.label", &err);
|
||||||
|
// if (err) goto error;
|
||||||
|
|
||||||
|
v->fstype = e_hal_property_string_get(ret, "volume.fstype", &err);
|
||||||
|
// if (err) goto error;
|
||||||
|
|
||||||
|
v->mounted = e_hal_property_bool_get(ret, "volume.is_mounted", &err);
|
||||||
|
if (err) goto error;
|
||||||
|
|
||||||
|
v->partition = e_hal_property_bool_get(ret, "volume.is_partition", &err);
|
||||||
|
if (err) goto error;
|
||||||
|
|
||||||
|
v->mount_point = e_hal_property_string_get(ret, "volume.mount_point", &err);
|
||||||
|
if (err) goto error;
|
||||||
|
|
||||||
|
if (v->partition)
|
||||||
|
{
|
||||||
|
v->partition_label = e_hal_property_string_get(ret, "volume.partition.label", &err);
|
||||||
|
// if (err) goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
v->parent = e_hal_property_string_get(ret, "info.parent", &err);
|
||||||
|
if ((!err) && (v->parent))
|
||||||
|
{
|
||||||
|
s = e_storage_find(v->parent);
|
||||||
|
if (s)
|
||||||
|
{
|
||||||
|
v->storage = s;
|
||||||
|
s->volumes = evas_list_append(s->volumes, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("++VOL:\n udi: %s\n uuid: %s\n fstype: %s\n label: %s\n partition: %d\n partition_label: %s\n mounted: %d\n mount_point: %s\n", v->udi, v->uuid, v->fstype, v->label, v->partition, v->partition ? v->partition_label : "(not a partition)", v->mounted, v->mount_point);
|
||||||
|
if (s) printf(" for storage: %s\n", s->udi);
|
||||||
|
else printf(" storage unknown\n");
|
||||||
|
v->validated = 1;
|
||||||
|
{
|
||||||
|
void *msg_data;
|
||||||
|
int msg_size;
|
||||||
|
|
||||||
|
msg_data = eet_data_descriptor_encode(_e_volume_edd, v, &msg_size);
|
||||||
|
if (msg_data)
|
||||||
|
{
|
||||||
|
ecore_ipc_server_send(_e_ipc_server,
|
||||||
|
6/*E_IPC_DOMAIN_FM*/,
|
||||||
|
10/*volume add*/,
|
||||||
|
0, 0, 0, msg_data, msg_size);
|
||||||
|
free(msg_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
error:
|
||||||
|
e_volume_del(v->udi);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Evas_List *_e_vols = NULL;
|
||||||
|
|
||||||
|
EAPI E_Volume *
|
||||||
|
e_volume_add(const char *udi)
|
||||||
|
{
|
||||||
|
E_Volume *v;
|
||||||
|
|
||||||
|
if (!udi) return NULL;
|
||||||
|
if (e_volume_find(udi)) return NULL;
|
||||||
|
v = calloc(1, sizeof(E_Volume));
|
||||||
|
if (!v) return NULL;
|
||||||
|
// printf("VOL+ %s\n", udi);
|
||||||
|
v->udi = strdup(udi);
|
||||||
|
_e_vols = evas_list_append(_e_vols, v);
|
||||||
|
e_hal_device_get_all_properties(_e_dbus_conn, v->udi,
|
||||||
|
_e_dbus_cb_vol_prop, v);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
e_volume_del(const char *udi)
|
||||||
|
{
|
||||||
|
E_Volume *v;
|
||||||
|
|
||||||
|
v = e_volume_find(udi);
|
||||||
|
if (!v) return;
|
||||||
|
if (v->validated)
|
||||||
|
{
|
||||||
|
printf("--VOL %s\n", v->udi);
|
||||||
|
/* FIXME: send event of storage volume (disk) removed */
|
||||||
|
ecore_ipc_server_send(_e_ipc_server,
|
||||||
|
6/*E_IPC_DOMAIN_FM*/,
|
||||||
|
11/*volume del*/,
|
||||||
|
0, 0, 0, v->udi, strlen(v->udi) + 1);
|
||||||
|
}
|
||||||
|
_e_vols = evas_list_remove(_e_vols, v);
|
||||||
|
_e_volume_free(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI E_Volume *
|
||||||
|
e_volume_find(const char *udi)
|
||||||
|
{
|
||||||
|
Evas_List *l;
|
||||||
|
|
||||||
|
for (l = _e_vols; l; l = l->next)
|
||||||
|
{
|
||||||
|
E_Volume *v;
|
||||||
|
|
||||||
|
v = l->data;
|
||||||
|
if (!strcmp(udi, v->udi)) return v;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_vol_mounted(void *user_data, void *method_return, DBusError *error)
|
||||||
|
{
|
||||||
|
E_Volume *v = user_data;
|
||||||
|
char *buf;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
v->mounted = 1;
|
||||||
|
printf("MOUNT: %s from %s\n", v->udi, v->mount_point);
|
||||||
|
size = strlen(v->udi) + 1 + strlen(v->mount_point) + 1;
|
||||||
|
buf = alloca(size);
|
||||||
|
strcpy(buf, v->udi);
|
||||||
|
strcpy(buf + strlen(buf) + 1, v->mount_point);
|
||||||
|
ecore_ipc_server_send(_e_ipc_server,
|
||||||
|
6/*E_IPC_DOMAIN_FM*/,
|
||||||
|
12/*mount done*/,
|
||||||
|
0, 0, 0, buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
e_volume_mount(E_Volume *v)
|
||||||
|
{
|
||||||
|
static int mount_id = 1;
|
||||||
|
char buf[4096];
|
||||||
|
char *mount_point;
|
||||||
|
|
||||||
|
if (v->mount_point && v->mount_point[0])
|
||||||
|
mount_point = v->mount_point;
|
||||||
|
else if (v->label && v->label[0])
|
||||||
|
mount_point = v->label;
|
||||||
|
else if (v->uuid && v->uuid[0])
|
||||||
|
mount_point = v->uuid;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
snprintf(buf, sizeof(buf), "unknown-%i\n", mount_id++);
|
||||||
|
mount_point = buf;
|
||||||
|
}
|
||||||
|
if (v->mount_point != mount_point)
|
||||||
|
{
|
||||||
|
if (v->mount_point) free(v->mount_point);
|
||||||
|
v->mount_point = strdup(mount_point);
|
||||||
|
}
|
||||||
|
printf("mount %s %s\n", v->udi, v->mount_point);
|
||||||
|
e_hal_device_volume_mount(_e_dbus_conn, v->udi, v->mount_point,
|
||||||
|
v->fstype, NULL, _e_dbus_cb_vol_mounted, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_dbus_cb_vol_unmounted(void *user_data, void *method_return, DBusError *error)
|
||||||
|
{
|
||||||
|
E_Volume *v = user_data;
|
||||||
|
char *buf;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
v->mounted = 0;
|
||||||
|
printf("UNMOUNT: %s from %s\n", v->udi, v->mount_point);
|
||||||
|
size = strlen(v->udi) + 1 + strlen(v->mount_point) + 1;
|
||||||
|
buf = alloca(size);
|
||||||
|
strcpy(buf, v->udi);
|
||||||
|
strcpy(buf + strlen(buf) + 1, v->mount_point);
|
||||||
|
ecore_ipc_server_send(_e_ipc_server,
|
||||||
|
6/*E_IPC_DOMAIN_FM*/,
|
||||||
|
13/*unmount done*/,
|
||||||
|
0, 0, 0, buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
e_volume_unmount(E_Volume *v)
|
||||||
|
{
|
||||||
|
printf("unmount %s %s\n", v->udi, v->mount_point);
|
||||||
|
e_hal_device_volume_unmount(_e_dbus_conn, v->udi, NULL,
|
||||||
|
_e_dbus_cb_vol_unmounted, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* local subsystem functions */
|
/* local subsystem functions */
|
||||||
static int
|
static int
|
||||||
_e_ipc_init(void)
|
_e_ipc_init(void)
|
||||||
|
@ -456,6 +1056,7 @@ _e_ipc_cb_server_data(void *data, int type, void *event)
|
||||||
fop->rel_to = rel_to;
|
fop->rel_to = rel_to;
|
||||||
fop->x = x;
|
fop->x = x;
|
||||||
fop->y = y;
|
fop->y = y;
|
||||||
|
printf("MV %s to %s\n", fop->src, fop->dst);
|
||||||
_e_fops = evas_list_append(_e_fops, fop);
|
_e_fops = evas_list_append(_e_fops, fop);
|
||||||
fop->idler = ecore_idler_add(_e_cb_fop_mv_idler, fop);
|
fop->idler = ecore_idler_add(_e_cb_fop_mv_idler, fop);
|
||||||
}
|
}
|
||||||
|
@ -504,11 +1105,39 @@ _e_ipc_cb_server_data(void *data, int type, void *event)
|
||||||
_e_path_fix_order(src, rel, rel_to, x, y);
|
_e_path_fix_order(src, rel, rel_to, x, y);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 9: /* fop mount fs */
|
case 9: /* mount udi mountpoint */
|
||||||
/* FIXME: implement later - for now in e */
|
{
|
||||||
|
E_Volume *v;
|
||||||
|
const char *udi, *mountpoint;
|
||||||
|
|
||||||
|
udi = e->data;
|
||||||
|
mountpoint = udi + strlen(udi) + 1;
|
||||||
|
v = e_volume_find(udi);
|
||||||
|
if (v)
|
||||||
|
{
|
||||||
|
if (mountpoint[0])
|
||||||
|
{
|
||||||
|
if (v->mount_point) free(v->mount_point);
|
||||||
|
v->mount_point = strdup(mountpoint);
|
||||||
|
}
|
||||||
|
printf("REQ M\n");
|
||||||
|
e_volume_mount(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 10: /* fop umount fs */
|
case 10:/* unmount udi */
|
||||||
/* FIXME: implement later - for now in e */
|
{
|
||||||
|
E_Volume *v;
|
||||||
|
const char *udi;
|
||||||
|
|
||||||
|
udi = e->data;
|
||||||
|
v = e_volume_find(udi);
|
||||||
|
if (v)
|
||||||
|
{
|
||||||
|
printf("REQ UM\n");
|
||||||
|
e_volume_unmount(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 11: /* quit */
|
case 11: /* quit */
|
||||||
ecore_main_loop_quit();
|
ecore_main_loop_quit();
|
||||||
|
@ -986,8 +1615,10 @@ _e_cb_fop_mv_idler(void *data)
|
||||||
{
|
{
|
||||||
if (rename(fop->src, fop->dst) != 0)
|
if (rename(fop->src, fop->dst) != 0)
|
||||||
{
|
{
|
||||||
|
printf("rename %s -> %s err\n", fop->src, fop->dst);
|
||||||
if (errno == EXDEV)
|
if (errno == EXDEV)
|
||||||
{
|
{
|
||||||
|
printf("copy instead\n");
|
||||||
/* copy it instead - but del after cp */
|
/* copy it instead - but del after cp */
|
||||||
fop->idler = ecore_idler_add(_e_cb_fop_cp_idler, fop);
|
fop->idler = ecore_idler_add(_e_cb_fop_cp_idler, fop);
|
||||||
fop->del_after = 1;
|
fop->del_after = 1;
|
||||||
|
@ -1033,6 +1664,7 @@ _e_cb_fop_cp_idler(void *data)
|
||||||
fd->dir = opendir(fd->path);
|
fd->dir = opendir(fd->path);
|
||||||
snprintf(buf, sizeof(buf), "%s", fd->path);
|
snprintf(buf, sizeof(buf), "%s", fd->path);
|
||||||
snprintf(buf2, sizeof(buf2), "%s", fd->path2);
|
snprintf(buf2, sizeof(buf2), "%s", fd->path2);
|
||||||
|
lnk = ecore_file_readlink(buf);
|
||||||
if (!lnk)
|
if (!lnk)
|
||||||
{
|
{
|
||||||
if (ecore_file_is_dir(buf))
|
if (ecore_file_is_dir(buf))
|
||||||
|
|
|
@ -429,7 +429,7 @@ _e_fwin_changed(void *data, Evas_Object *obj, void *event_info)
|
||||||
fwin->theme_file = _e_fwin_custom_file_path_eval(fwin, ef, fwin->theme_file, "X-Enlightenment-Directory-Theme");
|
fwin->theme_file = _e_fwin_custom_file_path_eval(fwin, ef, fwin->theme_file, "X-Enlightenment-Directory-Theme");
|
||||||
// FIXME: there is no way to just unref an efreet desktop - free completely
|
// FIXME: there is no way to just unref an efreet desktop - free completely
|
||||||
// frees - doesnt just unref.
|
// frees - doesnt just unref.
|
||||||
// efreet_desktop_free(ef);
|
efreet_desktop_free(ef);
|
||||||
}
|
}
|
||||||
if (fwin->under_obj)
|
if (fwin->under_obj)
|
||||||
{
|
{
|
||||||
|
@ -873,7 +873,7 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files, int always)
|
||||||
E_Fwin_Apps_Dialog *fad;
|
E_Fwin_Apps_Dialog *fad;
|
||||||
E_Fm2_Config fmc;
|
E_Fm2_Config fmc;
|
||||||
E_Fm2_Icon_Info *ici;
|
E_Fm2_Icon_Info *ici;
|
||||||
char buf[4096];
|
char buf[PATH_MAX];
|
||||||
const char *f;
|
const char *f;
|
||||||
int need_dia = 0;
|
int need_dia = 0;
|
||||||
Evas_Hash *mimes = NULL;
|
Evas_Hash *mimes = NULL;
|
||||||
|
@ -889,6 +889,7 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files, int always)
|
||||||
for (l = files; l; l = l->next)
|
for (l = files; l; l = l->next)
|
||||||
{
|
{
|
||||||
ici = l->data;
|
ici = l->data;
|
||||||
|
printf("O: %s -- %i\n", ici->link, ici->removable);
|
||||||
if ((ici->link) && (ici->mount))
|
if ((ici->link) && (ici->mount))
|
||||||
{
|
{
|
||||||
if (fwin->win)
|
if (fwin->win)
|
||||||
|
@ -898,10 +899,11 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files, int always)
|
||||||
}
|
}
|
||||||
else if ((ici->link) && (ici->removable))
|
else if ((ici->link) && (ici->removable))
|
||||||
{
|
{
|
||||||
|
snprintf(buf, sizeof(buf), "removable:%s", ici->link);
|
||||||
if (fwin->win)
|
if (fwin->win)
|
||||||
fwin2 = e_fwin_new(fwin->win->container, ici->link, "/");
|
fwin2 = e_fwin_new(fwin->win->container, buf, "/");
|
||||||
else if (fwin->zone)
|
else if (fwin->zone)
|
||||||
fwin2 = e_fwin_new(fwin->zone->container, ici->link, "/");
|
fwin2 = e_fwin_new(fwin->zone->container, buf, "/");
|
||||||
}
|
}
|
||||||
else if (ici->real_link)
|
else if (ici->real_link)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue