このページの内容

このページは、GLFW 3.5.1 公式ドキュメントを改変して Markdown 化したものです。libx 向けに書式、ナビゲーション、リンクを変更していますが、技術的な内容は GLFW 3.5.1 のソース配布物に基づいています。

内部構造

GLFW の内部には複数のインターフェースがあります。各インターフェースには、それぞれが担う領域と命名規則があります。

公開インターフェース

最もよく知られているのは、glfw3.h ヘッダーファイルに記述された公開インターフェースです。これは全プラットフォームで共有されるソースファイルに実装されており、それらのファイルにプラットフォーム固有のコードは含まれません。このコードは通常、実際の処理を行うためにプラットフォームインターフェースと内部インターフェースを呼び出します。

公開インターフェースは、GL と gl の代わりに GLFW と glfw を使う点を除き、OpenGL の命名規則に従います。OpenGL に先例のない構造体メンバーには、先頭を小文字にしたキャメルケースを使用します。

例: glfwCreateWindowGLFWwindowGLFW_RED_BITS

ネイティブインターフェース

ネイティブインターフェースは、一般に公開されている少数のプラットフォーム固有関数です。glfw3native.h ヘッダーファイルに記述されており、プラットフォームインターフェースが使用する基礎となるウィンドウ、コンテキスト、および一部のプラットフォームではディスプレイのハンドルへアクセスするために使われます。

ネイティブインターフェースの関数名は公開インターフェースのものと似ていますが、返されるハンドルが属するインターフェースの名前が組み込まれています。

例: glfwGetX11WindowglfwGetWGLContext

内部インターフェース

内部インターフェースは、ほかのすべてのインターフェースが使用するユーティリティ関数で構成されます。公開インターフェースおよびイベントインターフェースと同じ共有ソースファイルに実装された共有コードです。内部インターフェースは internal.h ヘッダーファイルに記述されています。

内部インターフェースは GLFW のグローバルデータを管理し、そのデータを _glfw という名前の _GLFWlibrary 構造体に格納します。

内部インターフェースは公開インターフェースと同じ形式を使用しますが、すべてのグローバル名に先頭アンダースコアが付きます。

例: _glfwIsValidContextConfig_GLFWwindow_glfw.monitorCount

プラットフォームインターフェース

プラットフォームインターフェースは、公開インターフェースにサービスを提供する形で、プラットフォーム固有のすべての処理を実装します。これにはイベント処理も含まれます。プラットフォームインターフェースがアプリケーションコードから直接呼び出されることはなく、アプリケーションが提供したコールバックを直接呼び出すこともありません。また、内部構造体のプラットフォーム非依存部分を変更することも禁止されています。代わりに、GLFW が対象とするイベントを受け取るとイベントインターフェースを呼び出します。

プラットフォームインターフェースは、いずれかまたはすべてのプラットフォームでプラットフォーム固有の処理が必要となる公開インターフェースの部分を、おおむね反映しています。

プラットフォーム API のウィンドウシステム関連部分は、実行時にプラットフォームを選択できるよう、関数ポインターからなる _GLFWplatform 構造体を通じて呼び出されます。これには、GLFW のウィンドウとコンテキストの作成、入力とイベントの処理、モニター、Vulkan サーフェス作成に関する部分が含まれます。この構造体はグローバルな _glfw 構造体に置かれています。

例: _glfw.platform.createWindow

プラットフォーム API のタイマー、スレッド、モジュール読み込みに関する部分は、使用するウィンドウシステムに依存しないため、_glfwPlatform 接頭辞が付いた通常の関数です。

例: _glfwPlatformGetTimerValue

プラットフォームインターフェースは、プラットフォーム固有のグローバル状態とオブジェクトごとの状態を格納する構造体も定義します。その名前は内部インターフェースの構造体名を反映し、インターフェース固有の接尾辞が追加されます。

例: _GLFWwindowX11_GLFWcontextWGL

これらの構造体は、使用する固有のインターフェースに応じた名前を付ける特殊なマクロによって、内部インターフェースの構造体へメンバーとして組み込まれます。これにより、共有コードが誤ってこれらのメンバーを使用することを防ぎます。

例: window->win32.handle_glfw.x11.display

イベントインターフェース

イベントインターフェースは公開インターフェースと同じ共有ソースファイルに実装されており、受け取ったイベントをコールバック、ウィンドウ状態の変更、またはその両方によってアプリケーションへ届ける役割を担います。

イベントインターフェースの関数名は、_glfwInput 接頭辞と ObjectEvent パターンを使用します。

例: _glfwInputWindowFocus_glfwInputCursorPos

静的関数

静的関数はどのインターフェースからでも使用でき、接頭辞も接尾辞も付きません。先頭を小文字にしたキャメルケースを使用します。

例: isValidElementForJoystick

構成マクロ

GLFW は、コンパイル時に使用するインターフェースとコード経路を選択するために、多数の構成マクロを使用します。これらは GLFW の CMake ターゲットで定義されます。

構成マクロは、先頭にアンダースコアが付く点を除き、公開インターフェースのトークンと同じ形式を使用します。

例: _GLFW_WIN32_GLFW_BUILD_DLL