Programming」カテゴリーアーカイブ

GTK4: GtkInscription

そういえば GTK4 に GtkInscription が追加されるんだっけ。
Gtk.Inscription

特殊用途に使う Widget なので通常は GtkLabel を使ってくれ。
ということらしいけど、つまり文字列がはみ出すラベルってことね。

#!/usr/bin/env python3

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

class TestWindow(Gtk.ApplicationWindow):
    def __init__(self, app):
        try:
            Gtk.ApplicationWindow.__init__(self, application=app)
            # Label and Inscription
            label = Gtk.Label(label='文字列に合わせて拡大されます')
            inscription = Gtk.Inscription(text='文字列に合わせて拡大されません、はみ出します')
            # pack
            vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
            vbox.append(label)
            vbox.append(inscription)
            self.set_child(vbox)
        except Exception as e:
            print(e, file=sys.stderr)
            app.quit()

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

    def do_activate(self):
        w = TestWindow(self)
        w.present()

app = TestApplication()
app.run(sys.argv)

inscription

なんだそれだけだったのか。
カラム部分とかコンテナが拡大されたら困る場所に使うってことですね。

ところで、GTK4 のドキュメントが親切になっている。
deprecated つまり廃止予定を明確にしてくれています。

Gtk ? 4.0

TreeView がやっと廃止、マウス必須な時代遅れ UI ですからね。
TreeStore だけでなく ListStore も廃止、リストビュー表示もできなくなる。
一応、GtkListView は昔ながらのリストビューではなくスマホの設定画面みたいな UI です。
あれ、Nautilus 43 のリストビュー表示は?
と思うかもだけどアレは ColumnView なんですね、いや今知ったんだけど。

伴ってあの解り辛いレンダラ関連が全面廃止。
あぁ、それで Inscription という Widget が必要になったということか。

ダイアログ関連を全面見直し。
いやそれ何故 GTK4 の最初でやらなかったのか。

ComboBox も廃止。いや困るだろと思ったけど Popover があったわ。
Nautilus 43 の設定もそうなっていた、はよ移行しろってことですね。

StyleContext も廃止。
CSS の適用は今後どうするんだろう?調べなきゃ。

GTK4 の方向性が見えてきましたね。
次は GtkColumnView あたりを調べてみるかな。

Python typing

そういえば 10 月になった。
GNOME 43 はどうなったのかな?

GNOME Release Notes

シャットダウンが又してもアイコンのみに、コロコロ変わりすぎ。
ログアウト選択ダイアログの 2 アクションに戻るんだろうか?
macOS はずっと 1 アクションだし何年もメニューは変わっていないというのに。

gnome-terminal は新規ターミナルに置き換えみたい。
本サイトの Tips を書き換えしなきゃいけなくなりそうだ。

GTK4 化アプリは全部 Libadwaita デザインにするっぽいな。
GNOME に謎の魔改造をする某ディストロはどうすんのやら、しらんけど。

GNOME 43 for Developers

GtkInscription は解説を見てもよく解らないな。
Fedora 37 が出たら色々試してみよう。

役立たずだった GtkPicture に色々手を入れたみたい。
いや用途適にスマホの縦写真を回転してくれないと使い物にならんままですけど。

g_idle_add_once と g_timeout_add_once か、名前のとおりな関数。
FALSE を戻すだけでいいのにわざわざ別関数を作った意味は何だ?

Drag and Drop – GNOME Developer Documentation

もう筆者は知っているけど解説を作ったらしいので。
Python のコードを見るとアレッ、Python って型指定ができるの?

typing — 型ヒントのサポート ? Python 3.10.6 ドキュメント

-> は知っていたけどこういう指定も可能だったのか。
というか型指定は Python の型だけでなく Class ならなんでもいいのね。
Gio.File は PyGObject では Class 扱いです。

def on_drop(self, drop_target, value: Gdk.FileList, x, y, user_data=None):
    files: List[Gio.File] = value.get_files()

    # Loop through the files and print their names.
    for file in files:
        print(file.get_path())

たださ。
PyGObject は型指定しなくても動くし None 引数を省略できるんだが。

    drop_target = Gtk.DropTarget.new(Gdk.FileList, Gdk.DragAction.COPY)
    drop_target.connect('drop', self.on_file_drop)
    drop_target.connect('accept', self.on_drop_accept)
    self.add_controller(drop_target)

def on_drop_accept(self, target, drop):
    return True

def on_file_drop(self, target, value, x, y):
    self.set_uri(value.get_files()[0].get_uri())

筆者が書いたやつ。
型指定バリバリな解説は混乱を招くと思うんだけーが。

しかしこんなことで Python の知らなかった機能を知るとは。
Fedora 37 が出るまで Python Tips を書き足しでもするか。

Dinamic Import: Gjs and JXA

現在の JavaScript はダイナミックインポートが可能。
下記ページで Chrome や Safari で動くと解りますね。

