mikutter / list_settings

リストの管理機能を提供し、設定画面から追加・削除・変更をできるようにします
MIT License
1 stars 1 forks source link

設定ウインドウの「追加」を押すとクラッシュする #3

Open tsutsui opened 2 years ago

tsutsui commented 2 years ago

落ちたときのトレース

Traceback (most recent call last):
        22: from mikutter.rb:115:in `<main>'
        21: from mikutter.rb:79:in `boot!'
        20: from /home/tsutsui/mikutter/mikutter/plugin/gtk3/mainloop.rb:10:in `mainloop'
        19: from /home/tsutsui/mikutter/mikutter/plugin/gtk3/mainloop.rb:10:in `catch'
        18: from /home/tsutsui/mikutter/mikutter/plugin/gtk3/mainloop.rb:12:in `block in mainloop'
        17: from /home/tsutsui/mikutter/mikutter/plugin/gtk3/mainloop.rb:12:in `loop'
        16: from /home/tsutsui/mikutter/mikutter/plugin/gtk3/mainloop.rb:18:in `block (2 levels) in mainloop'
        15: from /usr/pkg/lib/ruby/gems/2.7.0/gems/gobject-introspection-3.4.9/lib/gobject-introspection/loader.rb:112:in `main_iteration'
        14: from /usr/pkg/lib/ruby/gems/2.7.0/gems/gobject-introspection-3.4.9/lib/gobject-introspection/loader.rb:682:in `invoke'
        13: from /usr/pkg/lib/ruby/gems/2.7.0/gems/gobject-introspection-3.4.9/lib/gobject-introspection/loader.rb:682:in `invoke'
        12: from /home/tsutsui/mikutter/mikutter/core/mui/gtk_extension.rb:35:in `block in safety_signal_connect'
        11: from /home/tsutsui/mikutter/mikutter/core/mui/gtk_crud.rb:25:in `block in create_button'
        10: from /home/tsutsui/mikutter/mikutter/core/mui/gtk_crud.rb:107:in `record_create'
         9: from /home/tsutsui/mikutter/mikutter/core/mui/gtk_crud.rb:135:in `popup_input_window'
         8: from /home/tsutsui/mikutter/mikutter/core/mui/gtk_crud.rb:140:in `gen_popup_window_widget'
         7: from /home/tsutsui/mikutter/mikutter/core/mui/gtk_crud.rb:140:in `each_with_index'
         6: from /home/tsutsui/mikutter/mikutter/core/mui/gtk_crud.rb:140:in `each'
         5: from /home/tsutsui/mikutter/mikutter/core/mui/gtk_crud.rb:153:in `block in gen_popup_window_widget'
         4: from /usr/pkg/lib/ruby/2.7.0/rubygems/deprecate.rb:63:in `block (2 levels) in deprecate'
         3: from /home/tsutsui/mikutter/mikutter/core/mui/gtk_mtk.rb:142:in `input'
         2: from /usr/pkg/lib/ruby/gems/2.7.0/gems/gobject-introspection-3.4.9/lib/gobject-introspection/loader.rb:555:in `set_text'
         1: from /usr/pkg/lib/ruby/gems/2.7.0/gems/gobject-introspection-3.4.9/lib/gobject-introspection/loader.rb:684:in `invoke'
/usr/pkg/lib/ruby/gems/2.7.0/gems/gobject-introspection-3.4.9/lib/gobject-introspection/loader.rb:684:in `invoke': <Gtk::Entry#set_text>: the 0th argument must not nil: <text> (ArgumentError)

GTK3 or mikutter 5.0 固有の問題かは未確認。

tsutsui commented 2 years ago

mikutter 5.0 本体の core/mui/gtk_crud.rb では

  def record_create(optional, widget)
    if @creatable
      record = popup_input_window()
      if record
        force_record_create(record) end end end

popup_input_window() を引数なしで呼んでいる。 この後は

  def popup_input_window(defaults = [])
    input = gen_popup_window_widget(defaults)
    Mtk.scrolled_dialog(dialog_title || "", input[:widget], self.toplevel || self, &input[:result]) end
  def gen_popup_window_widget(results = [])
    widget = Gtk::Box.new(:vertical, 0)
    column_schemer.flatten.each_with_index{ |scheme, index|
      case scheme[:widget]
      when :message_picker
        widget.pack_start(Mtk.message_picker(lambda{ |new|
                                            if(new.nil?)
                                              results[index].freeze_ifn
                                            else
                                              results[index] = new.freeze_ifn
                                            end
                                          }), expand: false)
      when nil
        ;
      else
        widget.pack_start(widget, Mtk.__send__((scheme[:widget] or :input), lambda{ |new|
                                   if(new.nil?)
                                     results[index].freeze_ifn
                                   else
                                     results[index] = new.freeze_ifn
                                   end
                                 },
                                 scheme[:label], *(scheme[:args].to_a or [])), expand: false)
      end
    }

という感じ。

CRUD の実装を探るよりも mikutter 本体の https://dev.mikutter.hachune.net/issues/1380 にあるとおり FormDSLの listview を使うようにするのが筋という気がするが、 Listの操作は文字通り CRUD の Create, Update, Delete それぞれ必要っぽい。

上記🎫1380 のリビジョン履歴を見ると一応 listview でも作成・編集・削除それぞれ対応しているっぽいが、 子チケットを斜め読みした範囲では mikutter 本体で CUD が実際に使われている例はない? うーん……

tsutsui commented 2 years ago

いまさらながら mikutter 4.1.7 の NetBSD/amd64 9.2 の環境で試したところ GTK2 というか 🎫994 修正後の mikutter 4.x では設定ウインドウの「追加」でも

4 と同様に

This method always crashes when it's called. see: https://dev.mikutter.hachune.net/issues/994 (Mtk::Read994Error) でクラッシュする。つまり「追加」の場合は従来のクラッシュの場所にたどり着く前に GTK3固有の問題で先に落ちただけ、と思われる。

やはり listview で作り直すべきっぽいが、そもそも 従来「追加」「編集」がどういう動作をしていたのか忘却の彼方なので、 🎫994以前の mikutter 3.9.x で改めて確認する必要がありそう。

tsutsui commented 2 years ago

やはり listview で作り直すべきっぽいが、そもそも 従来「追加」「編集」がどういう動作をしていたのか忘却の彼方なので、 🎫994以前の mikutter 3.9.x で改めて確認する必要がありそう。

🎫994 の Mtk の Fiber対策 always crash変更前の mikutter 4.0.6 のリスト設定の「追加」と「編集」はこんな感じ。 mikutter-4 0-list-settings mikutter-4 0-list-settings-add mikutter-4 0-list-settings-edit

つまり要件としては以下のはず。

つまり CRUDかと思ったが実態は intent_selector 同様 Readだけということでよいのかも。 mikutter-4 0-intent-settings mikutter-4 0-intent-settings-add