Как я могу узнать, использует ли система Linux Wayland или X11?

Используемый язык

Я использую С++ 14 с cmake для своей программы.

Проблема:

Я хотел бы знать, как я могу узнать, использует ли система Linux Wayland или X11 в качестве оконной системы, чтобы иметь возможность использовать оба API в моем исходном коде без конфликтов. Таким образом, создайте окно с Wayland, когда Wayland доступен, и в противном случае используйте API X11.

Примечание. Я знаю, что есть XWayland, но я хочу использовать собственный X11 и собственный Wayland без чего-то вроде XWayland.

EDIT: Чтобы уточнить некоторые вещи: я не хочу проверять наличие X11 или Wayland во время компиляции, а вместо этого runtime, потому что тогда мне достаточно один раз скомпилировать код, и пользователю не нужно думать, какую версию использовать.


person ShadowDragon    schedule 06.08.2017    source источник
comment
Каков вариант использования? Для вашего обычного настольного приложения Linux вам не нужно знать это — вы пишете его с помощью набора инструментов высокого уровня (Qt, GTK+, Wx и т. д.), и этот набор инструментов позаботится о поддержке X11/Wayland за вас.   -  person MrEricSir    schedule 06.08.2017
comment
Я хочу разработать программное обеспечение, которое напрямую отображает экран окна с помощью OpenGL. Само программное обеспечение на самом деле не зависит от знания многих вещей, которые я делаю, но я хочу сам создать техническую часть программного обеспечения, поэтому я должен знать, как делать такие вещи.   -  person ShadowDragon    schedule 06.08.2017
comment
@shadowdragon каждый уважающий себя набор инструментов для работы с окнами позволяет отображать ваш opengl в его окнах. Для этого не нужно писать свой собственный.   -  person rubenvb    schedule 06.08.2017
comment
Возможный дубликат Эффективный способ обнаружения X11 против Wayland, желательно с помощью CMake   -  person nobody    schedule 07.08.2017
comment
Я не думаю, что это повторяющийся вопрос, поскольку я не хочу обнаруживать используемую оконную систему во время компиляции, а вместо этого во время выполнения.   -  person ShadowDragon    schedule 07.08.2017


Ответы (3)


X11 использует переменную среды DISPLAY для поиска X-сервера. Wayland использует WAYLAND_DISPLAY. Сначала найдите переменную Wayland. Затем, если вы не найдете его или не сможете подключиться, используйте X11.

Не пропускайте проверку переменной WAYLAND_DISPLAY и не предполагайте, что Wayland работает на «wayland-0». Некоторые люди хотят использовать вложенные композиторы, которые вы бы обошли стороной. Другие люди могут использовать Wayland, но хотят принудительно выполнить рендеринг X11, удалив переменную WAYLAND_DISPLAY.

person Zan Lynx    schedule 06.08.2017
comment
Вы объяснили в комментарии ранее, что XDG_SESSION_TYPE не всегда может быть установлен. Не могли бы вы объяснить, почему не всегда устанавливается правильная оконная система и почему переменная DISPLAY установлена? Мне также интересно, для чего localhost:10.0. Насколько я понимаю, это как-то связано с системой X Window, но поправьте меня, если я ошибаюсь. - person ShadowDragon; 07.08.2017
comment
@ShadowDragon: переменные XDG не установлены, потому что я не нахожусь в сеансе рабочего стола. Я вхожу удаленно, используя туннелирование SSH. SSH может предоставить прокси-сервер X11, и он помещает прокси-адрес в localhost:10.0 - person Zan Lynx; 07.08.2017

используйте переменную среды XDG_SESSION_TYPE

on x11

echo $XDG_SESSION_TYPE
x11

на пути

$ echo $XDG_SESSION_TYPE
wayland
person skr    schedule 06.08.2017
comment
Это не то, что я бы назвал надежным. - person Zan Lynx; 07.08.2017
comment
Например, я вошел в свою систему Linux с помощью PuTTY в Windows, и для моего X11 DISPLAY установлено значение localhost:10.0. Он отлично работает с запущенным XMing. Но XDG_SESSION_TYPE ничего не установлено. У меня нет никаких переменных XDG любого типа. - person Zan Lynx; 07.08.2017

Я нахожусь на уровне запуска 3, но в графической оболочке, и мой $ XDG_SESSION_TYPE — «tty».

person LinuxLover    schedule 22.06.2019
comment
Вы уверены, что отвечаете на вопрос, на который собирались ответить? - person Sergey Krusch; 22.06.2019
comment
Это случается и со мной. Поскольку я использую менеджер входа в систему по имени Ly. - person Ajeeb.K.P; 15.04.2020