Was ist die native GUI-API von Linux?


441

Ich hoffe, das kommt nicht als dumme Frage rüber, aber ich habe mich immer gefragt. Sowohl Windows (Win32 API) als auch OS X (Cocoa) verfügen über eigene APIs, um Fenster, Ereignisse und andere Betriebssysteme zu verarbeiten. Ich habe nie wirklich eine klare Antwort darauf bekommen, was Linux entspricht.

Ich habe einige Leute sagen hören, GTK +, aber GTK + ist plattformübergreifend. Wie kann es native sein?


46
Joni hat Recht: "Unter Linux ist die grafische Benutzeroberfläche nicht Teil des Betriebssystems ... X Window System definiert ein Netzwerkprotokoll für [GUI-Funktionen]. Toolkit-Bibliotheken wie Gtk + (von Gnome verwendet) und QT (von verwendet) KDE), gebaut auf Xlib. "
Pauls4

33
im Gegenteil, David, dies ist eine ausgezeichnete Untersuchung
Amphibient

7
Ich stimme zu - ich habe "The Linux Programming API" und "Systems Programming ... Unix" gelesen, die zwei Bibeln auf dem Kernel und der API, und diese Frage ist mir nie in den Sinn gekommen :) Die Antworten sind interessant.
John Humphreys - w00te

10
Die Win32-API ist auch plattformübergreifend, wenn Sie Wine einschließen.
Brendan Long

2
BTW Windows verfügt über WIN32 / WIN64-Subsysteme, die unter anderem für Windows Look and Feel - auch bekannt als WIN32 - viel Ähnliches implementieren. Diese Subsysteme arbeiten über dem NT-Kernel. Die APIs für diese sind unterschiedlich. Zum Beispiel ist C: eine WIN32-Abstraktion, keine NT-Kernel-Sache. Gleiches gilt für einige der Fensterfunktionen. Windows verfügte auch über verfügbare Unix-Subsysteme (die bis zu einem gewissen Grad X11 unterstützen).
Preet Sangha

Antworten:


603

Unter Linux ist die grafische Benutzeroberfläche nicht Teil des Betriebssystems. Die grafische Benutzeroberfläche der meisten Linux-Desktops wird von der Software X Window System bereitgestellt , die eine geräteunabhängige Methode für den Umgang mit Bildschirmen, Tastaturen und Zeigergeräten definiert.

X Window definiert ein Netzwerkprotokoll für die Kommunikation, und jedes Programm, das dieses Protokoll "sprechen" kann, kann es verwenden. Es ist eine C - Bibliothek namens Xlib , die es einfacher zu verwenden dieses Protokoll macht, so Xlib Art ist der nativen GUI - API. Xlib ist nicht die einzige Möglichkeit, auf einen X Window-Server zuzugreifen. Es gibt auch XCB .

Toolkit-Bibliotheken wie GTK + (von GNOME verwendet ) und Qt (von KDE verwendet ), die auf Xlib basieren, werden verwendet, weil sie einfacher zu programmieren sind. Sie bieten beispielsweise ein einheitliches Erscheinungsbild für alle Anwendungen, vereinfachen die Verwendung von Drag & Drop, stellen Standardkomponenten für eine moderne Desktop-Umgebung bereit und so weiter.

Wie X intern auf dem Bildschirm zeichnet, hängt von der Implementierung ab. X.org hat einen geräteunabhängigen Teil und einen geräteabhängigen Teil. Ersteres verwaltet Bildschirmressourcen wie Windows, während letzteres mit dem Grafikkartentreiber kommuniziert, normalerweise einem Kernelmodul. Die Kommunikation kann über direkten Speicherzugriff oder über Systemaufrufe an den Kernel erfolgen. Der Treiber übersetzt die Befehle in eine Form, die die Hardware auf der Karte versteht.

Ab 2013 heißt ein neues Fenstersystem Wayland nutzbar, und viele Distributionen haben angekündigt, dass sie irgendwann darauf migrieren werden, obwohl es noch keinen klaren Zeitplan gibt. Dieses System basiert auf der OpenGL / ES-API, was bedeutet, dass OpenGL in Zukunft die "native GUI-API" unter Linux sein wird. Es wird daran gearbeitet, GTK + und QT nach Wayland zu portieren, sodass die derzeit gängigen Anwendungen und Desktop-Systeme nur minimale Änderungen benötigen. Die Anwendungen, die nicht portiert werden können, werden über einen X11-Server unterstützt, ähnlich wie OS X X11-Apps über Xquartz unterstützt. Der GTK + -Port wird voraussichtlich innerhalb eines Jahres fertiggestellt sein , während Qt 5 bereits vollständige Wayland-Unterstützung bietet.

