GNOME 3.34 modal dialog bug

Fedora 31 の GNOME 3.34 にて。
Gedit でファイルの編集中にする。
F11 でフルスクリーンにする。
Ctrl+W でファイルを閉じようとして modal なアラートを出す。

何じゃこりゃ。

逆にフルスクリーンから戻すともっと悲惨。

自作アプリの Comipoli でファイル切り替えの動作が変だった。
モーダルダイアログを出すと一瞬だけ先頭ページが表示される現象に悩まされた。
これが原因じゃねーか、三日も悩んで損した。

GNOME だから 3.36 になるまでこのままなんだろうな。
しかたがないので Comipoli はしばらく GtkInfoBar に切り替えることに。

モーダルにできないのでキーボード処理は表示時のみ専用ハンドラに逃がして。
何故か use_markup が使えない、文字列だけにするしかないみたい。
gtk_info_bar_set_default_response が何故かエラーになる、困った。
スペースキーをガシガシするだけの特徴は残したいけど自前処理しか手段が無いな。
困った時の g_idle_add だ、この関数マジ便利。

#!/usr/bin/env python3

from gi.repository import GLib, Gtk

class ComipoliInfoBar (Gtk.InfoBar):
    def __init__(self):
        Gtk.InfoBar.__init__(self, no_show_all=True, valign=Gtk.Align.START)
        #
        self.uri = ''
        self.label = Gtk.Label(visible=True)
        area = self.get_content_area()
        area.add(self.label)
        self.ok = self.add_button('_OK', Gtk.ResponseType.OK)
        self.add_button('_Cancel', Gtk.ResponseType.CANCEL)

    def show_message(self, text, uri):
        self.uri = uri
        self.label.set_text(f'Next\n{text}\n\nEsc Cancel')
        GLib.idle_add(self._show_message)

    def _show_message(self):
        self.show()
        self.ok.props.has_focus = True
        return False

を GtkOverlay に乗せて。

class ComipoliWindow(Gtk.ApplicationWindow):
    def __init__(self, app):
        Gtk.ApplicationWindow.__init__(self, application=app)
        # InfoBar
        self.infobar = ComipoliInfoBar()
        self.infobar.connect('response', self.on_next_info)
        #
        # etc...
        #
        overlay = Gtk.Overlay()
        infolay = Gtk.Overlay()
        overlay.add_overlay(self.upperbar)
        overlay.add(infolay)
        infolay.add_overlay(self.infobar)
        infolay.add(self.canvas)
        self.add(overlay)

    def on_next_info(self, widget, res_id):
        if res_id == Gtk.ResponseType.OK:
            self.set_uri(widget.uri)
        widget.hide()

    def change_pixbuf(self, nex):
		#
		# etc...
		#
        next_index = cbzs.index(etc) + 1
        if l > next_index:
            esc = html.escape(cbzs[next_index])
            uri = GLib.filename_to_uri(GLib.build_filenamev([path, cbzs[next_index]]), None)
            self.infobar.show_message(esc, uri)
            ''' GNOME 3.34 bug
            dlg = Gtk.MessageDialog(
                transient_for=self,
                buttons=Gtk.ButtonsType.OK_CANCEL,
                #message_type=Gtk.MessageType.QUESTION,
                text=f'<span bgcolor="red">Next:</span> {esc}',
                use_markup=True,
                secondary_text='ESC Cancel')
            dlg.set_default_response(Gtk.ResponseType.OK)
            if dlg.run() == Gtk.ResponseType.OK:
                uri = GLib.filename_to_uri(GLib.build_filenamev([path, cbzs[next_index]]), None)
                self.set_uri(uri)
            dlg.destroy()
            '''

で。

なんとかなった。
もう少し debug してから更新します。

Fedora 31 Upgrade

Fedora 31 が出たので 30 からアップグレード。
方法はいつもと同じなので省略。

gnome-terminal の HeaderBar にあった妙な違和感が消え一般的になった。
python のリンクが python3 になった、今更感が凄い。
どうしても python2 が使いたいなら python2 と指定。
いや、デフォルトでは python2 は入っていないんだけど。

しかし Gedit は python の shebang を python2 と認識するまま。
#/usr/bin/env python3 と書かないと python3 と認識しない。

Super+A でのアプリケーションメニューのまとめが少し変わった。
サブ項目が「ユーティリティ」という一箇所にまとめられた。
多分 macOS の真似。

firewall-config と dconf-editor だけ Sundry にまとめられた。
システムに関するものをデフォルトと後入れに分けたみたいね。
iPhone みたいにドラッグして自分でまとめられるからどうでもいいかも。

