2017-07-17 33 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,這是否可以做到這一點,就像你建議的那樣。 –