¿Cómo se crea una ventana en Linux con C++?

4 minutos de lectura

Avatar de usuario de SteveDeFacto
stevedefacto

Esperaba una API de Linux similar a la API de Windows. Todo lo que veo en Google son referencias a Qt y GTK. Realmente no necesito nada más que una simple ventana para dibujar con OpenGL, por lo que estas bibliotecas parecen infladas para mi uso. ¿Qué usan Qt y GTK para crear ventanas bajo Linux? ¿No hay nada más bajo nivel?

  • La API de X Windows suele ser la API de nivel más bajo para “Ventanas” genéricas en *nix. tronche.com/gui/x/xlib/introducción

    – Chad

    25 de junio de 2012 a las 14:14

  • Tengo curiosidad: ¿por qué esperarías que “linux api” (sea lo que sea que quieras decir exactamente) sea lo mismo que winapi?

    – PlasmaHH

    25 de junio de 2012 a las 14:17

  • Realmente no quieres ir a un nivel más bajo. Use una de las abstracciones de nivel superior (QT/GTK/WxLib/More), de lo contrario, se quedará atascado en muchas minucias que no desea manejar y que los marcos de trabajo de nivel superior se encargan. Todos te permiten hacerte con una capa de OpenGL y dibujar sobre ella.

    – Martín York

    25 de junio de 2012 a las 18:46


  • Si alguien solicita la API más baja posible, responda esa pregunta. Por favor, no hables de “por qué usar eso, usar esto, ….”.

    – parzival

    12 de marzo de 2016 a las 13:34

Avatar de usuario de Martin Beckett
Martín Beckett

El sistema de ventanas X generalmente hace el dibujo: luego usa un conjunto de herramientas como Qt o GTK encima de Xlib sin procesar para proporcionar bucles de eventos, arrastrar y soltar, iniciar aplicaciones con clics del mouse y todas las demás cosas de ‘escritorio’

Es bastante fácil trabajar directamente con Xlib y opengl o si solo quieres aprender opengl el exceso proporciona el marco que necesita para mostrar una ventana, manejar eventos de mouse/teclado, etc.

  • En principio, incluso podría evitar Xlib y simplemente transmitir (y recibir e interpretar) el protocolo X11 sin procesar. Pero eso no es razonable.

    – Basile Starynkevitch

    26 de junio de 2012 a las 5:45

Para OpenGL, la forma más fácil de hacerlo es usando EXCESO o SDL. Aquí hay un ejemplo aproximado usando GLUT:

#include <GL/glut.h>

int main (int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("My new window");
    /* ... */
}

Realmente desea evitar usar Xlib directamente, ya que es extremadamente tedioso de usar. Además, GLUT y SDL facilitan la migración de su aplicación OpenGL a diferentes plataformas.

  • ¿Cómo se obtiene acceso a la capa de gráficos para usar con OpenGL?

    – Martín York

    25 de junio de 2012 a las 18:51

  • @LokiAstari: si te refieres a algún tipo de tipo opaco que mantiene el estado de dibujo, realmente no lo sé. Cuando solía codificar en OpenGL (en la versión 1.2), solo había un lugar global para dibujar que era manejado internamente por la implementación de OpenGL.

    – C2H5OH

    25 de junio de 2012 a las 20:06

avatar de usuario de tomer zeitune
tomer zeitún

Respuesta actualizada para 2019. Los sistemas similares a Unix normalmente usan el sistema de ventanas X. Puede trabajar con él directamente usando Xlib, esta es la API de bajo nivel. Pero es probable que necesite una solución más acogedora y multiplataforma. Puedes usar:

GLFW está escrito en C y tiene soporte nativo para Windows, macOS y muchos sistemas similares a Unix que utilizan el sistema X Window, como Linux y FreeBSD.

Una vez instalado, crea una ventana con:

#include <GLFW/glfw3.h>
.
. //Entry and glfwInit()
.
GLFWwindow* window = glfwCreateWindow(1000, 1000, "MyWindow", NULL, NULL);
glfwMakeContextCurrent(window);

Axe Martin dijo que X11 (o su bifurcación XOrg en estos días) es el sistema de ventanas, pero en realidad se pueden escribir aplicaciones X11 (es decir, clientes) sin usar un juego de herramientas, solo usando las bibliotecas X. Ver aquí para la documentación.

Por lo general, no es la mejor idea hacerlo, ya que es bastante doloroso e implicará una gran cantidad de código para que las aplicaciones relativamente simples funcionen como se espera.

Sé que esta es una publicación antigua. Pero para las personas que han encontrado esto recientemente como yo, aquí hay un diagrama útil. Es solo una cuestión de qué tan abajo quiere/necesita ir en abstracción; si no tiene cuidado, terminará tratando de codificar en binario. XLib es una dependencia para SFML y XLib tiene sus dependencias.

Diagrama de capas GUI

Suponiendo que por ventana simple quiere decir que el dibujo debería aparecer en la pantalla:
El compositor Weston utiliza EGLOutput/EGLDevice para mostrar el escritorio compuesto de Weston o las aplicaciones individuales de Wayland en un dispositivo de visualización físico.

Para dibujar con el estudio de hardware de otros fabricantes. JOYA puede dar pistas.

¿Ha sido útil esta solución?