2010-08-16 16 views
9

Estoy intentando detectar si estoy ejecutando en un entorno de escritorio Gnome o KDE.Detectar el entorno de escritorio en Linux mediante programación en C

Sé que puedo verificar a través de un ps -aux y empastar gnome o KDE, pero eso no es bueno: 1) ¿Qué pasa si estoy en un escritorio gnome pero tengo las librerías KDE cargadas? 2) Necesito hacerlo desde el código sin usar system() o popen() u otra combinación de fork/exec.

Puedo leer archivos, o env. variables o lo que sea.

¿Alguna idea?

gracias, cualquier ayuda es apreciada.

+6

¿y si es xfce? ¿ion? wmii? dwm ...? – cthom06

+0

Como solo está tratando de detectar gnome vs kde, ¿hay un conjunto particular de distribuciones o configuraciones a las que se dirige? ¿Cuán general debe ser la solución? – nmichaels

+0

¿Por qué quieres hacer esto? Es posible que te estés dirigiendo hacia un camino poco pensado aquí ... – dmckee

Respuesta

1

Elija un conjunto de gestores de ventanas que se preocupan por: metaciudad, xfwm4, flwm, etc Usted puede buscar a los de su grep de ps (o buscar a través de/proc). Las bibliotecas Gnome no significan necesariamente que alguien esté ejecutando todo el entorno de escritorio gnome, pero luego Gnome y KDE no son administradores de ventanas. Si las WM son lo que te importa, búscalas.

+0

tal vez no me explique correctamente: ¿hay alguna forma de saber si estoy ejecutando en un entorno gnome o un KDE? – Jessica

+0

Ah. En ese caso, es posible que desee editar su pregunta para decir "entorno de escritorio" en lugar de "administrador de ventanas". – nmichaels

+0

hecho. ¿tienes una respuesta ahora? – Jessica

1

Al menos en openSUSE no son el WINDOWMANAGER variables de entorno, WINDOW_MANAGER

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

No estoy seguro, pero creo que funciona en gentoo, también –

+0

Y no en Ubuntu. – Job

+1

sí, gracias pero no funciona en Ubuntu, fedora, redhat, suse ... – Jessica

0

Puede vincular estáticamente su kit de herramientas de ventana si no le importa una interfaz de usuario de aspecto incoherente. Todavía funcionará bien. También puede agrupar las bibliotecas compartidas y asegurarse de que LD_LIBRARY_PATH las señale. Si realmente desea implementar algo que se vincule dinámicamente a diferentes kits de herramientas, puede probar algo con dlopen/dlsym, pero sería una locura.

Si le importa la coherencia de la herramienta multiplataforma/entre varios widgets, su mejor opción sería hacer widgets nativos; Swing puede renderizar el mismo código para que parezca GTK o Windows. Sé que no estás usando Java, pero no hay una solución fácil en C (Swing solo te llevará a mitad de camino porque Qt no lo hace).

+0

Solo necesito saber si estoy funcionando con cualquiera de las computadoras de escritorio. la razón es que puedo presentarle al usuario la opción de ejecutar ciertos programas basados ​​en esa información; sin embargo, mi programa es una línea de comando simple sin enlaces a QT o GTK – Jessica

+0

. Luego, la lista de procesamiento tiene algunos casos de esquina mal. El hecho de que el usuario actual ejecute [Gnome | KDE] no significa que * este * proceso esté conectado a esa pantalla (los usuarios pueden ejecutar más de una sesión X y pueden usar diferentes entornos de escritorio y administradores de ventanas en ellos) ... – dmckee

+0

Lo sé. de ahí la pregunta aquí – Jessica

0

No estoy seguro de qué tan estándar es esto, pero es consistente en Fedora 21, Slackware 14.1 y Ubuntu 14.04. (Más de bienvenida)

tratar

$ echo $DESKTOP_SESSION 

Espero que esto ayude.

Cuestiones relacionadas