Cos'è l'API GUI nativa di Linux?


441

Spero che questa non sia una domanda stupida, ma è sempre qualcosa che mi sono chiesto. Sia Windows (API Win32) che OS X (Cocoa) hanno le proprie API per gestire finestre, eventi e altri elementi del sistema operativo. Non ho mai avuto una risposta chiara sull'equivalente di Linux.

Ho sentito alcune persone dire GTK +, ma GTK + è multipiattaforma, come può essere nativo?


46
Joni ha ragione: "In Linux l'interfaccia utente grafica non fa parte del sistema operativo ... X Window System definisce un protocollo di rete per [capacità della GUI]. Librerie di toolkit come Gtk + (usato da Gnome) e QT (usato da KDE), costruito su Xlib. "
paulsm4,

33
al contrario, David, questa è un'indagine eccellente
anfibio,

7
Sono d'accordo - ho letto "L'API di programmazione Linux" e "Programmazione di sistemi ... Unix" che sono le due bibbie sul kernel e sull'API, e questa domanda non mi è mai venuta in mente :) Le risposte sono interessanti.
John Humphreys - w00te,

10
L'API Win32 è anche multipiattaforma se includi Wine ..
Brendan Long

2
BTW Windows ha sottosistemi WIN32 / WIN64 che implementano molto lo stesso per il 'Windows Look and Feel - aka WIN32' tra le altre cose. Questi sottosistemi operano al di sopra del kernel NT. Le API per questi sono diverse. Ad esempio C: è un'astrazione WIN32, non una cosa del kernel NT. Lo stesso per alcune funzionalità della finestra. Windows aveva anche sottosistemi Unix disponibili (che supportano X11 in una certa misura).
Preet Sangha,

Risposte:


603

In Linux l'interfaccia utente grafica non fa parte del sistema operativo. L'interfaccia utente grafica presente sulla maggior parte dei desktop Linux è fornita da un software chiamato X Window System , che definisce un modo indipendente dal dispositivo di gestire schermi, tastiere e dispositivi di puntamento.

X Window definisce un protocollo di rete per la comunicazione e qualsiasi programma che sappia "parlare" questo protocollo può usarlo. V'è una libreria C chiamata Xlib che rende più facile da usare questo protocollo, in modo da Xlib è una specie di l' API GUI nativa. Xlib non è l'unico modo per accedere a un server X Window; c'è anche XCB .

Le librerie di toolkit come GTK + (usato da GNOME ) e Qt (usato da KDE ), costruite su Xlib, sono usate perché sono più facili da programmare. Ad esempio, offrono un aspetto coerente tra le applicazioni, semplificano l'utilizzo del trascinamento della selezione, forniscono componenti standard per un ambiente desktop moderno e così via.

Il modo in cui X disegna sullo schermo internamente dipende dall'implementazione. X.org ha una parte indipendente dal dispositivo e una parte dipendente dal dispositivo. Il primo gestisce le risorse dello schermo come Windows, mentre il secondo comunica con il driver della scheda grafica, generalmente un modulo del kernel. La comunicazione può avvenire tramite accesso diretto alla memoria o tramite chiamate di sistema al kernel. Il driver traduce i comandi in una forma comprensibile all'hardware sulla scheda.

A partire dal 2013, un nuovo sistema di finestre chiamato Wayland sta iniziando a diventare utilizzabile e molte distribuzioni hanno affermato che a un certo punto migreranno verso di esso, sebbene non ci sia ancora un programma chiaro. Questo sistema si basa sull'API OpenGL / ES, il che significa che in futuro OpenGL sarà l '"API GUI nativa" in Linux. Si sta lavorando per trasferire GTK + e QT su Wayland, in modo che le attuali applicazioni e sistemi desktop popolari necessitino di modifiche minime. Le applicazioni che non possono essere trasferite saranno supportate tramite un server X11, proprio come OS X supporta le app X11 tramite Xquartz. Il porto GTK + dovrebbe essere completato entro un anno , mentre Qt 5 ha già il supporto completo per Wayland.

