私はこれが愚かな質問として出くわさないことを望みますが、それはいつも私が疑問に思っていることです。Windows(Win32 API)とOS X(Cocoa)の両方には、ウィンドウ、イベント、その他のOSのものを処理するための独自のAPIがあります。Linuxの同等物が何であるかについて、私は本当に明確な答えを得たことがありません。
GTK +と言う人もいますが、GTK +はクロスプラットフォームです。どうすればネイティブになれますか?
私はこれが愚かな質問として出くわさないことを望みますが、それはいつも私が疑問に思っていることです。Windows(Win32 API)とOS X(Cocoa)の両方には、ウィンドウ、イベント、その他のOSのものを処理するための独自のAPIがあります。Linuxの同等物が何であるかについて、私は本当に明確な答えを得たことがありません。
GTK +と言う人もいますが、GTK +はクロスプラットフォームです。どうすればネイティブになれますか?
回答:
Linuxでは、グラフィカルユーザーインターフェイスはオペレーティングシステムの一部ではありません。ほとんどのLinuxデスクトップにあるグラフィカルユーザーインターフェイスは、Xウィンドウシステムと呼ばれるソフトウェアによって提供されます。これは、画面、キーボード、およびポインターデバイスを処理するデバイスに依存しない方法を定義します。
X Windowは通信用のネットワークプロトコルを定義し、このプロトコルを「話す」方法を知っているすべてのプログラムがそれを使用できます。呼ばれるCライブラリがあるのXlib Xlibのは一種のであるので、それが簡単にこのプロトコルを使用することができますネイティブGUI APIが。XlibはX Windowサーバーにアクセスする唯一の方法ではありません。XCBもあります。
Xlibの上に構築されたGTK +(GNOMEで使用)やQt(KDEで使用)などのツールキットライブラリを使用すると、プログラミングが容易になります。たとえば、アプリケーション間で一貫したルックアンドフィールを提供し、ドラッグアンドドロップの使用を容易にし、コンポーネントを最新のデスクトップ環境に標準で提供します。
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に基づいています。
Linuxはカーネルであり、完全なオペレーティングシステムではありません。Linux上でウィンドウ処理を提供するために実行されるさまざまなウィンドウシステムとGUIがあります。通常、X11はLinuxディストリビューションで使用されるウィンドウシステムです。
HAL
。実際、彼らが言っているのは、X11はウィンドウを表示するためのシステムに依存しない手段を提供することです。ダーウィン用のX11のバージョン(Mac OS-Mountain Lionを使用すると、実際にはもっと複雑になります)、MS Windows、およびLinuxがあります。
ウェイランドは、主に「将来のX11キラー」と呼ばれているため、言及する価値もあります。
また、Androidや他の一部のモバイルオペレーティングシステムにはLinuxカーネルがありますが、X11は含まれていません。その意味で、X11はすべてのLinuxシステムにネイティブではありません。
クロスプラットフォームであることは、ネイティブであることとは何の関係もありません。Cocoaは、GNUStepを介して他のプラットフォームにも移植されていますが、OS X / macOSにはネイティブです。
厳密に言うと、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について少し追加する価値があると思います。
メサ -「メサは多くのものですが、メサが最も有名であることの主なものの1つはOpenGL実装です。これはOpenGL APIのオープンソース実装です。」
カイロ - 「カイロは、ベクトル図形を描画するために、直接、またはGTK +などのライブラリを通じてFirefoxなどのアプリケーションのいずれかによって使用された描画ライブラリです。」
DRM(Direct Rendering Manager) -少なくともこれは理解していますが、基本的には、Xを経由せずにグラフィックを直接フレームバッファーに書き込むことができるカーネルドライバーです
質問は、「LinuxのネイティブGUI APIとは何か」に似ていると思います。
ほとんどの場合、X(別名X11)がそのために使用されます:http : //en.wikipedia.org/wiki/X_Window_System。
APIドキュメントはこちらにあります
XWindowsはおそらく「ネイティブ」と呼ばれるものに最も近いものです:)
LinuxでのWin32に最も近いのはlibcです。UIだけでなく、イベントや「その他のOSのもの」にも言及しています。
ioctl
自分のようなシステムコールを行うには、から何かを含める必要がありますsys/
。
Xlib
ませんlibc
。
Linuxカーネルのグラフィカル操作は、/ include / linux / fb.hにstruct fb_opsとして含まれています。最終的には、これがX11、Wayland、DRMなどのアドオンが参照しているように見えます。これらの操作はビデオカード専用であり、ベクターまたはラスターハードコピーやtty指向の端末デバイスではないため、GUIとしての有用性は限られています。いくつかのアセンブラを使用して必要に応じてsyscallをバイパスすることを気にしない場合は、グラフィック出力を取得するためにこれらのアドオンが必要になるというのはまったく真実ではありません。
GUIは機能の高レベルの抽象化であるため、XOrgサーバーからOpenGLまでのほとんどすべてが、Windowsプラットフォームを含め、クロスプラットフォームで移植されます。ただし、GUI APIが* nixグラフィックAPIを意味する場合は、「直接レンダリングインフラストラクチャ」をさまよっている可能性があります。
元の質問を言い換えると、次のようになり
ます。
A.「LinuxカーネルAPI」。 https://www.kernel.org/doc/htmldocs/kernel-api