LinuxのネイティブGUI APIとは何ですか?


441

私はこれが愚かな質問として出くわさないことを望みますが、それはいつも私が疑問に思っていることです。Windows(Win32 API)とOS X(Cocoa)の両方には、ウィンドウ、イベント、その他のOSのものを処理するための独自のAPIがあります。Linuxの同等物が何であるかについて、私は本当に明確な答えを得たことがありません。

GTK +と言う人もいますが、GTK +はクロスプラットフォームです。どうすればネイティブになれますか?


46
Joniは正解です。「Linuxでは、グラフィカルユーザーインターフェイスはオペレーティングシステムの一部ではありません。XWindow Systemは[GUI機能]のネットワークプロトコルを定義しています。Gtk+(Gnomeで使用)やQT( KDE)、Xlibの上に構築されました。」
paulsm4 2012年

33
それどころか、デビッド、これは素晴らしい調査です
両生類

7
同意します-カーネルとAPIの2つの聖書である「LinuxプログラミングAPI」と「システムプログラミング... Unix」を読みましたが、この質問は私には起こりませんでした:)答えは興味深いものです。
ジョンハンフリーズ-2012年

10
あなたがワイン..含まれている場合のWin32 APIは、クロスプラットフォームもある
ブレンダンロング

2
ちなみに、WindowsにはWIN32 / WIN64サブシステムがあり、「Windowsのルックアンドフィール-別名WIN32」と同じものを数多く実装しています。これらのサブシステムは、NTカーネルの上で動作します。これらのAPIは異なります。たとえば、C:はWIN32の抽象概念であり、NTカーネルのものではありません。一部のウィンドウ機能についても同じです。Windowsには、利用可能なUnixサブシステム(X11をある程度サポートする)もありました。
Preet Sangha 2012

回答:


603

Linuxでは、グラフィカルユーザーインターフェイスはオペレーティングシステムの一部ではありません。ほとんどのLinuxデスクトップにあるグラフィカルユーザーインターフェイスは、Xウィンドウシステムと呼ばれるソフトウェアによって提供されます。これは、画面、キーボード、およびポインターデバイスを処理するデバイスに依存しない方法を定義します。

X Windowは通信用のネットワークプロトコルを定義し、このプロトコルを「話す」方法を知っているすべてのプログラムがそれを使用できます。呼ばれるCライブラリがあるのXlib Xlibのは一種のであるので、それが簡単にこのプロトコルを使用することができますネイティブGUI APIが。XlibはX Windowサーバーにアクセスする唯一の方法ではありません。XCBもあります。

Xlibの上に構築されたGTK +GNOMEで使用)やQtKDEで使用)などのツールキットライブラリを使用すると、プログラミングが容易になります。たとえば、アプリケーション間で一貫したルックアンドフィールを提供し、ドラッグアンドドロップの使用を容易にし、コンポーネントを最新のデスクトップ環境に標準で提供します。

Xが画面にどのように描画するかは、実装によって異なります。X.orgには、デバイスに依存しない部分とデバイスに依存する部分があります。前者はウィンドウなどの画面リソースを管理し、後者はグラフィックスカードドライバー(通常はカーネルモジュール)と通信します。通信は、直接メモリアクセスを介して、またはカーネルへのシステムコールを介して行われます。ドライバは、コマンドをカードのハードウェアが理解できる形式に変換します。

2013年の時点で、Waylandと呼ばれる新しいウィンドウシステムが使用可能になり始めており、明確なスケジュールはまだありませんが、多くのディストリビューションは、いつか移行する予定だと言っています。このシステムはOpenGL / ES APIに基づいています。つまり、将来的にはOpenGLがLinuxの「ネイティブGUI API」になるでしょう。GTK +とQTをWaylandに移植する作業が行われているため、現在人気のあるアプリケーションとデスクトップシステムは最小限の変更で済みます。移植できないアプリケーションは、OS XがXquartzを介してX11アプリをサポートするように、X11サーバーを介してサポートされます。GTK +への移植は1年以内に完了する予定ですが、Qt 5はすでにWaylandを完全にサポートしています。

