2011-11-01 06:59:44 -07:00
|
|
|
/* TODO
|
|
|
|
check http://www.pvv.org/~mariusbu/proposal.html
|
|
|
|
for advances in cross toolkit settings */
|
|
|
|
|
2011-09-24 15:05:15 -07:00
|
|
|
#include <e.h>
|
2013-01-03 03:21:24 -08:00
|
|
|
//#include <X11/Xlib.h>
|
|
|
|
//#include <X11/Xmd.h> /* For CARD16 */
|
|
|
|
|
|
|
|
// define here to avoid needing x includes directly.
|
2013-01-11 02:34:29 -08:00
|
|
|
#define C16 unsigned short
|
|
|
|
#define C32 unsigned long
|
2011-09-24 15:05:15 -07:00
|
|
|
|
2013-01-11 02:34:29 -08:00
|
|
|
#define RETRY_TIMEOUT 2.0
|
2011-09-24 15:05:15 -07:00
|
|
|
|
2013-01-11 02:34:29 -08:00
|
|
|
#define SETTING_TYPE_INT 0
|
|
|
|
#define SETTING_TYPE_STRING 1
|
|
|
|
#define SETTING_TYPE_COLOR 2
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
#define OFFSET_ADD(n) ((n + 4 - 1) & (~(4 - 1)))
|
|
|
|
|
|
|
|
typedef struct _Settings_Manger Settings_Manager;
|
2013-01-11 02:34:29 -08:00
|
|
|
typedef struct _Setting Setting;
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
struct _Settings_Manger
|
|
|
|
{
|
2013-01-11 02:34:29 -08:00
|
|
|
E_Manager *man;
|
2011-09-24 15:05:15 -07:00
|
|
|
Ecore_X_Window selection;
|
2013-01-11 02:34:29 -08:00
|
|
|
Ecore_Timer *timer_retry;
|
|
|
|
unsigned long serial;
|
|
|
|
Ecore_X_Atom _atom_xsettings_screen;
|
2011-09-24 15:05:15 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
struct _Setting
|
|
|
|
{
|
2013-01-11 02:34:29 -08:00
|
|
|
unsigned short type;
|
|
|
|
|
|
|
|
const char *name;
|
|
|
|
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
const char *value;
|
|
|
|
} s;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
int value;
|
|
|
|
} i;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
unsigned short red, green, blue, alpha;
|
|
|
|
} c;
|
|
|
|
|
|
|
|
unsigned long length;
|
|
|
|
unsigned long last_change;
|
2011-09-24 15:05:15 -07:00
|
|
|
};
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
static void _e_xsettings_apply(Settings_Manager *sm);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
static Ecore_X_Atom _atom_manager = 0;
|
|
|
|
static Ecore_X_Atom _atom_xsettings = 0;
|
2012-12-21 04:03:11 -08:00
|
|
|
static Ecore_X_Atom _atom_gtk_iconthemes = 0;
|
|
|
|
static Ecore_X_Atom _atom_gtk_rcfiles = 0;
|
2011-09-24 15:05:15 -07:00
|
|
|
static Eina_List *managers = NULL;
|
|
|
|
static Eina_List *settings = NULL;
|
2011-09-26 18:56:08 -07:00
|
|
|
static Eina_Bool running = EINA_FALSE;
|
2012-07-25 00:48:19 -07:00
|
|
|
static Eio_File *eio_op = NULL;
|
|
|
|
static Eina_Bool setting = EINA_FALSE;
|
|
|
|
static Eina_Bool reset = EINA_FALSE;
|
2012-08-01 20:36:51 -07:00
|
|
|
static const char _setting_icon_theme_name[] = "Net/IconThemeName";
|
2013-01-11 02:34:29 -08:00
|
|
|
static const char _setting_theme_name[] = "Net/ThemeName";
|
|
|
|
static const char _setting_font_name[] = "Gtk/FontName";
|
|
|
|
static const char _setting_xft_dpi[] = "Xft/DPI";
|
2012-08-01 20:36:51 -07:00
|
|
|
static const char *_setting_theme = NULL;
|
2012-12-21 04:03:11 -08:00
|
|
|
static unsigned int event_ignore = 0;
|
2012-08-01 20:36:51 -07:00
|
|
|
|
2012-07-25 00:48:19 -07:00
|
|
|
static void _e_xsettings_done_cb(void *data, Eio_File *handler, const Eina_Stat *stat);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
static Ecore_X_Atom
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_atom_screen_get(int screen_num)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
2012-08-01 20:36:51 -07:00
|
|
|
char buf[32];
|
2011-09-24 15:05:15 -07:00
|
|
|
snprintf(buf, sizeof(buf), "_XSETTINGS_S%d", screen_num);
|
|
|
|
return ecore_x_atom_get(buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_selection_owner_set(Settings_Manager *sm)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
Ecore_X_Atom atom;
|
|
|
|
Ecore_X_Window cur_selection;
|
|
|
|
Eina_Bool ret;
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
atom = _e_xsettings_atom_screen_get(sm->man->num);
|
2011-09-24 15:05:15 -07:00
|
|
|
ecore_x_selection_owner_set(sm->selection, atom, ecore_x_current_time_get());
|
|
|
|
ecore_x_sync();
|
|
|
|
cur_selection = ecore_x_selection_owner_get(atom);
|
|
|
|
|
|
|
|
ret = (cur_selection == sm->selection);
|
|
|
|
if (!ret)
|
2012-06-13 08:17:23 -07:00
|
|
|
ERR("XSETTINGS: tried to set selection to %#x, but got %#x",
|
2013-01-11 02:34:29 -08:00
|
|
|
sm->selection, cur_selection);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_deactivate(Settings_Manager *sm)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
Ecore_X_Window old;
|
|
|
|
|
|
|
|
if (sm->selection == 0) return;
|
|
|
|
|
|
|
|
old = sm->selection;
|
|
|
|
sm->selection = 0;
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_selection_owner_set(sm);
|
2011-09-24 15:05:15 -07:00
|
|
|
ecore_x_sync();
|
|
|
|
ecore_x_window_free(old);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_activate(Settings_Manager *sm)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
Ecore_X_Atom atom;
|
|
|
|
Ecore_X_Window old_win;
|
|
|
|
|
|
|
|
if (sm->selection != 0) return 1;
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
atom = _e_xsettings_atom_screen_get(sm->man->num);
|
2011-09-24 15:05:15 -07:00
|
|
|
old_win = ecore_x_selection_owner_get(atom);
|
|
|
|
if (old_win != 0) return 0;
|
|
|
|
|
|
|
|
sm->selection = ecore_x_window_input_new(0, 0, 0, 1, 1);
|
|
|
|
if (sm->selection == 0)
|
|
|
|
return 0;
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
if (!_e_xsettings_selection_owner_set(sm))
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
ecore_x_window_free(sm->selection);
|
|
|
|
sm->selection = 0;
|
|
|
|
return 0;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
ecore_x_client_message32_send(e_manager_current_get()->root, _atom_manager,
|
2011-11-03 14:22:23 -07:00
|
|
|
ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
|
|
|
|
ecore_x_current_time_get(), atom,
|
|
|
|
sm->selection, 0, 0);
|
2012-08-01 20:36:51 -07:00
|
|
|
|
|
|
|
_e_xsettings_apply(sm);
|
|
|
|
|
2011-09-24 15:05:15 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_activate_retry(void *data)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
Settings_Manager *sm = data;
|
|
|
|
Eina_Bool ret;
|
|
|
|
|
2012-06-13 08:17:23 -07:00
|
|
|
INF("XSETTINGS: reactivate...");
|
2011-09-26 18:56:08 -07:00
|
|
|
ret = _e_xsettings_activate(sm);
|
2011-09-24 15:05:15 -07:00
|
|
|
if (ret)
|
2012-06-13 08:17:23 -07:00
|
|
|
INF("XSETTINGS: activate success!");
|
2011-09-24 15:05:15 -07:00
|
|
|
else
|
2012-06-13 08:17:23 -07:00
|
|
|
ERR("XSETTINGS: activate failure! retrying in %0.1f seconds", RETRY_TIMEOUT);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
if (!ret)
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
|
|
|
|
sm->timer_retry = NULL;
|
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_retry(Settings_Manager *sm)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
if (sm->timer_retry) return;
|
|
|
|
sm->timer_retry = ecore_timer_add
|
2013-01-11 02:34:29 -08:00
|
|
|
(RETRY_TIMEOUT, _e_xsettings_activate_retry, sm);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_string_set(const char *name, const char *value)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
Setting *s;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
if (!name) return;
|
2012-08-01 20:36:51 -07:00
|
|
|
if (name == _setting_theme_name)
|
|
|
|
e_config->xsettings.net_theme_name_detected = value;
|
|
|
|
name = eina_stringshare_add(name);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
EINA_LIST_FOREACH(settings, l, s)
|
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
if (s->type != SETTING_TYPE_STRING) continue;
|
|
|
|
if (s->name == name) break;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
if (!value)
|
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
if (!s) return;
|
2012-08-01 20:36:51 -07:00
|
|
|
DBG("remove %s\n", name);
|
|
|
|
eina_stringshare_del(name);
|
|
|
|
eina_stringshare_del(s->name);
|
2011-11-03 14:22:23 -07:00
|
|
|
eina_stringshare_del(s->s.value);
|
|
|
|
settings = eina_list_remove(settings, s);
|
|
|
|
E_FREE(s);
|
|
|
|
return;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
2012-08-01 20:36:51 -07:00
|
|
|
if (s)
|
2012-07-31 02:05:39 -07:00
|
|
|
{
|
2012-08-01 20:36:51 -07:00
|
|
|
DBG("update %s %s\n", name, value);
|
|
|
|
eina_stringshare_del(name);
|
|
|
|
eina_stringshare_replace(&s->s.value, value);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DBG("add %s %s\n", name, value);
|
2011-11-03 14:22:23 -07:00
|
|
|
s = E_NEW(Setting, 1);
|
|
|
|
s->type = SETTING_TYPE_STRING;
|
|
|
|
s->name = name;
|
2012-08-01 20:36:51 -07:00
|
|
|
s->s.value = eina_stringshare_add(value);
|
2011-11-03 14:22:23 -07:00
|
|
|
settings = eina_list_append(settings, s);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
2011-11-03 14:22:23 -07:00
|
|
|
|
2011-09-24 15:05:15 -07:00
|
|
|
/* type + pad + name-len + last-change-serial + str_len */
|
|
|
|
s->length = 12;
|
|
|
|
s->length += OFFSET_ADD(strlen(name));
|
|
|
|
s->length += OFFSET_ADD(strlen(value));
|
|
|
|
s->last_change = ecore_x_current_time_get();
|
|
|
|
}
|
|
|
|
|
2012-05-03 19:34:56 -07:00
|
|
|
#if 0
|
2011-09-24 15:05:15 -07:00
|
|
|
static void
|
2011-11-03 14:22:23 -07:00
|
|
|
_e_xsettings_int_set(const char *name, int value, Eina_Bool set)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
Setting *s;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
if (!name) return;
|
2012-08-01 20:36:51 -07:00
|
|
|
name = eina_stringshare_add(name);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
EINA_LIST_FOREACH(settings, l, s)
|
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
if (s->type != SETTING_TYPE_INT) continue;
|
|
|
|
if (s->name == name) break;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
2011-11-03 14:22:23 -07:00
|
|
|
if (!set)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
if (!s) return;
|
2012-06-13 08:17:23 -07:00
|
|
|
DBG("remove %s\n", name);
|
2012-08-01 20:36:51 -07:00
|
|
|
eina_stringshare_del(name);
|
|
|
|
eina_stringshare_del(s->name);
|
2011-11-03 14:22:23 -07:00
|
|
|
settings = eina_list_remove(settings, s);
|
|
|
|
E_FREE(s);
|
|
|
|
return;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
if (s)
|
|
|
|
{
|
2012-06-13 08:17:23 -07:00
|
|
|
DBG("update %s %d\n", name, value);
|
2012-08-01 20:36:51 -07:00
|
|
|
eina_stringshare_del(name);
|
2011-11-03 14:22:23 -07:00
|
|
|
s->i.value = value;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-06-13 08:17:23 -07:00
|
|
|
DBG("add %s %d\n", name, value);
|
2011-11-03 14:22:23 -07:00
|
|
|
s = E_NEW(Setting, 1);
|
|
|
|
s->type = SETTING_TYPE_INT;
|
|
|
|
s->name = name;
|
|
|
|
s->i.value = value;
|
|
|
|
settings = eina_list_append(settings, s);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
2011-11-03 14:22:23 -07:00
|
|
|
|
2011-10-05 02:37:59 -07:00
|
|
|
// type + pad + name-len + last-change-serial + value
|
2011-09-24 15:05:15 -07:00
|
|
|
s->length = 12;
|
|
|
|
s->length += OFFSET_ADD(strlen(name));
|
|
|
|
}
|
2013-01-11 02:34:29 -08:00
|
|
|
|
2012-05-03 19:34:56 -07:00
|
|
|
#endif
|
2011-11-03 14:22:23 -07:00
|
|
|
|
2011-09-24 15:05:15 -07:00
|
|
|
static unsigned char *
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_copy(unsigned char *buffer, Setting *s)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
size_t str_len;
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
buffer[0] = s->type;
|
|
|
|
buffer[1] = 0;
|
|
|
|
buffer += 2;
|
|
|
|
|
|
|
|
str_len = strlen(s->name);
|
2013-01-03 03:21:24 -08:00
|
|
|
*(C16 *)(buffer) = str_len;
|
2011-09-24 15:05:15 -07:00
|
|
|
buffer += 2;
|
|
|
|
|
|
|
|
memcpy(buffer, s->name, str_len);
|
|
|
|
buffer += str_len;
|
|
|
|
|
|
|
|
len = OFFSET_ADD(str_len) - str_len;
|
|
|
|
memset(buffer, 0, len);
|
|
|
|
buffer += len;
|
|
|
|
|
2013-01-03 03:21:24 -08:00
|
|
|
*(C32 *)(buffer) = s->last_change;
|
2011-09-24 15:05:15 -07:00
|
|
|
buffer += 4;
|
|
|
|
|
|
|
|
switch (s->type)
|
|
|
|
{
|
|
|
|
case SETTING_TYPE_INT:
|
2013-01-11 02:34:29 -08:00
|
|
|
*(C32 *)(buffer) = s->i.value;
|
|
|
|
buffer += 4;
|
|
|
|
break;
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
case SETTING_TYPE_STRING:
|
2013-01-11 02:34:29 -08:00
|
|
|
str_len = strlen(s->s.value);
|
|
|
|
*(C32 *)(buffer) = str_len;
|
|
|
|
buffer += 4;
|
2011-09-24 15:05:15 -07:00
|
|
|
|
2013-01-11 02:34:29 -08:00
|
|
|
memcpy(buffer, s->s.value, str_len);
|
|
|
|
buffer += str_len;
|
2011-09-24 15:05:15 -07:00
|
|
|
|
2013-01-11 02:34:29 -08:00
|
|
|
len = OFFSET_ADD(str_len) - str_len;
|
|
|
|
memset(buffer, 0, len);
|
|
|
|
buffer += len;
|
|
|
|
break;
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
case SETTING_TYPE_COLOR:
|
2013-01-11 02:34:29 -08:00
|
|
|
*(C16 *)(buffer) = s->c.red;
|
|
|
|
*(C16 *)(buffer + 2) = s->c.green;
|
|
|
|
*(C16 *)(buffer + 4) = s->c.blue;
|
|
|
|
*(C16 *)(buffer + 6) = s->c.alpha;
|
|
|
|
buffer += 8;
|
|
|
|
break;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_apply(Settings_Manager *sm)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
unsigned char *data;
|
|
|
|
unsigned char *pos;
|
|
|
|
size_t len = 12;
|
|
|
|
Setting *s;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(settings, l, s)
|
|
|
|
len += s->length;
|
|
|
|
|
|
|
|
pos = data = malloc(len);
|
|
|
|
if (!data) return;
|
2011-11-03 14:22:23 -07:00
|
|
|
|
2011-09-24 15:05:15 -07:00
|
|
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
2013-01-11 02:34:29 -08:00
|
|
|
*pos = 0; //LSBFirst
|
2011-09-24 15:05:15 -07:00
|
|
|
#else
|
2013-01-11 02:34:29 -08:00
|
|
|
*pos = 1; //MSBFirst
|
2011-09-24 15:05:15 -07:00
|
|
|
#endif
|
|
|
|
|
|
|
|
pos += 4;
|
2013-01-11 02:34:29 -08:00
|
|
|
*(C32 *)pos = sm->serial++;
|
2011-09-24 15:05:15 -07:00
|
|
|
pos += 4;
|
2013-01-11 02:34:29 -08:00
|
|
|
*(C32 *)pos = eina_list_count(settings);
|
2011-09-24 15:05:15 -07:00
|
|
|
pos += 4;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(settings, l, s)
|
2011-09-26 18:56:08 -07:00
|
|
|
pos = _e_xsettings_copy(pos, s);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
ecore_x_window_prop_property_set(sm->selection,
|
2011-11-03 14:22:23 -07:00
|
|
|
_atom_xsettings,
|
|
|
|
_atom_xsettings,
|
|
|
|
8, data, len);
|
2011-09-24 15:05:15 -07:00
|
|
|
free(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_update(void)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
Settings_Manager *sm;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(managers, l, sm)
|
2011-09-26 18:56:08 -07:00
|
|
|
if (sm->selection) _e_xsettings_apply(sm);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
2012-12-21 04:03:11 -08:00
|
|
|
static void
|
|
|
|
_e_xsettings_gtk_icon_update(void)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
2012-12-21 04:03:11 -08:00
|
|
|
Eina_List *l;
|
|
|
|
E_Border *bd;
|
2011-09-24 15:05:15 -07:00
|
|
|
|
2012-12-21 04:03:11 -08:00
|
|
|
EINA_LIST_FOREACH(e_border_client_list(), l, bd)
|
|
|
|
if (bd->client.icccm.state) ecore_x_client_message8_send(bd->client.win, _atom_gtk_iconthemes, NULL, 0);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
2012-12-21 04:03:11 -08:00
|
|
|
static void
|
|
|
|
_e_xsettings_gtk_rcfiles_update(void)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(e_border_client_list(), l, bd)
|
|
|
|
if (bd->client.icccm.state) ecore_x_client_message8_send(bd->client.win, _atom_gtk_rcfiles, NULL, 0);
|
|
|
|
}
|
2011-09-24 15:05:15 -07:00
|
|
|
|
|
|
|
static void
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_icon_theme_set(void)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
if (e_config->xsettings.match_e17_icon_theme)
|
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
_e_xsettings_string_set(_setting_icon_theme_name,
|
|
|
|
e_config->icon_theme);
|
|
|
|
return;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
2011-11-03 14:22:23 -07:00
|
|
|
|
|
|
|
if (e_config->xsettings.net_icon_theme_name)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
_e_xsettings_string_set(_setting_icon_theme_name,
|
2013-01-11 02:34:29 -08:00
|
|
|
e_config->xsettings.net_icon_theme_name);
|
2011-11-03 14:22:23 -07:00
|
|
|
return;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_string_set(_setting_icon_theme_name, NULL);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
2012-07-25 00:48:19 -07:00
|
|
|
static void
|
|
|
|
_e_xsettings_error_cb(void *data, Eio_File *handler __UNUSED__, int error __UNUSED__)
|
|
|
|
{
|
|
|
|
Eina_List *l = data;
|
|
|
|
if (reset || setting)
|
|
|
|
{
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
if (reset || (!l)) l = efreet_data_dirs_get();
|
2013-01-11 02:34:29 -08:00
|
|
|
else if (l)
|
|
|
|
l = l->next;
|
2012-07-25 00:48:19 -07:00
|
|
|
reset = EINA_FALSE;
|
|
|
|
if (l)
|
|
|
|
{
|
2013-01-11 02:34:29 -08:00
|
|
|
snprintf(buf, sizeof(buf), "%s/themes/%s", (char *)eina_list_data_get(l), _setting_theme);
|
2012-07-25 00:48:19 -07:00
|
|
|
eio_op = eio_file_direct_stat(buf, _e_xsettings_done_cb, _e_xsettings_error_cb, l);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
eio_op = NULL;
|
|
|
|
setting = EINA_FALSE;
|
2012-08-01 20:36:51 -07:00
|
|
|
_setting_theme = NULL;
|
2012-07-25 00:48:19 -07:00
|
|
|
|
|
|
|
if (e_config->xsettings.net_theme_name)
|
2012-12-21 04:03:11 -08:00
|
|
|
_e_xsettings_string_set(_setting_theme_name, e_config->xsettings.net_theme_name);
|
|
|
|
else
|
|
|
|
_e_xsettings_string_set(_setting_theme_name, NULL);
|
2012-11-06 07:21:11 -08:00
|
|
|
_e_xsettings_update();
|
2012-12-21 04:03:11 -08:00
|
|
|
_e_xsettings_gtk_rcfiles_update();
|
2012-07-25 00:48:19 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-26 05:01:00 -07:00
|
|
|
_e_xsettings_done_cb(void *data __UNUSED__, Eio_File *handler __UNUSED__, const Eina_Stat *estat __UNUSED__)
|
2012-07-25 00:48:19 -07:00
|
|
|
{
|
|
|
|
if (reset)
|
|
|
|
{
|
|
|
|
/* should not happen */
|
|
|
|
_e_xsettings_error_cb(NULL, NULL, 0);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
_e_xsettings_string_set(_setting_theme_name, _setting_theme);
|
2012-08-01 20:36:51 -07:00
|
|
|
_setting_theme = NULL;
|
2012-07-25 00:48:19 -07:00
|
|
|
eio_op = NULL;
|
|
|
|
setting = EINA_FALSE;
|
2012-11-06 07:21:11 -08:00
|
|
|
_e_xsettings_update();
|
2012-12-21 04:03:11 -08:00
|
|
|
_e_xsettings_gtk_rcfiles_update();
|
2012-07-25 00:48:19 -07:00
|
|
|
}
|
|
|
|
|
2011-09-24 15:05:15 -07:00
|
|
|
static void
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_theme_set(void)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
if (e_config->xsettings.match_e17_theme)
|
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
E_Config_Theme *ct;
|
|
|
|
if ((ct = e_theme_config_get("theme")))
|
|
|
|
{
|
2012-07-25 00:48:19 -07:00
|
|
|
if ((_setting_theme = edje_file_data_get(ct->file, "gtk-theme")))
|
2011-11-03 14:22:23 -07:00
|
|
|
{
|
2012-07-25 00:48:19 -07:00
|
|
|
char buf[PATH_MAX];
|
|
|
|
|
|
|
|
e_user_homedir_snprintf(buf, sizeof(buf), ".themes/%s", _setting_theme);
|
|
|
|
eio_op = eio_file_direct_stat(buf, _e_xsettings_done_cb, _e_xsettings_error_cb, NULL);
|
|
|
|
setting = EINA_TRUE;
|
|
|
|
return;
|
2011-11-03 14:22:23 -07:00
|
|
|
}
|
|
|
|
}
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
2011-11-03 14:22:23 -07:00
|
|
|
|
|
|
|
if (e_config->xsettings.net_theme_name)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
_e_xsettings_string_set(_setting_theme_name,
|
2013-01-11 02:34:29 -08:00
|
|
|
e_config->xsettings.net_theme_name);
|
2011-11-03 14:22:23 -07:00
|
|
|
return;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
_e_xsettings_string_set(_setting_theme_name, NULL);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
2011-11-01 06:59:44 -07:00
|
|
|
static void
|
|
|
|
_e_xsettings_font_set(void)
|
|
|
|
{
|
|
|
|
E_Font_Default *efd;
|
|
|
|
E_Font_Properties *efp;
|
2011-11-03 14:22:23 -07:00
|
|
|
|
2011-11-01 06:59:44 -07:00
|
|
|
efd = e_font_default_get("application");
|
|
|
|
|
|
|
|
if (efd && efd->font)
|
|
|
|
{
|
|
|
|
efp = e_font_fontconfig_name_parse(efd->font);
|
|
|
|
if (efp->name)
|
|
|
|
{
|
2012-09-28 05:04:34 -07:00
|
|
|
Eina_Strbuf *buf;
|
|
|
|
Eina_List *l;
|
2011-11-01 06:59:44 -07:00
|
|
|
int size = efd->size;
|
2012-09-28 05:04:34 -07:00
|
|
|
char size_buf[8];
|
|
|
|
const char *p;
|
|
|
|
|
2011-11-01 06:59:44 -07:00
|
|
|
/* TODO better way to convert evas font sizes? */
|
|
|
|
if (size < 0) size /= -10;
|
|
|
|
if (size < 5) size = 5;
|
|
|
|
if (size > 25) size = 25;
|
2012-09-28 05:04:34 -07:00
|
|
|
snprintf(size_buf, sizeof(size_buf), "%d", size);
|
2011-11-01 06:59:44 -07:00
|
|
|
|
2012-09-28 05:04:34 -07:00
|
|
|
buf = eina_strbuf_new();
|
|
|
|
eina_strbuf_append(buf, efp->name);
|
|
|
|
eina_strbuf_append_char(buf, ' ');
|
|
|
|
EINA_LIST_FOREACH(efp->styles, l, p)
|
|
|
|
{
|
|
|
|
eina_strbuf_append(buf, p);
|
|
|
|
eina_strbuf_append_char(buf, ' ');
|
|
|
|
}
|
|
|
|
eina_strbuf_append(buf, size_buf);
|
|
|
|
_e_xsettings_string_set(_setting_font_name, eina_strbuf_string_get(buf));
|
|
|
|
eina_strbuf_free(buf);
|
2011-11-01 06:59:44 -07:00
|
|
|
e_font_properties_free(efp);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
e_font_properties_free(efp);
|
|
|
|
}
|
|
|
|
|
|
|
|
_e_xsettings_string_set(_setting_font_name, NULL);
|
|
|
|
}
|
|
|
|
|
2012-05-03 19:34:56 -07:00
|
|
|
#if 0
|
2011-11-03 14:22:23 -07:00
|
|
|
static void
|
|
|
|
_e_xsettings_xft_set(void)
|
|
|
|
{
|
|
|
|
if (e_config->scale.use_dpi)
|
|
|
|
_e_xsettings_int_set(_setting_xft_dpi, e_config->scale.base_dpi, EINA_TRUE);
|
|
|
|
else
|
|
|
|
_e_xsettings_int_set(_setting_xft_dpi, 0, EINA_FALSE);
|
|
|
|
}
|
2013-01-11 02:34:29 -08:00
|
|
|
|
2012-05-03 19:34:56 -07:00
|
|
|
#endif
|
2011-11-03 14:22:23 -07:00
|
|
|
|
2012-09-18 23:58:50 -07:00
|
|
|
static void
|
|
|
|
_e_xsettings_cursor_path_set(void)
|
|
|
|
{
|
|
|
|
struct stat st;
|
|
|
|
char buf[PATH_MAX], env[4096], *path;
|
|
|
|
|
|
|
|
e_user_homedir_concat_static(buf, ".icons");
|
|
|
|
|
|
|
|
if (stat(buf, &st)) return;
|
|
|
|
path = getenv("XCURSOR_PATH");
|
|
|
|
if (path)
|
|
|
|
{
|
2013-01-11 02:34:29 -08:00
|
|
|
if (!strstr(path, buf))
|
|
|
|
{
|
|
|
|
snprintf(env, sizeof(env), "%s:%s", buf, path);
|
|
|
|
path = env;
|
|
|
|
}
|
2012-09-18 23:58:50 -07:00
|
|
|
}
|
|
|
|
else
|
2012-09-27 06:02:18 -07:00
|
|
|
{
|
2013-01-11 02:34:29 -08:00
|
|
|
snprintf(env, sizeof(env), "%s:%s", buf, "/usr/share/icons");
|
|
|
|
path = env;
|
2012-09-27 06:02:18 -07:00
|
|
|
}
|
2012-09-18 23:58:50 -07:00
|
|
|
e_env_set("XCURSOR_PATH", path);
|
|
|
|
}
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
static void
|
|
|
|
_e_xsettings_start(void)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
E_Manager *man;
|
2012-08-01 20:36:51 -07:00
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
if (running) return;
|
2012-08-01 20:36:51 -07:00
|
|
|
|
|
|
|
_e_xsettings_theme_set();
|
|
|
|
_e_xsettings_icon_theme_set();
|
|
|
|
_e_xsettings_font_set();
|
2012-09-18 23:58:50 -07:00
|
|
|
_e_xsettings_cursor_path_set();
|
2012-08-01 20:36:51 -07:00
|
|
|
|
2011-09-24 15:05:15 -07:00
|
|
|
EINA_LIST_FOREACH(e_manager_list(), l, man)
|
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
Settings_Manager *sm = E_NEW(Settings_Manager, 1);
|
|
|
|
sm->man = man;
|
2012-08-01 20:36:51 -07:00
|
|
|
|
2011-11-03 14:22:23 -07:00
|
|
|
if (!_e_xsettings_activate(sm))
|
|
|
|
_e_xsettings_retry(sm);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
2011-11-03 14:22:23 -07:00
|
|
|
managers = eina_list_append(managers, sm);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
running = EINA_TRUE;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
static void
|
|
|
|
_e_xsettings_stop(void)
|
2011-09-24 15:05:15 -07:00
|
|
|
{
|
|
|
|
Settings_Manager *sm;
|
|
|
|
Setting *s;
|
2011-09-26 18:56:08 -07:00
|
|
|
|
|
|
|
if (!running) return;
|
2011-11-01 06:59:44 -07:00
|
|
|
|
2011-09-24 15:05:15 -07:00
|
|
|
EINA_LIST_FREE(managers, sm)
|
|
|
|
{
|
2011-11-03 14:22:23 -07:00
|
|
|
if (sm->timer_retry)
|
|
|
|
ecore_timer_del(sm->timer_retry);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
2011-11-03 14:22:23 -07:00
|
|
|
_e_xsettings_deactivate(sm);
|
2011-09-24 15:05:15 -07:00
|
|
|
|
2011-11-03 14:22:23 -07:00
|
|
|
E_FREE(sm);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EINA_LIST_FREE(settings, s)
|
|
|
|
{
|
2012-08-01 20:36:51 -07:00
|
|
|
if (s->name) eina_stringshare_del(s->name);
|
2011-11-03 14:22:23 -07:00
|
|
|
if (s->s.value) eina_stringshare_del(s->s.value);
|
|
|
|
E_FREE(s);
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
running = EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EINTERN int
|
|
|
|
e_xsettings_init(void)
|
|
|
|
{
|
|
|
|
_atom_manager = ecore_x_atom_get("MANAGER");
|
|
|
|
_atom_xsettings = ecore_x_atom_get("_XSETTINGS_SETTINGS");
|
2012-12-21 04:03:11 -08:00
|
|
|
_atom_gtk_iconthemes = ecore_x_atom_get("_GTK_LOAD_ICONTHEMES");
|
|
|
|
_atom_gtk_rcfiles = ecore_x_atom_get("_GTK_READ_RCFILES");
|
2011-09-26 18:56:08 -07:00
|
|
|
|
|
|
|
if (e_config->xsettings.enabled)
|
|
|
|
_e_xsettings_start();
|
2011-11-03 14:22:23 -07:00
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EINTERN int
|
|
|
|
e_xsettings_shutdown(void)
|
|
|
|
{
|
|
|
|
_e_xsettings_stop();
|
2012-07-25 00:48:19 -07:00
|
|
|
if (eio_op) eio_file_cancel(eio_op);
|
|
|
|
eio_op = NULL;
|
2012-08-01 20:36:51 -07:00
|
|
|
setting = EINA_FALSE;
|
2012-12-21 04:03:11 -08:00
|
|
|
event_ignore = 0;
|
2011-11-03 14:22:23 -07:00
|
|
|
|
2011-09-24 15:05:15 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_xsettings_config_update(void)
|
|
|
|
{
|
2012-07-25 00:48:19 -07:00
|
|
|
setting = EINA_FALSE;
|
|
|
|
if (eio_op) eio_file_cancel(eio_op);
|
2011-09-26 18:56:08 -07:00
|
|
|
if (!e_config->xsettings.enabled)
|
|
|
|
{
|
|
|
|
_e_xsettings_stop();
|
|
|
|
return;
|
|
|
|
}
|
2011-11-03 14:22:23 -07:00
|
|
|
|
2011-09-26 18:56:08 -07:00
|
|
|
if (!running)
|
2012-08-01 20:36:51 -07:00
|
|
|
{
|
|
|
|
_e_xsettings_start();
|
|
|
|
}
|
2011-09-26 18:56:08 -07:00
|
|
|
else
|
|
|
|
{
|
2012-08-01 20:36:51 -07:00
|
|
|
_e_xsettings_theme_set();
|
|
|
|
_e_xsettings_icon_theme_set();
|
|
|
|
_e_xsettings_font_set();
|
|
|
|
_e_xsettings_update();
|
2012-12-21 04:03:11 -08:00
|
|
|
_e_xsettings_gtk_icon_update();
|
|
|
|
_e_xsettings_gtk_rcfiles_update();
|
2012-07-25 00:48:19 -07:00
|
|
|
reset = EINA_TRUE;
|
2011-11-03 14:22:23 -07:00
|
|
|
}
|
2012-12-21 04:03:11 -08:00
|
|
|
event_ignore++;
|
2011-09-24 15:05:15 -07:00
|
|
|
}
|
2013-01-11 02:34:29 -08:00
|
|
|
|