Per complicare ulteriormente le cose, Ubuntu ha annunciato che stanno sviluppando un nuovo sistema chiamato Mir a causa dei problemi che percepiscono con Wayland. Questo sistema di finestre si basa anche sull'API OpenGL / ES.


95
+1. Da quando un sistema operativo deve avere una GUI, il che implica che in caso contrario non è un sistema operativo? Senza senso.
David Hammen,

42
Persino Windows era originariamente solo un programma eseguito su DOS.
dan04

2
+1 @DavidHammen Non sono sicuro che sia stato indirizzato a me o meno, ma hai ragione al 100%. La mia terminologia non era esattamente accurata. Quello che avrei dovuto dire era che non è un sistema operativo completo nel modo in cui potresti comunemente pensare a un sistema operativo con tutti i componenti aggiuntivi che lo rendono facile da usare, ma piuttosto un conglomerato di componenti di diversi fornitori, ecc.
Chris Thompson,

3
@ChrisThompson - hmm ... forse sono troppo vecchio ma non ho mai pensato a una GUI come parte fondamentale di un sistema operativo. E non ho mai pensato a un sistema operativo senza una GUI come semplicemente "un conglomerato di componenti di diversi fornitori, ecc." Ma hey forse le cose sono andate avanti da quando ho formulato la mia opinione su ciò che costituiva un sistema operativo :)
George Hawkins,

2
A meno che una risposta non sia una wiki della comunità, non cambierò alcun contenuto, a parte il miglioramento della grammatica / formattazione o l'aggiunta di collegamenti. Se il contenuto deve essere corretto o aggiornato, questa è la responsabilità della persona la cui reputazione è legata al contenuto. Tuttavia farò loro il favore di commentare, in modo che diventino consapevoli del fatto che penso che qualcosa debba essere corretto o aggiornato.
Onesto Abe

84

Linux è un kernel, non un sistema operativo completo. Esistono diversi sistemi di finestre e gui che funzionano su Linux per fornire finestre. Tipicamente X11 è il sistema di finestre usato dalle distribuzioni Linux.


6
Sono costruiti sopra di esso. X11 è il server, mentre KDE, Gnome ecc. Sono desktop manager, che forniscono API di livello superiore, layout di finestre comuni ecc.
Segna il

7
X11 è l'attuale livello di basso livello che gestisce tutte queste cose e gestisce il disegno su schermo ecc (e comunica con i driver grafici). Gnome / KDE controlla quindi X11. Questo è tutto ad alto livello e ignorando un miliardo e un dettaglio.
slugonamission,

3
Grazie. un'altra domanda: Wikipedia spiega che X11 "crea un livello di astrazione hardware in cui il software è scritto per utilizzare un insieme generalizzato di comandi, consentendo l'indipendenza del dispositivo e il riutilizzo dei programmi su qualsiasi computer che implementa X." la mia domanda è: perché X11 fornisce l'interazione hardware (HAL), il kernel Linux dovrebbe fornire che e X11 dovrebbe operare in cima al kernel? In altre parole, perché X11 sta raggiungendo i dispositivi hardware quando il kernel dovrebbe essere il suo proxy?
anfibio,

1
Penso che in questo caso HALsia un termine usato in modo errato. In realtà quello che stanno dicendo è che X11 fornisce un mezzo indipendente dal sistema per visualizzare le finestre. Esistono versioni di X11 per Darwin (Mac OS - che attualmente è più complicato con Mountain Lion ...), MS Windows e Linux.
Chris Thompson,

4
X11 è un protocollo di rete. L'astrazione prevede la scrittura di programmi sulla piattaforma A in grado di visualizzare client X11 (finestre, app, ecc.) Sulla piattaforma B su alcune apparecchiature di rete. L'app può essere eseguita localmente, in remoto, in un server nidificato, in un server virtuale che esegue solo VNC, ecc. L'astrazione hardware (sulla piattaforma locale) è un effetto collaterale di questa funzionalità, ma sfuma anche la linea tra X11 e il kernel (che è ciò che fa l'astrazione hardware su un sistema Unix medio).
Alessio,

