2010-08-16 32 views
9

Tôi đang cố gắng phát hiện xem tôi có đang chạy trên môi trường máy tính để bàn Gnome hoặc KDE hay không.Phát hiện môi trường máy tính để bàn trong Linux theo lập trình trong C

Tôi biết tôi có thể kiểm tra thông qua một ps -aux và grepping hoặc gnome hoặc KDE nhưng điều đó không tốt: 1) nếu tôi đang ở trên một máy tính để bàn gnome nhưng tôi đã tải KDE? 2) Tôi cần phải làm điều đó từ mã mà không cần sử dụng hệ thống() hoặc popen() hoặc kết hợp ngã ba/exec khác.

Tôi có thể đọc tệp hoặc env. biến hoặc bất kỳ thứ gì.

Bất kỳ ý tưởng nào?

cảm ơn, mọi trợ giúp đều được đánh giá cao.

+6

nếu nó là xfce thì sao? ion? wmii? dwm ....? – cthom06

+0

Vì bạn chỉ đang cố gắng phát hiện gnome vs kde, có một tập hợp các bản phân phối hoặc cấu hình cụ thể mà bạn đang nhắm mục tiêu không? Làm thế nào chung giải pháp phải được? – nmichaels

+0

Tại sao bạn muốn làm điều này? Có thể bạn đang đi xuống một con đường bị coi là không quan trọng ở đây ... – dmckee

Trả lời

1

Chọn một bộ quản lý cửa sổ mà bạn quan tâm: metacity, xfwm4, flwm, vv Bạn có thể tìm kiếm những người trong grep lại ps (hoặc tìm kiếm thông qua/proc). Các thư viện Gnome không nhất thiết có nghĩa là ai đó đang chạy toàn bộ môi trường máy tính để bàn gnome, nhưng sau đó Gnome và KDE không phải là các trình quản lý cửa sổ. Nếu WM là những gì bạn quan tâm, hãy tìm những thứ đó.

+0

có lẽ tôi đã không giải thích chính xác mình: có cách nào để biết liệu tôi đang chạy trên môi trường gnome hay KDE? – Jessica

+0

Ah. Trong trường hợp đó, bạn có thể muốn chỉnh sửa câu hỏi của mình để nói "môi trường máy tính để bàn" thay vì "trình quản lý cửa sổ". Đã hoàn thành – nmichaels

+0

. bây giờ bạn có câu trả lời không – Jessica

1

Ít nhất trên OpenSUSE có các biến môi trường Chương trình quản lý cửa sổ X, WINDOW_MANAGER

[email protected]:~> echo $WINDOWMANAGER 
/usr/bin/startkde 
[email protected]:~> echo $WINDOW_MANAGER 
/usr/bin/startkde 
[email protected]:~> 
+0

Tôi không chắc chắn, nhưng tôi nghĩ nó hoạt động trên gentoo, quá –

+0

Và nó không có trên Ubuntu. – Job

+1

có, cảm ơn nhưng nó không hoạt động trên Ubuntu, fedora, redhat, suse ... – Jessica

0

Bạn có thể liên kết tĩnh bộ công cụ cửa sổ của mình nếu bạn không bận tâm đến giao diện người dùng không nhất quán. Nó vẫn sẽ hoạt động tốt. Bạn cũng có thể chỉ cần gộp các thư viện được chia sẻ và đảm bảo các điểm LD_LIBRARY_PATH cho chúng. Nếu bạn thực sự muốn thực hiện một cái gì đó mà sẽ tự động liên kết với các bộ công cụ khác nhau, bạn có thể thử một cái gì đó với dlopen/dlsym, nhưng điều đó sẽ là điên rồ.

Nếu bạn quan tâm đến tính nhất quán của cross-platform/cross-widget, đặt cược tốt nhất của bạn sẽ là thứ gì đó hiển thị chính các tiện ích tìm kiếm bản địa; Swing có thể hiển thị cùng một mã trông giống như GTK hoặc Windows. Tôi biết bạn đang không sử dụng Java, nhưng không có giải pháp dễ dàng trong C (Swing sẽ chỉ giúp bạn được partway anyway vì nó không làm Qt).

+0

Tôi chỉ cần biết liệu tôi có đang chạy với máy tính để bàn hay không. lý do là tôi có thể trình bày cho người dùng một tùy chọn chạy các chương trình nhất định dựa trên thông tin đó, tuy nhiên chương trình của tôi là một dòng lệnh đơn giản không liên kết với QT hoặc GTK – Jessica

+0

Sau đó sử dụng danh sách xử lý có một số trường hợp góc xấu. Chỉ vì người dùng hiện tại đang chạy [Gnome | KDE] không có nghĩa là quá trình * này được gắn vào màn hình đó (người dùng có thể chạy nhiều hơn một phiên X và có thể sử dụng các môi trường màn hình khác nhau và các trình quản lý cửa sổ trong đó) ... – dmckee

+0

Tôi biết điều đó. do đó câu hỏi ở đây – Jessica

0

Không chắc chắn tiêu chuẩn này như thế nào, nhưng nó nhất quán trong Fedora 21, Slackware 14.1 và Ubuntu 14.04. (Xem thêm hoan nghênh)

thử

$ echo $DESKTOP_SESSION 

Hope this helps.

Các vấn đề liên quan