2017-07-17 29 views
2

所以我做了一些谷歌搜索,这是一个知识非常少的东西。检测X11或Wayland是否正在使用,最好是在编译时和CMake中使用,这将是一种有效而又万无一失的方法?我需要将其应用于我的C++项目。检测X11 vs Wayland的有效方法,最好用CMake

+0

您的意思是作为活动的显示服务器,不仅如果库可用?为什么不在运行时? (这将*更容易,并且始终是正确的。) –

+0

感谢您的回复,@Someprogrammerdude,但我需要检测用户的屏幕分辨率,为此,我必须使用X11或Wayland,因此需要在编译时。除非有解决这个问题的多平台方法吗?我曾尝试过Qt(因为我已经使用过),但它证明不可靠。 –

+0

如果用户在程序编译后更改分辨率,该怎么办?例如,通过放入新的显卡或连接更大(或更小)的显示器?你的程序的用户需要重建你的程序吗? –

回答

1

我假设你想在编译期间,在调用CMake的时候评估显示服务器,而不是每次编译。这就是CMake的工作原理和应该使用的热点。一个缺点是,你必须重新运行每个更改的显示服务器的CMake。

目前没有默认的方式来检测正在运行的显示服务器。类似的,没有默认的代码片段来评估CMake的显示服务器。请选择one way of detecting the display分别手动为您或您的环境工作的服务器。

从CMake调用此代码并将结果存储在一个变量中,并将其用于您的C++代码。

例如loginctl show-session $(loginctl | grep $(whoami) | awk '{print $1}') -p Type适合我。得到的CMake的检查是

execute_process(
    "loginctl show-session $(loginctl | grep $(whoami) | awk '{print $1}') -p Type" 
    OUTPUT_VARIABLE result_display_server) 
if ("${resulting_display_server}" EQUALS "Type=x11") 
    set(display_server_x11 TRUE) 
else() 
    set(display_server_x11 FALSE) 
endif() 

也许你不得不反复折腾的条件和检查Type=wayland或类似的得到它正确地在你的环境中工作。

您可以使用display_server_x11write it into a config.h file在C++代码中使用它。

+0

非常感谢你的补充,我将尽最大努力使用你的这个解决方案:)虽然我的确提出了我的问题。我应该问过,在编译时或者至少在编译配置文件时使用CMake,这是否可以做到这一点,就像你建议的那样。 –