GTK (ツールキット)

**GTK** (以前は **GTK+**、または**GIMP Toolkit**) は、グラフィカルユーザインタフェース (GUI) を作るためのクロスプラットフォームのウィジェット・ツールキットである。WaylandおよびX Window System向けの最も人気のあるツールキットの1つである。

オープンソースな自由ソフトウェアであり、GNU LGPLでライセンスされているため、自由ソフトウェアとプロプライエタリソフトウェアの両方で使用できる。

GTKチームは定期的に新しいバージョンをリリースしている。GTK 4とGTK 3はメンテナンスされているが、GTK 2はサポートが終了している。GTK 1はCinePaintプロジェクトによって独立してメンテナンスされている。

## ソフトウェアアーキテクチャ

GTKライブラリには、グラフィカルコントロール要素（ウィジェット）のセットが含まれている。バージョン3.22.16には、186個のアクティブなウィジェットと36個の非推奨のウィジェットが含まれている。GTKは、C言語で書かれたオブジェクト指向のウィジェットツールキットであり、GObject（GLibオブジェクトシステム）を使用している。GTKは主にX11やWaylandで使用されるが、Microsoft Windows（Windows APIを使用）やmacOS（Quartzを使用）など、他のプラットフォームでも動作する。BroadwayというHTML5バックエンドも存在する。

GTKは、描画されるウィジェットの外観を変更するように設定できる。これは、さまざまな表示エンジンを利用して行われる。使用中のプラットフォーム上のネイティブウィジェットの外観をエミュレートしようとする表示エンジンもいくつか存在する。

2005年にリリースされたバージョン2.8以降、GTKはグラフィカルコントロール要素ウィジェットのほとんどをCairoを使用してレンダリングするようになった。GTKバージョン3.0以降、すべてのレンダリングはCairoを使用して行われる
。

2018年1月26日、で、マティアス・クラセン（Matthias Clasen）はGTK 4開発の現状について概要を説明し、GTK 3でのレンダリングと入力の仕組み、GTK 4（>3.90）での変更点とその理由について詳細に説明した。2019年2月6日、GTK 4ではプロジェクト名から「+」が削除されることが発表された。

### GTK Drawing Kit (GDK)

GDKは、基盤となるウィンドウシステムおよびグラフィックスシステムによって提供される低レベル関数のラッパーとして機能する。

### GTK Scene Graph Kit (GSK)

GSKは、GTKのレンダリングおよびAPIである。GSKは、グラフィカルコントロール要素（ウィジェット）とレンダリングの間に位置する。GSKは、最終的に2017年3月にリリースされたGTKバージョン3.90に統合された。

### GtkBuilder
GtkBuilderを使用すると、コードを記述せずにユーザインターフェイスを設計できる。インターフェイスは、手動、またはGUIデザイナーによって生成されるExtensible Markup Language（XML）ファイルで記述され、実行時に読み込まれ、オブジェクトが自動的に作成される。ユーザインターフェイスの記述は、使用されているプログラミング言語に依存しない。

### 言語バインディング

C++、Genie、JavaScript、Perl、Python、Valaなど、C以外の言語からGTKを使用するための言語バインディングが利用可能である。

### バックエンド
GTKはさまざまなバックエンドをサポートしており、システムや環境に応じてGTKアプリケーションを表示するさまざまな方法を提供する。GTKバックエンドの例は次の通りである。
* Wayland – Linuxシステムで使用される、X11のモダンな代替。
* X11 – X.Orgディスプレイサーバーを使用するLinuxシステムのデフォルト。
* Win32 – WindowsでGTKアプリケーションを実行することができる。
* Quartz – macOSのサポート。
* Broadway – HTML5とWebSocketを使用して、WebブラウザーでGTKアプリケーションを実行できる。

## 開発ツール
### GUIデザイナ

GTKには複数のGUIデザイナが存在する。以下にGTK GUIデザイナの一部を紹介する。