Wayland でフルスクリーンから戻る時がスムースになった、気がする。
戻る時に表示が崩れることが多々あったけど今のところ起きていない。

後は、何も変わった気がしないなぁ。
一部のデフォルトアイコンや設定の配置が少し変わったけど別にって感じ。
後は GtkCheckButton の色が少し濃くなった程度しか解らない。

筆者の公開アプリやプラグインは全部そのまま問題なく動くし。
macOS と違って httpd.conf のカスタムなんかは引き継ぎされるし。
Celluloid がアップデートしていないのに落ちなくなったのは意図的?
最近の Fedora upgrade は問題が出なさすぎて面白くないや。

macOS sh

macOS で man sh を初めて見てみたんだけど。

つまり /bin/sh は /private/var/select/sh を起動する。
その /private/var/select/sh は /bin/bash へのシンボリックリンク。

つまり macOS の sh も bash が本体ということみたい。
環境によってリンク先は変わるかもだが筆者の Air はこうなっていた。
なんでこんな面倒な仕組みになっているんじゃい。
Fedora みたいに直接 sh というリンクにすればいいのに。

でもまてよ、sh と bash は動作が違っていたよな。
(bash|zsh) read command 2 | PaePoi

色々探してみたらこんなのを見つけた。
/bin/sh と /bin/bash の違い – 双六工場日誌

あぁそういうことだったんだ。
Fedora 30 で試したらやはり posix のオプションが違っていたよ。
sh は bash を posix sh 互換で起動する呼び出し方で合っているかな。
でも Fedora の sh は \n 文字を文字として扱うのよね、まあいいか。

しかし何故 dash も選択肢に入っているのか?
Debian Almquist shell – Wikipedia
debian 系のコレと同じものだと思うけど、標準で入っている理由がワカンネ。

zsh Expansion

凝りもせず macOS で zsh を色々試しているんだけど。
zsh: 14 Expansion
一部を抜き出すと。

#!/bin/zsh

arr='IFS 区切りのまま for'
for s in ${=arr}; do
    echo $s
done

val='カンマ,区切りを,ループ'
for j in ${(ps.,.)val}; do
    echo $j
done

aa=(配列を 改行 区切りに合体)
echo ${(F)aa}

えっと。
理解できたのは Python 屋が使うモンじゃないってことだった。
だって覚えたところで永久に使わなさそうだもん、こんな書き方。
覚書ページへの追記は基本的なものだけにしておこう。

Catalina Atom JavaScript

おいおい、Atom の Script パッケージって…

Script はシバンを書かなければパスを通した node.js で実行するようです。
シバンを osascript に指定してもパラメーターは node.js 用のまま。
どういうことだってばよ。

右下にある言語の所をクリックし

JavaScript for Automamation (jxa)

を選択すれば osascript 用のパラメーターになるようです。

こんなのを毎回やるのなんて面倒臭いぞ。
ということで vim-modeline を使うことにする。

#!/usr/bin/osascript

console.log('Hello');

// vim:set ft=js.jxa

vim 屋は最終行に書いている場合が多いので合わせてみた。
Atom のみならこの表記でいい、本家 vim を併用している人は困るかも。
書き込んだ後に開き直すか option+control+V を押す。

問題なく JXA で起動できるようになります。
普通にシバンどおりに実行してくれたほうが嬉しいのに。

ところで node.js なんだけど。

普通にダウンロードしテキトーに置いた奴は起動できなくなっていた。
上記は以前試した graalvm に入っていた奴なんだけどね。
Gatekeeper がどんどん厳しくなるなぁ。
正式な手段でインストールしないと全部弾かれるようになったみたい。

macOS Catalinaでnode.jsをインストール – Qiita
node.jsのversionを管理するためにnodebrewを利用する – Qiita

curl -L git.io/nodebrew | perl - setup

を実行すると ~/.nodebrew が作られる。
筆者は zsh に変更したので ~/.zshrc にパスを書き込む。
しかし mac 屋は何故ドットコマンドではなく source を使うのか?

. ~/.zshrc

Node.js

コレを書いた時点の LTS は 10.16.3 である。

# ~/.nodebrew/src にバイナリでダウンロード
# ~/.nodebrew/node に展開
nodebrew install-binary v10.16.3

# ~/.nodebrew/current のリンク先を指定先に変更する
# ~/.nodebrew/current/bin に nodebrew 自体のリンクを貼る
nodebrew use v10.16.3

全部 $HOME 以下に展開されるけど問題なく使えるようになった。
Gatekeeper の仕組みがイマイチわからないな。