Um die Sache noch komplizierter zu machen, hat Ubuntu angekündigt, ein neues System namens Mir zu entwickeln, da sie Probleme mit Wayland haben. Dieses Fenstersystem basiert ebenfalls auf der OpenGL / ES-API.


95
+1. Seit wann muss ein Betriebssystem eine grafische Benutzeroberfläche haben, was bedeutet, dass es kein Betriebssystem ist, wenn dies nicht der Fall ist? Unsinn.
David Hammen

42
Sogar Windows war ursprünglich nur ein Programm, das auf DOS lief.
dan04

2
+1 @DavidHammen Ich bin mir nicht sicher, ob das an mich gerichtet war oder nicht, aber du bist zu 100% korrekt. Meine Terminologie war nicht genau. Was ich hätte sagen sollen , war, dass es sich nicht um ein vollständiges Betriebssystem handelt, wie man es sich normalerweise für ein Betriebssystem mit all den zusätzlichen Komponenten vorstellt, die die Verwendung vereinfachen, sondern um ein Konglomerat von Komponenten verschiedener Hersteller usw.
Chris Thompson

3
@ChrisThompson - hmm ... vielleicht bin ich zu alt, aber ich habe nie an eine GUI als Kernbestandteil eines Betriebssystems gedacht. Und ich habe nie gedacht, dass ein Betriebssystem ohne GUI einfach "ein Konglomerat von Komponenten verschiedener Hersteller usw." ist. Aber hey, vielleicht haben sich die Dinge weiterentwickelt, seit ich mir eine Meinung darüber gebildet habe, was ein Betriebssystem ausmacht :)
George Hawkins

2
Sofern eine Antwort kein Community-Wiki ist, werde ich keinen Inhalt ändern, abgesehen von der Verbesserung der Grammatik / Formatierung oder dem Hinzufügen von Links. Wenn Inhalte korrigiert oder aktualisiert werden müssen, liegt dies in der Verantwortung der Person, deren Ruf an den Inhalt gebunden ist. Ich werde ihnen jedoch den Gefallen tun, Kommentare abzugeben, damit sie sich bewusst werden, dass ich denke , dass etwas korrigiert oder aktualisiert werden muss.
Ehrliche Abe

84

Linux ist ein Kernel, kein vollständiges Betriebssystem. Es gibt verschiedene Fenstersysteme und GUI, die auf Linux ausgeführt werden, um die Fensterung zu ermöglichen. Typischerweise ist X11 das Fenstersystem, das von Linux-Distributionen verwendet wird.


6
Sie sind darauf gebaut. X11 ist der Server, während KDE, Gnome usw. sind Desktop - Manager und bietet höhere Level - APIs, gemeinsame Fensterlayouts usw.
Mark

7
X11 ist die eigentliche Ebene auf niedriger Ebene, die all diese Dinge erledigt und das Zeichnen auf dem Bildschirm usw. übernimmt (und mit Grafiktreibern kommuniziert). Gnome / KDE steuern dann X11. Das ist alles auf hohem Niveau und ignoriert eine Milliarde und ein Detail.
Slugonamission

3
Vielen Dank. Noch eine Frage: Wikipedia erklärt, dass X11 "eine Hardware-Abstraktionsschicht erstellt, in der Software so geschrieben wird, dass sie einen allgemeinen Befehlssatz verwendet, der die Geräteunabhängigkeit und die Wiederverwendung von Programmen auf jedem Computer ermöglicht, der X implementiert." Meine Frage ist: Warum bietet X11 Hardware-Interaktion (HAL), sollte der Linux-Kernel dies bereitstellen und X11 über dem Kernel arbeiten? Mit anderen Worten, warum erreicht X11 Hardwaregeräte, wenn der Kernel sein Proxy sein sollte?
Amphibient

1
Ich denke in diesem Fall HAList ein falsch verwendeter Begriff. Eigentlich sagen sie, dass X11 ein systemunabhängiges Mittel zum Anzeigen von Fenstern bietet. Es gibt Versionen von X11 für Darwin (Mac OS - das ist jetzt mit Mountain Lion tatsächlich komplizierter ...), MS Windows und Linux.
Chris Thompson

4
X11 ist ein Netzwerkprotokoll. Bei der Abstraktion werden Programme auf Plattform A geschrieben, mit denen X11-Clients (Fenster, Apps usw.) auf Plattform B über einige Netzwerkgeräte angezeigt werden können. Ihre App kann lokal, remote, auf einem verschachtelten Server, auf einem virtuellen Server, der nur VNC usw. ausführt, ausgeführt werden. Die Hardwareabstraktion (auf der lokalen Plattform) ist ein Nebeneffekt dieser Funktion, verwischt jedoch auch die Grenze zwischen X11 und der Kernel (was die Hardware-Abstraktion auf einem durchschnittlichen Unix-System bewirkt).
Alexios

