GTK4 main loop

GTK4 は PyGObject ばかりやっていたけど。
たまには Gjs もやろうかなって、gir なのは同じなんだけど。

gjs/gtk4-template.js at master ? GNOME/gjs ? GitHub

あれ?
GtkApplication を使わないでイケる方法があったんだ。
同様なはずなので PyGObject で書いてみる。

#!/usr/bin/env python3

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

class TestWindow(Gtk.Window):
    def __init__(self):
        Gtk.ApplicationWindow.__init__(self)
        btn = Gtk.Button(label='The best camera for wild birds')
        btn.connect('clicked', self.on_button_clicked)
        self.label = Gtk.Label(label='...')
        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.append(btn)
        box.append(self.label)
        self.set_child(box)
        #self.connect('delete-event', self.on_close_request) # v3
        self.connect('close-request', self.on_close_request)
        self.present()

    def on_button_clicked(self, widget):
        self.label.set_text('MICRO FOUR THIRDS !')

    def on_close_request(self, widget):
        loop.quit()

loop = GLib.MainLoop.new(None, False)
#GLib.set_prgname('LUMIX')
TestWindow()
loop.run()

mft

GMainLoop でも良かったようです、知らなかった。

でも何故かこの方法ではタイトルバーに何も表示されないね。
アプリ名表示は使っていないはずの GtkApplication になる、なんだかな。
ウインドウを作る前に g_set_prgname すればいいんだけどさ。

GtkApplication を使えば今までどおりファイル名が表示される。
いや application-id を指定するとそちらが優先されるみたい。
g_set_prgname 無指定の場合だけの話ですけど。

close-request は delete-event の名前が変わっただけです。
×ボタンを押したよってシグナル、destroy は破棄されたよってシグナル。
GtkApplication を使う場合はこんな処理いりませんからね。

しかしのんびりしている間に GNOME 41 が出てしまった。

GNOME 41 Release Notes

Multitasking って GSettings で変更できていたジャン。
GUI 設定が付いただけ、いや筆者はデフォルトで使うけど。
それよりランチャを左に戻す設定が欲しい、macOS でも左にしているんだ。
ちなみに普段は隱して三本指スワイプでランチャを出す GNOME3 式で使っている。

The GTK Project

GTK の stable は 4.2.1 か、こっちは今までどおり奇数が開発版なのか。
でもドキュメントは 4.5 かよ、バージョンの関連性がもうよくワカラン。

関係ないけどサンプルコードでカメラネタはやっぱりイマイチだ。
やっぱりスズキのバイクが一番だなって。

cosmos

こんな小春日和の、おだやかな日は。

cosmos

秋桜って背が高いだけでそこいらにある花って感じだよね。
なのに山口百恵をはじめ合唱曲になったり宇宙の別名になったり。
オオハルシャギクという本名のほうは無名なのに。

google

てか Google レンズのおかげで筆者も今日知ったんだが。
でもショウキズイセンだとヒガンバナと間違えてくれました。

pink

五条川では今はオキザリス?が綺麗です。
でも雑草、こんなに綺麗なのに。

mozu

今日の、いや昨日の五条川。

月曜の夕方に投稿しようとしたらサーバーが落ちていた。
十年以上さくらを利用しているけど障害発生メールが届いたのは初めて。
まあ復旧したのでそれはよくて夜勤明けの今頃ですが。

kosamebitaki

コサメビタキ、今回は綺麗に撮れた。
いや桜の枝は掛かってしまったけど。

mozu1

モズ、やはり枝が。
久々に見たけど夏はどこにいっていたのやら。

mozu2

モズ、だから枝が邪魔。
メスだし上と同じ場所にいたので多分夫婦。

mozu3

別の所でまたしてもモズ、今日はあちこちで鳴いている。
冬に向けた縄張り作り争いの真っ最中なのかな。

samebitaki

サメビタキ、だと思う。
目の前にある白線の下が暗色なので多分。

コサメビタキ・エゾビタキ・サメビタキの識別

思うんだけど当のヒタギ達は見分けられているんだろうか?
キビタキとルリビタキのメスなんてまったく違いが解らないし。
人間には解らない要素があるんだろう、知らんけど。

