Wayland egl window not showing up

JustKidding jk at vin.ovh
Sat Jul 22 18:12:52 UTC 2023


Hello everyone, I'm the developer of the ueberzugpp project, its main 
purpose is to enable users to view images inside any terminal.
One of the latest features I'm working on is EGL support for both the 
X11 and wayland backend, I'm also using this as an opportunity to learn 
a how OpenGL works. Now, I've managed to make EGL work under X11 using 
an OpenGL 4.6 context. When I tried to do the same in wayland, it didn't 
work. I also have an SHM backend with wayland and that works fine, so I 
copied most of the code from the SHM backend and edited some stuff. to 
make it work with EGL. This is a snippet of my code, it initializes the 
required structs, and configures the listeners, but no window appears, 
but it kinda does? It's like it is invisible. If I click around where 
the window should be the previous window loses focus.

The full code is located here: 
https://github.com/jstkdng/ueberzugpp/blob/master/src/canvas/wayland/window/waylandegl.cpp

Am I doing something wrong? I tested some examples I found and they work 
but those use OpenGL ES 2 for some reason, does wayland not support 
regular OpenGL?

Link to the example I tested: 
https://gist.github.com/nikp123/bebe2d2dc9a8287efa9ba0a5b38ffab4

Any help would be appreciated.

WaylandEglWindow::WaylandEglWindow(struct wl_compositor *compositor, 
struct xdg_wm_base *xdg_base,
         EGLDisplay egl_display, std::unique_ptr<Image> new_image,
         std::shared_ptr<WaylandConfig> new_config, struct XdgStructAgg& 
xdg_agg):
compositor(compositor),
xdg_base(xdg_base),
surface(wl_compositor_create_surface(compositor)),
xdg_surface(xdg_wm_base_get_xdg_surface(xdg_base, surface)),
xdg_toplevel(xdg_surface_get_toplevel(xdg_surface)),
image(std::move(new_image)),
config(std::move(new_config)),
egl_display(egl_display),
egl_util(egl_display),
appid(fmt::format("ueberzugpp_{}", util::generate_random_string(id_len))),
xdg_agg(xdg_agg)
{
     config->initial_setup(appid);
     xdg_setup();
}

void WaylandEglWindow::finish_init()
{
     auto xdg = std::make_unique<XdgStruct>();
     xdg->ptr = shared_from_this();
     this_ptr = xdg.get();
     xdg_agg.ptrs.push_back(std::move(xdg));
     setup_listeners();

     egl_window = wl_egl_window_create(surface, image->width(), 
image->height());
     egl_surface = eglCreatePlatformWindowSurface(egl_display, 
egl_util.config, egl_window, nullptr);

     if (egl_surface == EGL_NO_SURFACE) {
         std::cout << "Could not create surface" << std::endl;
     }

     eglMakeCurrent(egl_display, egl_surface, egl_surface, 
egl_util.context);
     eglSwapInterval(egl_display, 0);

     glGenFramebuffers(1, &fbo);
     glGenTextures(1, &texture);
#ifdef DEBUG
     glDebugMessageCallback(EGLUtil::debug_callback, nullptr);
     glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
#endif

     eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, 
EGL_NO_CONTEXT);

     visible = true;
}

void WaylandEglWindow::setup_listeners()
{
     xdg_surface_add_listener(xdg_surface, &xdg_surface_listener_egl, 
this_ptr);
     wl_surface_commit(surface);

     if (image->is_animated()) {
         callback = wl_surface_frame(surface);
         wl_callback_add_listener(callback, &frame_listener_egl, this_ptr);
     }
}

void WaylandEglWindow::xdg_setup()
{
     xdg_toplevel_set_app_id(xdg_toplevel, appid.c_str());
     xdg_toplevel_set_title(xdg_toplevel, appid.c_str());
}


More information about the wayland-devel mailing list