2010-05-07 08:49:06 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "elementary_config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_EVIL
|
|
|
|
# include <Evil.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <Elementary.h>
|
|
|
|
#include "elm_priv.h"
|
|
|
|
|
2011-02-03 07:52:49 -08:00
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
Elm_Config *_elm_config = NULL;
|
|
|
|
char *_elm_profile = NULL;
|
|
|
|
static Eet_Data_Descriptor *_config_edd = NULL;
|
2010-11-18 02:01:24 -08:00
|
|
|
static Eet_Data_Descriptor *_config_font_overlay_edd = NULL;
|
2010-05-08 19:19:14 -07:00
|
|
|
|
2010-11-22 22:10:58 -08:00
|
|
|
static Ecore_Poller *_elm_cache_flush_poller = NULL;
|
|
|
|
|
2010-11-01 14:10:07 -07:00
|
|
|
const char *_elm_engines[] = {
|
|
|
|
"software_x11",
|
|
|
|
"fb",
|
|
|
|
"directfb",
|
|
|
|
"software_16_x11",
|
|
|
|
"software_8_x11",
|
|
|
|
"xrender_x11",
|
|
|
|
"opengl_x11",
|
|
|
|
"software_gdi",
|
|
|
|
"software_16_wince_gdi",
|
|
|
|
"sdl",
|
|
|
|
"software_16_sdl",
|
|
|
|
"opengl_sdl",
|
2011-07-25 05:02:52 -07:00
|
|
|
"buffer",
|
2011-10-05 15:18:22 -07:00
|
|
|
"ews",
|
2010-11-01 14:10:07 -07:00
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
2010-11-18 02:01:24 -08:00
|
|
|
/* whenever you want to add a new text class support into Elementary,
|
|
|
|
declare it both here and in the (default) theme */
|
|
|
|
static const Elm_Text_Class _elm_text_classes[] = {
|
|
|
|
{"button", "Button Labels"},
|
2010-11-19 01:37:33 -08:00
|
|
|
{"label", "Text Labels"},
|
|
|
|
{"entry", "Text Entries"},
|
2010-11-18 02:01:24 -08:00
|
|
|
{"title_bar", "Title Bar"},
|
2010-11-23 17:47:59 -08:00
|
|
|
{"list_item", "List Items"},
|
|
|
|
{"grid_item", "Grid Items"},
|
|
|
|
{"toolbar_item", "Toolbar Items"},
|
|
|
|
{"menu_item", "Menu Items"},
|
2010-11-18 02:01:24 -08:00
|
|
|
{NULL, NULL}
|
|
|
|
};
|
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
static void _desc_init(void);
|
|
|
|
static void _desc_shutdown(void);
|
|
|
|
static void _profile_fetch_from_conf(void);
|
|
|
|
static void _config_free(void);
|
|
|
|
static void _config_apply(void);
|
|
|
|
static Elm_Config *_config_user_load(void);
|
|
|
|
static Elm_Config *_config_system_load(void);
|
|
|
|
static void _config_load(void);
|
|
|
|
static void _config_update(void);
|
|
|
|
static void _env_get(void);
|
|
|
|
static size_t _elm_data_dir_snprintf(char *dst,
|
|
|
|
size_t size,
|
|
|
|
const char *fmt, ...)
|
|
|
|
EINA_PRINTF(3, 4);
|
|
|
|
static size_t _elm_user_dir_snprintf(char *dst,
|
|
|
|
size_t size,
|
|
|
|
const char *fmt, ...)
|
|
|
|
EINA_PRINTF(3, 4);
|
2010-05-07 08:49:06 -07:00
|
|
|
|
2010-11-04 06:50:54 -07:00
|
|
|
#define ELM_CONFIG_VAL(edd, type, member, dtype) \
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(edd, type, #member, member, dtype)
|
|
|
|
#define ELM_CONFIG_LIST(edd, type, member, eddtype) \
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_LIST(edd, type, #member, member, eddtype)
|
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
#ifdef HAVE_ELEMENTARY_X
|
2010-05-08 19:19:14 -07:00
|
|
|
static Ecore_Event_Handler *_prop_change_handler = NULL;
|
|
|
|
static Ecore_X_Window _root_1st = 0;
|
2010-12-30 17:08:41 -08:00
|
|
|
#define ATOM_COUNT 22
|
2010-05-08 19:19:14 -07:00
|
|
|
static Ecore_X_Atom _atom[ATOM_COUNT];
|
|
|
|
static Ecore_X_Atom _atom_config = 0;
|
|
|
|
static const char *_atom_names[ATOM_COUNT] =
|
2010-12-06 04:46:16 -08:00
|
|
|
{
|
|
|
|
"ENLIGHTENMENT_SCALE",
|
|
|
|
"ENLIGHTENMENT_FINGER_SIZE",
|
|
|
|
"ENLIGHTENMENT_THEME",
|
|
|
|
"ENLIGHTENMENT_PROFILE",
|
|
|
|
"ENLIGHTENMENT_FONT_OVERLAY",
|
|
|
|
"ENLIGHTENMENT_CACHE_FLUSH_INTERVAL",
|
2010-12-24 08:02:30 -08:00
|
|
|
"ENLIGHTENMENT_CACHE_FLUSH_ENABLE",
|
2010-12-06 04:46:16 -08:00
|
|
|
"ENLIGHTENMENT_FONT_CACHE",
|
|
|
|
"ENLIGHTENMENT_IMAGE_CACHE",
|
|
|
|
"ENLIGHTENMENT_EDJE_FILE_CACHE",
|
|
|
|
"ENLIGHTENMENT_EDJE_COLLECTION_CACHE",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_BOUNCE_ENABLE",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_BOUNCE_FRICTION",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_ENABLE",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_THRESHOLD",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_MOMENTUM_THRESHOLD",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_FRICTION",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_BORDER_FRICTION",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_PAGE_SCROLL_FRICTION",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_BRING_IN_SCROLL_FRICTION",
|
|
|
|
"ENLIGHTENMENT_THUMBSCROLL_ZOOM_FRICTION",
|
|
|
|
"ENLIGHTENMENT_CONFIG"
|
|
|
|
};
|
|
|
|
#define ATOM_E_SCALE 0
|
|
|
|
#define ATOM_E_FINGER_SIZE 1
|
|
|
|
#define ATOM_E_THEME 2
|
|
|
|
#define ATOM_E_PROFILE 3
|
|
|
|
#define ATOM_E_FONT_OVERLAY 4
|
|
|
|
#define ATOM_E_CACHE_FLUSH_INTERVAL 5
|
2010-12-24 08:02:30 -08:00
|
|
|
#define ATOM_E_CACHE_FLUSH_ENABLE 6
|
|
|
|
#define ATOM_E_FONT_CACHE 7
|
|
|
|
#define ATOM_E_IMAGE_CACHE 8
|
|
|
|
#define ATOM_E_EDJE_FILE_CACHE 9
|
|
|
|
#define ATOM_E_EDJE_COLLECTION_CACHE 10
|
|
|
|
#define ATOM_E_THUMBSCROLL_BOUNCE_ENABLE 11
|
|
|
|
#define ATOM_E_THUMBSCROLL_BOUNCE_FRICTION 12
|
|
|
|
#define ATOM_E_THUMBSCROLL_ENABLE 13
|
|
|
|
#define ATOM_E_THUMBSCROLL_THRESHOLD 14
|
|
|
|
#define ATOM_E_THUMBSCROLL_MOMENTUM_THRESHOLD 15
|
|
|
|
#define ATOM_E_THUMBSCROLL_FRICTION 16
|
|
|
|
#define ATOM_E_THUMBSCROLL_BORDER_FRICTION 17
|
|
|
|
#define ATOM_E_THUMBSCROLL_PAGE_SCROLL_FRICTION 18
|
|
|
|
#define ATOM_E_THUMBSCROLL_BRING_IN_SCROLL_FRICTION 19
|
|
|
|
#define ATOM_E_THUMBSCROLL_ZOOM_FRICTION 20
|
|
|
|
#define ATOM_E_CONFIG 21
|
2010-05-08 19:19:14 -07:00
|
|
|
|
|
|
|
static Eina_Bool _prop_config_get(void);
|
2010-12-06 04:46:16 -08:00
|
|
|
static Eina_Bool _prop_change(void *data __UNUSED__,
|
|
|
|
int ev_type __UNUSED__,
|
|
|
|
void *ev);
|
2010-05-08 19:19:14 -07:00
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_prop_config_get(void)
|
|
|
|
{
|
|
|
|
int size = 0;
|
|
|
|
Ecore_X_Atom atom;
|
|
|
|
char buf[512];
|
2010-06-25 02:58:14 -07:00
|
|
|
unsigned char *data = NULL;
|
|
|
|
Elm_Config *config_data;
|
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
snprintf(buf, sizeof(buf), "ENLIGHTENMENT_CONFIG_%s", _elm_profile);
|
|
|
|
atom = ecore_x_atom_get(buf);
|
|
|
|
_atom_config = atom;
|
|
|
|
if (!ecore_x_window_prop_property_get(_root_1st,
|
2010-10-25 06:08:04 -07:00
|
|
|
atom, _atom[ATOM_E_CONFIG],
|
2010-05-08 19:19:14 -07:00
|
|
|
8, &data, &size))
|
|
|
|
{
|
2010-10-25 06:08:04 -07:00
|
|
|
if (!ecore_x_window_prop_property_get(_root_1st,
|
|
|
|
_atom[ATOM_E_CONFIG],
|
|
|
|
_atom[ATOM_E_CONFIG],
|
2010-05-08 19:19:14 -07:00
|
|
|
8, &data, &size))
|
2010-06-05 06:12:45 -07:00
|
|
|
return EINA_FALSE;
|
2010-05-08 19:19:14 -07:00
|
|
|
else
|
|
|
|
_atom_config = _atom[ATOM_E_CONFIG];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
_atom_config = atom;
|
|
|
|
if (size < 1)
|
|
|
|
{
|
|
|
|
free(data);
|
2010-06-05 06:12:45 -07:00
|
|
|
return EINA_FALSE;
|
2010-05-08 19:19:14 -07:00
|
|
|
}
|
|
|
|
config_data = eet_data_descriptor_decode(_config_edd, data, size);
|
|
|
|
free(data);
|
2010-06-05 06:12:45 -07:00
|
|
|
if (!config_data) return EINA_FALSE;
|
2010-09-02 07:33:04 -07:00
|
|
|
|
|
|
|
/* What do we do on version mismatch when someone changes the
|
|
|
|
* config in the rootwindow? */
|
|
|
|
/* Most obvious case, new version and we are still linked to
|
|
|
|
* whatever was there before, we just ignore until user restarts us */
|
|
|
|
if (config_data->config_version > ELM_CONFIG_VERSION)
|
|
|
|
return EINA_TRUE;
|
|
|
|
/* What in the case the version is older? Do we even support those
|
|
|
|
* cases or we only check for equality above? */
|
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
_config_free();
|
|
|
|
_elm_config = config_data;
|
|
|
|
_config_apply();
|
2010-11-18 02:01:24 -08:00
|
|
|
_elm_config_font_overlay_apply();
|
2010-05-08 19:19:14 -07:00
|
|
|
_elm_rescale();
|
2010-11-22 22:10:58 -08:00
|
|
|
_elm_recache();
|
2010-06-05 06:12:45 -07:00
|
|
|
return EINA_TRUE;
|
2010-05-08 19:19:14 -07:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:58:14 -07:00
|
|
|
static Eina_Bool
|
2010-12-06 04:46:16 -08:00
|
|
|
_prop_change(void *data __UNUSED__,
|
|
|
|
int ev_type __UNUSED__,
|
|
|
|
void *ev)
|
2010-05-07 08:49:06 -07:00
|
|
|
{
|
|
|
|
Ecore_X_Event_Window_Property *event = ev;
|
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
if (event->win == _root_1st)
|
2010-05-07 08:49:06 -07:00
|
|
|
{
|
2010-10-25 06:08:04 -07:00
|
|
|
if (event->atom == _atom[ATOM_E_SCALE])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
double pscale;
|
|
|
|
|
|
|
|
pscale = _elm_config->scale;
|
|
|
|
if (val > 0) _elm_config->scale = (double)val / 1000.0;
|
2010-11-22 22:10:58 -08:00
|
|
|
if (pscale != _elm_config->scale)
|
2010-12-06 04:46:16 -08:00
|
|
|
{
|
|
|
|
_elm_rescale();
|
|
|
|
_elm_recache();
|
|
|
|
}
|
2010-10-25 06:08:04 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_FINGER_SIZE])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
int pfinger_size;
|
|
|
|
|
|
|
|
pfinger_size = _elm_config->finger_size;
|
|
|
|
_elm_config->finger_size = val;
|
2010-11-22 22:10:58 -08:00
|
|
|
if (pfinger_size != _elm_config->finger_size)
|
2010-12-06 04:46:16 -08:00
|
|
|
{
|
|
|
|
_elm_rescale();
|
|
|
|
_elm_recache();
|
|
|
|
}
|
2010-10-25 06:08:04 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_THEME])
|
|
|
|
{
|
2010-05-07 08:49:06 -07:00
|
|
|
char *val = NULL;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
val = ecore_x_window_prop_string_get(event->win,
|
|
|
|
event->atom);
|
2010-10-25 06:08:04 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->theme, val);
|
|
|
|
if (val)
|
|
|
|
{
|
|
|
|
_elm_theme_parse(NULL, val);
|
|
|
|
free(val);
|
|
|
|
_elm_rescale();
|
2010-11-22 22:10:58 -08:00
|
|
|
_elm_recache();
|
2010-10-25 06:08:04 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_PROFILE])
|
2010-05-08 19:19:14 -07:00
|
|
|
{
|
|
|
|
char *val = NULL;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
val = ecore_x_window_prop_string_get(event->win,
|
|
|
|
event->atom);
|
2010-10-25 06:08:04 -07:00
|
|
|
if (val)
|
|
|
|
{
|
2010-05-08 19:19:14 -07:00
|
|
|
int changed = 0;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
if (_elm_profile)
|
|
|
|
{
|
|
|
|
if (strcmp(_elm_profile, val)) changed = 1;
|
|
|
|
free(_elm_profile);
|
|
|
|
}
|
|
|
|
_elm_profile = val;
|
|
|
|
if (changed)
|
|
|
|
{
|
|
|
|
if (!_prop_config_get())
|
|
|
|
{
|
|
|
|
_config_free();
|
|
|
|
_config_load();
|
|
|
|
_config_apply();
|
2010-11-18 02:01:24 -08:00
|
|
|
_elm_config_font_overlay_apply();
|
2010-05-08 19:19:14 -07:00
|
|
|
_elm_rescale();
|
|
|
|
}
|
|
|
|
}
|
2010-10-25 06:08:04 -07:00
|
|
|
}
|
2010-05-08 19:19:14 -07:00
|
|
|
}
|
2010-11-18 02:01:24 -08:00
|
|
|
else if (event->atom == _atom[ATOM_E_FONT_OVERLAY])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
_config_free();
|
|
|
|
_config_load();
|
|
|
|
_config_apply();
|
|
|
|
_elm_config_font_overlay_apply();
|
|
|
|
_elm_rescale();
|
|
|
|
}
|
|
|
|
}
|
2010-12-06 04:46:10 -08:00
|
|
|
else if (event->atom == _atom[ATOM_E_CACHE_FLUSH_INTERVAL])
|
2010-11-22 22:10:58 -08:00
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
int cache_flush_interval;
|
|
|
|
|
|
|
|
cache_flush_interval = _elm_config->cache_flush_poll_interval;
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config->cache_flush_poll_interval = val;
|
2010-11-22 22:10:58 -08:00
|
|
|
if (cache_flush_interval !=
|
|
|
|
_elm_config->cache_flush_poll_interval)
|
|
|
|
_elm_recache();
|
|
|
|
}
|
|
|
|
}
|
2010-12-24 08:02:30 -08:00
|
|
|
else if (event->atom == _atom[ATOM_E_CACHE_FLUSH_ENABLE])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
_elm_config->cache_flush_enable = !!val;
|
|
|
|
_elm_recache();
|
|
|
|
}
|
|
|
|
}
|
2010-12-06 04:46:10 -08:00
|
|
|
else if (event->atom == _atom[ATOM_E_FONT_CACHE])
|
2010-11-21 22:56:06 -08:00
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
int font_cache;
|
|
|
|
|
|
|
|
font_cache = _elm_config->font_cache;
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config->font_cache = val;
|
2010-11-21 22:56:06 -08:00
|
|
|
if (font_cache != _elm_config->font_cache)
|
|
|
|
_elm_recache();
|
|
|
|
}
|
|
|
|
}
|
2010-12-06 04:46:10 -08:00
|
|
|
else if (event->atom == _atom[ATOM_E_IMAGE_CACHE])
|
2010-11-21 22:56:06 -08:00
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
int image_cache;
|
|
|
|
|
|
|
|
image_cache = _elm_config->image_cache;
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config->image_cache = val;
|
2010-11-21 22:56:06 -08:00
|
|
|
if (image_cache != _elm_config->image_cache)
|
|
|
|
_elm_recache();
|
|
|
|
}
|
|
|
|
}
|
2010-12-06 04:46:10 -08:00
|
|
|
else if (event->atom == _atom[ATOM_E_EDJE_FILE_CACHE])
|
2010-11-22 22:10:58 -08:00
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
int edje_file_cache;
|
|
|
|
|
|
|
|
edje_file_cache = _elm_config->edje_cache;
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config->edje_cache = val;
|
2010-11-22 22:10:58 -08:00
|
|
|
if (edje_file_cache != _elm_config->edje_cache)
|
|
|
|
_elm_recache();
|
|
|
|
}
|
|
|
|
}
|
2010-12-06 04:46:10 -08:00
|
|
|
else if (event->atom == _atom[ATOM_E_EDJE_COLLECTION_CACHE])
|
2010-11-22 22:10:58 -08:00
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
int edje_collection_cache;
|
|
|
|
|
|
|
|
edje_collection_cache = _elm_config->edje_collection_cache;
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config->edje_collection_cache = val;
|
2010-11-22 22:10:58 -08:00
|
|
|
if (edje_collection_cache !=
|
|
|
|
_elm_config->edje_collection_cache)
|
|
|
|
_elm_recache();
|
|
|
|
}
|
|
|
|
}
|
2010-12-06 04:46:10 -08:00
|
|
|
else if (event->atom == _atom[ATOM_E_THUMBSCROLL_BOUNCE_ENABLE])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
_elm_config->thumbscroll_bounce_enable = !!val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_THUMBSCROLL_BOUNCE_FRICTION])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
if (val > 0)
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config->thumbscroll_bounce_friction =
|
|
|
|
(double)val / 1000.0;
|
2010-12-06 04:46:10 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_THUMBSCROLL_ENABLE])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
_elm_config->thumbscroll_enable = !!val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_THUMBSCROLL_THRESHOLD])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
if (val > 0) _elm_config->thumbscroll_threshold = val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_THUMBSCROLL_MOMENTUM_THRESHOLD])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
2011-06-07 23:54:02 -07:00
|
|
|
_elm_config->thumbscroll_momentum_threshold =
|
|
|
|
(double)val / 1000.0;
|
2010-12-06 04:46:10 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_THUMBSCROLL_FRICTION])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
2011-06-07 23:54:02 -07:00
|
|
|
_elm_config->thumbscroll_friction = (double)val / 1000.0;
|
2010-12-06 04:46:10 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_THUMBSCROLL_BORDER_FRICTION])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
2011-06-07 23:54:02 -07:00
|
|
|
_elm_config->thumbscroll_border_friction =
|
|
|
|
(double)val / 1000.0;
|
2010-12-06 04:46:10 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom == _atom[ATOM_E_THUMBSCROLL_PAGE_SCROLL_FRICTION])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
2011-06-07 23:54:02 -07:00
|
|
|
_elm_config->page_scroll_friction =
|
|
|
|
(double)val / 1000.0;
|
2010-12-06 04:46:10 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom ==
|
|
|
|
_atom[ATOM_E_THUMBSCROLL_BRING_IN_SCROLL_FRICTION])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
2011-06-07 23:54:02 -07:00
|
|
|
_elm_config->bring_in_scroll_friction =
|
|
|
|
(double)val / 1000.0;
|
2010-12-06 04:46:10 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event->atom ==
|
|
|
|
_atom[ATOM_E_THUMBSCROLL_ZOOM_FRICTION])
|
|
|
|
{
|
|
|
|
unsigned int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
2011-06-07 23:54:02 -07:00
|
|
|
_elm_config->zoom_friction = (double)val / 1000.0;
|
2010-12-06 04:46:10 -08:00
|
|
|
}
|
|
|
|
}
|
2010-10-25 06:08:04 -07:00
|
|
|
else if (((_atom_config > 0) && (event->atom == _atom_config)) ||
|
2010-05-08 19:19:14 -07:00
|
|
|
(event->atom == _atom[ATOM_E_CONFIG]))
|
|
|
|
{
|
|
|
|
_prop_config_get();
|
|
|
|
}
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
2010-06-25 02:58:14 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
2010-12-06 04:46:16 -08:00
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
#endif
|
|
|
|
|
|
|
|
static void
|
|
|
|
_desc_init(void)
|
|
|
|
{
|
|
|
|
Eet_Data_Descriptor_Class eddc;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Elm_Config);
|
|
|
|
eddc.func.str_direct_alloc = NULL;
|
|
|
|
eddc.func.str_direct_free = NULL;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
_config_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!_config_edd)
|
|
|
|
{
|
|
|
|
printf("EEEK! eet_data_descriptor_file_new() failed\n");
|
|
|
|
return;
|
|
|
|
}
|
2010-11-04 06:50:54 -07:00
|
|
|
|
2010-11-18 02:01:24 -08:00
|
|
|
memset(&eddc, 0, sizeof(eddc)); /* just in case... */
|
|
|
|
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Elm_Font_Overlay);
|
|
|
|
eddc.func.str_direct_alloc = NULL;
|
|
|
|
eddc.func.str_direct_free = NULL;
|
|
|
|
|
|
|
|
_config_font_overlay_edd = eet_data_descriptor_stream_new(&eddc);
|
|
|
|
if (!_config_font_overlay_edd)
|
|
|
|
{
|
|
|
|
printf("EEEK! eet_data_descriptor_stream_new() failed\n");
|
|
|
|
eet_data_descriptor_free(_config_edd);
|
|
|
|
return;
|
|
|
|
}
|
2010-12-06 04:46:16 -08:00
|
|
|
#define T_INT EET_T_INT
|
2010-11-04 06:50:54 -07:00
|
|
|
#define T_DOUBLE EET_T_DOUBLE
|
|
|
|
#define T_STRING EET_T_STRING
|
2010-12-06 04:46:16 -08:00
|
|
|
#define T_UCHAR EET_T_UCHAR
|
2010-11-18 02:01:24 -08:00
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
#define T Elm_Font_Overlay
|
|
|
|
#define D _config_font_overlay_edd
|
2010-11-18 02:01:24 -08:00
|
|
|
ELM_CONFIG_VAL(D, T, text_class, EET_T_STRING);
|
|
|
|
ELM_CONFIG_VAL(D, T, font, EET_T_STRING);
|
|
|
|
ELM_CONFIG_VAL(D, T, size, EET_T_INT);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
|
|
|
|
#define T Elm_Config
|
|
|
|
#define D _config_edd
|
2010-11-04 06:50:54 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, config_version, T_INT);
|
|
|
|
ELM_CONFIG_VAL(D, T, engine, T_STRING);
|
2011-05-11 02:06:59 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, vsync, T_UCHAR);
|
2010-11-04 06:50:54 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, thumbscroll_enable, T_UCHAR);
|
|
|
|
ELM_CONFIG_VAL(D, T, thumbscroll_threshold, T_INT);
|
|
|
|
ELM_CONFIG_VAL(D, T, thumbscroll_momentum_threshold, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, thumbscroll_friction, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, thumbscroll_bounce_friction, T_DOUBLE);
|
2010-11-05 02:31:51 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, thumbscroll_border_friction, T_DOUBLE);
|
2010-11-04 06:50:54 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, page_scroll_friction, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, bring_in_scroll_friction, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, zoom_friction, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, thumbscroll_bounce_enable, T_UCHAR);
|
2011-06-09 03:14:16 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, scroll_smooth_amount, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, scroll_smooth_history_weight, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, scroll_smooth_future_time, T_DOUBLE);
|
2011-06-09 22:07:21 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, scroll_smooth_time_window, T_DOUBLE);
|
2010-11-04 06:50:54 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, scale, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, bgpixmap, T_INT);
|
|
|
|
ELM_CONFIG_VAL(D, T, compositing, T_INT);
|
|
|
|
/* EET_DATA_DESCRIPTOR_ADD_LIST(D, T, "font_dirs", font_dirs, sub_edd); */
|
2010-11-18 02:01:24 -08:00
|
|
|
ELM_CONFIG_LIST(D, T, font_overlays, _config_font_overlay_edd);
|
2010-11-04 06:50:54 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, font_hinting, T_INT);
|
2010-11-22 22:10:58 -08:00
|
|
|
ELM_CONFIG_VAL(D, T, cache_flush_poll_interval, T_INT);
|
2010-12-24 08:02:30 -08:00
|
|
|
ELM_CONFIG_VAL(D, T, cache_flush_enable, T_UCHAR);
|
2010-11-04 06:50:54 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, image_cache, T_INT);
|
|
|
|
ELM_CONFIG_VAL(D, T, font_cache, T_INT);
|
2010-11-22 22:10:58 -08:00
|
|
|
ELM_CONFIG_VAL(D, T, edje_cache, T_INT);
|
|
|
|
ELM_CONFIG_VAL(D, T, edje_collection_cache, T_INT);
|
2010-11-04 06:50:54 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, finger_size, T_INT);
|
|
|
|
ELM_CONFIG_VAL(D, T, fps, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, theme, T_STRING);
|
|
|
|
ELM_CONFIG_VAL(D, T, modules, T_STRING);
|
|
|
|
ELM_CONFIG_VAL(D, T, tooltip_delay, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, cursor_engine_only, T_UCHAR);
|
|
|
|
ELM_CONFIG_VAL(D, T, focus_highlight_enable, T_UCHAR);
|
|
|
|
ELM_CONFIG_VAL(D, T, focus_highlight_animate, T_UCHAR);
|
|
|
|
ELM_CONFIG_VAL(D, T, toolbar_shrink_mode, T_INT);
|
|
|
|
ELM_CONFIG_VAL(D, T, fileselector_expand_enable, T_UCHAR);
|
|
|
|
ELM_CONFIG_VAL(D, T, inwin_dialogs_enable, T_UCHAR);
|
|
|
|
ELM_CONFIG_VAL(D, T, icon_size, T_INT);
|
2010-11-24 09:11:34 -08:00
|
|
|
ELM_CONFIG_VAL(D, T, longpress_timeout, T_DOUBLE);
|
2011-01-31 00:18:58 -08:00
|
|
|
ELM_CONFIG_VAL(D, T, effect_enable, T_UCHAR);
|
2011-04-01 06:20:40 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, desktop_entry, T_UCHAR);
|
2011-06-29 22:38:57 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, password_show_last, T_UCHAR);
|
|
|
|
ELM_CONFIG_VAL(D, T, password_show_last_timeout, T_DOUBLE);
|
2011-07-17 23:24:34 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, glayer_zoom_finger_factor, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, glayer_zoom_wheel_factor, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, glayer_zoom_distance_tolerance, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, glayer_rotate_angular_tolerance, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, glayer_line_min_length, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, glayer_line_distance_tolerance, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, glayer_line_angular_tolerance, T_DOUBLE);
|
|
|
|
ELM_CONFIG_VAL(D, T, glayer_flick_time_limit_ms, T_INT);
|
2011-08-01 06:09:05 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, glayer_long_tap_start_timeout, T_DOUBLE);
|
2011-08-19 07:39:27 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, access_mode, T_INT);
|
2011-09-08 03:10:34 -07:00
|
|
|
ELM_CONFIG_VAL(D, T, glayer_continues_enable, T_UCHAR);
|
2010-11-04 06:50:54 -07:00
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#undef T_INT
|
|
|
|
#undef T_DOUBLE
|
|
|
|
#undef T_STRING
|
|
|
|
#undef T_UCHAR
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_desc_shutdown(void)
|
|
|
|
{
|
2010-11-18 02:01:24 -08:00
|
|
|
if (_config_edd)
|
|
|
|
{
|
|
|
|
eet_data_descriptor_free(_config_edd);
|
|
|
|
_config_edd = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_config_font_overlay_edd)
|
|
|
|
{
|
|
|
|
eet_data_descriptor_free(_config_font_overlay_edd);
|
|
|
|
_config_font_overlay_edd = NULL;
|
|
|
|
}
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
|
|
|
|
2010-10-25 10:36:07 -07:00
|
|
|
static int
|
2010-12-06 04:46:16 -08:00
|
|
|
_sort_files_cb(const void *f1,
|
|
|
|
const void *f2)
|
2010-10-25 06:08:19 -07:00
|
|
|
{
|
|
|
|
return strcmp(f1, f2);
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *
|
|
|
|
_elm_config_current_profile_get(void)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
return _elm_profile;
|
2010-10-25 06:08:19 -07:00
|
|
|
}
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
static size_t
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_data_dir_snprintf(char *dst,
|
|
|
|
size_t size,
|
|
|
|
const char *fmt,
|
|
|
|
...)
|
2010-10-25 06:08:19 -07:00
|
|
|
{
|
2010-10-28 13:57:44 -07:00
|
|
|
size_t data_dir_len, off;
|
|
|
|
va_list ap;
|
|
|
|
|
2010-10-29 10:32:16 -07:00
|
|
|
data_dir_len = eina_strlcpy(dst, _elm_data_dir, size);
|
2010-10-28 13:57:44 -07:00
|
|
|
|
|
|
|
off = data_dir_len + 1;
|
|
|
|
if (off >= size)
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
va_start(ap, fmt);
|
|
|
|
dst[data_dir_len] = '/';
|
|
|
|
|
|
|
|
off = off + vsnprintf(dst + off, size - off, fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
end:
|
2010-10-28 13:57:44 -07:00
|
|
|
return off;
|
|
|
|
}
|
|
|
|
|
|
|
|
static size_t
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_user_dir_snprintf(char *dst,
|
|
|
|
size_t size,
|
|
|
|
const char *fmt,
|
|
|
|
...)
|
2010-10-28 13:57:44 -07:00
|
|
|
{
|
|
|
|
const char *home;
|
|
|
|
size_t user_dir_len, off;
|
|
|
|
va_list ap;
|
2010-10-25 06:08:19 -07:00
|
|
|
|
2011-04-06 06:57:42 -07:00
|
|
|
#ifdef _WIN32
|
|
|
|
home = evil_homedir_get();
|
|
|
|
#else
|
2010-10-25 06:08:19 -07:00
|
|
|
home = getenv("HOME");
|
2011-04-06 06:57:42 -07:00
|
|
|
#endif
|
2010-10-25 06:08:19 -07:00
|
|
|
if (!home)
|
|
|
|
home = "/";
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
user_dir_len = eina_str_join_len(dst, size, '/', home, strlen(home),
|
|
|
|
".elementary", sizeof(".elementary") - 1);
|
|
|
|
|
|
|
|
off = user_dir_len + 1;
|
|
|
|
if (off >= size)
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
va_start(ap, fmt);
|
|
|
|
dst[user_dir_len] = '/';
|
|
|
|
|
|
|
|
off = off + vsnprintf(dst + off, size - off, fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
end:
|
2010-10-28 13:57:44 -07:00
|
|
|
return off;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config_profile_dir_get(const char *prof,
|
|
|
|
Eina_Bool is_user)
|
2010-10-28 13:57:44 -07:00
|
|
|
{
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
|
|
|
|
if (!is_user)
|
|
|
|
goto not_user;
|
|
|
|
|
|
|
|
_elm_user_dir_snprintf(buf, sizeof(buf), "config/%s", prof);
|
2010-10-25 06:08:19 -07:00
|
|
|
|
|
|
|
if (ecore_file_is_dir(buf))
|
|
|
|
return strdup(buf);
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
return NULL;
|
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
not_user:
|
2010-10-25 06:08:19 -07:00
|
|
|
snprintf(buf, sizeof(buf), "%s/config/%s", _elm_data_dir, prof);
|
|
|
|
|
|
|
|
if (ecore_file_is_dir(buf))
|
|
|
|
return strdup(buf);
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2010-11-18 02:01:24 -08:00
|
|
|
Eina_List *
|
|
|
|
_elm_config_font_overlays_list(void)
|
|
|
|
{
|
|
|
|
return _elm_config->font_overlays;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_elm_config_font_overlay_set(const char *text_class,
|
|
|
|
const char *font,
|
|
|
|
Evas_Font_Size size)
|
|
|
|
{
|
|
|
|
Elm_Font_Overlay *efd;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(_elm_config->font_overlays, l, efd)
|
|
|
|
{
|
|
|
|
if (strcmp(efd->text_class, text_class))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (efd->font) eina_stringshare_del(efd->font);
|
|
|
|
efd->font = eina_stringshare_add(font);
|
|
|
|
efd->size = size;
|
|
|
|
_elm_config->font_overlays =
|
|
|
|
eina_list_promote_list(_elm_config->font_overlays, l);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* the text class doesn't exist */
|
|
|
|
efd = calloc(1, sizeof(Elm_Font_Overlay));
|
|
|
|
efd->text_class = eina_stringshare_add(text_class);
|
|
|
|
efd->font = eina_stringshare_add(font);
|
|
|
|
efd->size = size;
|
|
|
|
|
|
|
|
_elm_config->font_overlays = eina_list_prepend(_elm_config->font_overlays,
|
|
|
|
efd);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_elm_config_font_overlay_remove(const char *text_class)
|
|
|
|
{
|
|
|
|
Elm_Font_Overlay *efd;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(_elm_config->font_overlays, l, efd)
|
|
|
|
{
|
|
|
|
if (strcmp(efd->text_class, text_class))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
_elm_config->font_overlays =
|
|
|
|
eina_list_remove_list(_elm_config->font_overlays, l);
|
|
|
|
if (efd->text_class) eina_stringshare_del(efd->text_class);
|
|
|
|
if (efd->font) eina_stringshare_del(efd->font);
|
|
|
|
free(efd);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_elm_config_font_overlay_apply(void)
|
|
|
|
{
|
|
|
|
Elm_Font_Overlay *efd;
|
|
|
|
Eina_List *l;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; _elm_text_classes[i].desc; i++)
|
|
|
|
edje_text_class_del(_elm_text_classes[i].name);
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(_elm_config->font_overlays, l, efd)
|
|
|
|
edje_text_class_set(efd->text_class, efd->font, efd->size);
|
|
|
|
}
|
|
|
|
|
|
|
|
Eina_List *
|
|
|
|
_elm_config_text_classes_get(void)
|
|
|
|
{
|
|
|
|
Eina_List *ret = NULL;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; _elm_text_classes[i].desc; i++)
|
|
|
|
{
|
|
|
|
Elm_Text_Class *tc;
|
|
|
|
tc = malloc(sizeof(*tc));
|
|
|
|
|
|
|
|
*tc = _elm_text_classes[i];
|
|
|
|
|
|
|
|
ret = eina_list_append(ret, tc);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_elm_config_text_classes_free(Eina_List *l)
|
|
|
|
{
|
|
|
|
Elm_Text_Class *tc;
|
|
|
|
|
|
|
|
EINA_LIST_FREE(l, tc)
|
|
|
|
free(tc);
|
|
|
|
}
|
|
|
|
|
2010-10-25 06:08:19 -07:00
|
|
|
Eina_List *
|
|
|
|
_elm_config_profiles_list(void)
|
|
|
|
{
|
2010-10-25 10:36:07 -07:00
|
|
|
const Eina_File_Direct_Info *info;
|
2010-10-25 06:08:19 -07:00
|
|
|
Eina_List *flist = NULL;
|
2010-10-25 10:36:07 -07:00
|
|
|
Eina_Iterator *file_it;
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
const char *dir;
|
2010-10-25 06:08:19 -07:00
|
|
|
size_t len;
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
len = _elm_user_dir_snprintf(buf, sizeof(buf), "config");
|
2010-10-25 06:08:19 -07:00
|
|
|
|
2010-10-25 10:36:07 -07:00
|
|
|
file_it = eina_file_direct_ls(buf);
|
|
|
|
if (!file_it)
|
|
|
|
goto sys;
|
2010-10-25 06:08:19 -07:00
|
|
|
|
|
|
|
buf[len] = '/';
|
|
|
|
len++;
|
|
|
|
|
|
|
|
len = sizeof(buf) - len;
|
2010-10-25 10:36:07 -07:00
|
|
|
|
|
|
|
EINA_ITERATOR_FOREACH(file_it, info)
|
2010-10-25 06:08:19 -07:00
|
|
|
{
|
2010-11-18 02:00:41 -08:00
|
|
|
if (info->name_length >= len)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (info->type == EINA_FILE_DIR)
|
|
|
|
{
|
|
|
|
flist =
|
|
|
|
eina_list_sorted_insert(flist, _sort_files_cb,
|
|
|
|
eina_stringshare_add(info->path +
|
|
|
|
info->name_start));
|
|
|
|
}
|
2010-10-25 06:08:19 -07:00
|
|
|
}
|
|
|
|
|
2010-10-25 10:36:07 -07:00
|
|
|
eina_iterator_free(file_it);
|
|
|
|
|
2010-11-18 02:00:41 -08:00
|
|
|
sys:
|
2010-10-25 06:08:19 -07:00
|
|
|
len = eina_str_join_len(buf, sizeof(buf), '/', _elm_data_dir,
|
|
|
|
strlen(_elm_data_dir), "config",
|
|
|
|
sizeof("config") - 1);
|
|
|
|
|
2010-10-25 10:36:07 -07:00
|
|
|
file_it = eina_file_direct_ls(buf);
|
|
|
|
if (!file_it)
|
|
|
|
goto list_free;
|
2010-10-25 06:08:19 -07:00
|
|
|
|
|
|
|
buf[len] = '/';
|
|
|
|
len++;
|
|
|
|
|
|
|
|
len = sizeof(buf) - len;
|
2010-10-25 10:36:07 -07:00
|
|
|
EINA_ITERATOR_FOREACH(file_it, info)
|
2010-10-25 06:08:19 -07:00
|
|
|
{
|
2010-11-18 02:00:41 -08:00
|
|
|
if (info->name_length >= len)
|
|
|
|
continue;
|
2010-10-25 10:36:07 -07:00
|
|
|
|
2010-11-18 02:00:41 -08:00
|
|
|
switch (info->type)
|
|
|
|
{
|
|
|
|
case EINA_FILE_DIR:
|
|
|
|
{
|
|
|
|
const Eina_List *l;
|
|
|
|
const char *tmp;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(flist, l, tmp)
|
|
|
|
if (!strcmp(info->path + info->name_start, tmp))
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (!l)
|
|
|
|
flist =
|
|
|
|
eina_list_sorted_insert(flist, _sort_files_cb,
|
|
|
|
eina_stringshare_add(info->path +
|
|
|
|
info->name_start));
|
|
|
|
}
|
2010-10-25 10:36:07 -07:00
|
|
|
break;
|
|
|
|
|
2010-11-18 02:00:41 -08:00
|
|
|
default:
|
|
|
|
continue;
|
|
|
|
}
|
2010-10-25 06:08:19 -07:00
|
|
|
}
|
2010-10-25 10:36:07 -07:00
|
|
|
eina_iterator_free(file_it);
|
elementary - fixed some logic errors patched by rajeev.r@samsung.com
Hi all,
I found few memory related issues in elementary package when performed static analysis on it.
These issues include:
Array indices getting out of bounds, freed memory address being passed to a function as parameter, memory not getting cleaned up because of earlier return statement.
Issues details:
1. In elm_widget.c inside function elm_widget_signal_callback_del(), it is possible that freed memory address esd is passed to the sd->callback_del_func(). I think it should be data, not esd.
Moreover what if the callback frees memory for data, then the other problem is that the return value is data from the function elm_widget_signal_callback_del() which in my opinion can be a problem.
2. Inside directory src/edje_externals for files elm_genlist.c, elm_notify.c, elm_list.c, elm_thumb.c and elm_map.c, array indices can go beyound bounary.
sizeof() operator for an array of character pointers will return [number of elements in the array * size of (char*)], basically 4 times the number of elements which has been taken care in assertion inside src/edje_extenarnals
while performing assertion but has been missed in the next statement in the loop condition.
3. In file src/lib/elm_config.c inside function _elm_config_profiles_list, freeing of file iterator has been missed out.
Please review the attached patch and let me know your opinion.
Thanks.
Regards,
Rajeev
SVN revision: 63550
2011-09-22 17:02:13 -07:00
|
|
|
return flist;
|
2010-10-25 10:36:07 -07:00
|
|
|
|
2010-11-18 02:00:41 -08:00
|
|
|
list_free:
|
2010-10-25 10:36:07 -07:00
|
|
|
EINA_LIST_FREE(flist, dir)
|
|
|
|
eina_stringshare_del(dir);
|
|
|
|
|
|
|
|
return NULL;
|
2010-10-25 06:08:19 -07:00
|
|
|
}
|
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
static void
|
2010-10-25 06:08:19 -07:00
|
|
|
_profile_fetch_from_conf(void)
|
2010-05-07 08:49:06 -07:00
|
|
|
{
|
|
|
|
char buf[PATH_MAX], *p, *s;
|
2010-10-29 10:32:16 -07:00
|
|
|
Eet_File *ef = NULL;
|
2010-05-07 08:49:06 -07:00
|
|
|
int len = 0;
|
|
|
|
|
|
|
|
_elm_profile = strdup("default");
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
// if env var - use profile without question
|
|
|
|
s = getenv("ELM_PROFILE");
|
|
|
|
if (s)
|
|
|
|
{
|
|
|
|
free(_elm_profile);
|
|
|
|
_elm_profile = strdup(s);
|
|
|
|
return;
|
|
|
|
}
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
// user profile
|
|
|
|
_elm_user_dir_snprintf(buf, sizeof(buf), "config/profile.cfg");
|
2010-05-07 08:49:06 -07:00
|
|
|
ef = eet_open(buf, EET_FILE_MODE_READ);
|
|
|
|
if (ef)
|
|
|
|
{
|
|
|
|
p = eet_read(ef, "config", &len);
|
|
|
|
if (p)
|
|
|
|
{
|
|
|
|
free(_elm_profile);
|
|
|
|
_elm_profile = malloc(len + 1);
|
|
|
|
memcpy(_elm_profile, p, len);
|
|
|
|
_elm_profile[len] = 0;
|
|
|
|
free(p);
|
|
|
|
}
|
|
|
|
eet_close(ef);
|
|
|
|
if (!p) ef = NULL;
|
|
|
|
}
|
|
|
|
if (ef) return;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
// system profile
|
2010-10-28 13:57:44 -07:00
|
|
|
_elm_data_dir_snprintf(buf, sizeof(buf), "config/profile.cfg");
|
2010-05-07 08:49:06 -07:00
|
|
|
ef = eet_open(buf, EET_FILE_MODE_READ);
|
|
|
|
if (ef)
|
|
|
|
{
|
|
|
|
p = eet_read(ef, "config", &len);
|
|
|
|
if (p)
|
|
|
|
{
|
|
|
|
free(_elm_profile);
|
|
|
|
_elm_profile = malloc(len + 1);
|
|
|
|
memcpy(_elm_profile, p, len);
|
|
|
|
_elm_profile[len] = 0;
|
|
|
|
free(p);
|
|
|
|
}
|
|
|
|
eet_close(ef);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
static void
|
|
|
|
_config_free(void)
|
|
|
|
{
|
2010-11-18 02:01:24 -08:00
|
|
|
Elm_Font_Overlay *fo;
|
2010-05-08 19:19:14 -07:00
|
|
|
const char *fontdir;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
if (!_elm_config) return;
|
|
|
|
EINA_LIST_FREE(_elm_config->font_dirs, fontdir)
|
|
|
|
{
|
|
|
|
eina_stringshare_del(fontdir);
|
|
|
|
}
|
2010-11-01 14:10:07 -07:00
|
|
|
if (_elm_config->engine) eina_stringshare_del(_elm_config->engine);
|
2010-11-18 02:01:24 -08:00
|
|
|
EINA_LIST_FREE(_elm_config->font_overlays, fo)
|
|
|
|
{
|
|
|
|
if (fo->text_class) eina_stringshare_del(fo->text_class);
|
|
|
|
if (fo->font) eina_stringshare_del(fo->font);
|
|
|
|
free(fo);
|
|
|
|
}
|
2010-05-08 19:19:14 -07:00
|
|
|
if (_elm_config->theme) eina_stringshare_del(_elm_config->theme);
|
|
|
|
if (_elm_config->modules) eina_stringshare_del(_elm_config->modules);
|
|
|
|
free(_elm_config);
|
|
|
|
_elm_config = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_config_apply(void)
|
|
|
|
{
|
2010-05-11 18:03:46 -07:00
|
|
|
_elm_theme_parse(NULL, _elm_config->theme);
|
2010-05-08 19:19:14 -07:00
|
|
|
ecore_animator_frametime_set(1.0 / _elm_config->fps);
|
2010-09-22 19:55:51 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_config_sub_apply(void)
|
|
|
|
{
|
2010-05-08 19:19:14 -07:00
|
|
|
edje_frametime_set(1.0 / _elm_config->fps);
|
|
|
|
edje_scale_set(_elm_config->scale);
|
2011-06-29 22:38:57 -07:00
|
|
|
edje_password_show_last_set(_elm_config->password_show_last);
|
|
|
|
edje_password_show_last_timeout_set(_elm_config->password_show_last_timeout);
|
2010-09-22 19:55:51 -07:00
|
|
|
if (_elm_config->modules) _elm_module_parse(_elm_config->modules);
|
2010-05-08 19:19:14 -07:00
|
|
|
}
|
|
|
|
|
2010-11-22 22:10:58 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_elm_cache_flush_cb(void *data __UNUSED__)
|
|
|
|
{
|
|
|
|
elm_all_flush();
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* kind of abusing this call right now -- shared between all of those
|
|
|
|
* properties -- but they are not meant to be called that periodically
|
|
|
|
* anyway */
|
2010-11-21 22:56:06 -08:00
|
|
|
void
|
|
|
|
_elm_recache(void)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Evas_Object *win;
|
|
|
|
|
|
|
|
elm_all_flush();
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(_elm_win_list, l, win)
|
|
|
|
{
|
|
|
|
Evas *e = evas_object_evas_get(win);
|
2011-02-10 22:16:23 -08:00
|
|
|
evas_image_cache_set(e, _elm_config->image_cache * 1024);
|
|
|
|
evas_font_cache_set(e, _elm_config->font_cache * 1024);
|
2010-11-22 22:10:58 -08:00
|
|
|
}
|
|
|
|
edje_file_cache_set(_elm_config->edje_cache);
|
|
|
|
edje_collection_cache_set(_elm_config->edje_collection_cache);
|
|
|
|
|
|
|
|
if (_elm_cache_flush_poller)
|
|
|
|
{
|
|
|
|
ecore_poller_del(_elm_cache_flush_poller);
|
|
|
|
_elm_cache_flush_poller = NULL;
|
|
|
|
}
|
2011-01-24 02:21:58 -08:00
|
|
|
if (_elm_config->cache_flush_enable)
|
2010-11-22 22:10:58 -08:00
|
|
|
{
|
2011-01-24 02:21:58 -08:00
|
|
|
if (_elm_config->cache_flush_poll_interval > 0)
|
|
|
|
{
|
|
|
|
_elm_cache_flush_poller =
|
|
|
|
ecore_poller_add(ECORE_POLLER_CORE,
|
|
|
|
_elm_config->cache_flush_poll_interval,
|
|
|
|
_elm_cache_flush_cb, NULL);
|
|
|
|
}
|
2010-11-21 22:56:06 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-02 07:33:04 -07:00
|
|
|
static Elm_Config *
|
|
|
|
_config_user_load(void)
|
2010-05-07 08:49:06 -07:00
|
|
|
{
|
2010-09-02 07:33:04 -07:00
|
|
|
Elm_Config *cfg = NULL;
|
|
|
|
Eet_File *ef;
|
2010-05-07 08:49:06 -07:00
|
|
|
char buf[PATH_MAX];
|
2010-09-02 07:33:04 -07:00
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
_elm_user_dir_snprintf(buf, sizeof(buf), "config/%s/base.cfg",
|
|
|
|
_elm_profile);
|
2010-09-02 07:33:04 -07:00
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
ef = eet_open(buf, EET_FILE_MODE_READ);
|
|
|
|
if (ef)
|
|
|
|
{
|
2010-09-02 07:33:04 -07:00
|
|
|
cfg = eet_data_read(ef, _config_edd, "config");
|
2010-05-07 08:49:06 -07:00
|
|
|
eet_close(ef);
|
|
|
|
}
|
2010-09-02 07:33:04 -07:00
|
|
|
return cfg;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Elm_Config *
|
|
|
|
_config_system_load(void)
|
|
|
|
{
|
|
|
|
Elm_Config *cfg = NULL;
|
|
|
|
Eet_File *ef;
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
_elm_data_dir_snprintf(buf, sizeof(buf), "config/%s/base.cfg",
|
|
|
|
_elm_profile);
|
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
ef = eet_open(buf, EET_FILE_MODE_READ);
|
|
|
|
if (ef)
|
|
|
|
{
|
2010-09-02 07:33:04 -07:00
|
|
|
cfg = eet_data_read(ef, _config_edd, "config");
|
2010-05-07 08:49:06 -07:00
|
|
|
eet_close(ef);
|
|
|
|
}
|
2010-09-02 07:33:04 -07:00
|
|
|
return cfg;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_config_load(void)
|
|
|
|
{
|
|
|
|
_elm_config = _config_user_load();
|
|
|
|
if (_elm_config)
|
|
|
|
{
|
|
|
|
if (_elm_config->config_version < ELM_CONFIG_VERSION)
|
|
|
|
_config_update();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* no user config, fallback for system. No need to check version for
|
|
|
|
* this one, if it's not the right one, someone screwed up at the time
|
|
|
|
* of installing it */
|
|
|
|
_elm_config = _config_system_load();
|
2010-05-07 08:49:06 -07:00
|
|
|
if (_elm_config) return;
|
2010-09-02 07:33:04 -07:00
|
|
|
/* FIXME: config load could have failed because of a non-existent
|
|
|
|
* profile. Fallback to default before moving on */
|
2010-05-07 08:49:06 -07:00
|
|
|
|
|
|
|
// config load fail - defaults
|
2010-09-02 07:33:04 -07:00
|
|
|
/* XXX: do these make sense? Only if it's valid to install the lib
|
|
|
|
* without the config, but do we want that? */
|
2010-05-07 08:49:06 -07:00
|
|
|
_elm_config = ELM_NEW(Elm_Config);
|
2010-09-02 07:33:04 -07:00
|
|
|
_elm_config->config_version = ELM_CONFIG_VERSION;
|
2010-11-01 14:10:07 -07:00
|
|
|
_elm_config->engine = eina_stringshare_add("software_x11");
|
2011-05-11 02:06:59 -07:00
|
|
|
_elm_config->vsync = 0;
|
2010-10-21 11:26:14 -07:00
|
|
|
_elm_config->thumbscroll_enable = EINA_TRUE;
|
2010-10-21 12:35:12 -07:00
|
|
|
_elm_config->thumbscroll_threshold = 24;
|
|
|
|
_elm_config->thumbscroll_momentum_threshold = 100.0;
|
2010-05-07 08:49:06 -07:00
|
|
|
_elm_config->thumbscroll_friction = 1.0;
|
|
|
|
_elm_config->thumbscroll_bounce_friction = 0.5;
|
2010-11-22 22:10:58 -08:00
|
|
|
_elm_config->thumbscroll_bounce_enable = EINA_TRUE;
|
2010-05-07 08:49:06 -07:00
|
|
|
_elm_config->page_scroll_friction = 0.5;
|
|
|
|
_elm_config->bring_in_scroll_friction = 0.5;
|
|
|
|
_elm_config->zoom_friction = 0.5;
|
2010-11-22 22:10:58 -08:00
|
|
|
_elm_config->thumbscroll_border_friction = 0.5;
|
2011-06-09 03:14:16 -07:00
|
|
|
_elm_config->scroll_smooth_amount = 1.0;
|
|
|
|
_elm_config->scroll_smooth_history_weight = 0.3;
|
2011-06-10 01:05:39 -07:00
|
|
|
_elm_config->scroll_smooth_future_time = 0.0;
|
|
|
|
_elm_config->scroll_smooth_time_window = 0.2;
|
2010-05-07 08:49:06 -07:00
|
|
|
_elm_config->scale = 1.0;
|
|
|
|
_elm_config->bgpixmap = 0;
|
2010-11-22 22:10:58 -08:00
|
|
|
_elm_config->compositing = 1;
|
2010-05-07 08:49:06 -07:00
|
|
|
_elm_config->font_hinting = 2;
|
2010-11-22 22:10:58 -08:00
|
|
|
_elm_config->cache_flush_poll_interval = 512;
|
2010-12-24 08:02:30 -08:00
|
|
|
_elm_config->cache_flush_enable = EINA_TRUE;
|
2010-05-07 08:49:06 -07:00
|
|
|
_elm_config->font_dirs = NULL;
|
|
|
|
_elm_config->image_cache = 4096;
|
|
|
|
_elm_config->font_cache = 512;
|
2010-11-22 22:10:58 -08:00
|
|
|
_elm_config->edje_cache = 32;
|
|
|
|
_elm_config->edje_collection_cache = 64;
|
2010-05-07 08:49:06 -07:00
|
|
|
_elm_config->finger_size = 40;
|
|
|
|
_elm_config->fps = 60.0;
|
|
|
|
_elm_config->theme = eina_stringshare_add("default");
|
|
|
|
_elm_config->modules = NULL;
|
2010-09-10 17:52:33 -07:00
|
|
|
_elm_config->tooltip_delay = 1.0;
|
2010-10-21 11:26:14 -07:00
|
|
|
_elm_config->cursor_engine_only = EINA_TRUE;
|
|
|
|
_elm_config->focus_highlight_enable = EINA_FALSE;
|
|
|
|
_elm_config->focus_highlight_animate = EINA_TRUE;
|
|
|
|
_elm_config->toolbar_shrink_mode = 2;
|
|
|
|
_elm_config->fileselector_expand_enable = EINA_FALSE;
|
|
|
|
_elm_config->inwin_dialogs_enable = EINA_FALSE;
|
|
|
|
_elm_config->icon_size = 32;
|
2010-11-24 09:11:34 -08:00
|
|
|
_elm_config->longpress_timeout = 1.0;
|
2011-01-31 00:18:58 -08:00
|
|
|
_elm_config->effect_enable = EINA_TRUE;
|
2011-04-01 06:20:40 -07:00
|
|
|
_elm_config->desktop_entry = EINA_FALSE;
|
|
|
|
_elm_config->is_mirrored = EINA_FALSE; /* Read sys value in env_get() */
|
2011-06-29 22:38:57 -07:00
|
|
|
_elm_config->password_show_last = EINA_FALSE;
|
|
|
|
_elm_config->password_show_last_timeout = 2.0;
|
2011-07-17 23:24:34 -07:00
|
|
|
_elm_config->glayer_zoom_finger_factor = 1.0;
|
|
|
|
_elm_config->glayer_zoom_wheel_factor = 0.05;
|
|
|
|
_elm_config->glayer_zoom_distance_tolerance = 1.0; /* 1 times elm_finger_size_get() */
|
|
|
|
_elm_config->glayer_rotate_angular_tolerance = 0.034906585; /* Represents 2 DEG */
|
|
|
|
_elm_config->glayer_line_min_length = 1.0; /* 1 times elm_finger_size_get() */
|
|
|
|
_elm_config->glayer_line_distance_tolerance = 3.0; /* 3 times elm_finger_size_get() */
|
|
|
|
_elm_config->glayer_line_angular_tolerance = 0.34906585; /* Represents 20 DEG */
|
|
|
|
_elm_config->glayer_flick_time_limit_ms = 60; /* 60 ms to finish flick */
|
2011-08-01 06:09:05 -07:00
|
|
|
_elm_config->glayer_long_tap_start_timeout = 1.2; /* 1.2 second to start long-tap */
|
2011-09-08 03:10:34 -07:00
|
|
|
_elm_config->glayer_continues_enable = EINA_TRUE; /* Continue gestures default */
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
static const char *
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config_eet_close_error_get(Eet_File *ef,
|
|
|
|
char *file)
|
2010-10-28 13:57:44 -07:00
|
|
|
{
|
|
|
|
Eet_Error err;
|
2010-10-29 06:04:05 -07:00
|
|
|
const char *erstr = NULL;
|
2010-10-28 13:57:44 -07:00
|
|
|
|
|
|
|
err = eet_close(ef);
|
|
|
|
switch (err)
|
|
|
|
{
|
|
|
|
case EET_ERROR_WRITE_ERROR:
|
2010-12-06 04:46:16 -08:00
|
|
|
erstr = "An error occurred while saving Elementary's "
|
|
|
|
"settings to disk. The error could not be "
|
|
|
|
"deterimined. The file where the error occurred was: "
|
|
|
|
"%s. This file has been deleted to avoid corrupt data.";
|
|
|
|
break;
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
case EET_ERROR_WRITE_ERROR_FILE_TOO_BIG:
|
2010-12-06 04:46:16 -08:00
|
|
|
erstr = "Elementary's settings files are too big "
|
|
|
|
"for the file system they are being saved to. "
|
|
|
|
"This error is very strange as the files should "
|
|
|
|
"be extremely small. Please check the settings "
|
|
|
|
"for your home directory. "
|
|
|
|
"The file where the error occurred was: %s ."
|
|
|
|
"This file has been deleted to avoid corrupt data.";
|
|
|
|
break;
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
case EET_ERROR_WRITE_ERROR_IO_ERROR:
|
2010-12-06 04:46:16 -08:00
|
|
|
erstr = "An output error occurred when writing the settings "
|
|
|
|
"files for Elementary. Your disk is having troubles "
|
|
|
|
"and possibly needs replacement. "
|
|
|
|
"The file where the error occurred was: %s ."
|
|
|
|
"This file has been deleted to avoid corrupt data.";
|
|
|
|
break;
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
case EET_ERROR_WRITE_ERROR_OUT_OF_SPACE:
|
2010-12-06 04:46:16 -08:00
|
|
|
erstr = "Elementary cannot write its settings file "
|
|
|
|
"because it ran out of space to write the file. "
|
|
|
|
"You have either run out of disk space or have "
|
|
|
|
"gone over your quota limit. "
|
|
|
|
"The file where the error occurred was: %s ."
|
|
|
|
"This file has been deleted to avoid corrupt data.";
|
|
|
|
break;
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
case EET_ERROR_WRITE_ERROR_FILE_CLOSED:
|
2010-12-06 04:46:16 -08:00
|
|
|
erstr = "Elementary unexpectedly had the settings file "
|
|
|
|
"it was writing closed on it. This is very unusual. "
|
|
|
|
"The file where the error occurred was: %s "
|
|
|
|
"This file has been deleted to avoid corrupt data.";
|
|
|
|
break;
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
default:
|
2010-12-06 04:46:16 -08:00
|
|
|
break;
|
2010-10-28 13:57:44 -07:00
|
|
|
}
|
|
|
|
if (erstr)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
/* delete any partially-written file */
|
|
|
|
ecore_file_unlink(file);
|
|
|
|
return strdup(erstr);
|
2010-10-28 13:57:44 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_elm_config_profile_save(void)
|
|
|
|
{
|
|
|
|
char buf[4096], buf2[4096];
|
|
|
|
int ok = 0, ret;
|
|
|
|
const char *err;
|
|
|
|
Eet_File *ef;
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
len = _elm_user_dir_snprintf(buf, sizeof(buf), "config/profile.cfg");
|
|
|
|
if (len + 1 >= sizeof(buf))
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
len = _elm_user_dir_snprintf(buf2, sizeof(buf2), "config/profile.cfg.tmp");
|
2010-10-28 13:57:44 -07:00
|
|
|
if (len + 1 >= sizeof(buf2))
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
|
|
|
ef = eet_open(buf2, EET_FILE_MODE_WRITE);
|
|
|
|
if (!ef)
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
|
|
|
ok = eet_write(ef, "config", _elm_profile, strlen(_elm_profile), 0);
|
|
|
|
if (!ok)
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
err = _elm_config_eet_close_error_get(ef, buf2);
|
|
|
|
if (err)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
ERR("%s", err);
|
|
|
|
free((void *)err);
|
|
|
|
goto err;
|
2010-10-28 13:57:44 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
ret = ecore_file_mv(buf2, buf);
|
|
|
|
if (!ret)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
ERR("Error saving Elementary's configuration file");
|
|
|
|
goto err;
|
2010-10-28 13:57:44 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
ecore_file_unlink(buf2);
|
|
|
|
return EINA_TRUE;
|
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
err:
|
2010-10-28 13:57:44 -07:00
|
|
|
ecore_file_unlink(buf2);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
Eina_Bool
|
|
|
|
_elm_config_save(void)
|
|
|
|
{
|
|
|
|
char buf[4096], buf2[4096];
|
|
|
|
int ok = 0, ret;
|
|
|
|
const char *err;
|
|
|
|
Eet_File *ef;
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
len = _elm_user_dir_snprintf(buf, sizeof(buf), "config/%s", _elm_profile);
|
|
|
|
if (len + 1 >= sizeof(buf))
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
|
|
|
ok = ecore_file_mkpath(buf);
|
|
|
|
if (!ok)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
ERR("Problem acessing Elementary's user configuration directory: %s",
|
|
|
|
buf);
|
|
|
|
return EINA_FALSE;
|
2010-10-28 13:57:44 -07:00
|
|
|
}
|
|
|
|
|
2010-10-29 10:32:16 -07:00
|
|
|
if (!_elm_config_profile_save())
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
buf[len] = '/';
|
|
|
|
len++;
|
|
|
|
|
|
|
|
if (len + sizeof("base.cfg") >= sizeof(buf) - len)
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
|
|
|
memcpy(buf + len, "base.cfg", sizeof("base.cfg"));
|
|
|
|
len += sizeof("base.cfg") - 1;
|
|
|
|
|
|
|
|
if (len + sizeof(".tmp") >= sizeof(buf))
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
|
|
|
memcpy(buf2, buf, len);
|
|
|
|
memcpy(buf2 + len, ".tmp", sizeof(".tmp"));
|
|
|
|
|
|
|
|
ef = eet_open(buf2, EET_FILE_MODE_WRITE);
|
|
|
|
if (!ef)
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
|
|
|
ok = eet_data_write(ef, _config_edd, "config", _elm_config, 1);
|
|
|
|
if (!ok)
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
err = _elm_config_eet_close_error_get(ef, buf2);
|
|
|
|
if (err)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
ERR("%s", err);
|
|
|
|
free((void *)err);
|
|
|
|
goto err;
|
2010-10-28 13:57:44 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
ret = ecore_file_mv(buf2, buf);
|
|
|
|
if (!ret)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
ERR("Error saving Elementary's configuration file");
|
|
|
|
goto err;
|
2010-10-28 13:57:44 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
ecore_file_unlink(buf2);
|
|
|
|
return EINA_TRUE;
|
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
err:
|
2010-10-28 13:57:44 -07:00
|
|
|
ecore_file_unlink(buf2);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
2010-09-02 07:33:04 -07:00
|
|
|
static void
|
|
|
|
_config_update(void)
|
|
|
|
{
|
|
|
|
Elm_Config *tcfg;
|
|
|
|
|
|
|
|
tcfg = _config_system_load();
|
|
|
|
if (!tcfg)
|
|
|
|
{
|
|
|
|
/* weird profile or something? We should probably fill
|
|
|
|
* with hardcoded defaults, or get from default previx */
|
2010-12-06 04:46:16 -08:00
|
|
|
return;
|
2010-09-02 07:33:04 -07:00
|
|
|
}
|
2010-12-06 04:46:16 -08:00
|
|
|
#define IFCFG(v) if ((_elm_config->config_version & 0xffff) < (v)) {
|
2010-09-02 07:33:04 -07:00
|
|
|
#define IFCFGELSE } else {
|
2010-12-06 04:46:16 -08:00
|
|
|
#define IFCFGEND }
|
|
|
|
#define COPYVAL(x) do {_elm_config->x = tcfg->x; } while(0)
|
2010-09-02 07:33:04 -07:00
|
|
|
#define COPYPTR(x) do {_elm_config->x = tcfg->x; tcfg->x = NULL; } while(0)
|
|
|
|
#define COPYSTR(x) COPYPTR(x)
|
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
/* we also need to update for property changes in the root window
|
|
|
|
* if needed, but that will be dependent on new properties added
|
|
|
|
* with each version */
|
2010-09-02 07:33:04 -07:00
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
IFCFG(0x0003);
|
|
|
|
COPYVAL(longpress_timeout);
|
|
|
|
IFCFGEND;
|
2010-09-02 07:33:04 -07:00
|
|
|
|
|
|
|
#undef COPYSTR
|
|
|
|
#undef COPYPTR
|
|
|
|
#undef COPYVAL
|
|
|
|
#undef IFCFGEND
|
|
|
|
#undef IFCFGELSE
|
|
|
|
#undef IFCFG
|
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
/* after updating user config, we must save */
|
2010-09-02 07:33:04 -07:00
|
|
|
}
|
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
static void
|
2010-05-08 19:19:14 -07:00
|
|
|
_env_get(void)
|
2010-05-07 08:49:06 -07:00
|
|
|
{
|
2010-05-27 02:01:41 -07:00
|
|
|
char *s;
|
2010-12-06 04:46:10 -08:00
|
|
|
double friction;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
s = getenv("ELM_ENGINE");
|
|
|
|
if (s)
|
|
|
|
{
|
|
|
|
if ((!strcasecmp(s, "x11")) ||
|
|
|
|
(!strcasecmp(s, "x")) ||
|
|
|
|
(!strcasecmp(s, "software-x11")) ||
|
|
|
|
(!strcasecmp(s, "software_x11")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_X11);
|
2010-09-28 15:43:48 -07:00
|
|
|
else if ((!strcasecmp(s, "opengl")) ||
|
|
|
|
(!strcasecmp(s, "gl")) ||
|
|
|
|
(!strcasecmp(s, "opengl-x11")) ||
|
|
|
|
(!strcasecmp(s, "opengl_x11")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_OPENGL_X11);
|
2010-09-28 15:43:48 -07:00
|
|
|
else if ((!strcasecmp(s, "x11-8")) ||
|
2011-05-15 19:26:16 -07:00
|
|
|
(!strcasecmp(s, "x8")) ||
|
2010-09-28 15:43:48 -07:00
|
|
|
(!strcasecmp(s, "software-8-x11")) ||
|
|
|
|
(!strcasecmp(s, "software_8_x11")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_8_X11);
|
2010-05-07 08:49:06 -07:00
|
|
|
else if ((!strcasecmp(s, "x11-16")) ||
|
|
|
|
(!strcasecmp(s, "x16")) ||
|
|
|
|
(!strcasecmp(s, "software-16-x11")) ||
|
|
|
|
(!strcasecmp(s, "software_16_x11")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_16_X11);
|
2011-05-19 17:43:05 -07:00
|
|
|
/*
|
2010-05-07 08:49:06 -07:00
|
|
|
else if ((!strcasecmp(s, "xrender")) ||
|
|
|
|
(!strcasecmp(s, "xr")) ||
|
|
|
|
(!strcasecmp(s, "xrender-x11")) ||
|
|
|
|
(!strcasecmp(s, "xrender_x11")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_XRENDER_X11);
|
2011-05-15 19:26:16 -07:00
|
|
|
*/
|
2010-05-07 08:49:06 -07:00
|
|
|
else if ((!strcasecmp(s, "fb")) ||
|
|
|
|
(!strcasecmp(s, "software-fb")) ||
|
|
|
|
(!strcasecmp(s, "software_fb")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_FB);
|
2010-05-07 08:49:06 -07:00
|
|
|
else if ((!strcasecmp(s, "directfb")) ||
|
|
|
|
(!strcasecmp(s, "dfb")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_DIRECTFB);
|
2010-05-07 08:49:06 -07:00
|
|
|
else if ((!strcasecmp(s, "sdl")) ||
|
|
|
|
(!strcasecmp(s, "software-sdl")) ||
|
|
|
|
(!strcasecmp(s, "software_sdl")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_SDL);
|
2010-05-07 08:49:06 -07:00
|
|
|
else if ((!strcasecmp(s, "sdl-16")) ||
|
|
|
|
(!strcasecmp(s, "software-16-sdl")) ||
|
|
|
|
(!strcasecmp(s, "software_16_sdl")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_16_SDL);
|
2010-05-07 08:49:06 -07:00
|
|
|
else if ((!strcasecmp(s, "opengl-sdl")) ||
|
|
|
|
(!strcasecmp(s, "opengl_sdl")) ||
|
|
|
|
(!strcasecmp(s, "gl-sdl")) ||
|
|
|
|
(!strcasecmp(s, "gl_sdl")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_OPENGL_SDL);
|
2010-05-07 08:49:06 -07:00
|
|
|
else if ((!strcasecmp(s, "gdi")) ||
|
|
|
|
(!strcasecmp(s, "software-gdi")) ||
|
|
|
|
(!strcasecmp(s, "software_gdi")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_WIN32);
|
2010-05-07 08:49:06 -07:00
|
|
|
else if ((!strcasecmp(s, "wince-gdi")) ||
|
|
|
|
(!strcasecmp(s, "software-16-wince-gdi")) ||
|
|
|
|
(!strcasecmp(s, "software_16_wince_gdi")))
|
2010-11-01 14:10:07 -07:00
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_16_WINCE);
|
2011-07-25 05:02:52 -07:00
|
|
|
else if (!strcasecmp(s, "buffer"))
|
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_BUFFER);
|
2011-05-04 03:09:59 -07:00
|
|
|
else if ((!strncmp(s, "shot:", 5)))
|
|
|
|
eina_stringshare_replace(&_elm_config->engine, s);
|
2011-10-05 15:18:22 -07:00
|
|
|
else if ((!strcasecmp(s, "ews")))
|
|
|
|
eina_stringshare_replace(&_elm_config->engine, ELM_EWS);
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
2011-05-13 09:55:24 -07:00
|
|
|
|
2011-05-11 02:06:59 -07:00
|
|
|
s = getenv("ELM_VSYNC");
|
|
|
|
if (s) _elm_config->vsync = !!atoi(s);
|
2010-05-07 08:49:06 -07:00
|
|
|
|
|
|
|
s = getenv("ELM_THUMBSCROLL_ENABLE");
|
2010-10-21 11:26:14 -07:00
|
|
|
if (s) _elm_config->thumbscroll_enable = !!atoi(s);
|
2010-05-07 08:49:06 -07:00
|
|
|
s = getenv("ELM_THUMBSCROLL_THRESHOLD");
|
2010-10-21 12:35:12 -07:00
|
|
|
if (s) _elm_config->thumbscroll_threshold = atoi(s);
|
2010-05-07 08:49:06 -07:00
|
|
|
// FIXME: floatformat locale issues here 1.0 vs 1,0 - should just be 1.0
|
|
|
|
s = getenv("ELM_THUMBSCROLL_MOMENTUM_THRESHOLD");
|
2010-10-21 12:35:12 -07:00
|
|
|
if (s) _elm_config->thumbscroll_momentum_threshold = atof(s);
|
2010-05-07 08:49:06 -07:00
|
|
|
s = getenv("ELM_THUMBSCROLL_FRICTION");
|
|
|
|
if (s) _elm_config->thumbscroll_friction = atof(s);
|
2010-12-06 04:46:10 -08:00
|
|
|
s = getenv("ELM_THUMBSCROLL_BOUNCE_ENABLE");
|
|
|
|
if (s) _elm_config->thumbscroll_bounce_enable = !!atoi(s);
|
|
|
|
s = getenv("ELM_THUMBSCROLL_BOUNCE_FRICTION");
|
|
|
|
if (s) _elm_config->thumbscroll_bounce_friction = atof(s);
|
2010-05-07 08:49:06 -07:00
|
|
|
s = getenv("ELM_PAGE_SCROLL_FRICTION");
|
|
|
|
if (s) _elm_config->page_scroll_friction = atof(s);
|
|
|
|
s = getenv("ELM_BRING_IN_SCROLL_FRICTION");
|
|
|
|
if (s) _elm_config->bring_in_scroll_friction = atof(s);
|
|
|
|
s = getenv("ELM_ZOOM_FRICTION");
|
|
|
|
if (s) _elm_config->zoom_friction = atof(s);
|
2010-11-05 02:31:51 -07:00
|
|
|
s = getenv("ELM_THUMBSCROLL_BORDER_FRICTION");
|
2010-12-06 04:46:10 -08:00
|
|
|
if (s)
|
|
|
|
{
|
|
|
|
friction = atof(s);
|
|
|
|
if (friction < 0.0)
|
|
|
|
friction = 0.0;
|
2010-05-07 08:49:06 -07:00
|
|
|
|
2010-12-06 04:46:10 -08:00
|
|
|
if (friction > 1.0)
|
|
|
|
friction = 1.0;
|
|
|
|
|
|
|
|
_elm_config->thumbscroll_border_friction = friction;
|
|
|
|
}
|
2011-06-09 03:14:16 -07:00
|
|
|
s = getenv("ELM_SCROLL_SMOOTH_AMOUNT");
|
|
|
|
if (s) _elm_config->scroll_smooth_amount = atof(s);
|
|
|
|
s = getenv("ELM_SCROLL_SMOOTH_HISTORY_WEIGHT");
|
|
|
|
if (s) _elm_config->scroll_smooth_history_weight = atof(s);
|
|
|
|
s = getenv("ELM_SCROLL_SMOOTH_FUTURE_TIME");
|
|
|
|
if (s) _elm_config->scroll_smooth_future_time = atof(s);
|
2011-06-09 22:07:21 -07:00
|
|
|
s = getenv("ELM_SCROLL_SMOOTH_TIME_WINDOW");
|
|
|
|
if (s) _elm_config->scroll_smooth_time_window = atof(s);
|
2010-05-07 08:49:06 -07:00
|
|
|
s = getenv("ELM_THEME");
|
|
|
|
if (s) eina_stringshare_replace(&_elm_config->theme, s);
|
|
|
|
|
|
|
|
s = getenv("ELM_FONT_HINTING");
|
|
|
|
if (s)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
if (!strcasecmp(s, "none")) _elm_config->font_hinting = 0;
|
|
|
|
else if (!strcasecmp(s, "auto"))
|
|
|
|
_elm_config->font_hinting = 1;
|
|
|
|
else if (!strcasecmp(s, "bytecode"))
|
|
|
|
_elm_config->font_hinting = 2;
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
s = getenv("ELM_FONT_PATH");
|
|
|
|
if (s)
|
|
|
|
{
|
2010-10-25 06:08:04 -07:00
|
|
|
const char *p, *pp;
|
|
|
|
char *buf2;
|
2010-05-07 08:49:06 -07:00
|
|
|
|
|
|
|
EINA_LIST_FREE(_elm_config->font_dirs, p)
|
|
|
|
{
|
|
|
|
eina_stringshare_del(p);
|
|
|
|
}
|
2010-10-25 06:08:04 -07:00
|
|
|
|
|
|
|
buf2 = alloca(strlen(s) + 1);
|
|
|
|
p = s;
|
|
|
|
pp = p;
|
2010-12-06 04:46:16 -08:00
|
|
|
for (;; )
|
2010-10-25 06:08:04 -07:00
|
|
|
{
|
|
|
|
if ((*p == ':') || (*p == 0))
|
|
|
|
{
|
|
|
|
int len;
|
|
|
|
|
|
|
|
len = p - pp;
|
|
|
|
strncpy(buf2, pp, len);
|
|
|
|
buf2[len] = 0;
|
|
|
|
_elm_config->font_dirs =
|
|
|
|
eina_list_append(_elm_config->font_dirs,
|
2010-05-07 08:49:06 -07:00
|
|
|
eina_stringshare_add(buf2));
|
2010-10-25 06:08:04 -07:00
|
|
|
if (*p == 0) break;
|
|
|
|
p++;
|
|
|
|
pp = p;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (*p == 0) break;
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
}
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
s = getenv("ELM_IMAGE_CACHE");
|
|
|
|
if (s) _elm_config->image_cache = atoi(s);
|
|
|
|
|
|
|
|
s = getenv("ELM_FONT_CACHE");
|
|
|
|
if (s) _elm_config->font_cache = atoi(s);
|
|
|
|
|
|
|
|
s = getenv("ELM_SCALE");
|
|
|
|
if (s) _elm_config->scale = atof(s);
|
2010-10-25 06:08:04 -07:00
|
|
|
|
|
|
|
_elm_config->finger_size =
|
|
|
|
(double)_elm_config->finger_size * _elm_config->scale;
|
2010-05-07 08:49:06 -07:00
|
|
|
s = getenv("ELM_FINGER_SIZE");
|
|
|
|
if (s) _elm_config->finger_size = atoi(s);
|
|
|
|
|
2011-06-29 22:38:57 -07:00
|
|
|
s = getenv("ELM_PASSWORD_SHOW_LAST");
|
|
|
|
if (s) _elm_config->password_show_last = !!atoi(s);
|
|
|
|
|
|
|
|
s = getenv("ELM_PASSWORD_SHOW_LAST_TIMEOUT");
|
|
|
|
if (s)
|
|
|
|
{
|
|
|
|
double pw_show_last_timeout = atof(s);
|
|
|
|
if (pw_show_last_timeout >= 0.0)
|
|
|
|
_elm_config->password_show_last_timeout = pw_show_last_timeout;
|
|
|
|
}
|
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
s = getenv("ELM_FPS");
|
|
|
|
if (s) _elm_config->fps = atof(s);
|
|
|
|
if (_elm_config->fps < 1.0) _elm_config->fps = 1.0;
|
|
|
|
|
|
|
|
s = getenv("ELM_MODULES");
|
|
|
|
if (s) eina_stringshare_replace(&_elm_config->modules, s);
|
2010-09-10 17:52:33 -07:00
|
|
|
|
2011-02-03 07:52:49 -08:00
|
|
|
/* Get RTL orientation from system */
|
|
|
|
setlocale(LC_ALL, "");
|
2011-04-27 00:41:06 -07:00
|
|
|
bindtextdomain(PACKAGE, LOCALE_DIR);
|
2011-03-24 21:49:49 -07:00
|
|
|
_elm_config->is_mirrored = !strcmp(E_("default:LTR"), "default:RTL");
|
2011-02-03 07:52:49 -08:00
|
|
|
|
2010-09-10 17:52:33 -07:00
|
|
|
s = getenv("ELM_TOOLTIP_DELAY");
|
|
|
|
if (s)
|
|
|
|
{
|
|
|
|
double delay = atof(s);
|
|
|
|
if (delay >= 0.0)
|
|
|
|
_elm_config->tooltip_delay = delay;
|
|
|
|
}
|
2010-09-25 15:04:51 -07:00
|
|
|
|
|
|
|
s = getenv("ELM_CURSOR_ENGINE_ONLY");
|
2010-10-21 11:26:14 -07:00
|
|
|
if (s) _elm_config->cursor_engine_only = !!atoi(s);
|
2010-10-04 09:55:32 -07:00
|
|
|
|
|
|
|
s = getenv("ELM_FOCUS_HIGHLIGHT_ENABLE");
|
2010-10-21 11:26:14 -07:00
|
|
|
if (s) _elm_config->focus_highlight_enable = !!atoi(s);
|
2010-10-04 09:55:32 -07:00
|
|
|
|
|
|
|
s = getenv("ELM_FOCUS_HIGHLIGHT_ANIMATE");
|
2010-10-21 11:26:14 -07:00
|
|
|
if (s) _elm_config->focus_highlight_animate = !!atoi(s);
|
|
|
|
|
|
|
|
s = getenv("ELM_TOOLBAR_SHRINK_MODE");
|
|
|
|
if (s) _elm_config->toolbar_shrink_mode = atoi(s);
|
|
|
|
|
|
|
|
s = getenv("ELM_FILESELECTOR_EXPAND_ENABLE");
|
|
|
|
if (s) _elm_config->fileselector_expand_enable = !!atoi(s);
|
|
|
|
|
|
|
|
s = getenv("ELM_INWIN_DIALOGS_ENABLE");
|
|
|
|
if (s) _elm_config->inwin_dialogs_enable = !!atoi(s);
|
|
|
|
|
|
|
|
s = getenv("ELM_ICON_SIZE");
|
|
|
|
if (s) _elm_config->icon_size = atoi(s);
|
2010-12-06 04:46:16 -08:00
|
|
|
|
2010-11-24 09:11:34 -08:00
|
|
|
s = getenv("ELM_LONGPRESS_TIMEOUT");
|
|
|
|
if (s) _elm_config->longpress_timeout = atof(s);
|
2010-12-06 04:46:10 -08:00
|
|
|
if (_elm_config->longpress_timeout < 0.0)
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config->longpress_timeout = 0.0;
|
elementary / entry, list, scroller, fileselector_button, config, photocam, map, pan, bg, store, priv, pager, conform, box, clock, flipselector
fixed indentation, removed white spaces.
SVN revision: 58267
2011-04-01 12:08:56 -07:00
|
|
|
|
2011-01-31 00:18:58 -08:00
|
|
|
s = getenv("ELM_EFFECT_ENABLE");
|
|
|
|
if (s) _elm_config->effect_enable = !!atoi(s);
|
elementary / entry, list, scroller, fileselector_button, config, photocam, map, pan, bg, store, priv, pager, conform, box, clock, flipselector
fixed indentation, removed white spaces.
SVN revision: 58267
2011-04-01 12:08:56 -07:00
|
|
|
|
2011-04-01 06:20:40 -07:00
|
|
|
s = getenv("ELM_DESKTOP_ENTRY");
|
|
|
|
if (s) _elm_config->desktop_entry = !!atoi(s);
|
2011-08-19 07:39:27 -07:00
|
|
|
s = getenv("ELM_ACCESS_MODE");
|
|
|
|
if (s) _elm_config->access_mode = ELM_ACCESS_MODE_ON;
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
|
|
|
|
2011-02-03 07:52:49 -08:00
|
|
|
EAPI Eina_Bool
|
|
|
|
elm_mirrored_get(void)
|
|
|
|
{
|
|
|
|
return _elm_config->is_mirrored;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
elm_mirrored_set(Eina_Bool mirrored)
|
|
|
|
{
|
|
|
|
_elm_config->is_mirrored = mirrored;
|
2011-02-09 08:13:58 -08:00
|
|
|
_elm_rescale();
|
2011-02-03 07:52:49 -08:00
|
|
|
}
|
|
|
|
|
2011-09-18 00:53:41 -07:00
|
|
|
static void
|
|
|
|
_translation_init()
|
|
|
|
{
|
|
|
|
#ifdef ENABLE_NLS
|
|
|
|
const char *cur_dom = textdomain(NULL);
|
|
|
|
const char *trans_comment = gettext("");
|
|
|
|
const char *msg_locale = setlocale(LC_MESSAGES, NULL);
|
|
|
|
|
|
|
|
/* Same concept as what glib does:
|
|
|
|
* We shouldn't translate if there are no translations for the
|
|
|
|
* application in the current locale + domain. (Unless locale is
|
|
|
|
* en_/C where translating only parts of the interface make some
|
|
|
|
* sense).
|
|
|
|
*/
|
|
|
|
_elm_config->translate = !(strcmp (cur_dom, "messages") &&
|
|
|
|
!*trans_comment && strncmp (msg_locale, "en_", 3) &&
|
|
|
|
strcmp (msg_locale, "C"));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
void
|
|
|
|
_elm_config_init(void)
|
|
|
|
{
|
|
|
|
_desc_init();
|
2010-10-25 06:08:19 -07:00
|
|
|
_profile_fetch_from_conf();
|
2010-05-07 08:49:06 -07:00
|
|
|
_config_load();
|
2011-09-18 00:53:41 -07:00
|
|
|
_translation_init();
|
2010-05-08 19:19:14 -07:00
|
|
|
_env_get();
|
|
|
|
_config_apply();
|
2010-11-18 02:01:24 -08:00
|
|
|
_elm_config_font_overlay_apply();
|
2010-11-22 22:10:58 -08:00
|
|
|
_elm_recache();
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
|
|
|
|
2011-09-28 19:00:20 -07:00
|
|
|
void
|
|
|
|
_elm_config_sub_shutdown(void)
|
|
|
|
{
|
|
|
|
#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
|
|
|
|
if (ENGINE_COMPARE(ELM_SOFTWARE_X11) ||
|
|
|
|
ENGINE_COMPARE(ELM_SOFTWARE_16_X11) ||
|
|
|
|
ENGINE_COMPARE(ELM_XRENDER_X11) ||
|
|
|
|
ENGINE_COMPARE(ELM_OPENGL_X11))
|
|
|
|
#undef ENGINE_COMPARE
|
|
|
|
{
|
|
|
|
#ifdef HAVE_ELEMENTARY_X
|
|
|
|
ecore_x_disconnect();
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
void
|
|
|
|
_elm_config_sub_init(void)
|
|
|
|
{
|
2010-11-01 14:10:07 -07:00
|
|
|
#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
|
2010-12-06 04:46:16 -08:00
|
|
|
if (ENGINE_COMPARE(ELM_SOFTWARE_X11) ||
|
|
|
|
ENGINE_COMPARE(ELM_SOFTWARE_16_X11) ||
|
|
|
|
ENGINE_COMPARE(ELM_XRENDER_X11) ||
|
|
|
|
ENGINE_COMPARE(ELM_OPENGL_X11))
|
2010-11-01 14:10:07 -07:00
|
|
|
#undef ENGINE_COMPARE
|
2010-05-07 08:49:06 -07:00
|
|
|
{
|
|
|
|
#ifdef HAVE_ELEMENTARY_X
|
2010-10-25 06:08:04 -07:00
|
|
|
unsigned int val = 1000;
|
2010-05-07 08:49:06 -07:00
|
|
|
|
2010-10-25 06:08:04 -07:00
|
|
|
if (!ecore_x_init(NULL))
|
|
|
|
{
|
|
|
|
ERR("Cannot connect to X11 display. check $DISPLAY variable");
|
|
|
|
exit(1);
|
|
|
|
}
|
2010-05-08 19:19:14 -07:00
|
|
|
_root_1st = ecore_x_window_root_first_get();
|
2010-10-25 06:08:04 -07:00
|
|
|
|
|
|
|
if (!ecore_x_screen_is_composited(0))
|
|
|
|
_elm_config->compositing = 0;
|
2010-05-08 19:19:14 -07:00
|
|
|
|
|
|
|
ecore_x_atoms_get(_atom_names, ATOM_COUNT, _atom);
|
2010-10-25 06:08:04 -07:00
|
|
|
ecore_x_event_mask_set(_root_1st,
|
|
|
|
ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
|
|
|
|
_prop_change_handler = ecore_event_handler_add
|
2010-12-06 04:46:16 -08:00
|
|
|
(ECORE_X_EVENT_WINDOW_PROPERTY, _prop_change, NULL);
|
2010-10-25 06:08:04 -07:00
|
|
|
if (!getenv("ELM_SCALE"))
|
|
|
|
{
|
|
|
|
if (ecore_x_window_prop_card32_get(_root_1st,
|
|
|
|
_atom[ATOM_E_SCALE],
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
if (val > 0)
|
|
|
|
{
|
|
|
|
_elm_config->scale = (double)val / 1000.0;
|
2010-12-06 04:46:16 -08:00
|
|
|
// FIXME: hack until e export finger size too
|
2010-11-18 01:30:46 -08:00
|
|
|
if (!getenv("ELM_FINGER_SIZE"))
|
|
|
|
{
|
|
|
|
_elm_config->finger_size = 40.0 * _elm_config->scale;
|
|
|
|
}
|
2010-05-07 08:49:06 -07:00
|
|
|
edje_scale_set(_elm_config->scale);
|
2010-10-25 06:08:04 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!getenv("ELM_FINGER_SIZE"))
|
|
|
|
{
|
|
|
|
if (ecore_x_window_prop_card32_get(_root_1st,
|
|
|
|
_atom[ATOM_E_FINGER_SIZE],
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
if (val > 0)
|
|
|
|
{
|
|
|
|
_elm_config->finger_size = val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!getenv("ELM_THEME"))
|
|
|
|
{
|
2010-05-07 08:49:06 -07:00
|
|
|
char *s;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
s = ecore_x_window_prop_string_get(_root_1st,
|
2010-10-25 06:08:04 -07:00
|
|
|
_atom[ATOM_E_THEME]);
|
2010-05-07 08:49:06 -07:00
|
|
|
if (s)
|
2010-10-25 06:08:04 -07:00
|
|
|
{
|
|
|
|
eina_stringshare_replace(&_elm_config->theme, s);
|
2010-05-11 18:03:46 -07:00
|
|
|
_elm_theme_parse(NULL, s);
|
2010-05-07 08:49:06 -07:00
|
|
|
free(s);
|
2010-10-25 06:08:04 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!getenv("ELM_PROFILE"))
|
|
|
|
{
|
2010-05-08 19:19:14 -07:00
|
|
|
char *s;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
s = ecore_x_window_prop_string_get(_root_1st,
|
2010-10-25 06:08:04 -07:00
|
|
|
_atom[ATOM_E_PROFILE]);
|
2010-05-08 19:19:14 -07:00
|
|
|
if (s)
|
2010-10-25 06:08:04 -07:00
|
|
|
{
|
2010-05-08 19:19:14 -07:00
|
|
|
int changed = 0;
|
2010-10-25 06:08:04 -07:00
|
|
|
|
2010-05-08 19:19:14 -07:00
|
|
|
if (_elm_profile)
|
|
|
|
{
|
|
|
|
if (strcmp(_elm_profile, s)) changed = 1;
|
|
|
|
free(_elm_profile);
|
|
|
|
}
|
|
|
|
_elm_profile = s;
|
|
|
|
if (changed) _prop_config_get();
|
2010-10-25 06:08:04 -07:00
|
|
|
}
|
|
|
|
}
|
2010-05-07 08:49:06 -07:00
|
|
|
#endif
|
2010-10-25 06:08:04 -07:00
|
|
|
}
|
2010-09-22 19:55:51 -07:00
|
|
|
_config_sub_apply();
|
2010-05-07 08:49:06 -07:00
|
|
|
}
|
|
|
|
|
2010-10-28 13:57:44 -07:00
|
|
|
void
|
|
|
|
_elm_config_reload(void)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
_config_free();
|
|
|
|
_config_load();
|
|
|
|
_config_apply();
|
|
|
|
_elm_config_font_overlay_apply();
|
|
|
|
_elm_rescale();
|
|
|
|
_elm_recache();
|
2010-10-28 13:57:44 -07:00
|
|
|
}
|
|
|
|
|
2010-11-01 14:10:14 -07:00
|
|
|
void
|
|
|
|
_elm_config_engine_set(const char *engine)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
if (_elm_config->engine && strcmp(_elm_config->engine, engine))
|
|
|
|
eina_stringshare_del(_elm_config->engine);
|
2010-11-01 14:10:14 -07:00
|
|
|
|
2010-12-06 04:46:16 -08:00
|
|
|
_elm_config->engine = eina_stringshare_add(engine);
|
2010-11-01 14:10:14 -07:00
|
|
|
}
|
|
|
|
|
2010-10-25 06:08:19 -07:00
|
|
|
void
|
|
|
|
_elm_config_profile_set(const char *profile)
|
|
|
|
{
|
2010-12-06 04:46:16 -08:00
|
|
|
Eina_Bool changed = EINA_FALSE;
|
|
|
|
|
|
|
|
if (_elm_profile)
|
|
|
|
{
|
|
|
|
if (strcmp(_elm_profile, profile))
|
|
|
|
changed = 1;
|
|
|
|
free(_elm_profile);
|
|
|
|
}
|
|
|
|
|
|
|
|
_elm_profile = strdup(profile);
|
|
|
|
|
|
|
|
if (changed)
|
|
|
|
{
|
|
|
|
_config_free();
|
|
|
|
_config_load();
|
|
|
|
_config_apply();
|
|
|
|
_elm_config_font_overlay_apply();
|
|
|
|
_elm_rescale();
|
|
|
|
_elm_recache();
|
|
|
|
}
|
2010-10-25 06:08:19 -07:00
|
|
|
}
|
|
|
|
|
2010-05-07 08:49:06 -07:00
|
|
|
void
|
|
|
|
_elm_config_shutdown(void)
|
|
|
|
{
|
2010-11-01 14:10:07 -07:00
|
|
|
#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
|
2010-12-06 04:46:16 -08:00
|
|
|
if (ENGINE_COMPARE(ELM_SOFTWARE_X11) ||
|
|
|
|
ENGINE_COMPARE(ELM_SOFTWARE_16_X11) ||
|
|
|
|
ENGINE_COMPARE(ELM_XRENDER_X11) ||
|
|
|
|
ENGINE_COMPARE(ELM_OPENGL_X11))
|
2010-11-01 14:10:07 -07:00
|
|
|
#undef ENGINE_COMPARE
|
2010-05-07 08:49:06 -07:00
|
|
|
{
|
|
|
|
#ifdef HAVE_ELEMENTARY_X
|
2010-10-25 06:08:04 -07:00
|
|
|
ecore_event_handler_del(_prop_change_handler);
|
|
|
|
_prop_change_handler = NULL;
|
2010-05-07 08:49:06 -07:00
|
|
|
#endif
|
|
|
|
}
|
2010-05-08 19:19:14 -07:00
|
|
|
_config_free();
|
2010-05-07 08:49:06 -07:00
|
|
|
if (_elm_profile)
|
|
|
|
{
|
|
|
|
free(_elm_profile);
|
|
|
|
_elm_profile = NULL;
|
|
|
|
}
|
|
|
|
_desc_shutdown();
|
|
|
|
}
|
2010-12-06 04:46:16 -08:00
|
|
|
|