* Cambalache – Gladeの後継で、GTK 4をサポートしている。
* Glade – GTK組み込みのGUI記述形式であるGtkBuilderをサポートしている（現在、アクティブにメンテナンスされていない）。
* Gazpacho – Pythonで書かれたGTKツールキット用のGUIビルダー。
* Crow Designer – 独自のGuiXml形式とGuiLoaderライブラリを使用している。
* Stetic – MonoDevelopの一部で、Gtk#向けである。
* Gambas（バージョン2.0以降、BASICベース）
* Xojo
* Lazarus（LinuxではデフォルトでGTK 2とのインターフェイスとなる）

### GTKインスペクタ

GTKインスペクタはGTKに組み込まれたインタラクティブなデバッグツールであり、UI要素の検査と変更、CSSの変更のテスト、ウィジェット構造のリアルタイム分析を行うことができる。`Control + Shift + I`または`Control + Shift + D`のショートカットを使用するか、`GTK_DEBUG=interactive`環境変数を設定することで有効にできる。GTKバージョン3.14で導入された。
#### 機能
* インタラクティブなデバッグ
* リアルタイムのCSSテストと変更
* 詳細な検査のためのウィジェットの拡大
* UI構造の分析とオブジェクトプロパティの検査
* 環境変数によるカスタマイズ可能な表示設定
* 詳細なオブジェクト検査（タイプ、状態、プロパティ、CSS、アクションなど）
* グローバルアプリケーション情報の表示
* CSSルールのデバッグ
* レンダリングパイプラインの記録と検査

## 開発
GTKは主にGNOMEプロジェクトによって開発されている。GNOMEプロジェクトはGNOME開発プラットフォームとGNOMEデスクトップ環境も開発している。GTKは主にC言語で書かれており、多くの言語バインディングが利用可能である。GTKの開発は緩く管理されている。

GNOMEの開発者とユーザーは、毎年開催されるGNOMEユーザーと開発者のヨーロッパ会議GUADECミーティングに集まり、GNOMEの現状と将来の方向性について議論する。GNOMEは、他のデスクトップとの相互運用性を高めるために、freedesktop.orgの標準とプログラムを取り入れている。

2016年9月1日、GTK開発ブログの投稿で、GTKの将来の番号付けスキームなどが示された。2016年秋にリリースされたGTKバージョン3.22は、3.x系の最後のリリースとなる予定だったが、2018年秋にはGTK 4の遅れによりバージョン3.24が続いた。GTK 4の開発では、2020年12月に最初のGTK 4.0安定リリースが開始されるまで、バージョン名3.90、3.92などが使用されていた。最初の安定したGTK 4リリースにもかかわらず、GTKを使用する一部のアプリケーションは依然としてGTK 2に依存している。たとえば、2022年1月現在、GIMPはまだGTK 3に移植されていない。

### ビルド自動化
GTKのマスターブランチはビルド自動化にMesonを利用している。GTK（およびGNOME、GLibなど）は、以前はビルド自動化システムとしてGNU Build System（Autotools）を利用していた。2017年8月14日以降、Autotoolsビルドシステムファイルは削除された。

## 批判
GTKに対する最も一般的な批判は、主要なアップデートにおける下位互換性の欠如であり、特にAPIとテーマにおいてそれが顕著である。その結果、アプリケーション開発者やテーマ開発者は、GTKの新しいバージョンで動作するようにコードを書き直す必要がある。

GTK 3.xの開発サイクル中にマイナーリリース間で互換性が途切れたのは、現代のユーザーが期待する機能の提供や、影響力が増しているWaylandのサポートなど、革新への強いプレッシャーが原因であるとBenjamin Otteは説明した。GTK 4のリリースにより、革新の必要性によるプレッシャーは解消され、安定性と革新のバランスはより安定することになる。同様に、テーマに対する最近の変更は、APIのその部分を改善し安定化させることを特に意図している。

