C++ 检测X11 vs Wayland的有效方法,最好使用CMake

C++ 检测X11 vs Wayland的有效方法,最好使用CMake,c++,cmake,x11,compile-time,wayland,C++,Cmake,X11,Compile Time,Wayland,所以我做了一些谷歌搜索,这是一个知识非常少的东西。什么是检测X11或Wayland是否正在使用的有效且简单的方法,最好是在编译时使用CMake?我需要把它应用到我的C++项目。 < P>我假设你想在编译时对显示服务器进行评估,而不是在每次编译时调用CMake。这就是CMake的工作原理,应该使用它。一个缺点是,您必须为每个更改的显示服务器重新运行CMake 目前没有检测正在运行的显示服务器的默认方法。类似地,也没有默认的代码片段来通过CMake评估显示服务器。只需分别选择手动为您或您的环境工作的

所以我做了一些谷歌搜索,这是一个知识非常少的东西。什么是检测X11或Wayland是否正在使用的有效且简单的方法,最好是在编译时使用CMake?我需要把它应用到我的C++项目。

< P>我假设你想在编译时对显示服务器进行评估,而不是在每次编译时调用CMake。这就是CMake的工作原理,应该使用它。一个缺点是,您必须为每个更改的显示服务器重新运行CMake

目前没有检测正在运行的显示服务器的默认方法。类似地,也没有默认的代码片段来通过CMake评估显示服务器。只需分别选择手动为您或您的环境工作的服务器

调用此代码从CGube中并将结果存储在变量中并将其用于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 IsServyx11/Cux>并在C++代码中使用它。< /P>您是指作为活动显示服务器,不仅可以使用库吗?为什么不在运行时呢?(这会容易得多,而且总是正确的。)谢谢你的回答,@Someprogrammerdude,但我需要检测用户的屏幕分辨率,要做到这一点,我必须使用X11或Wayland的代码,因此需要在编译时使用。除非有一个多平台的方法来解决我的问题?我确实尝试过Qt(因为我已经在使用它了),但它被证明是不可靠的。如果用户在程序构建后更改分辨率怎么办?例如,安装新的图形卡或连接更大(或更小)的显示器?那么,你的程序的用户需要重建你的程序吗?作为我之前评论的补充,响应性设计、编程和布局不仅对网页很重要。我认为这应该是所有面向GUI编程的主要目标。@Someprogrammerdude检测分辨率本身的代码是动态的,但必须是Wayland或基于X11的库代码才能做到这一点。因此需要在编译时选择依赖哪一组库:)非常感谢您的添加,我肯定会使用您的解决方案:)尽管我的问题说得很糟糕。我应该问一下,是否可以在编译时或者至少在生成配置文件时使用CMake(如您所建议的那样)执行此操作。