struct x11_compositor {
struct weston_compositor base;
+ EGLSurface dummy_pbuffer;
+
Display *dpy;
xcb_connection_t *conn;
xcb_screen_t *screen;
{
EGLint major, minor;
EGLint n;
- const char *extensions;
EGLint config_attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RED_SIZE, 1,
EGL_GREEN_SIZE, 1,
EGL_BLUE_SIZE, 1,
- EGL_DEPTH_SIZE, 1,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE
};
EGL_NONE
};
+ static const EGLint pbuffer_attribs[] = {
+ EGL_WIDTH, 10,
+ EGL_HEIGHT, 10,
+ EGL_NONE
+ };
+
c->base.display = eglGetDisplay(c->dpy);
if (c->base.display == NULL) {
fprintf(stderr, "failed to create display\n");
return -1;
}
- extensions = eglQueryString(c->base.display, EGL_EXTENSIONS);
- if (!strstr(extensions, "EGL_KHR_surfaceless_gles2")) {
- fprintf(stderr, "EGL_KHR_surfaceless_gles2 not available\n");
- return -1;
- }
-
if (!eglBindAPI(EGL_OPENGL_ES_API)) {
fprintf(stderr, "failed to bind EGL_OPENGL_ES_API\n");
return -1;
return -1;
}
+ c->dummy_pbuffer = eglCreatePbufferSurface(c->base.display,
+ c->base.config,
+ pbuffer_attribs);
+ if (c->base.context == NULL) {
+ fprintf(stderr, "failed to create dummy pbuffer\n");
+ return -1;
+ }
+
if (!eglMakeCurrent(c->base.display, EGL_NO_SURFACE,
EGL_NO_SURFACE, c->base.context)) {
fprintf(stderr, "failed to make context current\n");
wl_list_for_each_reverse(surface, &compositor->base.surface_list, link)
weston_surface_draw(surface, &output->base, damage);
+ weston_output_do_read_pixels(&output->base);
+
eglSwapBuffers(compositor->base.display, output->egl_surface);
wl_event_source_timer_update(output->finish_frame_timer, 10);
output->finish_frame_timer =
wl_event_loop_add_timer(loop, finish_frame_handler, output);
+ output->base.origin = output->base.current;
output->base.repaint = x11_output_repaint;
output->base.destroy = x11_output_destroy;
output->base.assign_planes = NULL;
output->base.set_backlight = NULL;
output->base.set_dpms = NULL;
+ output->base.switch_mode = NULL;
wl_list_insert(c->base.output_list.prev, &output->base.link);
button = BTN_RIGHT;
break;
case 4:
+ if (state)
+ notify_axis(c->base.input_device,
+ weston_compositor_get_time(),
+ WL_INPUT_DEVICE_AXIS_VERTICAL_SCROLL, 1);
+ return;
case 5:
+ if (state)
+ notify_axis(c->base.input_device,
+ weston_compositor_get_time(),
+ WL_INPUT_DEVICE_AXIS_VERTICAL_SCROLL, -1);
+ return;
case 6:
+ if (state)
+ notify_axis(c->base.input_device,
+ weston_compositor_get_time(),
+ WL_INPUT_DEVICE_AXIS_HORIZONTAL_SCROLL, 1);
+ return;
case 7:
- /* X11 sends wheel events as buttons events. But
- * linux input treats as REL_WHEEL, therefore not
- * button type at all. When we update the input
- * protocol and get the 'axis' event, we'll send
- * scroll events as axis events. */
+ if (state)
+ notify_axis(c->base.input_device,
+ weston_compositor_get_time(),
+ WL_INPUT_DEVICE_AXIS_HORIZONTAL_SCROLL, -1);
return;
}
xcb_focus_in_event_t *focus_in;
xcb_atom_t atom;
uint32_t *k;
- int i, set;
+ uint32_t i, set;
prev = NULL;
while (x11_compositor_next_event(c, &event, mask)) {
}
output = x11_compositor_find_output(c, focus_in->event);
- notify_keyboard_focus(c->base.input_device,
- weston_compositor_get_time(),
- &output->base, &c->keys);
+ notify_keyboard_focus(c->base.input_device, &c->keys);
free(prev);
prev = NULL;
break;
output = x11_compositor_find_output(c, enter_notify->event);
notify_pointer_focus(c->base.input_device,
- weston_compositor_get_time(),
&output->base,
output->base.x + enter_notify->event_x,
output->base.y + enter_notify->event_y);
if (enter_notify->state >= Button1Mask)
break;
output = x11_compositor_find_output(c, enter_notify->event);
- notify_pointer_focus(c->base.input_device,
- weston_compositor_get_time(),
- NULL,
+ notify_pointer_focus(c->base.input_device, NULL,
output->base.x + enter_notify->event_x,
output->base.y + enter_notify->event_y);
break;
if (focus_in->mode == XCB_NOTIFY_MODE_WHILE_GRABBED ||
focus_in->mode == XCB_NOTIFY_MODE_UNGRAB)
break;
- notify_keyboard_focus(c->base.input_device,
- weston_compositor_get_time(),
- NULL, NULL);
+ notify_keyboard_focus(c->base.input_device, NULL);
break;
default:
xcb_intern_atom_reply_t *reply;
xcb_pixmap_t pixmap;
xcb_gc_t gc;
- int i;
+ unsigned int i;
uint8_t data[] = { 0, 0, 0, 0 };
for (i = 0; i < ARRAY_LENGTH(atoms); i++)