全モダンブラウザで使えるJavaScriptのdynamic import(動的読み込み) – Qiita

GNOME の Gjs は imports 関数があるので関係ないんだけど。
そういえば macOS の JXA はファイル分割ができないのが困る。
コレを利用してクラス毎に分割できるかな。

#!/usr/bin/osascript

import('./sub.js')
	.then((module) => {
        console.log('Start!');
		const sub = new module.Sub();
        sub.subMethod();
	});

main.js

export class Sub {
    subMethod() {
        console.log('this is Sub Class Method');
    }
}

sub.js

osa

なんでだよ!
Promise だと認識はしているけど動作しないってことみたい。
JavaScriptCore が全部やってくれるってわけじゃないんかい。

Gjs でも同じかな?
console.log を print に書き換えて実験。

#!/usr/bin/gjs

import('./sub.js')
	.then((module) => {
		const sub = new module.Sub();
        sub.subMethod(); 
	});

main.js

export class Sub {
    constructor(app) {
        print('Hello');
    }
    subMethod() {
        print("this is Sub Class Method");
    }
}

gjs

動いたのでコンストラクタも入れてみた、普通に Class ですね。
いや Gjs は imports を使ったほうが簡単ですけど。
というか、Apple は内製スクリプトには本当にヤル気が無いなって。

rar

Fedora Tips を更新しました。
Fedora Tips – Paepoi

内容はあまり変わっていないけど表記が GNOME3 のままじゃなって。
ついでに公開鍵認証とかを追記して公開っと。

写真もいいけど他の古くなった Tips を書き換えや追記をしなきゃ。
ネタは一応色々あるんだけど。
たとえば現行 Fedora はデフォルトで RAR アーカイブを展開できるけど。

#!/usr/bin/env python3

import gi
gi.require_version('GnomeAutoar', '0.1')
from gi.repository import GnomeAutoar, Gio

RAR_FILE = '[もっとGF] 桃子の遠足!.cbr'

src = Gio.File.new_for_path(RAR_FILE)
outfile = Gio.File.new_for_path('output_dir')

ar = GnomeAutoar.Extractor(
    source_file=src,
    output_file=outfile)

ar.start(None)

できるのよ、cbr の拡張子のままでも。
でも圧縮が上手くいかないってオチがある。

gnome-autoar | Paepoi Blog

しかもコレ標準出力に投げることができない、ファイル化のみ。
我が Comipoli に使おうとかなと思ったけど無理っぽい。

そんな感じで色々中途半端で止まっている。
止まったまま Clutter 等が開発終了してしまったり筆者が忘れ去ったり。
覚書の細かいファイルばかりが溜まっていく、整理しなきゃ。

mpv: rotate

mpv をスクリプトで拡張をまとめてページを作ろうとして、欲が出た。
動画の回転を Eye of GNOME や Totem に合わせたい。
具体的には Ctrl+R で 90° ずつ時計回り、Shift 追加で逆回り。

今まで Ctrl+E を逆回りに割り当てていたけど、やはりおかしい。
それに割り当てする値は 0-359 以内にしないとエラーになる。
input.conf ではどうにもならない、Lua スクリプトを書く。

-- ~/.config/mpv/scripts/mpv_rotate.lua

-- input.conf に 'Ctrl+r add video-rotate 90' でもいいけど
-- 0-359 以内にしないとエラーなのとキーを Eye of GNOME に合わせたかったので

function on_rotate_right()
    angle = mp.get_property('options/video-rotate')
    num = tonumber(angle) + 90
    if num > 270 then
        num = 0
    end
    mp.osd_message('angle:'..tostring(num)..'°')
    mp.set_property_number('options/video-rotate', num)
end

function on_rotate_left()
    angle = mp.get_property('options/video-rotate')
    num = tonumber(angle) - 90
    if num < 0 then
        num = 270
    end
    mp.osd_message('angle:'..tostring(num)..'°')
    mp.set_property_number('options/video-rotate', num)
end

mp.add_key_binding('Ctrl+r', 'rotate_right', on_rotate_right)
mp.add_key_binding('Ctrl+Shift+r', 'rotate_left', on_rotate_left)

osd も入れて。

よし問題なく動くぞ。
macOS な人は逆回転を command+L にすれば Preview.app と同じになる。

ついでに、time-pos プロパティをゼロにすれば先頭に巻き戻しできるけど。
最後まで再生してポーズ状態からだとポーズのまま、即再生させたいのよ筆者は。

-- ~/.config/mpv/scripts/mpv_go_home.lua

-- Home キーで先頭に巻き戻して再生する
-- 最後まで再生しポーズ状態になっていても即再生できるように

function on_go_home()
    mp.set_property_number('time-pos', 0)
    if mp.get_property_bool('pause') then
        mp.set_property_bool('pause', false)
    end
end
mp.add_key_binding('Home', 'go_home_func', on_go_home)

できた。

いやいや input.conf がスッカラカンに。
自分で拡張できるアプリって面白いよね。