59

Wayland ist ebenfalls erwähnenswert, da es meistens als "zukünftiger X11-Killer" bezeichnet wird.

Beachten Sie auch, dass Android und einige andere mobile Betriebssysteme X11 nicht enthalten, obwohl sie einen Linux-Kernel haben. In diesem Sinne ist X11 nicht für alle Linux-Systeme nativ.

Plattformübergreifend zu sein hat nichts damit zu tun, einheimisch zu sein. Cocoa wurde auch über GNUStep auf andere Plattformen portiert, ist jedoch immer noch in OS X / macOS enthalten.


2
Das übergeordnete Architekturdiagramm für Wayland ist das gleiche wie das von X, außer dass "Compositor" und "Server" im X-Diagramm im Wayland-Diagramm zusammengeführt werden. Was fehlt, ist eine plausible Erklärung, warum diese Integration nicht in X eingearbeitet werden konnte.
Kaz

1
Nun, ich würde sagen, es ist nicht einfach, das grundlegende Design einer über 20 Jahre alten Codebasis zu ändern. Beachten Sie auch, dass ein weiteres Problem mit X11 darin besteht, dass die meisten Funktionen wie das Rendern von Schriftarten heute nicht verwendet werden. Außerdem wird X11 weiterhin in Servern und Supercomputern benötigt. Die Netzwerktransparenz ist einfach zu gut, um aufgegeben zu werden.
keine

3
@gokcehan wayland lässt Netzwerktransparenz nicht aus, es ist ein Mythos. Es ist nicht implementiert noch , genauso wie viele andere Dinge in Wayland. wayland.freedesktop.org/faq.html#heading_toc_j_8 blog.martin-graesslin.com/blog/2011/08/… usw.
Whitequark

8
+! für die Erwähnung von Android Mangel an X11. Android ist wahrscheinlich das überzeugendste Gegenbeispiel zu dem Argument, dass "x11 die native Linux-GUI ist". Die Demonstration, dass Linux x11 oder Android als "native" GUI haben kann, zeigt Anfängern, dass Linux wirklich nur ein Kernel ist und nicht immer eine GUI hat.
Trevor Boyd Smith

"Plattformübergreifend zu sein hat nichts damit zu tun, einheimisch zu sein" ist ein ausgezeichneter Punkt. Ich habe dieses Muster in meinen Jahren der plattformübergreifenden Portierung sehr häufig verwendet. Vor allem in den 90er Jahren habe ich ein Framework verkauft, mit dem Sie Code, der mit MFC unter der Haube in das Metrowerks PowerPlant-Framework geschrieben wurde, übergreifend kompilieren können. (Bevor jemand spottet, ist MFC ziemlich vernünftig, sobald Sie unter die Makros geraten.) Ich hatte auch mehrere Portierungsjobs, bei denen entweder die Win32- oder die Mac Toolbox-API die Spezifikation war, anhand derer wir sie kompilierten und bei Bedarf auf den anderen Plattformen neu implementierten .
Andy Dent

23

Genau genommen besteht die API von Linux aus ihren Systemaufrufen . Dies sind alle Kernelfunktionen, die von einem Programm im Benutzermodus (Nicht-Kernel) aufgerufen werden können. Dies ist eine sehr einfache Oberfläche, über die Programme beispielsweise Dateien öffnen und lesen können. Eine allgemeine Einführung finden Sie unter http://en.wikipedia.org/wiki/System_call .

Auf einem echten Linux-System wird auch ein ganzer "Stapel" anderer Software ausgeführt, um eine grafische Benutzeroberfläche und andere Funktionen bereitzustellen. Jedes Element dieses Stapels bietet eine eigene API.


3
Diese Antwort wurde geschrieben, als die Frage lautete: "Was ist die native API von Linux?" (seitdem wurde "GUI" in die Frage eingefügt).
Nibot

Es ist immer noch die richtige Antwort auf eine jetzt inkohärente Frage, da keines der Systeme, die auf Linux basieren, einschließlich GNU und X11, in irgendeiner sinnvollen Weise "nativ" ist.
Jim Balter

20

Um das bereits Erwähnte zu unterstützen, gibt es in diesem Blog einen sehr guten Überblick über den Linux-Grafikstapel: http://blog.mecheye.net/2012/06/the-linux-graphics-stack/

Dies erklärt X11 / Wayland usw. und wie alles zusammenpasst. Zusätzlich zu dem, was bereits erwähnt wurde, lohnt es sich, ein wenig über die folgenden APIs hinzuzufügen, die Sie für Grafiken unter Linux verwenden können:

