load ~/.Xdefaults less often, make it shared and free its resources.

SVN revision: 48420
This commit is contained in:
Gustavo Sverzut Barbieri 2010-04-29 15:32:47 +00:00
parent 843fb898ef
commit 2e4b0fddd8
4 changed files with 285 additions and 82 deletions

View File

@ -114,6 +114,51 @@ int _evas_engine_GL_X11_log_dom = -1;
/* function tables - filled in later (func and parent func) */
static Evas_Func func, pfunc;
struct xrdb_user
{
time_t last_stat;
time_t last_mtime;
XrmDatabase db;
};
static struct xrdb_user xrdb_user = {0, 0, NULL};
static Eina_Bool
xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
{
time_t last = xrdb_user.last_stat, now = time(NULL);
xrdb_user.last_stat = now;
if (last != now) /* don't stat() more than once every second */
{
struct stat st;
const char *home = getenv("HOME");
char tmp[PATH_MAX];
if (!home) goto failed;
snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
if (stat(tmp, &st) != 0) goto failed;
if (xrdb_user.last_mtime != st.st_mtime)
{
if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
xrdb_user.db = XrmGetFileDatabase(tmp);
if (!xrdb_user.db) goto failed;
xrdb_user.last_mtime = st.st_mtime;
}
}
if (!xrdb_user.db) return EINA_FALSE;
return XrmGetResource(xrdb_user.db, name, cls, type, val);
failed:
if (xrdb_user.db)
{
XrmDestroyDatabase(xrdb_user.db);
xrdb_user.db = NULL;
}
xrdb_user.last_mtime = 0;
return EINA_FALSE;
}
typedef struct _Render_Engine Render_Engine;
struct _Render_Engine
@ -123,9 +168,7 @@ struct _Render_Engine
Evas *evas;
int end;
// TODO: maybe use these as shared global resources, acquired only once?
XrmDatabase xrdb_dpy; // xres - dpi
XrmDatabase xrdb_user;
XrmDatabase xrdb; // xres - dpi
struct { // xres - dpi
int dpi; // xres - dpi
} xr; // xres - dpi
@ -195,26 +238,16 @@ eng_setup(Evas *e, void *in)
{
int status;
char *type = NULL;
const char *home;
XrmValue val;
re->xr.dpi = 75000; // dpy * 1000
if ((home = getenv("HOME")))
{
char tmp[PATH_MAX];
snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
re->xrdb_user = XrmGetFileDatabase(tmp);
if (re->xrdb_user)
status = XrmGetResource(re->xrdb_user,
"Xft.dpi", "Xft.Dpi", &type, &val);
}
status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
if ((!status) || (!type))
{
re->xrdb_dpy = XrmGetDatabase(info->info.display);
if (re->xrdb_dpy)
status = XrmGetResource(re->xrdb_dpy,
if (!re->xrdb) re->xrdb = XrmGetDatabase(info->info.display);
if (re->xrdb)
status = XrmGetResource(re->xrdb,
"Xft.dpi", "Xft.Dpi", &type, &val);
}
@ -326,9 +359,10 @@ eng_output_free(void *data)
Render_Engine *re;
re = (Render_Engine *)data;
// if (re->xrdb_user) XrmDestroyDatabase(re->xrdb_user);
// if (re->xrdb_dpy) XrmDestroyDatabase(re->xrdb_dpy);
// NOTE: XrmGetDatabase() result is shared per connection, do not free it.
// if (re->xrdb) XrmDestroyDatabase(re->xrdb);
eng_window_free(re->win);
free(re);
@ -1905,6 +1939,13 @@ eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__)
static int
module_open(Evas_Module *em)
{
static Eina_Bool xrm_inited = EINA_FALSE;
if (!xrm_inited)
{
xrm_inited = EINA_TRUE;
XrmInitialize();
}
if (!em) return 0;
/* get whatever engine module we inherit from */
if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
@ -2022,6 +2063,13 @@ static void
module_close(Evas_Module *em)
{
eina_log_domain_unregister(_evas_engine_GL_X11_log_dom);
if (xrdb_user.db)
{
XrmDestroyDatabase(xrdb_user.db);
xrdb_user.last_stat = 0;
xrdb_user.last_mtime = 0;
xrdb_user.db = NULL;
}
}
static Evas_Module_Api evas_modapi =

View File

@ -8,6 +8,51 @@ int _evas_engine_soft16_x11_log_dom = -1;
/* function tables - filled in later (func and parent func) */
static Evas_Func func, pfunc;
struct xrdb_user
{
time_t last_stat;
time_t last_mtime;
XrmDatabase db;
};
static struct xrdb_user xrdb_user = {0, 0, NULL};
static Eina_Bool
xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
{
time_t last = xrdb_user.last_stat, now = time(NULL);
xrdb_user.last_stat = now;
if (last != now) /* don't stat() more than once every second */
{
struct stat st;
const char *home = getenv("HOME");
char tmp[PATH_MAX];
if (!home) goto failed;
snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
if (stat(tmp, &st) != 0) goto failed;
if (xrdb_user.last_mtime != st.st_mtime)
{
if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
xrdb_user.db = XrmGetFileDatabase(tmp);
if (!xrdb_user.db) goto failed;
xrdb_user.last_mtime = st.st_mtime;
}
}
if (!xrdb_user.db) return EINA_FALSE;
return XrmGetResource(xrdb_user.db, name, cls, type, val);
failed:
if (xrdb_user.db)
{
XrmDestroyDatabase(xrdb_user.db);
xrdb_user.db = NULL;
}
xrdb_user.last_mtime = 0;
return EINA_FALSE;
}
/* engine struct data */
typedef struct _Render_Engine Render_Engine;
@ -21,9 +66,7 @@ struct _Render_Engine
Tilebuf_Rect *rects;
Tilebuf_Rect *cur_rect;
// TODO: maybe use these as shared global resources, acquired only once?
XrmDatabase xrdb_dpy; // xres - dpi
XrmDatabase xrdb_user;
XrmDatabase xrdb; // xres - dpi
struct { // xres - dpi
int dpi; // xres - dpi
} xr; // xres - dpi
@ -188,26 +231,16 @@ eng_setup(Evas *e, void *in)
{
int status;
char *type = NULL;
const char *home;
XrmValue val;
re->xr.dpi = 75000; // dpy * 1000
if ((home = getenv("HOME")))
{
char tmp[PATH_MAX];
snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
re->xrdb_user = XrmGetFileDatabase(tmp);
if (re->xrdb_user)
status = XrmGetResource(re->xrdb_user,
"Xft.dpi", "Xft.Dpi", &type, &val);
}
status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
if ((!status) || (!type))
{
re->xrdb_dpy = XrmGetDatabase(re->disp);
if (re->xrdb_dpy)
status = XrmGetResource(re->xrdb_dpy,
if (!re->xrdb) re->xrdb = XrmGetDatabase(re->disp);
if (re->xrdb)
status = XrmGetResource(re->xrdb,
"Xft.dpi", "Xft.Dpi", &type, &val);
}
@ -266,8 +299,8 @@ eng_output_free(void *data)
re = (Render_Engine *)data;
// if (re->xrdb_user) XrmDestroyDatabase(re->xrdb_user);
// if (re->xrdb_dpy) XrmDestroyDatabase(re->xrdb_dpy);
// NOTE: XrmGetDatabase() result is shared per connection, do not free it.
// if (re->xrdb) XrmDestroyDatabase(re->xrdb);
if (re->shbuf) evas_software_x11_x_output_buffer_free(re->shbuf, 0);
if (re->clip_rects) XDestroyRegion(re->clip_rects);
@ -630,6 +663,13 @@ eng_canvas_alpha_get(void *data __UNUSED__, void *context __UNUSED__)
static int
module_open(Evas_Module *em)
{
static Eina_Bool xrm_inited = EINA_FALSE;
if (!xrm_inited)
{
xrm_inited = EINA_TRUE;
XrmInitialize();
}
if (!em) return 0;
/* get whatever engine module we inherit from */
if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0;
@ -667,6 +707,13 @@ static void
module_close(Evas_Module *em)
{
eina_log_domain_unregister(_evas_engine_soft16_x11_log_dom);
if (xrdb_user.db)
{
XrmDestroyDatabase(xrdb_user.db);
xrdb_user.last_stat = 0;
xrdb_user.last_mtime = 0;
xrdb_user.db = NULL;
}
}
static Evas_Module_Api evas_modapi =

View File

@ -20,6 +20,53 @@ int test ;
/* function tables - filled in later (func and parent func) */
static Evas_Func func, pfunc;
#ifdef BUILD_ENGINE_SOFTWARE_XLIB
struct xrdb_user
{
time_t last_stat;
time_t last_mtime;
XrmDatabase db;
};
static struct xrdb_user xrdb_user = {0, 0, NULL};
static Eina_Bool
xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
{
time_t last = xrdb_user.last_stat, now = time(NULL);
xrdb_user.last_stat = now;
if (last != now) /* don't stat() more than once every second */
{
struct stat st;
const char *home = getenv("HOME");
char tmp[PATH_MAX];
if (!home) goto failed;
snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
if (stat(tmp, &st) != 0) goto failed;
if (xrdb_user.last_mtime != st.st_mtime)
{
if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
xrdb_user.db = XrmGetFileDatabase(tmp);
if (!xrdb_user.db) goto failed;
xrdb_user.last_mtime = st.st_mtime;
}
}
if (!xrdb_user.db) return EINA_FALSE;
return XrmGetResource(xrdb_user.db, name, cls, type, val);
failed:
if (xrdb_user.db)
{
XrmDestroyDatabase(xrdb_user.db);
xrdb_user.db = NULL;
}
xrdb_user.last_mtime = 0;
return EINA_FALSE;
}
#endif
/* engine struct data */
typedef struct _Render_Engine Render_Engine;
@ -32,9 +79,7 @@ struct _Render_Engine
int end : 1;
#ifdef BUILD_ENGINE_SOFTWARE_XLIB
// TODO: maybe use these as shared global resources, acquired only once?
XrmDatabase xrdb_dpy; // xres - dpi
XrmDatabase xrdb_user;
XrmDatabase xrdb; // xres - dpi
struct { // xres - dpi
int dpi; // xres - dpi
} xr; // xres - dpi
@ -101,28 +146,18 @@ _output_xlib_setup(int w,
evas_software_xlib_outbuf_init();
{
int status = 0;
int status;
char *type = NULL;
const char *home;
XrmValue val;
re->xr.dpi = 75000; // dpy * 1000
if ((home = getenv("HOME")))
{
char tmp[PATH_MAX];
snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
re->xrdb_user = XrmGetFileDatabase(tmp);
if (re->xrdb_user)
status = XrmGetResource(re->xrdb_user,
"Xft.dpi", "Xft.Dpi", &type, &val);
}
status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
if ((!status) || (!type))
{
re->xrdb_dpy = XrmGetDatabase(disp);
if (re->xrdb_dpy)
status = XrmGetResource(re->xrdb_dpy,
if (!re->xrdb) re->xrdb = XrmGetDatabase(disp);
if (re->xrdb)
status = XrmGetResource(re->xrdb,
"Xft.dpi", "Xft.Dpi", &type, &val);
}
@ -235,7 +270,7 @@ _output_xcb_setup(int w,
evas_software_xcb_x_color_init();
evas_software_xcb_outbuf_init();
// FIXME: re->xrdb_user, re->xrdb_dpy
// FIXME: re->xrdb
re->ob = evas_software_xcb_outbuf_setup_x(w,
h,
@ -574,12 +609,12 @@ eng_output_free(void *data)
if (!data) return;
re = (Render_Engine *)data;
#ifdef BUILD_ENGINE_SOFTWARE_XLIB
// if (re->xrdb_user) XrmDestroyDatabase(re->xrdb_user);
// if (re->xrdb_dpy) XrmDestroyDatabase(re->xrdb_dpy);
#endif
// NOTE: XrmGetDatabase() result is shared per connection, do not free it.
// if (re->xrdb) XrmDestroyDatabase(re->xrdb);
#endif
re->outbuf_free(re->ob);
evas_common_tilebuf_free(re->tb);
if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
@ -720,7 +755,17 @@ eng_canvas_alpha_get(void *data, void *context __UNUSED__)
static int
module_open(Evas_Module *em)
{
#ifdef BUILD_ENGINE_SOFTWARE_XLIB
static Eina_Bool xrm_inited = EINA_FALSE;
if (!xrm_inited)
{
xrm_inited = EINA_TRUE;
XrmInitialize();
}
#endif
if (!em) return 0;
/* get whatever engine module we inherit from */
if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
_evas_engine_soft_x11_log_dom = eina_log_domain_register("EvasSoftX11", EVAS_DEFAULT_LOG_COLOR);
@ -756,6 +801,15 @@ static void
module_close(Evas_Module *em __UNUSED__)
{
eina_log_domain_unregister(_evas_engine_soft_x11_log_dom);
#ifdef BUILD_ENGINE_SOFTWARE_XLIB
if (xrdb_user.db)
{
XrmDestroyDatabase(xrdb_user.db);
xrdb_user.last_stat = 0;
xrdb_user.last_mtime = 0;
xrdb_user.db = NULL;
}
#endif
}
static Evas_Module_Api evas_modapi =

View File

@ -8,6 +8,53 @@ int _evas_xrender_xcb_log_dom = -1;
/* function tables - filled in later (func and parent func) */
static Evas_Func func, pfunc;
#ifdef BUILD_ENGINE_SOFTWARE_XLIB
struct xrdb_user
{
time_t last_stat;
time_t last_mtime;
XrmDatabase db;
};
static struct xrdb_user xrdb_user = {0, 0, NULL};
static Eina_Bool
xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
{
time_t last = xrdb_user.last_stat, now = time(NULL);
xrdb_user.last_stat = now;
if (last != now) /* don't stat() more than once every second */
{
struct stat st;
const char *home = getenv("HOME");
char tmp[PATH_MAX];
if (!home) goto failed;
snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
if (stat(tmp, &st) != 0) goto failed;
if (xrdb_user.last_mtime != st.st_mtime)
{
if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
xrdb_user.db = XrmGetFileDatabase(tmp);
if (!xrdb_user.db) goto failed;
xrdb_user.last_mtime = st.st_mtime;
}
}
if (!xrdb_user.db) return EINA_FALSE;
return XrmGetResource(xrdb_user.db, name, cls, type, val);
failed:
if (xrdb_user.db)
{
XrmDestroyDatabase(xrdb_user.db);
xrdb_user.db = NULL;
}
xrdb_user.last_mtime = 0;
return EINA_FALSE;
}
#endif
/* engine struct data */
typedef struct _Render_Engine Render_Engine;
typedef struct _Render_Engine_Update Render_Engine_Update;
@ -31,9 +78,7 @@ struct _Render_Engine
unsigned char destination_alpha : 1;
#ifdef BUILD_ENGINE_XRENDER_X11
// TODO: maybe use these as shared global resources, acquired only once?
XrmDatabase xrdb_dpy; // xres - dpi
XrmDatabase xrdb_user;
XrmDatabase xrdb; // xres - dpi
struct { // xres - dpi
int dpi; // xres - dpi
} xr; // xres - dpi
@ -229,26 +274,17 @@ _output_xlib_setup(int width,
{
int status;
char *type = NULL;
const char *home;
XrmValue val;
re->xr.dpi = 75000; // dpy * 1000
if ((home = getenv("HOME")))
{
char tmp[PATH_MAX];
snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
re->xrdb_user = XrmGetFileDatabase(tmp);
if (re->xrdb_user)
status = XrmGetResource(re->xrdb_user,
"Xft.dpi", "Xft.Dpi", &type, &val);
}
status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
if ((!status) || (!type))
{
re->xrdb_dpy = XrmGetDatabase((Display *)re->x11.connection);
if (re->xrdb_dpy)
status = XrmGetResource(re->xrdb_dpy,
if (!re->xrdb)
re->xrdb = XrmGetDatabase((Display *)re->x11.connection);
if (re->xrdb)
status = XrmGetResource(re->xrdb,
"Xft.dpi", "Xft.Dpi", &type, &val);
}
@ -521,8 +557,8 @@ eng_output_free(void *data)
re = (Render_Engine *)data;
#ifdef BUILD_ENGINE_XRENDER_X11
// if (re->xrdb_user) XrmDestroyDatabase(re->xrdb_user);
// if (re->xrdb_dpy) XrmDestroyDatabase(re->xrdb_dpy);
// NOTE: XrmGetDatabase() result is shared per connection, do not free it.
// if (re->xrdb) XrmDestroyDatabase(re->xrdb);
#endif
evas_common_font_shutdown();
@ -1490,6 +1526,15 @@ eng_canvas_alpha_get(void *data, void *context)
static int
module_open(Evas_Module *em)
{
#ifdef BUILD_ENGINE_SOFTWARE_XLIB
static Eina_Bool xrm_inited = EINA_FALSE;
if (!xrm_inited)
{
xrm_inited = EINA_TRUE;
XrmInitialize();
}
#endif
if (!em) return 0;
/* get whatever engine module we inherit from */
if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
@ -1605,6 +1650,15 @@ static void
module_close(Evas_Module *em)
{
eina_log_domain_unregister(_evas_xrender_xcb_log_dom);
#ifdef BUILD_ENGINE_SOFTWARE_XLIB
if (xrdb_user.db)
{
XrmDestroyDatabase(xrdb_user.db);
xrdb_user.last_stat = 0;
xrdb_user.last_mtime = 0;
xrdb_user.db = NULL;
}
#endif
}
static Evas_Module_Api evas_modapi =