# GTK+ (日本語)

関連記事

- Qt と GTK アプリケーションの外観の統合
- Qt
- GNU Project

GTK+ ウェブサイト より:

  GTK+ もしくは GIMP ツールキットはグラフィカルユーザーインターフェースを作成するためのマルチプラットフォームのツールキットです。ウィジェットの完全なセットを提供することで、GTK+ はちょっとしたツールから完全なアプリケーションスイートまで幅広いプロジェクトに適しています。

当初 GTK+ (GIMP Toolkit) は GNU Project によって GIMP のために作成されました、しかしながら現在ではさまざまな言語のバインディングの存在する人気のあるツールキットになっています。この記事では GTK+ テーマ・スタイル・アイコン・フォント・フォントサイズを設定するのに使うツールと手動設定の方法を詳しく伝えます。

## 設定プログラム

以下の GUI プログラムによってテーマを選択したりフォントをカスタマイズできます。基本的に `~/.gtkrc-2.0` ファイルを上書きします。

- lxappearance: LXDE プロジェクトの設定ツールで、LXDE や他のデスクトップ環境を必要としません。他のプログラムよりも柔軟なカスタマイズが可能です。
- gtk-chtheme
- gtk-theme-switch2
- gtk2_prefs

Uniform Look for Qt and GTK Applications (日本語)#それぞれのツールキットのスタイルを変更する も参照してください。

## テーマ

### GTK+ 1.x

AUR には GTK+ 1.x テーマがたくさん存在します: gtk-theme で検索してください。gtk-smooth-engine が最初のテーマとして良いでしょう。

ほとんどのデスクトップ環境は GTK+ テーマ・アイコン・フォント・フォントサイズを設定するためのツールを提供しています。

もしくは、gtk-theme-switch2 を使って下さい。`switch` コマンドで実行できます。

### GTK+ 2.x

AUR には GTK+ 2.x テーマがたくさん存在します: gtk2-theme で検索してください。初めにインストールするパッケージは gtk-engines がふさわしいでしょう、人気の Clearlooks テーマが含まれています。

ほとんどのデスクトップ環境は GTK+ テーマ・アイコン・フォント・フォントサイズを設定するためのツールを提供しています。

もしくは、`~/.gtkrc-2.0` を編集することで手動で GTK+ の設定をすることも可能です。GTK+ の設定の一覧は GNOME library にあります。手動で GTK+ テーマ・アイコン・フォント・フォントサイズを変更するには、以下を `~/.gtkrc-2.0` に追加してください:

    ~/.gtkrc-2.0

    gtk-icon-theme-name = "[name-of-icon-theme]"
    gtk-theme-name = "[name-of-theme]"
    gtk-font-name = "[font-name] [size]"

例えば:

    ~/.gtkrc-2.0

    gtk-icon-theme-name = "Tango"
    gtk-theme-name = "Murrine-Gray"
    gtk-font-name = "DejaVu Sans 8"

Note: 上の例を使うには公式リポジトリから ttf-dejavu, tangerine-icon-theme, gtk-engine-murrine が、AUR から gtk-theme-murrine-collection が必要です。

### GTK+ 3.x

初めにインストールするパッケージは gnome-themes-standard がふさわしいでしょう、人気の Adwaita テーマが含まれています。

選択したスタイルに GTK+ 2.x と GTK+ 3.x 両方のテーマが含まれている場合、それらが使われます。選択したスタイルに GTK+ 2.x テーマしかない場合、GTK+ 2.x アプリケーションにはそれが使われ、GTK+ 3.x アプリケーションには（醜い）デフォルトのテーマが使われます。選択したスタイルに GTK+ 3.x テーマしかない場合、GTK+ 3.x アプリケーションにはそれが使われ、GTK+ 2.x アプリケーションには（醜い）デフォルトのテーマが使われます。UI の外観を統一するために GTK+ 2.x と GTK+ 3.x 両方のテーマを持っているスタイルを使うと一番良い結果が得られます。

ほとんどのデスクトップ環境は GTK+ テーマ・アイコン・フォント・フォントサイズを設定するためのツールを提供しています。GNOME を使っている場合、GNOME Tweak Tool (gnome-tweak-tool) を使って下さい。Xfce を使っている場合、Appearance ツールを使って下さい: Settings-->Appearance から行けます。

