Ejemplo n.º 1
0
static void
gdk_wayland_display_sync (GdkDisplay *display)
{
  GdkDisplayWayland *display_wayland;
  gboolean done;

  g_return_if_fail (GDK_IS_DISPLAY (display));

  display_wayland = GDK_DISPLAY_WAYLAND (display);

  wl_display_sync_callback(display_wayland->wl_display, sync_callback, &done);
  wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_WRITABLE);
  while (!done)
    wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_READABLE);
}
Ejemplo n.º 2
0
static void
window_attach_surface(struct window *window)
{
	struct display *display = window->display;
	struct wl_buffer *buffer;
	int32_t x, y;

	if (window->pending_surface != NULL)
		return;

	window->pending_surface = window->cairo_surface;
	window->cairo_surface = NULL;

	buffer = display_get_buffer_for_surface(display,
						window->pending_surface);
	if (window->resize_edges & WINDOW_RESIZING_LEFT)
		x = window->server_allocation.width -
			window->allocation.width;
	else
		x = 0;

	if (window->resize_edges & WINDOW_RESIZING_TOP)
		y = window->server_allocation.height -
			window->allocation.height;
	else
		y = 0;

	window->server_allocation = window->allocation;
	window->resize_edges = 0;
	wl_surface_attach(window->surface, buffer, x, y);
	wl_display_sync_callback(display->display, free_surface, window);

	if (!window->mapped) {
		wl_surface_map_toplevel(window->surface);
		window->mapped = 1;
	}

	wl_surface_damage(window->surface, 0, 0,
			  window->allocation.width,
			  window->allocation.height);
}
Ejemplo n.º 3
0
void QWaylandDisplay::syncCallback(wl_display_sync_func_t func, void *data)
{
    wl_display_sync_callback(mDisplay, func, data);
}
Ejemplo n.º 4
-1
void QWaylandXCompositeEGLContext::geometryChanged()
{
    QSize size(mWindow->geometry().size());
    if (size.isEmpty()) {
        //QGLWidget wants a context for a window without geometry
        size = QSize(1,1);
    }

    delete mBuffer;
    //XFreePixmap deletes the glxPixmap as well
    if (mXWindow) {
        XDestroyWindow(mEglIntegration->xDisplay(),mXWindow);
    }

    VisualID visualId = QXlibEglIntegration::getCompatibleVisualId(mEglIntegration->xDisplay(),mEglIntegration->eglDisplay(),mConfig);

    XVisualInfo visualInfoTemplate;
    memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
    visualInfoTemplate.visualid = visualId;

    int matchingCount = 0;
    XVisualInfo *visualInfo = XGetVisualInfo(mEglIntegration->xDisplay(), VisualIDMask, &visualInfoTemplate, &matchingCount);

    Colormap cmap = XCreateColormap(mEglIntegration->xDisplay(),mEglIntegration->rootWindow(),visualInfo->visual,AllocNone);

    XSetWindowAttributes a;
    a.colormap = cmap;
    mXWindow = XCreateWindow(mEglIntegration->xDisplay(), mEglIntegration->rootWindow(),0, 0, size.width(), size.height(),
                             0, visualInfo->depth, InputOutput, visualInfo->visual,
                             CWColormap, &a);

    XCompositeRedirectWindow(mEglIntegration->xDisplay(), mXWindow, CompositeRedirectManual);
    XMapWindow(mEglIntegration->xDisplay(), mXWindow);

    mEglWindowSurface = eglCreateWindowSurface(mEglIntegration->eglDisplay(),mConfig,mXWindow,0);
    if (mEglWindowSurface == EGL_NO_SURFACE) {
        qFatal("Could not make eglsurface");
    }

    XSync(mEglIntegration->xDisplay(),False);
    mBuffer = new QWaylandXCompositeBuffer(mEglIntegration->waylandXComposite(),
                                           (uint32_t)mXWindow,
                                           size,
                                           mEglIntegration->waylandDisplay()->argbVisual());
    mWindow->attach(mBuffer);
    wl_display_sync_callback(mEglIntegration->waylandDisplay()->wl_display(),
                             QWaylandXCompositeEGLContext::sync_function,
                             this);

    mWaitingForSync = true;
    wl_display_sync(mEglIntegration->waylandDisplay()->wl_display(),0);
    mEglIntegration->waylandDisplay()->flushRequests();
    while (mWaitingForSync) {
        mEglIntegration->waylandDisplay()->readEvents();
    }
}