これがばかげた質問として出てこないことを願っていますが、それはいつも私が疑問に思っていたことです。 Windows(Win32 API)とOS X(Cocoa)の両方に、ウィンドウ、イベント、およびその他のOS関連のものを処理するための独自のAPIがあります。私は、Linuxと同等のものについて明確な答えを得たことは一度もありません。
私は何人かの人々がGTK +と言うのを聞いたことがありますが、GTK +はクロスプラットフォームなので、どうすればネイティブにできますか?
Linuxでは、グラフィカルユーザインタフェースはオペレーティングシステムの一部ではありません。ほとんどのLinuxデスクトップに見られるグラフィカルユーザインタフェースは、 X Window System と呼ばれるソフトウェアによって提供されます。これは、画面、キーボード、およびポインタデバイスを扱うデバイスに依存しない方法を定義します。
X Windowは通信用のネットワークプロトコルを定義しており、このプロトコルを「話す」方法を知っているプログラムならどれでも使用できます。このプロトコルを使いやすくする Xlib というCライブラリがあるので、Xlibは一種のtheネイティブGUI APIです。 XlibはX Windowサーバーにアクセスする唯一の方法ではありません。 XCB もあります。
GTK + ( GNOME で使用)や Qt ( KDEで使用)などのツールキットライブラリXLIBの上に構築された )は、プログラミングが簡単なので使用されます。たとえば、アプリケーション間で一貫したルックアンドフィールを提供したり、ドラッグアンドドロップを簡単に使用したり、最新のデスクトップ環境に標準的なコンポーネントを提供したりすることなどができます。
Xがどのように画面上に描画するかは、実装によって異なります。 X.org にはデバイスに依存しない部分とデバイスに依存する部分があります。前者はウィンドウなどの画面リソースを管理し、後者はグラフィックカードドライバ(通常はカーネルモジュール)と通信します。通信は、 ダイレクトメモリアクセス を介して、または システムコール を介してカーネルに対して行われることがあります。ドライバはコマンドをカード上のハードウェアが理解できる形式に変換します。
2013年現在、 Wayland と呼ばれる新しいウィンドウシステムが使用可能になり始めており、まだ明確なスケジュールはありませんが、多くのディストリビューションではいつか移行する予定です。このシステムはOpenGL/ES APIをベースにしているため、将来的にはOpenGLがLinuxの「ネイティブGUI API」になります。 GTK +とQTをWaylandに移植する作業が行われているので、現在普及しているアプリケーションとデスクトップシステムは最小限の変更で済みます。 OS XがXquartzを介してX11アプリケーションをサポートするように、移植できないアプリケーションはX11サーバーを介してサポートされます。 GTK +の移植版は 年以内に完成する予定です 、Qt 5はすでにWaylandを完全にサポートしています。
さらに問題を複雑にするために、UbuntuはWaylandで問題を認識しているため、 Mir という新しいシステムを開発していると発表しました。このウィンドウシステムもOpenGL/ES APIに基づいています。
Linuxはカーネルであり、完全なオペレーティングシステムではありません。ウィンドウを提供するためにLinux上で動作するさまざまなウィンドウシステムとGUIがあります。通常 X11 はLinuxディストリビューションで使用されるウィンドウシステムです。
厳密に言えば、LinuxのAPIはそのシステムコールで構成されています。これらは、ユーザーモード(非カーネル)プログラムから呼び出すことができるすべてのカーネル関数です。これは、プログラムがファイルを開いたり読んだりすることを可能にする非常に低レベルのインタフェースです。一般的な紹介は http://en.wikipedia.org/wiki/System_call をご覧ください。
実際のLinuxシステムでは、グラフィカルユーザーインターフェースやその他の機能を提供するために、他のソフトウェアの「スタック」全体が実行されています。このスタックの各要素は独自のAPIを提供します。
すでに述べたことを手助けするために、このブログでLinuxグラフィックスタックの非常に良い概説があります: http://blog.mecheye.net/2012/06/the-linux- graphics-stack /
これはX11/Waylandなどとそれがどのように一緒に収まるかを説明します。すでに述べたことに加えて、Linuxのグラフィックに使用できる次のAPIについて少し追加する価値があると思います。
Mesa - "Mesaは多くのものですが、最も有名なのはそのOpenGLの実装です。それはopen-の実装です。 OpenGL APIのソース実装」
Cairo - "cairoは、Firefoxなどのアプリケーションで直接使用されるか、GTK +などのライブラリを介してベクトル図形を描画するための描画ライブラリです。"
DRM(Direct Rendering Manager) - これはほとんど理解できませんが、基本的にはXを経由せずにグラフィックを直接フレームバッファに書き込むことができるカーネルドライバです。
私はその質問が「LinuxのネイティブGUI APIとは何か」のようなものだと思います。
ほとんどの場合、X(別名X11)がそのために使用されます。 http://en.wikipedia.org/wiki/X_Window_System 。
APIドキュメント はこちら にあります。
XWindowsはおそらく「ネイティブ」と呼ばれるものに最も近いものです:)
あなたがUIだけでなくイベントや "その他のOSのもの"を言及したように、LinuxでWin32に最も近いものはlibcでしょう
GUIは高レベルの機能の抽象化であるため、XOrgサーバーからOpenGLまでのほとんどすべてが、Windowsプラットフォームを含むクロスプラットフォームに移植されています。しかし、GUI APIとは、* nixグラフィックスAPIを意味するのであれば、 "Direct Rendering Infrastructure"をさまようかもしれません。
Linuxカーネルのグラフィカル操作は/include/linux/fb.hにstruct fb_opsとしてあります。結局これはX11、Wayland、またはDRMのようなアドオンが参照するように見えるものです。これらの操作はビデオカードのみを対象としているため、ベクターやラスターのハードコピーやtty指向の端末機器ではないため、GUIとしての有用性は限られています。必要に応じてアセンブラを使用してsyscallをバイパスしてもかまわないのであれば、グラフィカルな出力を得るためにこれらのアドオンが必要になることはまったく本当ではありません。