GNOME には GTK+ だけでなく Adw というものもあります。
モダンな GNOME アプリを作る GTK4 ベースな部品だそうです。
Fedora 36 にはデモアプリが最初から入っています、以下のコマンドで。
$ adwaita-1-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.StyleManager で DEFAULT を指定します。
無くても動きますがコレをやらないとこの見た目にはなりません。
AdwWindow という GtkWindow のサブクラスがあります。
なんとタイトルバーがありません、set_titlebar 関数すら省かれている。
GtkBox と AdwHeaderBar を使えばタイトルバーは再現できるようです。
GtkHeaderBar を入れても普通に動きます。
部品設置には set_child ではなく set_content を使います。
普通に GtkWidget が配置できます、何故関数名を変えたのか解りません。
正直、存在意義がよく解らないけど理由があるんだろうなって。
AdwTabView は設置しただけでリンク先のショートカットが有効になる。
便利だけれど AdwTabBar を配置すると Ctrl+PageDown は動作しなかった。
いや普通 Alt+数値キーですよね、Google Chrome や Gedit もそうですし。
GtkOverLay を駆使するより簡単にアプリ内 Notify が可能です。
Adw.StyleManager を指定しないと背景が無い残念な Notify になる。
これは便利ですね、ただ Nautilus のように上から出せないのかな?
これ以外は demo をご覧ください。
サンプルコードはこの demo くらいしかありませんでした。