59

Vale la pena menzionare anche Wayland in quanto viene principalmente definito un "futuro assassino X11".

Si noti inoltre che Android e alcuni altri sistemi operativi mobili non includono X11 sebbene abbiano un kernel Linux, quindi in questo senso X11 non è nativo di tutti i sistemi Linux.

Essere multipiattaforma non ha nulla a che fare con l'essere nativo. Cocoa è stato anche portato su altre piattaforme tramite GNUStep ma è ancora nativo di OS X / macOS.


2
Il diagramma di architettura di alto livello per Wayland è uguale a quello di X, tranne per il fatto che "Compositor" e "Server" nel diagramma X sono uniti nel diagramma di Wayland. Ciò che manca è una spiegazione plausibile del perché questa integrazione non possa essere realizzata in X.
Kaz

1
bene, direi che non è facile cambiare il design fondamentale di una base di codice di oltre 20 anni. Si noti inoltre che un altro problema con X11 è che la maggior parte delle sue funzionalità come il rendering dei caratteri non viene utilizzata oggi. Inoltre X11 sarà ancora necessario nei server e nei supercomputer, la trasparenza della rete è semplicemente troppo buona per essere abbandonata.
nessuno il

3
@gokcehan wayland non omette la trasparenza della rete, è un mito. Non è implementato ancora , così come molte altre cose in Wayland. wayland.freedesktop.org/faq.html#heading_toc_j_8 blog.martin-graesslin.com/blog/2011/08/… ecc.
whitequark

8
+! per aver menzionato la mancanza di X11 da parte di Android. Android è probabilmente il contro-esempio più convincente dell'argomento secondo cui "x11 è la GUI nativa di Linux". Dimostrare che Linux può avere x11 o Android poiché è una GUI "nativa" mostra ai principianti che Linux è in realtà solo un kernel e non ha sempre una GUI.
Trevor Boyd Smith,

"Essere multipiattaforma non ha nulla a che fare con l'essere nativi" è un punto eccellente. Ho usato questo modello molto frequentemente durante i miei anni di porting multipiattaforma. In particolare, negli anni '90, ho venduto un framework che ti consentiva di compilare codice scritto sul framework Metrowerks PowerPlant usando MFC sotto il cofano. (Prima che qualcuno sogghignasse, una volta scesi al di sotto delle macro, MFC è abbastanza ragionevole.) Ho anche avuto più lavori di porting in cui l'API Win32 o Mac Toolbox era la specifica contro la quale abbiamo compilato, reimplementato secondo necessità sulle altre piattaforme .
Andy Dent,

23

A rigor di termini, l'API di Linux consiste nelle sue chiamate di sistema . Queste sono tutte le funzioni del kernel che possono essere richiamate da un programma in modalità utente (non kernel). Questa è un'interfaccia di livello molto basso che consente ai programmi di fare cose come aprire e leggere file. Vedi http://en.wikipedia.org/wiki/System_call per un'introduzione generale.

Un vero sistema Linux avrà anche un intero "stack" di altro software in esecuzione su di esso, al fine di fornire un'interfaccia utente grafica e altre funzionalità. Ogni elemento di questo stack offrirà la propria API.


3
Questa risposta è stata scritta quando la domanda era "Qual è l'API nativa di Linux?" (da allora, "GUI" è stata inserita nella domanda).
nibot

È ancora la risposta giusta a quella che ora è una domanda incoerente perché nessuno dei sistemi che si trovano su Linux, inclusi GNU e X11, sono "nativi" in alcun senso significativo.
Jim Balter,

20

Per aiutare in ciò che è già stato menzionato, in questo blog è disponibile un'ottima panoramica dello stack grafico di Linux: http://blog.mecheye.net/2012/06/the-linux-graphics-stack/

Questo spiega X11 / Wayland ecc. E come si adatta tutto insieme. Oltre a quanto è già stato menzionato, penso che valga la pena aggiungere qualcosa sulle seguenti API che è possibile utilizzare per la grafica in Linux:

