forked from enlightenment/enlightenment
efm: use freedesktop icons from icon theme.
This almost remove need of e_fm_mime.c since it will use efreet, but may bring some slowdowns due efreet. In this case let's try to optimize efreet and improve everything. SVN revision: 39315
This commit is contained in:
parent
efc8391314
commit
e88de35176
153
src/bin/e_fm.c
153
src/bin/e_fm.c
|
@ -229,11 +229,11 @@ static int _e_fm2_icon_fill(E_Fm2_Icon *ic, E_Fm2_Finfo *finf);
|
||||||
static void _e_fm2_icon_free(E_Fm2_Icon *ic);
|
static void _e_fm2_icon_free(E_Fm2_Icon *ic);
|
||||||
static void _e_fm2_icon_realize(E_Fm2_Icon *ic);
|
static void _e_fm2_icon_realize(E_Fm2_Icon *ic);
|
||||||
static void _e_fm2_icon_unrealize(E_Fm2_Icon *ic);
|
static void _e_fm2_icon_unrealize(E_Fm2_Icon *ic);
|
||||||
static int _e_fm2_icon_visible(E_Fm2_Icon *ic);
|
static Eina_Bool _e_fm2_icon_visible(const E_Fm2_Icon *ic);
|
||||||
static void _e_fm2_icon_label_set(E_Fm2_Icon *ic, Evas_Object *obj);
|
static void _e_fm2_icon_label_set(E_Fm2_Icon *ic, Evas_Object *obj);
|
||||||
static Evas_Object *_e_fm2_icon_icon_direct_set(E_Fm2_Icon *ic, Evas_Object *o, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen);
|
static Evas_Object *_e_fm2_icon_icon_direct_set(E_Fm2_Icon *ic, Evas_Object *o, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen);
|
||||||
static void _e_fm2_icon_icon_set(E_Fm2_Icon *ic);
|
static void _e_fm2_icon_icon_set(E_Fm2_Icon *ic);
|
||||||
static void _e_fm2_icon_thumb(E_Fm2_Icon *ic, Evas_Object *oic, int force);
|
static void _e_fm2_icon_thumb(const E_Fm2_Icon *ic, Evas_Object *oic, int force);
|
||||||
static void _e_fm2_icon_select(E_Fm2_Icon *ic);
|
static void _e_fm2_icon_select(E_Fm2_Icon *ic);
|
||||||
static void _e_fm2_icon_deselect(E_Fm2_Icon *ic);
|
static void _e_fm2_icon_deselect(E_Fm2_Icon *ic);
|
||||||
static int _e_fm2_icon_desktop_load(E_Fm2_Icon *ic);
|
static int _e_fm2_icon_desktop_load(E_Fm2_Icon *ic);
|
||||||
|
@ -398,6 +398,8 @@ static int _e_fm_file_buffer_cutting = 0;
|
||||||
static int _e_fm_file_buffer_copying = 0;
|
static int _e_fm_file_buffer_copying = 0;
|
||||||
static const char *_e_fm2_icon_desktop_str = NULL;
|
static const char *_e_fm2_icon_desktop_str = NULL;
|
||||||
static const char *_e_fm2_icon_thumb_str = NULL;
|
static const char *_e_fm2_icon_thumb_str = NULL;
|
||||||
|
static const char *_e_fm2_mime_inode_directory = NULL;
|
||||||
|
static const char *_e_fm2_mime_app_desktop = NULL;
|
||||||
|
|
||||||
/* contains:
|
/* contains:
|
||||||
* _e_volume_edd
|
* _e_volume_edd
|
||||||
|
@ -499,6 +501,30 @@ _e_fm2_file_is_desktop(const char *file)
|
||||||
return ((p) && (_e_fm2_ext_is_desktop(p + 1)));
|
return ((p) && (_e_fm2_ext_is_desktop(p + 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline char
|
||||||
|
_e_fm2_view_mode_get(const E_Fm2_Smart_Data *sd)
|
||||||
|
{
|
||||||
|
if (sd->view_mode > -1)
|
||||||
|
return sd->view_mode;
|
||||||
|
return sd->config->view.mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline Evas_Coord
|
||||||
|
_e_fm2_icon_w_get(const E_Fm2_Smart_Data *sd)
|
||||||
|
{
|
||||||
|
if (sd->icon_size > -1)
|
||||||
|
return sd->icon_size * e_scale;
|
||||||
|
return sd->config->icon.icon.w;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline Evas_Coord
|
||||||
|
_e_fm2_icon_h_get(const E_Fm2_Smart_Data *sd)
|
||||||
|
{
|
||||||
|
if (sd->icon_size > -1)
|
||||||
|
return sd->icon_size * e_scale;
|
||||||
|
return sd->config->icon.icon.h;
|
||||||
|
}
|
||||||
|
|
||||||
/***/
|
/***/
|
||||||
|
|
||||||
EAPI int
|
EAPI int
|
||||||
|
@ -542,6 +568,8 @@ e_fm2_init(void)
|
||||||
|
|
||||||
_e_fm2_icon_desktop_str = eina_stringshare_add("DESKTOP");
|
_e_fm2_icon_desktop_str = eina_stringshare_add("DESKTOP");
|
||||||
_e_fm2_icon_thumb_str = eina_stringshare_add("THUMB");
|
_e_fm2_icon_thumb_str = eina_stringshare_add("THUMB");
|
||||||
|
_e_fm2_mime_inode_directory = eina_stringshare_add("inode/directory");
|
||||||
|
_e_fm2_mime_app_desktop = eina_stringshare_add("application/x-desktop");
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -549,10 +577,10 @@ e_fm2_init(void)
|
||||||
EAPI int
|
EAPI int
|
||||||
e_fm2_shutdown(void)
|
e_fm2_shutdown(void)
|
||||||
{
|
{
|
||||||
eina_stringshare_del(_e_fm2_icon_desktop_str);
|
_eina_stringshare_replace(&_e_fm2_icon_desktop_str, NULL);
|
||||||
_e_fm2_icon_desktop_str = NULL;
|
_eina_stringshare_replace(&_e_fm2_icon_thumb_str, NULL);
|
||||||
eina_stringshare_del(_e_fm2_icon_thumb_str);
|
_eina_stringshare_replace(&_e_fm2_mime_inode_directory, NULL);
|
||||||
_e_fm2_icon_thumb_str = NULL;
|
_eina_stringshare_replace(&_e_fm2_mime_app_desktop, NULL);
|
||||||
|
|
||||||
evas_smart_free(_e_fm2_smart);
|
evas_smart_free(_e_fm2_smart);
|
||||||
_e_fm2_smart = NULL;
|
_e_fm2_smart = NULL;
|
||||||
|
@ -1434,7 +1462,7 @@ _e_fm2_path_join(char *buf, int buflen, const char *base, const char *component)
|
||||||
* @see _e_fm2_icon_explicit_get()
|
* @see _e_fm2_icon_explicit_get()
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_explicit_edje_get(Evas *evas, E_Fm2_Icon *ic, const char *iconpath, const char **type_ret)
|
_e_fm2_icon_explicit_edje_get(Evas *evas, const E_Fm2_Icon *ic, const char *iconpath, const char **type_ret)
|
||||||
{
|
{
|
||||||
Evas_Object *o = edje_object_add(evas);
|
Evas_Object *o = edje_object_add(evas);
|
||||||
if (!o)
|
if (!o)
|
||||||
|
@ -1459,7 +1487,7 @@ _e_fm2_icon_explicit_edje_get(Evas *evas, E_Fm2_Icon *ic, const char *iconpath,
|
||||||
* @see _e_fm2_icon_explicit_get()
|
* @see _e_fm2_icon_explicit_get()
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_explicit_theme_icon_get(Evas *evas, E_Fm2_Icon *ic, const char *name, const char **type_ret)
|
_e_fm2_icon_explicit_theme_icon_get(Evas *evas, const E_Fm2_Icon *ic, const char *name, const char **type_ret)
|
||||||
{
|
{
|
||||||
Evas_Object *o = edje_object_add(evas);
|
Evas_Object *o = edje_object_add(evas);
|
||||||
if (!o)
|
if (!o)
|
||||||
|
@ -1485,7 +1513,7 @@ _e_fm2_icon_explicit_theme_icon_get(Evas *evas, E_Fm2_Icon *ic, const char *name
|
||||||
* @see _e_fm2_icon_explicit_get()
|
* @see _e_fm2_icon_explicit_get()
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_explicit_theme_get(Evas *evas, E_Fm2_Icon *ic, const char *name, const char **type_ret)
|
_e_fm2_icon_explicit_theme_get(Evas *evas, const E_Fm2_Icon *ic, const char *name, const char **type_ret)
|
||||||
{
|
{
|
||||||
Evas_Object *o = edje_object_add(evas);
|
Evas_Object *o = edje_object_add(evas);
|
||||||
if (!o)
|
if (!o)
|
||||||
|
@ -1510,7 +1538,7 @@ _e_fm2_icon_explicit_theme_get(Evas *evas, E_Fm2_Icon *ic, const char *name, con
|
||||||
* @param icon might be an absolute or relative path, or icon name or edje path.
|
* @param icon might be an absolute or relative path, or icon name or edje path.
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_explicit_get(Evas *evas, E_Fm2_Icon *ic, const char *icon, const char **type_ret)
|
_e_fm2_icon_explicit_get(Evas *evas, const E_Fm2_Icon *ic, const char *icon, const char **type_ret)
|
||||||
{
|
{
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
const char *iconpath;
|
const char *iconpath;
|
||||||
|
@ -1545,7 +1573,7 @@ _e_fm2_icon_explicit_get(Evas *evas, E_Fm2_Icon *ic, const char *icon, const cha
|
||||||
* It will find out if it is a folder, file or like and set it accordingly.
|
* It will find out if it is a folder, file or like and set it accordingly.
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_fallback_get(Evas *evas, E_Fm2_Icon *ic, const char **type_ret)
|
_e_fm2_icon_fallback_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
|
@ -1585,7 +1613,7 @@ _e_fm2_icon_fallback_get(Evas *evas, E_Fm2_Icon *ic, const char **type_ret)
|
||||||
* @param force_gen whenever to force generation of thumbnails, even it exists.
|
* @param force_gen whenever to force generation of thumbnails, even it exists.
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_thumb_get(Evas *evas, E_Fm2_Icon *ic, const char *group, void (*cb) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret)
|
_e_fm2_icon_thumb_get(Evas *evas, const E_Fm2_Icon *ic, const char *group, void (*cb) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret)
|
||||||
{
|
{
|
||||||
Evas_Object *o;
|
Evas_Object *o;
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
|
@ -1614,7 +1642,7 @@ _e_fm2_icon_thumb_get(Evas *evas, E_Fm2_Icon *ic, const char *group, void (*cb)
|
||||||
* known groups like 'icon', 'e/desktop/background' and 'e/init/splash'.
|
* known groups like 'icon', 'e/desktop/background' and 'e/init/splash'.
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_thumb_edje_get(Evas *evas, E_Fm2_Icon *ic, void (*cb) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret)
|
_e_fm2_icon_thumb_edje_get(Evas *evas, const E_Fm2_Icon *ic, void (*cb) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret)
|
||||||
{
|
{
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
const char **itr, *group;
|
const char **itr, *group;
|
||||||
|
@ -1658,7 +1686,7 @@ _e_fm2_icon_thumb_edje_get(Evas *evas, E_Fm2_Icon *ic, void (*cb) (void *data, E
|
||||||
* Machinery for _e_fm2_icon_desktop_get() and others with instances of desktop.
|
* Machinery for _e_fm2_icon_desktop_get() and others with instances of desktop.
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_desktop_get_internal(Evas *evas, E_Fm2_Icon *ic, Efreet_Desktop *desktop, const char **type_ret)
|
_e_fm2_icon_desktop_get_internal(Evas *evas, const E_Fm2_Icon *ic, Efreet_Desktop *desktop, const char **type_ret)
|
||||||
{
|
{
|
||||||
Evas_Object *o;
|
Evas_Object *o;
|
||||||
|
|
||||||
|
@ -1681,7 +1709,7 @@ _e_fm2_icon_desktop_get_internal(Evas *evas, E_Fm2_Icon *ic, Efreet_Desktop *des
|
||||||
* Use freedesktop.org '.desktop' files to set icon.
|
* Use freedesktop.org '.desktop' files to set icon.
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_desktop_get(Evas *evas, E_Fm2_Icon *ic, const char **type_ret)
|
_e_fm2_icon_desktop_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret)
|
||||||
{
|
{
|
||||||
Efreet_Desktop *ef;
|
Efreet_Desktop *ef;
|
||||||
Evas_Object *o;
|
Evas_Object *o;
|
||||||
|
@ -1702,13 +1730,63 @@ _e_fm2_icon_desktop_get(Evas *evas, E_Fm2_Icon *ic, const char **type_ret)
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const char *
|
||||||
|
_e_fm2_icon_mime_type_special_match(const E_Fm2_Icon *ic)
|
||||||
|
{
|
||||||
|
const Eina_List *l;
|
||||||
|
const E_Config_Mime_Icon *mi;
|
||||||
|
const char *mime = ic->info.mime;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(e_config->mime_icons, l, mi)
|
||||||
|
if (mi->mime == mime) /* both in the same stringshare pool */
|
||||||
|
return mi->icon;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned int
|
||||||
|
_e_fm2_icon_mime_size_normalize(const E_Fm2_Icon *ic)
|
||||||
|
{
|
||||||
|
const unsigned int *itr, known_sizes[] = {
|
||||||
|
16, 22, 24, 32, 36, 48, 64, 72, 96, 128, 192, -1
|
||||||
|
};
|
||||||
|
unsigned int desired = _e_fm2_icon_w_get(ic->sd);
|
||||||
|
for (itr = known_sizes; *itr > 0; itr++)
|
||||||
|
if (*itr >= desired)
|
||||||
|
return *itr;
|
||||||
|
|
||||||
|
return 256; /* largest know size? */
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use mime type information to set icon.
|
* Use mime type information to set icon.
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_mime_get(Evas *evas, E_Fm2_Icon *ic, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret)
|
_e_fm2_icon_mime_get(Evas *evas, const E_Fm2_Icon *ic, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret)
|
||||||
{
|
{
|
||||||
const char *icon = e_fm_mime_icon_get(ic->info.mime);
|
const char *icon;
|
||||||
|
unsigned int size;
|
||||||
|
|
||||||
|
icon = _e_fm2_icon_mime_type_special_match(ic);
|
||||||
|
if (icon)
|
||||||
|
{
|
||||||
|
if (icon == _e_fm2_icon_desktop_str)
|
||||||
|
return _e_fm2_icon_desktop_get(evas, ic, type_ret);
|
||||||
|
else if (icon == _e_fm2_icon_thumb_str)
|
||||||
|
return _e_fm2_icon_thumb_get(evas, ic, NULL,
|
||||||
|
gen_func, data, force_gen, type_ret);
|
||||||
|
else if (strncmp(icon, "e/icons/fileman/mime/", 21) == 0)
|
||||||
|
return _e_fm2_icon_explicit_theme_get(evas, ic, icon + 21 - 5, type_ret);
|
||||||
|
else
|
||||||
|
return _e_fm2_icon_explicit_get(evas, ic, icon, type_ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
size = _e_fm2_icon_mime_size_normalize(ic);
|
||||||
|
icon = efreet_mime_type_icon_get(ic->info.mime, e_config->icon_theme, size);
|
||||||
|
if (icon) return _e_fm2_icon_explicit_get(evas, ic, icon, type_ret);
|
||||||
|
|
||||||
|
/* XXX REMOVE/DEPRECATED below here */
|
||||||
|
icon = e_fm_mime_icon_get(ic->info.mime);
|
||||||
if (!icon) return NULL;
|
if (!icon) return NULL;
|
||||||
|
|
||||||
if (icon == _e_fm2_icon_desktop_str)
|
if (icon == _e_fm2_icon_desktop_str)
|
||||||
|
@ -1726,7 +1804,7 @@ _e_fm2_icon_mime_get(Evas *evas, E_Fm2_Icon *ic, void (*gen_func) (void *data, E
|
||||||
* Discovers the executable of Input Method Config file and set icon.
|
* Discovers the executable of Input Method Config file and set icon.
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_imc_get(Evas *evas, E_Fm2_Icon *ic, const char **type_ret)
|
_e_fm2_icon_imc_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret)
|
||||||
{
|
{
|
||||||
E_Input_Method_Config *imc;
|
E_Input_Method_Config *imc;
|
||||||
Efreet_Desktop *desktop;
|
Efreet_Desktop *desktop;
|
||||||
|
@ -1769,7 +1847,7 @@ _e_fm2_icon_imc_get(Evas *evas, E_Fm2_Icon *ic, const char **type_ret)
|
||||||
* Use heuristics to discover and set icon.
|
* Use heuristics to discover and set icon.
|
||||||
*/
|
*/
|
||||||
static Evas_Object *
|
static Evas_Object *
|
||||||
_e_fm2_icon_discover_get(Evas *evas, E_Fm2_Icon *ic, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret)
|
_e_fm2_icon_discover_get(Evas *evas, const E_Fm2_Icon *ic, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret)
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
|
|
||||||
|
@ -3505,30 +3583,6 @@ _e_fm2_icons_place_list(E_Fm2_Smart_Data *sd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline char
|
|
||||||
_e_fm2_view_mode_get(const E_Fm2_Smart_Data *sd)
|
|
||||||
{
|
|
||||||
if (sd->view_mode > -1)
|
|
||||||
return sd->view_mode;
|
|
||||||
return sd->config->view.mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline Evas_Coord
|
|
||||||
_e_fm2_icon_w_get(const E_Fm2_Smart_Data *sd)
|
|
||||||
{
|
|
||||||
if (sd->icon_size > -1)
|
|
||||||
return sd->icon_size * e_scale;
|
|
||||||
return sd->config->icon.icon.w;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline Evas_Coord
|
|
||||||
_e_fm2_icon_h_get(const E_Fm2_Smart_Data *sd)
|
|
||||||
{
|
|
||||||
if (sd->icon_size > -1)
|
|
||||||
return sd->icon_size * e_scale;
|
|
||||||
return sd->config->icon.icon.h;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_fm2_icons_place(Evas_Object *obj)
|
_e_fm2_icons_place(Evas_Object *obj)
|
||||||
{
|
{
|
||||||
|
@ -3930,10 +3984,13 @@ _e_fm2_icon_fill(E_Fm2_Icon *ic, E_Fm2_Finfo *finf)
|
||||||
|
|
||||||
if (S_ISDIR(ic->info.statinfo.st_mode))
|
if (S_ISDIR(ic->info.statinfo.st_mode))
|
||||||
{
|
{
|
||||||
ic->info.mime = eina_stringshare_add("inode/directory");
|
ic->info.mime = eina_stringshare_ref(_e_fm2_mime_inode_directory);
|
||||||
}
|
}
|
||||||
if (!ic->info.mime)
|
else if (!ic->info.mime)
|
||||||
{
|
{
|
||||||
|
mime = efreet_mime_type_get(buf);
|
||||||
|
if (!mime)
|
||||||
|
/* XXX REMOVE/DEPRECATE ME LATER */
|
||||||
mime = e_fm_mime_filename_get(ic->info.file);
|
mime = e_fm_mime_filename_get(ic->info.file);
|
||||||
if (mime) ic->info.mime = eina_stringshare_add(mime);
|
if (mime) ic->info.mime = eina_stringshare_add(mime);
|
||||||
}
|
}
|
||||||
|
@ -4207,8 +4264,8 @@ _e_fm2_icon_unrealize(E_Fm2_Icon *ic)
|
||||||
ic->obj_icon = NULL;
|
ic->obj_icon = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static Eina_Bool
|
||||||
_e_fm2_icon_visible(E_Fm2_Icon *ic)
|
_e_fm2_icon_visible(const E_Fm2_Icon *ic)
|
||||||
{
|
{
|
||||||
/* return if the icon is visible */
|
/* return if the icon is visible */
|
||||||
if (
|
if (
|
||||||
|
@ -4282,7 +4339,7 @@ _e_fm2_icon_icon_set(E_Fm2_Icon *ic)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_fm2_icon_thumb(E_Fm2_Icon *ic, Evas_Object *oic, int force)
|
_e_fm2_icon_thumb(const E_Fm2_Icon *ic, Evas_Object *oic, int force)
|
||||||
{
|
{
|
||||||
if ((force) ||
|
if ((force) ||
|
||||||
((_e_fm2_icon_visible(ic)) &&
|
((_e_fm2_icon_visible(ic)) &&
|
||||||
|
|
Loading…
Reference in New Issue