*Aurélien GâteauはGwenviewをGTKアプリケーションとして開始したが、開発の初期段階でQtに切り替えた。
*Subsurfaceの共同開発者であり、IntelのオープンソーステクノロジーセンターのメンバーでもあるDirk Hohndelは、GTK開発者が攻撃的でコミュニティの要求のほとんどを無視していると批判した。
*LXDE（GTKバージョンは廃止され、すべての取り組みはQtへの移植に集中）の開発者であるHong Jen Yeeは、GTKツールキットのバージョン3の根本的なAPI変更とメモリ使用量の増加を軽蔑し、PCManFMをQtに移植した。PCManFMは、GTKとQtの両方で同時に開発されている。
*Audaciousミュージックプレーヤーはバージョン3.6でQtに移行した。開発者らが述べた理由には、クライアント側のウィンドウ装飾への移行が含まれ、これによりアプリケーションが「GNOME風で場違い」に見えるようになったと彼らは主張している。
*Wiresharkは、GTKのクロスプラットフォームサポートで良い経験がなかったため、Qtに切り替えた。

## 使用例

GTKをウィジェットツールキットとして使用するアプリケーションには、以下のものがある。

* Ardour - デジタルオーディオワークステーション（DAW）
* Deluge - BitTorrentクライアント
* Foliate - 電子書籍リーダー
* GIMP - ラスターグラフィックエディタ
* GNOME Core Applications - GNOMEデスクトップ環境の標準バンドルとして提供されるアプリケーションの集合
* GNOME Circle - GNOMEエコシステム内で動作するように作成されたアプリケーションの集合
* GNOME Evolution - 個人情報管理ソフトウェア
* HandBrake - デジタルビデオトランスコーダ
* Inkscape - ベクターグラフィックエディタ
* LibreOffice - オフィススイート
*  - ゲームマネージャ
* Mozilla Firefox - ウェブブラウザ
* Mozilla Thunderbird - 個人情報管理ソフトウェア
*  - 動画編集ソフトウェア
* PCSX-Reloaded - ゲームエミュレータ
* REAPER - デジタルオーディオワークステーション（DAW）
*  - リモートデスクトップクライアント
* Transmission - BitTorrentクライアント

GTKプログラムは、必要なライブラリがインストールされていれば、X11とWaylandをベースにしたデスクトップ環境や、GTKで作成されていない他のデスクトップ環境でも実行できる。これには、X11.appがインストールされていればmacOSも含まれる。GTKはMicrosoft Windowsでも実行でき、PidginやGIMPなどの人気のあるクロスプラットフォームアプリケーションで使用されている。クロスプラットフォームGUIツールキットであるwxWidgetsは、LinuxでデフォルトでGTKを使用する。他のポートにはDirectFB（例えばDebianインストーラで使用）がある。

### デスクトップ環境

いくつかのデスクトップ環境はウィジェット・ツールキットとしてGTKを使用している。
#### 開発中
* GNOME - GTKをベースとしており、GNOMEネイティブのプログラムはGTKを使用する。  
* Budgie - Solus OSの後継であるSolusオペレーティングシステム用にゼロから構築された。  
* Cinnamon - GNOME 3のフォークで、GTKバージョン3を使用する。  
* MATE - GNOME 2のフォークで、バージョン1.18以降はGTK 3を使用する。  
* Xfce - バージョン4.14以降はGTK 3ベース。  
* Pantheon - elementary OSによって開発されており、GTK 3のみを使用する。  
* Sugar - 青少年初等教育用のデスクトップ環境で、GTK、特にPyGTKを使用する。  
* Phosh - PureOS用に設計されたモバイルUI。 
* LXDE（軽量X11デスクトップ環境） - GTK 2をベースとしている。  
* Unity - Ubuntuの以前のデフォルトのデスクトップ環境。
#### 非アクティブ
* Access Linux Platform - Palm OS PDAプラットフォームの後継。  
* Consort - GNOME 3.4フォールバックモードのSolusからのフォーク。  
* GPE
*  - RISC OSのGUIの機能を備えた軽量デスクトップ。
#### ウィンドウマネージャ
次のウィンドウマネージャはGTKを使用している。
* Aewm
* 
* Amaterus
* Consortium
* IceWM
* Marco
* Metacity
* Muffin
* Mutter
* 
* Wmg
* Xfwm
### GtkSourceView
シンタックスハイライトにはGtkSourceView（ソースコード編集ウィジェット）が利用できる。GtkSourceView は、GTK とは別に GNOME によってライブラリ gtksourceview として管理されている。gsv への名称変更が計画されている。
### GtkSpell
GtkSpell は GTK とは別のライブラリである。GtkSpell は GTK と Enchant に依存している。Enchant は実際のスペルチェッカーエンジンやソフトウェアである ispell、 などのラッパーである。GtkSpell は GTK の GtkTextView ウィジェットを使用してスペルミスのある単語を強調表示し、置換を提案する。

