私は最近Cコードで遊んで、いくつかの機能、特にウィンドウの作成がどのように実装されているかを知りたいと思います。
しばらくSDLを使用してきましたが、X11(またはWayland)に依存しているようです。ところで、X11自体はCで書かれていますが、どのようにウィンドウを作成するのでしょうか?下の方へ行けますか?
たとえば、私はこれを行うシステムコールを知りません。
これは教育目的にのみ使用され、本番用途には使用されません。
ベストアンサー1
X11は、クライアントがウィンドウを要求できるクライアント - サーバーアーキテクチャです。サーバーは実際に物を表示するものであり、クライアントはアプリケーションです。
クライアントソフトウェアとして通常、libX11を使用してこれらの要求を実行します。
X11で直接GUIアプリケーションを開発する人はもういません。 X11デザインのほとんどは、もはやそのようなアプリケーションを書く方法を反映していません。たとえば、X11 には線やボックスなどの基本的な描画ルーチンがあります。ただし、描画するすべての行に対してプロトコルを介して要求するオーバーヘッドは非常に高いです。したがって、賢明なクライアントはそれをサーフェス(必要に応じてビットマップ)に単純に変更された領域をブロックのサーバーに送信します。
さらに、特にSDLを使用するときにOpenGLなどの機能を有効にしたり、X11を介したビットマップのコピーを防ぐために、クライアントとサーバー間の厳密な分離を破らなければならないことに注意する必要があります。代わりに、アプリケーションがSDLに直接書き込むことができます。 GPUバッファ。
さらに、過去10年間に機能開発に積極的に参加しているほとんどすべてのX.org開発者がWaylandでそうしたと言うのが妥当だと思います。したがって、2023年に低レベルX11を実行する方法を学ぶことは最も賢明な選択肢ではないかもしれません。 Waylandはまだこれを達成していませんが、Xの時代が残っていないことは明らかです。
これがもう低いレベルのX11呼び出しをしないもう一つの良い理由です。ますます多くのプラットフォームから自分自身を除外しています(または別の間接層を追加します。xwaylandサーバーはWaylandのシングルウィンドウX11サーバーをエミュレートします。これはある程度機能します。たとえば、XWaylandは基本的な操作をまったく実行しますできません。
したがって、「コードの量はどれくらいですか?」という質問に答えるためには、役に立つ作業を行う必要がない限り多くはありません。スレッドサポートでlibX11を初期化し、ハンドラを設定し、入力処理を初期化し、少なくともxdamageを初期化し、ウィンドウを設定し、サーフェスを取得して描画を開始する必要があります。これはすべて1980年代にC-ductで行われました。正直なところ、より良い時代もありました。 SDL、GTK4、FLTKなどのフレームワークを使用しています...私は個人的に、DearImguiがグラフィックシステムと対話するさまざまな方法に基づいて簡単な例を提供していることに気づきました。これらの方法はX11ウィンドウを取得するための具体的な詳細を抽象化しますが、4 MBのRAMがあまりにも大きなデスクトップのアイデアではなく、最新のGPUインターフェイスに基づいてGUIを構築すると、GUIがどのようにやり取りするかをより深く理解できるため、これは良いです。