GNOME Adw

GNOME には GTK+ だけでなく Adw というものもあります。

Adw ? 1

モダンな GNOME アプリを作る GTK4 ベースな部品だそうです。
Fedora 36 にはデモアプリが最初から入っています、以下のコマンドで。

$ adwaita-1-demo

adw_demo

この demo のソースは以下にあります。

demo ? main ? GNOME / libadwaita ? GitLab

他にサンプルコードが以下にありました。

examples ? 2bf94101 ? GNOME / libadwaita ? GitLab

かなーり解り辛いです、Linux はこんなもんです。
細かいことはリンク先のソースや英語を読んでもらうとして。

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
from gi.repository import Gtk, Adw

class Win(Adw.ApplicationWindow):
    '''
        Adw: Sample Code
    '''
    def __init__(self, a):
        # Set Adwaita Style
        manager = Adw.StyleManager.get_default()
        manager.set_color_scheme(Adw.ColorScheme.DEFAULT)
        # init
        Gtk.ApplicationWindow.__init__(self, application=a)
        # TitleBar
        titlebar = Adw.HeaderBar()
        # Tab
        view = Adw.TabView()
        tabbar = Adw.TabBar(view=view, autohide=False)
        # First Page
        label = Gtk.Label(label='First Page\nPress Alt+2')
        page1 = view.append(label)
        page1.set_title('tab1')
        # Second Page
        button = Gtk.Button(label='This is Button\nShow Toast', vexpand=True, halign=Gtk.Align.START)
        button.connect('clicked', self.on_button_clicked)
        page2 = view.append(button)
        page2.set_title('tab2')
        # Toast
        self.toast = Adw.ToastOverlay(child=view)
        # pack
        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.append(titlebar)
        box.append(tabbar)
        box.append(self.toast)
        self.set_content(box)
        self.set_default_size(400, 300)

    def on_button_clicked(self, button):
        toast = Adw.Toast(title='This is a Toast Message')#, priority=Adw.ToastPriority.HIGH, timeout=0)
        self.toast.add_toast(toast)

def app_activate(a):
    w = Win(a)
    w.present()

app = Gtk.Application()
app.connect('activate', app_activate)
app.run()

色々試してみました。

adw

まず Adw.StyleManager で DEFAULT を指定します。
無くても動きますがコレをやらないとこの見た目にはなりません。

AdwWindow という GtkWindow のサブクラスがあります。
なんとタイトルバーがありません、set_titlebar 関数すら省かれている。
GtkBox と AdwHeaderBar を使えばタイトルバーは再現できるようです。
GtkHeaderBar を入れても普通に動きます。

部品設置には set_child ではなく set_content を使います。
普通に GtkWidget が配置できます、何故関数名を変えたのか解りません。
正直、存在意義がよく解らないけど理由があるんだろうなって。

Adw.TabView

AdwTabView は設置しただけでリンク先のショートカットが有効になる。
便利だけれど AdwTabBar を配置すると Ctrl+PageDown は動作しなかった。
いや普通 Alt+数値キーですよね、Google Chrome や Gedit もそうですし。

Adw.Toast

GtkOverLay を駆使するより簡単にアプリ内 Notify が可能です。
Adw.StyleManager を指定しないと背景が無い残念な Notify になる。
これは便利ですね、ただ Nautilus のように上から出せないのかな?

これ以外は demo をご覧ください。
サンプルコードはこの demo くらいしかありませんでした。