他にも依存パッケージが少ないツールとして lxappearance があります。

テーママネージャを全くインストールしたくないという場合は、手動で `$XDG_CONFIG_HOME/gtk-3.0/settings.ini` (普通は `~/.config/gtk-3.0/settings.ini`) にテーマを設定することができます。`settings.ini` ファイルの例:

    $XDG_CONFIG_HOME/gtk-3.0/settings.ini

    [Settings]
    gtk-application-prefer-dark-theme = false
    gtk-theme-name = Zukitwo
    gtk-fallback-icon-theme = gnome
    gtk-icon-theme-name = [icon theme name]
    gtk-font-name = [font name] [font size]

手動設定が反映されないときは、`$XDG_CONFIG_HOME` にある古い `gtk-3.0` フォルダを削除して /path/to/theme から `$XDG_CONFIG_HOME` に `gtk-3.0` フォルダをコピーしてください。例えば:

    $ rm -r ~/.config/gtk-3.0/
    $ cp -r /usr/share/themes/Zukitwo/gtk-3.0/ ~/.config/

この後、DE の外観設定ツールで同じテーマを設定する必要があります。GTK+ 3.x と GTK+ 2.x アプリケーションで同じ見た目を提供するテーマはわずかしかありません。そうしたテーマの例:

1. Adwaita (gnome-themes-standard に含まれています)
2. Clearlooks-Phenix (AUR: clearlooks-phenix-gtk-theme)
3. GTK+ 3 用の Newlooks と GTK+ 2 用の Clearlooks
4. Zukitwo
5. Elegant Brit
6. Atolm
7. Hope
8. OMG

Note: テーマによっては正しく表示するために librsvg が必要になりますが、依存パッケージとして指定されていないことがあります。選んだテーマが壊れて見えるようでしたらインストールしてみて下さい。
Note: 他にも両方兼ね備えたテーマがあるかもしれません。上のテーマの内いくつかは AUR で利用できます。また、テーマによっては GTK+ 2.x パネルを正しく表示することができないため、この パネルの背景 を使う必要があります。

インストールしたテーマでどれが GTK+ 2.x と GTK+ 3.x 両方のバージョンを持っているか調べるには次のコマンドを使って下さい (空白が含まれている名前はひっかかりません):

    find $(find ~/.themes /usr/share/themes/ -wholename "*/gtk-3.0" | sed -e "s/^\(.*\)\/gtk-3.0$/\1/")\
    -wholename "*/gtk-2.0" | sed -e "s/.*\/\(.*\)\/gtk-2.0/\1"/

### GTK+ と Qt

デスクトップで GTK+ と Qt (KDE) アプリケーションを使っているならば、それらの見た目が上手く調和しないことに気づくでしょう。GTK+ スタイルと Qt スタイルを調和させたい場合は Uniform Look for Qt and GTK Applications (日本語) を読んで下さい。

### Broadway による GTK+ と HTML

GDK Broadway バックエンドは HTML5 とウェブソケットを使って、ウェブブラウザに GTK+ アプリケーションを表示することをサポートしています [1]。

broadwayd を使うときには、X と同じようにコロンを前に付けて、使用するディスプレイ番号を指定してください。デフォルトのディスプレイ番号は 1 です。

    $ display_number=:5

次のコマンドで起動します。

    $ broadwayd $display_number

デフォルトで使われるポートは:

    port = 8080 + ($display_number - 1)

ブラウザで http://localhost:port を開いて下さい。

アプリを起動するには:

    $ GDK_BACKEND=broadway BROADWAY_DISPLAY=$display_number <<app>>

また、アドレスやポートを設定することも可能です:

    $ broadwayd --port $port_number --address $address $display_number

## 設定ファイル

Note: GTK の設定オプションの完全なリストは GTK+ プログラミングリファレンスマニュアルの GtkSettings properties を見て下さい。

このセクションでは GTK+ の設定ファイルなどで使うことができる GTK+ の設定をまとめて説明します。

(ini フォーマットの) GTK+ の設定ファイルは配置される場所が2つあります: $XDG_CONFIG_HOME/gtk-3.0/ (普通は ~/.config/gtk-3.0/) と /etc/gtk-3.0/ です。前者はユーザーごとの設定のためにあり、後者はシステム全体の設定のために存在します。

