/* 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
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
{
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);
}
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);
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;
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 =
/* 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;
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
{
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);
}
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);
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;
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 =
/* 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;
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
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);
}
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,
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);
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);
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 =
/* 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;
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
{
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);
}
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();
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;
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 =