問題をさらに複雑にするために、UbuntuはWaylandで問題を認識しているため、Mirと呼ばれる新しいシステムを開発していると発表しました。このウィンドウシステムもOpenGL / ES APIに基づいています。


95
+1。いつオペレーティングシステムにGUIが必要になるのか、それがOSではないということを意味するのはいつですか?ナンセンス。
David Hammen、

42
WindowsでさえもともとはDOSの上で実行される単なるプログラムでした。
dan04

2
+1 @DavidHammen指示されたかどうかはわかりませんが、100%正解です。私の用語は正確ではありませんでした。私は何をすべきと述べたことは、それはあなたが一般的になど、使いやすい、それを作るの追加コンポーネントのすべてを持つOSを考えるのではなく、異なるベンダーのコンポーネントの集合体かもしれないように、完全なオペレーティングシステムではないということだった
クリストンプソン

3
@ChrisThompson-うーん...年を取りすぎているかもしれませんが、GUIをOSの中核と考えたことはありません。そして、GUIのない​​OSを単に「異なるベンダーのコンポーネントの集まり」などと考えたことはありません。しかし、私はOSを構成するものについての私の意見を形成してから、事態は進んだのかもしれません:)
George Hawkins

2
回答がコミュニティWikiでない限り、文法や書式の改善、リンクの追加を除いて、コンテンツは変更しません。コンテンツを修正または更新する必要がある場合、その評判がコンテンツに結び付けられている人の責任です。しかし、私は彼らにコメントを優先して、何かを修正または更新する必要があると私が気づくようにします
正直な阿部

84

Linuxはカーネルであり、完全なオペレーティングシステムではありません。Linux上でウィンドウ処理を提供するために実行されるさまざまなウィンドウシステムとGUIがあります。通常、X11はLinuxディストリビューションで使用されるウィンドウシステムです。


6
それらはその上に構築されています。高レベルAPI、共通のウィンドウレイアウトなどを提供し、デスクトップ管理されているKDE、Gnomeのなどしながら、X11は、サーバーである
マーク・

7
X11は、これらすべてを処理し、画面への描画などを処理する(そしてグラフィックスドライバーと通信する)実際の低レベルレイヤーです。Gnome / KDEはX11を制御します。それは高レベルでのことであり、10億と1つの詳細を無視しています。
slugonamission

3
ありがとう。もう1つの質問:ウィキペディアは、X11が「汎用のコマンドセットを使用するようにソフトウェアが記述されたハードウェアアブストラクションレイヤーを作成し、デバイスに依存せず、Xを実装するコンピューターでプログラムを再利用できるようにする」と説明しています。私の質問は、なぜX11はハードウェアインタラクション(HAL)を提供するのですか?Linuxカーネルがそれを提供し、X11がカーネルの上で動作する必要があるのですか?言い換えると、カーネルをプロキシにする必要があるのに、X11がハードウェアデバイスに到達するのはなぜですか。
両生類

1
この場合、私は間違って使用されている用語だと思いますHAL。実際、彼らが言っているのは、X11はウィンドウを表示するためのシステムに依存しない手段を提供することです。ダーウィン用のX11のバージョン(Mac OS-Mountain Lionを使用すると、実際にはもっと複雑になります)、MS Windows、およびLinuxがあります。
クリストンプソン

4
X11はネットワークプロトコルです。抽象化には、プラットフォームBのX11クライアント(ウィンドウ、アプリなど)を一部のネットワーク機器を介して表示できるプログラムをプラットフォームAで作成することが含まれます。アプリはローカルで、リモートで、ネストされたサーバーで、VNCを実行するだけの仮想サーバーなどで実行できます。ハードウェアの抽象化(ローカルプラットフォームで)は、この機能の副作用ですが、X11とXカーネル(これは、平均的なUnixシステムでハードウェア抽象化を行うものです)。
Alexios

