forked from enlightenment/efl
Ecore_X(cb): Add simple .Xdefaults file parser for getting dpi, cursor
size, etc. NB: Xcb has no support for xrdb (yet), so parse dpi, etc from .Xdefaults (if exists). SVN revision: 63299
This commit is contained in:
parent
1a1248b689
commit
67a369fee3
|
@ -67,7 +67,8 @@ libecore_x_xcb_la_SOURCES = \
|
||||||
ecore_xcb_xinerama.c \
|
ecore_xcb_xinerama.c \
|
||||||
ecore_xcb_error.c \
|
ecore_xcb_error.c \
|
||||||
ecore_xcb_xtest.c \
|
ecore_xcb_xtest.c \
|
||||||
ecore_xcb_vsync.c
|
ecore_xcb_vsync.c \
|
||||||
|
ecore_xcb_xdefaults.c
|
||||||
|
|
||||||
libecore_x_xcb_la_LIBADD = \
|
libecore_x_xcb_la_LIBADD = \
|
||||||
@XCB_DAMAGE_LIBS@ \
|
@XCB_DAMAGE_LIBS@ \
|
||||||
|
|
|
@ -1376,6 +1376,9 @@ _ecore_xcb_fd_handle(void *data, Ecore_Fd_Handler *hdlr __UNUSED__)
|
||||||
|
|
||||||
while ((ev = xcb_poll_for_event(conn)))
|
while ((ev = xcb_poll_for_event(conn)))
|
||||||
{
|
{
|
||||||
|
/* NB: Ecore Xlib uses filterevent for xim, but xcb does not support
|
||||||
|
* xim, so no need for it here */
|
||||||
|
|
||||||
/* check for errors first */
|
/* check for errors first */
|
||||||
if (xcb_connection_has_error(conn))
|
if (xcb_connection_has_error(conn))
|
||||||
{
|
{
|
||||||
|
|
|
@ -76,6 +76,7 @@ _ecore_xcb_composite_finalize(void)
|
||||||
EAPI Eina_Bool
|
EAPI Eina_Bool
|
||||||
ecore_x_composite_query(void)
|
ecore_x_composite_query(void)
|
||||||
{
|
{
|
||||||
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
return _composite_avail;
|
return _composite_avail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ ecore_x_cursor_new(Ecore_X_Window win, int *pixels, int w, int h, int hot_x, int
|
||||||
Ecore_X_Cursor cursor = 0;
|
Ecore_X_Cursor cursor = 0;
|
||||||
xcb_image_t *img;
|
xcb_image_t *img;
|
||||||
|
|
||||||
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
// LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
|
|
||||||
#ifdef ECORE_XCB_CURSOR
|
#ifdef ECORE_XCB_CURSOR
|
||||||
if (_ecore_xcb_cursor)
|
if (_ecore_xcb_cursor)
|
||||||
|
@ -228,7 +228,7 @@ ecore_x_cursor_new(Ecore_X_Window win, int *pixels, int w, int h, int hot_x, int
|
||||||
EAPI void
|
EAPI void
|
||||||
ecore_x_cursor_free(Ecore_X_Cursor c)
|
ecore_x_cursor_free(Ecore_X_Cursor c)
|
||||||
{
|
{
|
||||||
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
// LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
|
|
||||||
xcb_free_cursor(_ecore_xcb_conn, c);
|
xcb_free_cursor(_ecore_xcb_conn, c);
|
||||||
}
|
}
|
||||||
|
@ -295,25 +295,34 @@ _ecore_xcb_cursor_format_get(void)
|
||||||
static void
|
static void
|
||||||
_ecore_xcb_cursor_default_size_get(void)
|
_ecore_xcb_cursor_default_size_get(void)
|
||||||
{
|
{
|
||||||
|
char *s = NULL;
|
||||||
|
int v = 0;
|
||||||
|
|
||||||
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
|
|
||||||
/* char *v = NULL; */
|
s = getenv("XCURSOR_SIZE");
|
||||||
|
if (!s)
|
||||||
/* v = getenv("XCURSOR_SIZE"); */
|
{
|
||||||
/* if (!v) */
|
_ecore_xcb_xdefaults_init();
|
||||||
/* v = _ecore_xcb_resource_get_string("Xcursor", "size"); */
|
v = _ecore_xcb_xdefaults_int_get("Xcursor", "size");
|
||||||
/* if (v) _ecore_xcb_cursor_size = ((atoi(v) * 16) / 72); */
|
_ecore_xcb_xdefaults_shutdown();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
v = atoi(s);
|
||||||
|
if (v) _ecore_xcb_cursor_size = ((v * 16) / 72);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ecore_xcb_cursor_dpi_size_get(void)
|
_ecore_xcb_cursor_dpi_size_get(void)
|
||||||
{
|
{
|
||||||
|
int v = 0;
|
||||||
|
|
||||||
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
|
|
||||||
/* int v = 0; */
|
_ecore_xcb_xdefaults_init();
|
||||||
|
v = _ecore_xcb_xdefaults_int_get("Xft", "dpi");
|
||||||
/* v = _ecore_xcb_resource_get_int("Xft", "dpi"); */
|
if (v) _ecore_xcb_cursor_size = ((v * 16) / 72);
|
||||||
/* if (v) _ecore_xcb_cursor_size = ((v * 16) / 72); */
|
_ecore_xcb_xdefaults_shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -337,4 +337,9 @@ int _ecore_xcb_io_error_handle(xcb_generic_error_t *err);
|
||||||
|
|
||||||
xcb_image_t *_ecore_xcb_image_create_native(int w, int h, xcb_image_format_t format, uint8_t depth, void *base, uint32_t bytes, uint8_t *data);
|
xcb_image_t *_ecore_xcb_image_create_native(int w, int h, xcb_image_format_t format, uint8_t depth, void *base, uint32_t bytes, uint8_t *data);
|
||||||
|
|
||||||
|
void _ecore_xcb_xdefaults_init(void);
|
||||||
|
void _ecore_xcb_xdefaults_shutdown(void);
|
||||||
|
char *_ecore_xcb_xdefaults_string_get(const char *prog, const char *param);
|
||||||
|
int _ecore_xcb_xdefaults_int_get(const char *prog, const char *param);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
#include "ecore_xcb_private.h"
|
||||||
|
#include <fnmatch.h>
|
||||||
|
|
||||||
|
/* local function prototypes */
|
||||||
|
static Eina_Bool _ecore_xcb_xdefaults_glob_match(const char *str, const char *glob);
|
||||||
|
|
||||||
|
/* local variables */
|
||||||
|
static Eina_File *_ecore_xcb_xdefaults_file = NULL;
|
||||||
|
static char *_ecore_xcb_xdefaults_data = NULL;
|
||||||
|
|
||||||
|
void
|
||||||
|
_ecore_xcb_xdefaults_init(void)
|
||||||
|
{
|
||||||
|
char buff[PATH_MAX];
|
||||||
|
|
||||||
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
|
|
||||||
|
snprintf(buff, sizeof(buff), "%s/.Xdefaults", getenv("HOME"));
|
||||||
|
if ((_ecore_xcb_xdefaults_file = eina_file_open(buff, EINA_FALSE)))
|
||||||
|
{
|
||||||
|
eina_mmap_safety_enabled_set(EINA_TRUE);
|
||||||
|
|
||||||
|
_ecore_xcb_xdefaults_data =
|
||||||
|
eina_file_map_all(_ecore_xcb_xdefaults_file, EINA_FILE_SEQUENTIAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_ecore_xcb_xdefaults_shutdown(void)
|
||||||
|
{
|
||||||
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
|
|
||||||
|
if (!_ecore_xcb_xdefaults_file) return;
|
||||||
|
if (_ecore_xcb_xdefaults_data)
|
||||||
|
eina_file_map_free(_ecore_xcb_xdefaults_file, _ecore_xcb_xdefaults_data);
|
||||||
|
if (_ecore_xcb_xdefaults_file) eina_file_close(_ecore_xcb_xdefaults_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
_ecore_xcb_xdefaults_string_get(const char *prog, const char *param)
|
||||||
|
{
|
||||||
|
char buff[1024], ret[1024];
|
||||||
|
char *str = NULL;
|
||||||
|
char **ea = NULL;
|
||||||
|
unsigned int count = 0, i = 0;
|
||||||
|
|
||||||
|
if ((!_ecore_xcb_xdefaults_data) || (!_ecore_xcb_xdefaults_file))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
|
||||||
|
|
||||||
|
str = _ecore_xcb_xdefaults_data;
|
||||||
|
ea = eina_str_split_full(str, "\n", -1, &count);
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
if (_ecore_xcb_xdefaults_glob_match(ea[i], buff))
|
||||||
|
sscanf(ea[i], "%*[^:]:%*[ ]%s", ret);
|
||||||
|
}
|
||||||
|
if ((ea) && (ea[0]))
|
||||||
|
{
|
||||||
|
free(ea[0]);
|
||||||
|
free(ea);
|
||||||
|
}
|
||||||
|
|
||||||
|
return strdup(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_ecore_xcb_xdefaults_int_get(const char *prog, const char *param)
|
||||||
|
{
|
||||||
|
char buff[1024];
|
||||||
|
char *str = NULL;
|
||||||
|
char **ea = NULL;
|
||||||
|
unsigned int count = 0, i = 0;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if ((!_ecore_xcb_xdefaults_data) || (!_ecore_xcb_xdefaults_file))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
|
||||||
|
|
||||||
|
str = _ecore_xcb_xdefaults_data;
|
||||||
|
ea = eina_str_split_full(str, "\n", -1, &count);
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
if (_ecore_xcb_xdefaults_glob_match(ea[i], buff))
|
||||||
|
sscanf(ea[i], "%*[^:]:%*[ ]%d", &ret);
|
||||||
|
}
|
||||||
|
if ((ea) && (ea[0]))
|
||||||
|
{
|
||||||
|
free(ea[0]);
|
||||||
|
free(ea);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* local functions */
|
||||||
|
static Eina_Bool
|
||||||
|
_ecore_xcb_xdefaults_glob_match(const char *str, const char *glob)
|
||||||
|
{
|
||||||
|
if ((!str) || (!glob)) return EINA_FALSE;
|
||||||
|
if (glob[0] == 0)
|
||||||
|
{
|
||||||
|
if (str[0] == 0) return EINA_TRUE;
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
if (!strcmp(glob, "*")) return EINA_TRUE;
|
||||||
|
if (!fnmatch(glob, str, 0)) return EINA_TRUE;
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
Loading…
Reference in New Issue