Mesa - "Mesa è molte cose, ma una delle cose principali per cui è famosa è la sua implementazione OpenGL. È un'implementazione open source dell'API OpenGL."

Il Cairo - "cairo è una libreria di disegni utilizzata direttamente da applicazioni come Firefox o tramite librerie come GTK + per disegnare forme vettoriali".

DRM (Direct Rendering Manager) - Capisco questo meno, ma sono fondamentalmente i driver del kernel che ti consentono di scrivere grafica direttamente su framebuffer senza passare attraverso X


habrahabr.ru/post/148954 - (in russo) traduzione di quel post se qualcuno ha bisogno
Boris Burkov


5

XWindows è probabilmente il più vicino a quello che potrebbe essere chiamato 'nativo' :)


3
è la stessa cosa di x11?
DavidColson,

1
Ma se lo usi direttamente, vedrai che non è proprio un'API GUI ... Linux non ha solo un'API GUI nativa. Ma quasi tutte quelle API della GUI (almeno quelle comuni su Linux desktop oggi) girano sopra X. Se inizi a scrivere un'applicazione usando la vecchia X oggi, sembrerà totalmente fuori posto su qualsiasi distribuzione moderna, quindi farei diciamo che la GUI nativa dipende dalla distribuzione - gtk / gnome per ubuntu, kde per gli altri.
Axel,

1

La cosa più vicina a Win32 in Linux sarebbe la libc, dato che menzionate non solo l'interfaccia utente ma eventi e "altre cose del sistema operativo"


5
libc (la libreria standard C) è un'interfaccia per le chiamate di sistema del sistema operativo. È quest'ultimo (chiamate del sistema operativo) su Linux che si traduce approssimativamente in Win32 su Windows. Non puoi davvero (o affatto?) Programmare per le attuali versioni di Windows senza un certo livello usando l'API Win32, ma puoi programmare sia per Windows che per Linux senza usare la libreria C standard del rispettivo compilatore, semplicemente duplicando il comando diretto- codice to-syscalls. Non è raccomandato e rende il codice completamente non portabile ad altri sistemi operativi, ma è possibile farlo.
un CVn

L'interfaccia utente non fa parte di libc - fintanto che non pensi a printf / scanf e simili come un'interfaccia utente ... libc è solo la libreria standard C. E non è nemmeno un'interfaccia per le chiamate di sistema del sistema operativo. Fornisce funzioni per l'I / O dei file, la gestione della memoria, l'elaborazione delle stringhe ecc. E utilizza internamente le chiamate di sistema. Per effettuare chiamate di sistema come ioctlte, dovresti includere qualcosa da sys/.
Axel,

La domanda non specificava sempre "GUI".
jv110,

Forse si parla di Xlibnon libc.
i486,

1

Le operazioni grafiche del kernel linux sono in /include/linux/fb.h come struct fb_ops. Alla fine questo è ciò a cui sembrano fare riferimento componenti aggiuntivi come X11, Wayland o DRM. Dato che queste operazioni sono solo per le schede video, non per i supporti cartacei vettoriali o raster o per i terminali orientati a tty, la loro utilità come GUI è limitata; non è del tutto vero che hai bisogno di quei componenti aggiuntivi per ottenere un output grafico se non ti dispiace usare un assemblatore per bypassare syscall, se necessario.


0

La GUI è un'astrazione di alto livello di funzionalità, quindi quasi tutto, dal server XOrg a OpenGL, è portato su più piattaforme, anche per la piattaforma Windows. Ma se per API della GUI intendi * nix API grafica, potresti vagare per "Infrastruttura di rendering diretto".


0

Wayland

Come potresti sentire, Wayland è la scelta principale di molte distro in questi giorni, perché il suo protocollo è più semplice di X.

Toolkit di wayland

Toolkit o librerie di gui che Wayland suggerisce sono:

  • QT 5
  • GTK +
  • LSD
  • Ingombrare
  • EFL

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.