今後ブログ用写真は Lightroom 書き出しを(小)で。
これって切り出しでサイズダウンしたものより容量は小さくなるのね。
(小)でも拡大しないかぎり原寸との違いが解らん。

どうでもいいけど筆者は Python では鈴菌ネタを使っているけど。
カメラネタにし変更したほうがいいかな、マジどうでもいいけど。

GTK4 Clipboard (String)

GTK4 で Clipboard を使うテスト。
文字列のコピペはできた、ただし自分のインスタンス内のみで。

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '4.0')
#gi.require_version('Gdk', '4.0') # not need
from gi.repository import Gtk, Gdk

class TestWindow(Gtk.ApplicationWindow):
    '''
        GTK4 Clipboard @ String Copy
        This Code is Instance Only
    '''
    def __init__(self, app):
        Gtk.ApplicationWindow.__init__(self, application=app)
        self.clip = self.props.display.get_primary_clipboard()
        print(self.clip) #=> GdkWaylandPrimary (GdkClipboard)
        '''
        self.clip = self.get_clipboard()
        self.clip = self.props.display.get_clipboard()

        display = Gdk.Display.get_default()
        self.clip = display.get_primary_clipboard()
        self.clip = display.get_clipboard()

        # local is All True...
        print(self.clip.props.local)
        '''
        self.clip.set('スズキのバイクはカッコイイ')
        print(self.clip.get_formats().to_string()) #=> { gchararray, text/plain;charset=utf-8, text/plain }
        #
        #self.clip.set_text('No GIR Binding') # Error!
        #
        self.clip.read_text_async(None, self.read_text_async_cb)
        #
        self.label = Gtk.Label(label='Motor Cycle')
        self.set_child(self.label)
        self.set_default_size(400, 100)
        self.present()

    def read_text_async_cb(self, clip, res):
        text = clip.read_text_finish(res)
        self.label.set_label(text)

class TestApplication(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self, application_id='org.suzuki.katana')

    def do_activate(self):
        TestWindow(self)

app = TestApplication()
app.run()

clip

何をどうやっても local Property が True になってしまう。
False にしないと Gedit 等の外部インスタンスとはコピペできない。
バグなのか?
他にやらないといけないことがあるのか?

それと set_text 等がバインドされていないのはどうなんだ?
set で文字列を渡したら普通にセットできたけど「ん?」って感じ。
バイナリの転送は GdkContentProvider でいいのかな?

Higanbana

この連休にて五条川での成果物。

カワセミ、ブレブレもしくは見失う。
キセキレイ、「もういる!」と喜んだがブレブレ。
コサメビタキ、顔が葉っぱかぶり。

1

その他も全滅、もう野鳥はやめようかなぁ。。。。。
こんな日もあるさって先月からずっとこんな感じだけど。
気を取り直して花写真の練習だ、もちろん今は彼岸花。

2

色々試したけどやはり G99 で花は F6.3 が一番イイね。
後ろのヒゲが F4 だとボケるし F8 だと背景と境界が不明瞭。
マニュアルフォーカスでピントのピークは横ひげの先端にしています。
あ、今回は Lightroom 書き出しを 2048x1536px に縮小してます。

3

F6.3 でも川に反射させた光は玉ボケになってくれます。
面白いと思っていっぱい撮ったけど大半が白飛びでした。
しかしコレはキットズームの 14-140 で撮ったんだけど。
F6.3 で使うなら文句なしだわ、単焦点使わなくなりそう。

それにしても野鳥と花でレンズを交換するのが面倒臭い。
ズームレンズを使うならパナライカの 12-60 もどんなだか試してみたい。
ならば G9 pro のレンズキットでも買い足せば一気に揃うぞと。
ただそうすると今のサブ機 D3400 から重量が倍以上になる、うーん。

てか花とかは背面液晶で撮影するようになったんで D3400 がチト。
LUMIX の MF アシストとピーキング機能が便利過ぎなのが悪い。
ファインダーだけで追い込むレフ機が今となっては面倒臭くて。
って調べたら G9 pro のキットって 20 万もするのか、ヤメヤメ。