1 diff --git a/src/virtual_window.c b/src/virtual_window.c
2 index 4f482ff..0e39eda 100644
3 --- a/src/virtual_window.c
4 +++ b/src/virtual_window.c
6 static struct static_info {
7 Ecore_Evas *(*alloc_canvas)(int w, int h, void *(*a)(void *data, int size), void (*f)(void *data, void *ptr), void *data);
8 Ecore_Evas *(*alloc_canvas_with_stride)(int w, int h, void *(*a)(void *data, int size, int *stride, int *bpp), void (*f)(void *data, void *ptr), void *data);
9 + Ecore_Evas *(*alloc_canvas_with_pixmap)(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h, Ecore_X_Pixmap (*alloc_cb)(void *data, Ecore_X_Window parent, int w, int h, int *depth), void (*free_cb)(void *data, Ecore_X_Pixmap pixmap), void *data);
12 .alloc_canvas_with_stride = NULL,
13 + .alloc_canvas_with_pixmap = NULL,
17 @@ -486,6 +488,58 @@ static int event_handler_cb(struct dynamicbox_buffer *handler, struct dynamicbox
23 + * This callback can be called twice (or more) to get a several pixmaps
24 + * Acquired pixmaps are used for double/tripple buffering for canvas
26 +static Ecore_X_Pixmap alloc_pixmap_cb(void *data, Ecore_X_Window parent, int w, int h, int *depth)
28 + struct info *info = data;
31 + ecore_evas_geometry_get(info->ee, NULL, NULL, &info->w, &info->h);
32 + DbgPrint("Size of ee is updated: %dx%d (info: %p)\n", info->w, info->h, info);
36 + * Acquire a buffer for canvas.
38 + info->handle = dynamicbox_acquire_buffer(info->id, info->is_gbar,
39 + info->w, info->h, sizeof(int), 0,
40 + event_handler_cb, info);
41 + if (!info->handle) {
42 + ErrPrint("Failed to get the buffer\n");
47 + return (Ecore_X_Pixmap)dynamicbox_resource_id(info->handle);
50 +static void free_pixmap_cb(void *data, Ecore_X_Pixmap pixmap)
52 + struct info *info = data;
54 + if (!info->handle) {
59 + ErrPrint("Impossible\n");
62 + dynamicbox_release_buffer(info->handle);
63 + info->handle = NULL;
65 + if (info->deleted) {
73 static void *alloc_fb(void *data, int size)
75 struct info *info = data;
76 @@ -654,8 +708,14 @@ PUBLIC void *dynamicbox_get_evas_object(const char *id, int is_gbar)
82 + if (!s_info.alloc_canvas && !s_info.alloc_canvas_with_stride && !s_info.alloc_canvas_with_pixmap) {
83 + s_info.alloc_canvas_with_pixmap = dlsym(RTLD_DEFAULT, "ecore_evas_gl_x11_pixmap_allocfunc_new");
84 + if (!s_info.alloc_canvas_with_pixmap) {
85 + DbgPrint("pixmap_allocfunc_new is not found\n");
88 - if (!s_info.alloc_canvas && !s_info.alloc_canvas_with_stride) {
89 s_info.alloc_canvas_with_stride = dlsym(RTLD_DEFAULT, "ecore_evas_buffer_allocfunc_with_stride_new");
90 if (!s_info.alloc_canvas_with_stride) {
91 DbgPrint("allocfunc_with_stirde_new is not found\n");
92 @@ -666,7 +726,7 @@ PUBLIC void *dynamicbox_get_evas_object(const char *id, int is_gbar)
93 ErrPrint("allocfunc_new is not found\n");
96 - if (!s_info.alloc_canvas_with_stride && !s_info.alloc_canvas) {
97 + if (!s_info.alloc_canvas_with_stride && !s_info.alloc_canvas && !s_info.alloc_canvas_with_pixmap) {
98 ErrPrint("No way to allocate canvas\n");
101 @@ -698,10 +758,20 @@ PUBLIC void *dynamicbox_get_evas_object(const char *id, int is_gbar)
105 - if (!dynamicbox_conf_auto_align() && s_info.alloc_canvas_with_stride) {
106 - info->ee = s_info.alloc_canvas_with_stride(1, 1, alloc_stride_fb, free_fb, info);
107 - } else if (s_info.alloc_canvas) {
108 - info->ee = s_info.alloc_canvas(1, 1, alloc_fb, free_fb, info);
109 + engine = elm_config_preferred_engine_get();
110 + DbgPrint("Preferred engine: %s\n", engine);
111 + if (engine && !strcmp(engine, "opengl_x11")) {
112 + if (s_info.alloc_canvas_with_pixmap) {
113 + info->ee = s_info.alloc_canvas_with_pixmap(NULL, 0u, 0, 0, 1, 1, alloc_pixmap_cb, free_pixmap_cb, info);
118 + if (!dynamicbox_conf_auto_align() && s_info.alloc_canvas_with_stride) {
119 + info->ee = s_info.alloc_canvas_with_stride(1, 1, alloc_stride_fb, free_fb, info);
120 + } else if (s_info.alloc_canvas) {
121 + info->ee = s_info.alloc_canvas(1, 1, alloc_fb, free_fb, info);