### キーボードショートカットのカスタマイズを有効にする

マウスをメニューアイテムの上に乗せて設定したいキーボードのコンビネーションを押すことで GTK+ アプリケーションのキーボードショートカットをカスタマイズすることができます ただし、この機能はデフォルトでは無効になっています。この機能を有効にするには、次を設定してください:

    gtk-can-change-accels = 1

### GNOME メニューの高速化

この設定は GNOME でマウスをメニューに置いた時にメニューが開くまでの待ち時間を決めます。あなたの好きなように設定を変更してください。数字はミリ秒です、例えば 250 は1/4秒になります。

    gtk-menu-popup-delay = 0

### ウィジェットのサイズを小さくする

小さな画面を使っていて大きなアイコンやウィジェットを表示したくない場合、簡単にサイズを変えることができます。 ツールバーのアイコンに文章を表示しないようにするには、次を使って下さい:

    gtk-toolbar-style = GTK_TOOLBAR_ICONS

小さいアイコンを使うには、次のような行を使って下さい:

    gtk-icon-sizes = "panel-menu=16,16:panel=16,16:gtk-menu=16,16:gtk-large-toolbar=16,16\
    :gtk-small-toolbar=16,16:gtk-button=16,16"

ボタンからアイコンを完全に削除するには:

    gtk-button-images = 0

メニューからアイコンを削除することもできます:

    gtk-menu-images = 0

ここ で説明されているようにテーマの gtkrc で設定をすることもでき、小さくする設定が全て行う テーマ もあります。

## 開発

スクラッチから C で GTK+ 3 プログラムを書く時は、CFLAGS を gcc に追加してください:

    gcc -g -Wall `pkg-config --cflags --libs gtk+-3.0` -o base base.c

-g と -Wall パラメータはデバッグ出力をするためのものなので必須ではありません。 公式の Hello World サンプル も試してみてください。

### シンプルなメッセージダイアログアプリ

GObject-Introspection やバインディングを使うことで多くのプログラミング言語で簡単に GTK+ 3 のメッセージダイアログを作ることができます、また bash を使うこともできます。

以下の例ではシンプルに "Hello world" をメッセージダイアログに表示します。

#### Bash

- 依存パッケージ: zenity

    hello_world.sh

    #!/bin/bash
    zenity --info --title='Hello world!' --text='This is an example dialog.'

#### Boo

- 依存パッケージ: AUR の gtk-sharp-3 (boo)
- ビルドするのに必要なパッケージ: boo
- ビルド: `booc hello_world.boo`
- 実行: `mono hello_world.exe` (もしくは `booi hello_world.boo`)

    hello_world.boo

    import Gtk from "gtk-sharp"
    Application.Init()
    Hello = MessageDialog(null, DialogFlags.Modal, MessageType.Info, ButtonsType.Close, "Hello world!")
    Hello.SecondaryText = "This is an example dialog."
    Hello.Run()

#### C

- 依存パッケージ: gtk3 と pkg-config
- ビルド: `gcc -o hello_world `pkg-config --cflags --libs gtk+-3.0` hello_world.c`

    hello_world.c

    #include <gtk/gtk.h>
    void main (int argc, char *argv[]) {
    	gtk_init (&argc, &argv);
            GtkWidget *hello = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Hello world!");
    	gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (hello), "This is an example dialog.");
            gtk_dialog_run(GTK_DIALOG (hello));
    }

#### C++

- 依存パッケージ: gtkmm3
- ビルド: `g++ -o hello_world `pkg-config --cflags --libs gtkmm-3.0` hello_world.cc`

    hello_world.cc

    #include <gtkmm/main.h>
    #include <gtkmm/messagedialog.h>
    int main(int argc, char *argv[]) {
    	Gtk::Main kit(argc, argv);
    	Gtk::MessageDialog Hello("Hello world!", false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK);
    	Hello.set_secondary_text("This is an example dialog.");
    	Hello.run();
    }

#### C#

- 依存パッケージ: AUR の gtk-sharp-3
- ビルド: `mcs -pkg:gtk-sharp-3.0 hello_world.cs`
- 実行: `mono hello_world.exe`

    hello_world.cs

    using Gtk;
    public class HelloWorld {
    	static void Main() {
    		Application.Init ();
    		MessageDialog Hello = new MessageDialog (null, DialogFlags.Modal, MessageType.Info, ButtonsType.Close, "Hello world!");
    		Hello.SecondaryText="This is an example dialog.";
    		Hello.Run ();
    	}
    }