59

ウェイランドは、主に「将来のX11キラー」と呼ばれているため、言及する価値もあります。

また、Androidや他の一部のモバイルオペレーティングシステムにはLinuxカーネルがありますが、X11は含まれていません。その意味で、X11はすべてのLinuxシステムにネイティブではありません。

クロスプラットフォームであることは、ネイティブであることとは何の関係もありません。Cocoaは、GNUStepを介して他のプラットフォームにも移植されていますが、OS X / macOSにはネイティブです。


2
ウェイランドの高レベルのアーキテクチャ図はXのそれと同じですが、Xダイアグラムの「コンポジター」と「サーバー」がウェイランド図にマージされています。何欠けていることは、この統合はX.に加工することができなかった理由をもっともらしい説明である
カズ

1
まあ、20年以上前のコードベースの基本的な設計を変更するのは簡単ではないと思います。また、X11のもう1つの問題は、フォントのレンダリングなど、X11のほとんどの機能が現在使用されていないことです。さらに、X11はサーバーやスーパーコンピューターで必要とされますが、ネットワークの透過性はあきらめられません。
なし

3
@gokcehan waylandはネットワークの透明性を省略していません。それは神話です。まだ実装されていませんが、ウェイランドの他の多くのものと同じです。wayland.freedesktop.org/faq.html#heading_toc_j_8 blog.martin-graesslin.com/blog/2011/08/...など
whitequark

8
+!AndroidのX11の欠如について言及したことに対して。Androidは、「x11がネイティブのLinux GUIである」という議論に対するおそらく最も説得力のある反例です。「ネイティブ」GUIであるため、Linuxがx11またはAndroidを搭載できることを実証すると、Linuxは実際には単なるカーネルであり、常にGUIを備えているわけではないことが初心者に示されます。
Trevor Boyd Smith

「クロスプラットフォームであることはネイティブであることとは何の関係もない」というのは優れた点です。私は長年クロスプラットフォームを移植してきたそのパターンを非常に頻繁に使用しました。最も注目すべきは、90年代に、MFCを使用してMetrowerks PowerPlantフレームワークに書き込まれたコードを内部でクロスコンパイルできるフレームワークを販売したことです。(誰かが冷笑する前に、マクロを下回れば、MFCはかなり合理的です。)Win32またはMac Toolbox APIのいずれかが、私たちがコンパイルした仕様であり、他のプラットフォームで必要に応じて再実装された複数の移植ジョブもありました。
アンディ・デント

23

厳密に言うと、LinuxのAPIはシステムコールで構成されています。これらは、ユーザーモード(非カーネル)プログラムから呼び出すことができるすべてのカーネル関数です。これは非常に低レベルのインターフェースであり、プログラムはファイルを開いたり読み取ったりすることができます。一般的な概要については、http://en.wikipedia.org/wiki/System_callを参照してください

実際のLinuxシステムでは、グラフィカルユーザーインターフェイスやその他の機能を提供するために、他のソフトウェアの「スタック」全体が実行されます。このスタックの各要素は独自のAPIを提供します。


3
この回答は、「LinuxのネイティブAPIとは何ですか?」(それ以来、「GUI」が質問に挿入されました)。
nibot 2012年

それはだ、まだ GNUおよびX11を含むLinuxの上に座るシステム、のいずれも、意味のある意味での「ネイティブ」ではないので、今支離滅裂な質問です何に正しい答え。
ジムバルター

20

すでに言及されていることを支援するために、このブログにLinuxグラフィックスタックの非常に優れた概要があります。http//blog.mecheye.net/2012/06/the-linux-graphics-stack/