## 歴史
### Linux/Unix
GTKは当初、Motifの代替としてGIMPのために設計され、用いられた。はMotifに失望し、彼自身のGUIツールキット、GIMP toolkitが書かれた。これはGIMP 0.60のリリースでMotifを置き換えることに成功した。最終的にGTKは書き直され、オブジェクト指向となり、GTK+に名前が変更された。これはGIMPの0.99リリースで最初に使われた。GTKはその後、GNOME Foundationによってメンテナンス対応がなされGNOMEデスクトップ環境で使われるようになった。

### GTK 2
GTK 2.0.0リリース（2002年）シリーズでは、Pangoを使用したテキストレンダリングの改善、新しいテーマエンジン、を使用したアクセシビリティの改善、UTF-8文字列を使用したUnicodeへの移行、より柔軟なAPIなどの新機能が導入された。バージョン2.8から、GTK 2はベクターグラフィックスの描画のためのライブラリとしてCairoに依存するようになっている。

### GTK 3
GTKバージョン3.0.0（2011年）には、入力デバイス処理の改良、CSSのような構文で書かれたテーマのサポート、開いている他のGTKアプリケーションに関する情報を受け取る機能が含まれていた。

2019年2月のハッカソン中に「+」が削除され、名前が「GTK」に戻った。

### OpenVMS
HPは、必要なOpenVMSの変更をGTKバージョン1.3の開発ストリームに統合することを目標としていたが、これは実現しなかった。OpenVMS用のGTKの最新バージョンはバージョン1.2.10である。

### GTK 4
GTK 4 開発サイクル（GTK 3.92 など）中に行われた主な変更の1つは、ユーザーカスタマイズオプション（GTK+ 2で設定可能な個別のキーボードショートカットなど）の削除と、GTKが提供する基本クラスに機能をエンコードするのではなく、補助オブジェクトに機能を委任したことである。その他の変更には次のものがある。
* GtkWidgetによって記述されたシグナルハンドラーからのイベント処理は、イベントコントローラーに委任される。
* レンダリングは、GtkSnapshotオブジェクトに委任される。
* レイアウトメカニズムは、GtkWidgetからGtkLayoutManagerに委任される。
2018年ので、マティアス・クラセン（Matthias Clasen）は当時のGTK 4開発の現状について概要を説明し、GTK 3でのレンダリングと入力の仕組み、GTK 4でどのような変更が行われたか、その変更の理由などについて詳細に説明した。GTK 4で可能になったことの例も示された。

## 関連項目

* クライアントサイド・デコレーション
* ウィジェット・ツールキット
* GLib
* FLTK
* Gtk#
* GTK-Qt
* gtkmm

## 脚注

## 外部リンク
*  公式ウェブサイト
* GNOME – Simple, beautiful, elegant. GNOMEオフィシャルサイト
* 日本ＧＮＯＭＥユーザー会 / Japan GNOME Users Group(APIリファレンス・チュートリアル等の日本語訳)