2008-12-12 17 views
23

Mi experiencia principal es con C & & C++, así que preferiría permanecer con ellos. No quiero utilizar nada como QT, GTK o wxWidgets ni ningún kit de herramientas. Me gustaría aprender programación nativa y este tipo de derrotas el propósito. Con eso en mente, también me gustaría evitar Java.¿Cómo se hace la GUI de Linux?

Entiendo gnome y xfce y KDE y todos son entornos de escritorio para Linux, y la base instalada suele ser X (Xorg). Al codificar para Linux, ¿codifica X o el entorno de escritorio? ¿Hay un encabezado Linux estándar para esto (como win32 tiene windows.h) para Linux? o son diferentes los métodos de codificación para cada entorno de escritorio?

cualquier ayuda es muy apreciada.

Respuesta

65

X es una capa horrible para programar y, a pesar de su intención de evitar Java, QT o cualquiera de las excelentes capas de abstracción de la interfaz de usuario, se hará un flaco favor al codificar a ese nivel. Lo he hecho (hace mucho tiempo cuando Motif estaba en su infancia en la plataforma que estábamos usando) y lo haría no hacerlo de nuevo si hubiera una manera más fácil.

El uso de la frase "programación nativa" me confunde un poco. Si desea aprender programación nativa, es a las API a las que elige llamar. Con un razonamiento similar, tampoco debería codificar en C, sino que debe optar por el ensamblador (o el código de máquina directo) ya que C proporciona una abstracción al hardware.

Si quieres aprender la programación X, está bien. Obtendrá mucho más control sobre su interfaz, pero casi todos los demás le rendirán en términos de entrega de software. Yo prefiero codificar a una API de nivel superior que puedo usar en muchas plataformas, me da tiempos de entrega más rápidos y más potencial de mercado.

No construyes una casa con átomos, la construyes con ladrillos. Mi sugerencia es usar las herramientas, para eso están ahí.

+0

He tenido que usar el motivo directamente (solo porque el wm que estamos usando está desarrollado en la casa) y no es fácil. Prefiero usar una de las capas de abstracción de interfaz de usuario de acceso libre – hhafez

+0

Escribir una IU en Xlib no es como escribir una IU en Win32 simple, es más como escribir una IU en DirectDraw; es mucho más bajo que Win32 –

+6

Si no estás dispuesto a pasar por media docena de capas de abstracción, el desarrollo de Linux no es para ti. ;) – jalf

13

Supongo que podría escribir el código C directamente contra Xlib, pero terminaría recreando toda la funcionalidad que proporciona GTK + o QT que X no es la única.

+0

de acuerdo; Creo que es una forma diferente de hacer las cosas en el mundo de Linux. – Sydius

+0

Entiendo que Linux originalmente era solo la consola, y las GUI son agregadas por programas de terceros. Pero se siente raro usando todos estos kits de herramientas en Linux, se siente como obtener una GUI que necesita para usar "hacks" o andar por las ramas, por así decirlo. –

+2

@Mike, ¿sientes los "hackeos" cuando juegas juegos de DirectX con los controladores de NVidia? Son software de terceros. – paxdiablo

4

GTK, QT y wx son kits de herramientas que se basan en X para proporcionar una API más amigable.

Si no usa un juego de herramientas existente, necesitará escribir cosas a un nivel muy bajo, directamente manejando eventos de mouse y teclado. Si desea un botón o un cuadro de texto, tendrá que escribirlo usted mismo utilizando las primitivas xlib de bajo nivel.

Antes de intentar esto, probablemente sea mejor que elijamos el kit de herramientas de su entorno de escritorio preferido y empecemos por eso.

4

Simplemente no hay nada como "nativo" en este caso. Windows y OS X solo tienen una opción oficial, mientras que X no.

+0

Bueno, X tiene una opción oficial, es solo un nivel muy bajo (feo). – paxdiablo

44

No quiero utilizar nada como QT, GTK o wxWidgets ni ningún kit de herramientas. Me gustaría aprender programación nativa y este tipo de derrotas el propósito.

No, no es así. De vuelta en una versión anterior de X11, como R1 o R2, codifiqué un programa completo de "Hello, World" solo en Xlib.

Aproximadamente 700 líneas de C.

usted no quiere ir allí.

+8

este comentario me hizo reír – matchew

+1

-1. Tonterías típicas que se encuentran en los sitios de preguntas y respuestas: cuando alguien pregunta "¿cómo hacer ABC?", Alguien responde "¿por qué quieres hacer ABC?". A menos que comprenda cómo codificar utilizando Xlib, nunca estará en condiciones de escribir Xlib usted mismo, posiblemente para un kernel de SO nuevo que no se haya inventado. Por supuesto, si está entregando software profesionalmente según las líneas de tiempo, irá con una abstracción de alto nivel bien respaldada. Pero si confías ciegamente en los programadores modernos, nunca aprenderás cómo construir los primitivos cuando surja la necesidad. –

