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); }
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); }
void QWaylandDisplay::syncCallback(wl_display_sync_func_t func, void *data) { wl_display_sync_callback(mDisplay, func, data); }
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(); } }