Mesa - "Mesa ist vieles, aber eines der wichtigsten Dinge, für die es am bekanntesten ist, ist seine OpenGL-Implementierung. Es ist eine Open-Source-Implementierung der OpenGL-API."

Kairo - "Kairo ist eine Zeichnungsbibliothek, die entweder von Anwendungen wie Firefox direkt oder über Bibliotheken wie GTK + zum Zeichnen von Vektorformen verwendet wird."

DRM (Direct Rendering Manager) - Ich verstehe das am wenigsten, aber es sind im Grunde die Kerneltreiber, mit denen Sie Grafiken direkt in den Framebuffer schreiben können, ohne X zu durchlaufen


habrahabr.ru/post/148954 - (auf Russisch) Übersetzung dieses Beitrags, wenn jemand braucht
Boris Burkov


5

XWindows ist wahrscheinlich am nächsten an dem, was man als "native" bezeichnen könnte :)


3
ist das dasselbe wie x11?
DavidColson

1
Aber wenn Sie es direkt verwenden, werden Sie sehen, dass es keine richtige GUI-API ist ... Linux hat einfach keine 1 native GUI-API. Aber fast alle diese GUI-APIs (zumindest die heute unter Desktop-Linux üblichen) laufen auf X. Wenn Sie heute anfangen, eine Anwendung mit einfachem altem X zu schreiben, sieht sie in jeder modernen Distribution völlig fehl am Platz aus Angenommen, die native Benutzeroberfläche ist verteilungsabhängig - gtk / gnome für Ubuntu, kde für andere.
Axel

1

Das, was Win32 unter Linux am nächsten kommt, ist die libc, da Sie nicht nur die Benutzeroberfläche, sondern auch Ereignisse und "andere Betriebssysteme" erwähnen.


5
libc (die C-Standardbibliothek) ist eine Schnittstelle zu den Betriebssystemaufrufen des Betriebssystems. Letzteres (Betriebssystemaufrufe) unter Linux übersetzt sich grob in Win32 unter Windows. Sie können nicht wirklich (oder überhaupt nicht?) Für aktuelle Windows-Versionen programmieren, ohne die Win32-API zu verwenden, aber Sie können sowohl für Windows als auch für Linux programmieren, ohne die Standard-C-Bibliothek des jeweiligen Compilers zu verwenden, indem Sie einfach die Direkt- to-syscalls-Code. Es wird nicht empfohlen und macht Ihren Code für andere Betriebssysteme vollständig nicht portierbar, aber es ist möglich.
ein CVn

Die Benutzeroberfläche ist nicht Teil von libc - solange Sie nicht an printf / scanf und dergleichen als Benutzeroberfläche denken ... libc ist nur die C-Standardbibliothek. Und es ist auch keine Schnittstelle zu den Systemaufrufen des Betriebssystems. Es bietet Funktionen für Datei-E / A, Speicherverwaltung, Zeichenfolgenverarbeitung usw. und verwendet intern Systemaufrufe. Um Systemaufrufe wie Sie ioctlselbst zu tätigen, müssten Sie etwas von einschließen sys/.
Axel

In der Frage wurde nicht immer "GUI" angegeben.
Jv110

Vielleicht redest du Xlibnicht darüber libc.
i486

1

Die grafischen Operationen des Linux-Kernels befinden sich in /include/linux/fb.h als struct fb_ops. Letztendlich scheinen Add-Ons wie X11, Wayland oder DRM darauf zu verweisen. Da diese Vorgänge nur für Grafikkarten gelten, nicht für Vektor- oder Raster-Hardcopy oder tty-orientierte Endgeräte, ist ihre Nützlichkeit als GUI begrenzt. Es ist einfach nicht ganz richtig, dass Sie diese Add-Ons benötigen, um eine grafische Ausgabe zu erhalten, wenn es Ihnen nichts ausmacht, einen Assembler zu verwenden, um Syscall nach Bedarf zu umgehen.


0

GUI ist eine Abstraktion von Funktionen auf hoher Ebene, sodass fast alles vom XOrg-Server bis zu OpenGL plattformübergreifend portiert wird, auch für die Windows-Plattform. Wenn Sie mit GUI-API jedoch * nix-Grafik-API meinen, können Sie sich in "Direct Rendering Infrastructure" umsehen.


0

Wayland

Wie Sie vielleicht hören, ist Wayland heutzutage die bevorzugte Wahl vieler Distributionen, da sein Protokoll einfacher ist als das X.

Toolkits von Wayland

Toolkits oder GUI - Bibliotheken dass wayland schlägt vor , sind:

  • QT 5
  • GTK +
  • LSD
  • Unordnung
  • EFL

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.