#### Genie

- 依存パッケージ: gtk3
- ビルドするのに必要なパッケージ: vala
- ビルド: `valac --pkg gtk+-3.0 hello_world.gs`

    hello_world.gs

    uses
    	Gtk
    init
    	Gtk.init (ref args)
    	var Hello=new MessageDialog (null, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Hello world!")
    	Hello.format_secondary_text ("This is an example dialog.")
    	Hello.run ()

#### Java

- 依存パッケージ: AUR の java-gnome
- ビルドするのに必要なパッケージ: java-environment
- ビルド: `mkdir HelloWorld && javac -classpath /usr/share/java/gtk.jar -d HelloWorld HelloWorld.java`
- 実行: `java -classpath /usr/share/java/gtk.jar:HelloWorld HelloWorld`

    HelloWorld.java

    import org.gnome.gtk.Gtk;
    import org.gnome.gtk.Dialog;
    import org.gnome.gtk.InfoMessageDialog;

    public class HelloWorld
    {
        public static void main(String[] args) {
            Gtk.init(args);
            Dialog Hello = new InfoMessageDialog(null, "Hello world!", "This is an example dialog.");
            Hello.run();
        }
    }

#### JavaScript

- 依存パッケージ: gtk3, gjs (seed)

    hello_world.js

    #!/usr/bin/gjs
    Gtk = imports.gi.Gtk
    Gtk.init(null, null)
    Hello = new Gtk.MessageDialog({type: Gtk.MessageType.INFO,
                                   buttons: Gtk.ButtonsType.OK,
                                   text: "Hello world!",
                                   "secondary-text": "This is an example dialog."})
    Hello.run()

#### Perl

- 依存パッケージ: AUR の perl-gtk3

    hello_world.pl

    #!/usr/bin/perl
    use Gtk3 -init;
    my $hello = Gtk3::MessageDialog->new (undef, 'modal', 'info', 'ok', "Hello world!");
    $hello->set ('secondary-text' => 'This is an example dialog.');
    $hello->run;

#### Python

- 依存パッケージ: gtk3, python-gobject

    hello_world.py

    #!/usr/bin/python
    from gi.repository import Gtk
    Gtk.init(None)
    Hello=Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.CLOSE, "Hello world!")
    Hello.format_secondary_text("This is an example dialog.")
    Hello.run()

#### Vala

- 依存パッケージ: gtk3
- ビルドするのに必要なパッケージ: vala
- ビルド: `valac --pkg gtk+-3.0 hello_world.vala`

    hello_world.vala

    using Gtk;
    public class HelloWorld {
    	static void main (string[] args) {
    		Gtk.init (ref args);
    		var Hello=new MessageDialog (null, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Hello world!");
    		Hello.format_secondary_text ("This is an example dialog.");
    		Hello.run ();
    	}
    }

#### Visual Basic .NET

- 依存パッケージ: AUR の gtk-sharp-3
- ビルドするのに必要なパッケージ: mono-basic
- ビルド: `vbnc -r:/usr/lib/mono/gtk-sharp-3.0/gio-sharp.dll -r:/usr/lib/mono/gtk-sharp-3.0/glib-sharp.dll -r:/usr/lib/mono/gtk-sharp-3.0/gtk-sharp.dll hello_world.vb`
- 実行: `mono hello_world.exe`

    hello_world.vb

    Imports Gtk
    Public Class Hello
    	Inherits MessageDialog
    	Public Sub New
    		MyBase.New(Me, DialogFlags.Modal, MessageType.Info, ButtonsType.Close, "Hello world!")
    		Me.SecondaryText = "This is an example dialog."
    	End Sub
    	Public Shared Sub Main
    		Application.Init
    		Dim Dialog As New Hello
    		Dialog.Run
    	End Sub
    End Class

## 資料

- 公式 GTK+ ウェブサイト
- Wikipedia article about GTK+
- GTK+ 2.0 チュートリアル
- GTK+ 3 リファレンスマニュアル
- gtkmm チュートリアル
- gtkmm リファレンスマニュアル

Category:

- Widget Toolkits (日本語)