これはX11 / Waylandなどとそれがどのように組み合わされるかを説明します。すでに述べたことに加えて、Linuxのグラフィックに使用できる次のAPIについて少し追加する価値があると思います。

メサ -「メサは多くのものですが、メサが最も有名であることの主なものの1つはOpenGL実装です。これはOpenGL APIのオープンソース実装です。」

カイロ - 「カイロは、ベクトル図形を描画するために、直接、またはGTK +などのライブラリを通じてFirefoxなどのアプリケーションのいずれかによって使用された描画ライブラリです。」

DRM(Direct Rendering Manager) -少なくともこれは理解していますが、基本的には、Xを経由せずにグラフィックを直接フレームバッファーに書き込むことができるカーネルドライバーです


habrahabr.ru/post/148954-誰かが必要な場合のその投稿の(ロシア語の)翻訳
Boris Burkov


5

XWindowsはおそらく「ネイティブ」と呼ばれるものに最も近いものです:)


3
それはx11と同じですか?
DavidColson、2012年

1
しかし、それを直接使用する場合、それはまったくGUI APIではないことがわかります... Linuxには1つのネイティブGUI APIがありません。しかし、ほとんどすべてのGUI API(少なくとも今日のデスクトップLinuxで一般的なもの)はXの上で実行されます。今日のプレーンな古いXを使用してアプリケーションを作成し始めると、現代のディストリビューションではまったく場違いに見えるので、ネイティブGUIはディストリビューションに依存するとします-ubuntuの場合はgtk / gnome、その他の場合はkde。
Axel

1

LinuxでのWin32に最も近いのはlibcです。UIだけでなく、イベントや「その他のOSのもの」にも言及しています。


5
libc(C標準ライブラリ)は、OSシステムコールへのインターフェイスです。Linuxでは後者(OSシステムコール)であり、WindowsではほぼWin32に変換されます。Win32 APIを使用せずに、現在のバージョンのWindowsのプログラムを実際に(またはまったく)実行することはできませんが、直接とto-syscallsコード。これはお勧めできません。コードを他のOSに完全に移植できなくすることは可能ですが、可能です。
からCVn

UIはlibcの一部ではありません-printf / scanfなどをUIであると考えない限り... libcは単なるC標準ライブラリです。また、OSシステムコールへのインターフェイスでもありません。ファイルI / O、メモリ管理、文字列処理などの機能を提供し、内部的にシステムコールを使用します。ioctl自分のようなシステムコールを行うには、から何かを含める必要がありますsys/
Axel

質問は必ずしも「GUI」を指定していませんでした。
jv110

たぶん、あなたはについて話しXlibませんlibc
i486

1

Linuxカーネルのグラフィカル操作は、/ include / linux / fb.hにstruct fb_opsとして含まれています。最終的には、これがX11、Wayland、DRMなどのアドオンが参照しているように見えます。これらの操作はビデオカード専用であり、ベクターまたはラスターハードコピーやtty指向の端末デバイスではないため、GUIとしての有用性は限られています。いくつかのアセンブラを使用して必要に応じてsyscallをバイパスすることを気にしない場合は、グラフィック出力を取得するためにこれらのアドオンが必要になるというのはまったく真実ではありません。


0

GUIは機能の高レベルの抽象化であるため、XOrgサーバーからOpenGLまでのほとんどすべてが、Windowsプラットフォームを含め、クロスプラットフォームで移植されます。ただし、GUI APIが* nixグラフィックAPIを意味する場合は、「直接レンダリングインフラストラクチャ」をさまよっている可能性があります。


0

ウェイランド

聞いたことがあるかもしれませんが、プロトコルがXよりもシンプルであるため、最近では多くのディストリビューションでウェイランドが採用されています。

ウェイランドのツールキット

ウェイランドが提案するツールキットまたはGUIライブラリは次のとおりです。

  • QT 5
  • GTK +
  • LSD
  • 乱雑
  • EFL

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.