+0

Tonterías pedantes típicas. Él es claramente nuevo en esto. Si quiere aprender los aspectos internos, puede hacerlo, pero, de nuevo, una vez hecho esto cuando * no estaba * mucho más allá de Xlib, solo un tonto intenta hacerlo solo para aprender a escribir una X GUI. –

1

Sugeriría lesstif/motif también. También se basa en X y la curva de aprendizaje es, en mi opinión, no tan pronunciada como GTK o Qt. Sin embargo, las UI que construyas con ellas no serán tan sofisticadas como las que podrías construir con GTK o Qt. Se puede encontrar más información en here.

Como han mencionado otros probablemente no quieras X es un dolor.

3

La interfaz "nativa" para Linux & la mayoría de los demás sistemas operativos similares a Unix es Xlib, la API C de nivel más bajo para X11.

GTK, Qt & otros son todos (hasta donde yo sé) implementados en términos de Xlib en su núcleo. Como han dicho otros, Xlib te brinda el control máximo, pero tendrás que trabajar para ello (y otros pueden correr círculos a tu alrededor en términos de entrega de un producto).

Como punto de referencia, implementé personalmente una biblioteca de GUI multiplataforma moderna (es decir, fluida) multiplataforma (Win32 + X11), bastante rica en características & en C++. El recuento total es de aproximadamente 29 KLOC de C++, de los cuales se requieren aproximadamente 2500 líneas cada uno para el calce de X11 & Win32. El resto es para implementaciones de Widget de plataforma neutra. A menos que esté preparado para comprometerse así, le recomiendo que vaya con una de las bibliotecas de nivel superior (Qt probablemente sea mi elección, aunque no puedo soportar el enfoque de preprocesador).

BTW, una gran ventaja para Xlib es su portabilidad cruda: cualquier caja Unix con pantalla lo tendrá, y también se puede hacer funcionar en Windows & OS X.

10

Unix (y, por extensión, Linux) en realidad no define nada que ver con las GUI. X, que se usa comúnmente, no define nada que tenga que ver con widgets o estilos ni nada de esa naturaleza; se trata principalmente de primitivas de dibujo y manejo de eventos. Básicamente, si quisiera escribir en X puro, estaría definiendo la forma y el comportamiento de cada elemento en la pantalla. Si estuviera lo suficientemente loco como para abandonar X, estaría trabajando en el nivel de framebuffer gráfico ...

Es mejor que use un kit de herramientas - si está buscando un peso ligero, ¿por qué no probarlo? FLTK?

2

Creo que es necesario contraponer la unanimidad de las otras respuestas aquí. X11 es de hecho bajo nivel. Pero para "realmente" entender lo que está pasando, debería estar un poco familiarizado con el funcionamiento de X11. Dado que todos los kits de herramientas funcionan sobre X, lo está usando, lo quiera o no. Hay un buen tutorial en línea en algún lugar que soy demasiado flojo para buscar. Lo guía a través de la construcción de un simple Hello World. Para hacerlo, tendrás que aprender a crear una ventana, solicitar eventos, mapear la ventana y procesar eventos en un bucle. Incluso podría llegar a ordenar algunos libros usados ​​en Amazon. Los O'Reilly vols 1 y 2 (por ahora obtienen las ediciones más baratas, pero nada antes que X11R4) son esenciales para referencia y para obtener la historia completa de cómo funcionan las piezas juntas. Para aprender, sin embargo, el mejor libro es X Window Applications Programming por Eric Johnson y Kevin Reichard.

En algún punto a lo largo de este viaje, como todos los demás dicen, encontrará que ha tenido suficiente. Dos páginas de código solo para seleccionar una imagen, y luego todavía debe rellenar un mapa de colores antes de poder pintar su mapa de bits personalizado. Y luego dos días de reescritura y depuración para darse cuenta de que todo funciona; ¡simplemente te olvidaste de XFlush()!

La lucha es importante, porque apreciarás más los kits de herramientas una vez que encuentres el que más te guste.

0

Por qué no elegir uno entre, digamos, Qt, wxWidgets y GTK y aprender su funcionamiento interno, en lugar de su API? No me refiero solo por el hecho de hacerlo, sino con el objetivo de contribuir a las partes que le resulten más atractivas. De esta forma, cumplirías tu objetivo y harías algo útil, para ti y también para los demás. Creo que esto sería más gratificante que asignarte la tarea más bien artificial de construir una aplicación con lo que equivalen a las herramientas equivocadas.

Cuestiones relacionadas