I have a yocto/poky build of linux using Weston/Wayland. I have 2 displays. The desktop environment is showing on both displays, but I can only launch apps on display-1 from the command line (ssh shell). I'm just trying to run weston-simple-egl.
This command works and I see the app running on display-1:
WAYLAND_DISPLAY=wayland-1 XDG_RUNTIME_DIR=/run/user/1000 /usr/bin/weston-simple-egl
But this fails:
WAYLAND_DISPLAY=wayland-2 XDG_RUNTIME_DIR=/run/user/1000 /usr/bin/weston-simple-egl
weston-simple-egl: ../weston-11.0.1/clients/simple-egl.c:1157: int main(int, char **): Assertion `display.display' failed.
Aborted
I also tried other display-ids: 0, 2, 3, 4...
Is there a way to check which display-ids are valid? Any logs I should be looking at? or other ways to debug this?
Edit: The display is currently 'extended' I can move an app from one to the other. In the XDG_RUNTIME_DIR, I see only wayland-1:
# ls /run/user/1000
wayland-1 wayland-1.lock
It seems this is not possible via any weston environment variable or configuration.
The answer was to modify the app itself, using this wayland api:
xdg_toplevel::set_fullscreen(output: object<wl_output>)
Calling set_fullscreen(NULL)
will allow the compositor to fullscreen the window on a display of its choosing. But you can iterate over wl_outputs
and choose one to use. I added a command line option to set the output index.
Example for glmark2:
- output = display_->outputs.at(0);
+ output = display_->outputs.at(NativeStateWayland::outputIndex);
Example for weston-simple-egl:
create_surface(struct window *window)
{
struct display *display = window->display;
+ struct wl_output *wl_output = NULL;
+ if (window->outputIndex != -1) {
+ int index = 0;
+ struct output *itr = NULL;
+ wl_list_for_each(itr, &display->output_list, link) {
+ if (index == window->outputIndex) {
+ wl_output = itr->wl_output;
+ break;
+ }
+ index++;
+ }
+ }
...
...
if (window->fullscreen) {
- xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
+ xdg_toplevel_set_fullscreen(window->xdg_toplevel, wl_output);
}
It was not possible to select a display without going fullscreen.
resources: