プロジェクト

全般

プロフィール

機能 #887

完了

gtk3

toshi_a 初音 さんが約8年前に追加. ほぼ3年前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
開始日:
2019-10-13
期日:
進捗率:

100%

プラグイン名:
gtk3

説明

現在はgtk2を利用しているが、流石に時代遅れなのでgtk3を利用するように変更する

gtkプラグイン

gtkプラグインを削除し、gtk3プラグインを実装する。
そうすることで、サードパーティプラグインでgtkプラグインに依存している(=gtk2に依存している)プラグインが、gtk3環境下でロードされないようになるため、ユーザがmikutterだけをバージョンアップした時に、gtk2に依存したプラグインがロードされず、正常に起動できるという状態になることを期待できる。
(まぁ.mikutter.ymlちゃんと書いてなかったら結局ダメなんだけどさ)

gtk2モードのようなものは用意しない。mikutterプラグインの依存関係の指定方法では、一つのプラグインが いずれかの プラグインに依存しているという状態を表現できないため、一つのプラグインでgtk{2,3}両方に対応することはできない。

その他バンドルプラグイン

gtk3プラグインへ依存するように順次書き換えていく。

時期

いくつかのプラグインの互換性がなくなる変更なので、メジャーバージョンアップとする。


子チケット 20 (0件未完了20件完了)

機能 #1399: MiraclePainterをmoduleとして再実装する却下Yuto Tokunaga2019-10-13

操作
機能 #1423: アカウント追加ウィンドウをGTK3で再実装する終了Yuto Tokunaga2020-01-05

操作
バグ #1493: gtk3: Intentやカスタム投稿のダイアログに何も表示されない終了Shibafu Midorino操作
バグ #1494: gtk3: Mastodonアカウントのプロフィールを開くとランダムにSEGVする終了toshi_a 初音操作
バグ #1495: gtk3: guideで「次へ」を押したらクラッシュする終了Shibafu Midorino操作
バグ #1496: gtk3: proxyプラグインの設定が正常にレイアウトされない終了Shibafu Midorino操作
バグ #1497: gtk3: Boostされたトゥートが無関係の抽出タブにも流入している終了Shibafu Midorino操作
バグ #1498: gtk3: 新しいMiraclePainterの不具合まとめ終了Shibafu Midorino操作
バグ #1499: gtk3: Timelineで右クリックした位置の要素は選択状態になってほしい終了toshi_a 初音操作
バグ #1500: gtk3: consoleのウィジェットサイズがウィンドウサイズと連動しない、ウィンドウサイズを強制的に大きくしてしまう終了Shibafu Midorino操作
バグ #1502: gtk3: アイコン上の返信ボタンをクリックするとクラッシュする終了Shibafu Midorino操作
バグ #1503: gtk3: 設定画面を開くとMiraclePainterの背景色がおかしくなる終了Shibafu Midorino操作
バグ #1504: MiralcePainterのカスタム絵文字の高さの計算が誤っている終了toshi_a 初音操作
バグ #1505: gtk3: FormDSLでlinkを使った時のレイアウトがおかしい終了Shibafu Midorino操作
バグ #1506: gtk3: 同時に複数のTimelineの要素が選択できているように見える終了toshi_a 初音操作
バグ #1508: gtk3: Timelineの複数選択を再サポートする終了toshi_a 初音操作
バグ #1513: gtk3: Gtk::BINDING_VERSION が残っていてバグレポ送信でエラーになる終了Izumi Tsutsui操作
バグ #1514: gtk3: core/mui/gtk_userlist.rb で visible_range と :expose_event が参照されている終了Izumi Tsutsui操作
バグ #1515: gtk3: mui 関連の deprecated 警告終了Izumi Tsutsui操作
バグ #1516: gtk3: worldshifter の world選択肢のアイコンが表示されない終了Izumi Tsutsui操作

関連するチケット

関連している 提案 #1453: gtk3: MiraclePainterをGtk::Widgetベースの実装に書き直す却下Yuto Tokunaga操作

toshi_a 初音 さんが約8年前に更新

  • ステータス新規 から 実装待ち に変更
  • 担当者Katsuyoshi MATSUMOTO にセット

メインの担当者として、Rubykaigi2016でこの件に関して名乗りを挙げてくれたkatsyoshiをアサインします。

toshi_a 初音 さんが約8年前に更新

どんな起動オプションでやってる?
俺はとりあえずgtk3だけ読み込むために

mikutter --confroot=/tmp/mikutter.887 --plugin=gtk3 --debug

みたいなことをしている。情報共有を円滑にするために起動オプション(厳密にはロードするプラグイン)共有してほしいです

Katsuyoshi MATSUMOTO さんが約8年前に更新

どんな起動オプションでやってる?

基本的にまだ絞り込んでない

Yuto Tokunaga さんが約6年前に更新

こんにちは.gtk3対応に興味があったのでやってみています. https://github.com/yuntan/mikutter/tree/gtk3 に置いてます.topic/887-gtk3をmaster(557b03b)にrebaseしてその続きで作業しています.起動できるところまで作業を進めましたが,MiracrlePainterで苦戦しています.

Osamu Koga さんが約6年前に更新

すごい。
さっそく7a1a902f を手元で動かしてみたところ、初回起動時に paneの page_added が発火したところで落ちてしまいました。
デバッグのため、 prypry-stack_explorer をGemfileに追加しています。

% bundle exec ruby mikutter.rb --debug --confroot=dummy

(エラーまで省略)

From: /home/osamu/app/mikutter-gtk3/core/utils.rb @ line 131 Object#into_debug_mode:

 => 131: def into_debug_mode(exception = nil, bind = binding)
    132:   if Mopt.debug and not Mopt.testing
    133:     require_if_exist 'pry'
    134:     if binding.respond_to?(:pry)
    135:       log "error", exception if exception
    136:       $into_debug_mode_lock.synchronize {
    137:         begin
    138:           $into_debug_mode = Set.new
    139:           bind.pry
    140:         ensure
    141:           threads = $into_debug_mode
    142:           $into_debug_mode = false
    143:           threads.each &:wakeup end }
    144:       return true end end end

[1] pry(#<Plugin>)> show-stack

Showing all accessible frames in stack (22 in total):
--
=> #0  into_debug_mode <Object#into_debug_mode(exception=?, bind=?)>
   #1 [method]  mon_synchronize <MonitorMixin#mon_synchronize()>
   #2 [method]  into_debug_mode <Object#into_debug_mode(exception=?, bind=?)>
   #3 [method]  type_strict <Object#type_strict(args, &proc)>
   #4 [block]   block (3 levels) in <top (required)>
   #5 [block]   block in define_method <Gtk::Notebook#append_page(*arguments, &block)>
   #6 [method]  widget_join_tab <self.widget_join_tab(i_tab, widget)>
   #7 [block]   block (2 levels) in <top (required)>
   #8 [method]  call <Pluggaloid::Listener#call(*args)>
   #9 [block]   block (2 levels) in call_all_listeners <Pluggaloid::Event#call_all_listeners(args)>
   #10 [block]   block in call_all_listeners <Pluggaloid::Event#call_all_listeners(args)>
   #11 [method]  call_all_listeners <Pluggaloid::Event#call_all_listeners(args)>
   #12 [block]   block in call <Pluggaloid::Event#call(*args)>
   #13 [method]  run <Delayer::Procedure#run()>
   #14 [method]  run_once <Delayer::Extend#run_once()>
   #15 [method]  run <Delayer::Extend#run(current_expire=?)>
   #16 [method]  method_missing <Delayer.method_missing(*args, &proc)>
   #17 [block]   block in boot <#<Module:0x000055ec221094d8>.boot()>
   #18 [block]   block in define_singleton_method <Gtk.main(*arguments, &block)>
   #19 [method]  mainloop <Mainloop#mainloop()>
   #20 [method]  boot! <Object#boot!(profile)>
   #21 [main]    <main>
[2] pry(#<Plugin>)> f 4
NoMethodError: undefined method `f' for #<Plugin:0x000055ec2058b5f8>
from /home/osamu/.gem/gems/pluggaloid-1.1.1/lib/pluggaloid/plugin.rb:257:in `method_missing'
[3] pry(#<Plugin>)> frame 4

Frame number: 4/21
Frame type: block

From: /home/osamu/app/mikutter-gtk3/core/plugin/gtk3/gtk3.rb @ line 109 :

    104:       false }
    105:     pane.ssc(:switch_page){ |this, page, pagenum|
    106:       if pagenum == pane.page
    107:         i_pane.set_active_child(pane.get_nth_page(pagenum).i_tab, true) end }
    108:     pane.signal_connect(:page_added){ |this, tabcontainer, index|
 => 109:       type_strict tabcontainer => ::Gtk::TabContainer
    110:       Plugin.call(:rewind_window_order, i_pane.parent) if i_pane.parent
    111:       i_tab = tabcontainer.i_tab
    112:       next false if i_tab.parent == i_pane
    113:       Plugin.call(:after_gui_tab_reparent, i_tab, i_tab.parent, i_pane)
    114:       i_pane.add_child(i_tab, index)

[4] pry(#<Plugin>)> tabcontainer
=> #<Gtk::Box:0x55ec22dd4de8 ptr=0x55ec24b8b490>

環境は以下の通りです。

[2018-08-26 16:31:36-0500][/home/osamu/app/mikutter-gtk3]
osamu@glados(gtk3|✚1…)> pkg-config --modversion gtk+-3.0
3.22.30

[2018-08-26 16:31:41-0500][/home/osamu/app/mikutter-gtk3]
osamu@glados(gtk3|✚1…)> bundle exec ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]

toshi_a 初音 さんが約6年前に更新

  • 担当者Katsuyoshi MATSUMOTO から toshi_a 初音 に変更

良いですね。これを基準に進めましょう。

こちらで試したところおさけーさんと同様のエラーが発生したようです。まとまった時間が取れないので詳しいことは調べていません。

MiraclePainterは、gtk3に移行するには問題を抱えているため、一度Gtk依存を取り除こうと試みています( #1245 )。
が、gtk3のことを何もわかっていないので、先にそっちを理解してからMiraclePainterも作業をしないと二度手間にならないかなぁ、と迷っていたりもします。

担当者は、一旦katsyoshiさんより比較的反応が可能な私に変更しておきます。

Yuto Tokunaga さんが約6年前に更新

さっそく7a1a902f を手元で動かしてみたところ、初回起動時に paneの page_added が発火したところで落ちてしまいました。

ありがとうございます.未コミットの変更がありました. d6f939a だと上手くいくはずです.

toshi_a 初音 さんが約5年前に更新

  • ブロック元 機能 #1380: Gtk::CRUDに依存しているコードを減らす を追加

Yuto Tokunaga さんが約5年前に更新

TODOです.

  • MiraclePainterGtkTreeViewから独立したGtkWidgetとする
  • GtkTimelineGtkTreeViewから,gtk3で新設されたGtkListBoxに移行する

めでたくコミッタになったので,GitHubに上げてたbranchをこちらにpushしようと思います.

Yuto Tokunaga さんが約5年前に更新

動作がかなり不安定(表示されたりされなかったりする)ですが,MiraclePainterを表示させることが出来ました.

Yuto Tokunaga さんが約5年前に更新

MiraclePainterGtk::Widgetのサブクラスとして再実装できそうです.タイムラインをTreeViewからListBoxにして,中にWidgetを詰めるというのをやってみました.元のMiraclePainterのcairoを用いた描画処理がそのまま使えるので,そこまででかい変更にはならなさそうです.

toshi_a 初音 さんが約5年前に更新

これ試したいんですが、どこにpushされてますか?(まだしてない?)

Yuto Tokunaga さんが約5年前に更新

pushしてないです

Yuto Tokunaga さんが約5年前に更新

  • 担当者toshi_a 初音 から ふぇのまー 葱野 に変更
  • 対象バージョン を削除 (4.0)

topic/887-gtk3-yuntanにpushしました.

Yuto Tokunaga さんが約5年前に更新

  • 担当者ふぇのまー 葱野 から toshi_a 初音 に変更
  • 対象バージョン4.0 にセット

Yuto Tokunaga さんが約5年前に更新

なんもしてないのにフィールドが変になった.

Yuto Tokunaga さんが4年以上前に更新

  • 関連している 提案 #1453: gtk3: MiraclePainterをGtk::Widgetベースの実装に書き直す を追加

Shibafu Midorino さんが約3年前に更新

お久しぶりです。現在 topic/887-gtk3-shibafu にて下記の作業を実施しています。

  • 最新のdevelopへの追従
  • gtk3 3.4.9 を採用し、upstreamに取り込まれたvirtual function実装サポートを使うよう書き換え

2つ目に関しては課題が残っており、upstreamにpatchを投げています。それが取り込まれるまでは plugin/gtk3/patch.rb でモンキーパッチしてやり過ごします。

作業が完了したらどこからやりましょうかね〜

Shibafu Midorino さんが約3年前に更新

一旦最新のdevelop 86b703388eee78e8c8271f8065f01448d11a1025 までマージしましたが、直近の変更が大規模なプラグイン分割だったこともあり、見落としているデグレがいくらでもありそうです。

Shibafu Midorino さんが約3年前に更新

気づいたことメモ

  • TLコンテキストメニューの項目を選択しても、warningログが出力されるだけで何も実行されない
    /home/shibafu/git/mikutter-gtk3/vendor/bundle/ruby/3.0.0/gems/gobject-introspection-3.4.9/lib/gobject-introspection/loader.rb:614: warning: GRClosure invoking callback: already destroyed: GtkMenu::deactivate
    /home/shibafu/git/mikutter-gtk3/vendor/bundle/ruby/3.0.0/gems/gobject-introspection-3.4.9/lib/gobject-introspection/loader.rb:614: warning: GRClosure invoking callback: already destroyed: GtkImageMenuItem::activate
    
    • 恐らくgemにメモリ管理のバグがある。Gtk::Menuをどこかのインスタンス変数等にバインドしておけば回避できる。
  • TLで右クリックした時、マウスポインタの位置の要素が選択された状態にならない#1499
  • タブを切り替えようとしても切り替わらないか、表示が切り替わり続ける?ような動作を起こすことがある fixed b194ce6dfc8782f32b0b5ce4d4ac71b748761324
  • Intentダイアログの中身が空になる#1493

toshi_a 初音 さんが約3年前に更新

  • 対象バージョン4.0 から 5.0 に変更

toshi_a 初音 さんがほぼ3年前に更新

  • ブロック元 を削除 (機能 #1380: Gtk::CRUDに依存しているコードを減らす)

toshi_a 初音 さんがほぼ3年前に更新

  • ステータス実装待ち から 終了 に変更
  • プラグイン名gtk3 にセット

merged.

他の形式にエクスポート: Atom PDF