機能 #887
closedgtk3
100%
Description
現在はgtk2を利用しているが、流石に時代遅れなのでgtk3を利用するように変更する
gtkプラグイン¶
gtkプラグインを削除し、gtk3プラグインを実装する。
そうすることで、サードパーティプラグインでgtkプラグインに依存している(=gtk2に依存している)プラグインが、gtk3環境下でロードされないようになるため、ユーザがmikutterだけをバージョンアップした時に、gtk2に依存したプラグインがロードされず、正常に起動できるという状態になることを期待できる。
(まぁ.mikutter.ymlちゃんと書いてなかったら結局ダメなんだけどさ)
gtk2モードのようなものは用意しない。mikutterプラグインの依存関係の指定方法では、一つのプラグインが いずれかの プラグインに依存しているという状態を表現できないため、一つのプラグインでgtk{2,3}両方に対応することはできない。
その他バンドルプラグイン¶
gtk3プラグインへ依存するように順次書き換えていく。
時期¶
いくつかのプラグインの互換性がなくなる変更なので、メジャーバージョンアップとする。
Updated by toshi_a 初音 over 9 years ago
- Status changed from 新規 to 実装待ち
- Assignee set to Katsuyoshi MATSUMOTO
メインの担当者として、Rubykaigi2016でこの件に関して名乗りを挙げてくれたkatsyoshiをアサインします。
Updated by toshi_a 初音 over 9 years ago
どんな起動オプションでやってる?
俺はとりあえずgtk3だけ読み込むために
mikutter --confroot=/tmp/mikutter.887 --plugin=gtk3 --debug
みたいなことをしている。情報共有を円滑にするために起動オプション(厳密にはロードするプラグイン)共有してほしいです
Updated by Yuto Tokunaga over 7 years ago
こんにちは.gtk3対応に興味があったのでやってみています. https://github.com/yuntan/mikutter/tree/gtk3 に置いてます.topic/887-gtk3をmaster(557b03b)にrebaseしてその続きで作業しています.起動できるところまで作業を進めましたが,MiracrlePainterで苦戦しています.
Updated by Osamu Koga over 7 years ago
すごい。
さっそく7a1a902f を手元で動かしてみたところ、初回起動時に paneの page_added が発火したところで落ちてしまいました。
デバッグのため、 pry と pry-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]
Updated by toshi_a 初音 over 7 years ago
- Assignee changed from Katsuyoshi MATSUMOTO to toshi_a 初音
良いですね。これを基準に進めましょう。
こちらで試したところおさけーさんと同様のエラーが発生したようです。まとまった時間が取れないので詳しいことは調べていません。
MiraclePainterは、gtk3に移行するには問題を抱えているため、一度Gtk依存を取り除こうと試みています( #1245 )。
が、gtk3のことを何もわかっていないので、先にそっちを理解してからMiraclePainterも作業をしないと二度手間にならないかなぁ、と迷っていたりもします。
担当者は、一旦katsyoshiさんより比較的反応が可能な私に変更しておきます。
Updated by Yuto Tokunaga over 7 years ago
さっそく7a1a902f を手元で動かしてみたところ、初回起動時に paneの page_added が発火したところで落ちてしまいました。
ありがとうございます.未コミットの変更がありました. d6f939a だと上手くいくはずです.
Updated by toshi_a 初音 over 6 years ago
- Blocked by 機能 #1380: Gtk::CRUDに依存しているコードを減らす added
Updated by Yuto Tokunaga over 6 years ago
TODOです.
MiraclePainterをGtkTreeViewから独立したGtkWidgetとするGtkTimelineをGtkTreeViewから,gtk3で新設されたGtkListBoxに移行する
めでたくコミッタになったので,GitHubに上げてたbranchをこちらにpushしようと思います.
Updated by Yuto Tokunaga over 6 years ago
動作がかなり不安定(表示されたりされなかったりする)ですが,MiraclePainterを表示させることが出来ました.

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

Updated by Yuto Tokunaga over 6 years ago
- Assignee changed from toshi_a 初音 to ふぇのまー 葱野
- Target version deleted (
4.0)
topic/887-gtk3-yuntanにpushしました.
Updated by Yuto Tokunaga over 6 years ago
- Assignee changed from ふぇのまー 葱野 to toshi_a 初音
- Target version set to 4.0
Updated by Yuto Tokunaga over 5 years ago
- Related to 提案 #1453: gtk3: MiraclePainterをGtk::Widgetベースの実装に書き直す added
Updated by Shibafu Midorino over 4 years ago
お久しぶりです。現在 topic/887-gtk3-shibafu にて下記の作業を実施しています。
- 最新のdevelopへの追従
- gtk3 3.4.9 を採用し、upstreamに取り込まれたvirtual function実装サポートを使うよう書き換え
2つ目に関しては課題が残っており、upstreamにpatchを投げています。それが取り込まれるまでは plugin/gtk3/patch.rb でモンキーパッチしてやり過ごします。
作業が完了したらどこからやりましょうかね〜
Updated by Shibafu Midorino over 4 years ago
一旦最新のdevelop 86b703388eee78e8c8271f8065f01448d11a1025 までマージしましたが、直近の変更が大規模なプラグイン分割だったこともあり、見落としているデグレがいくらでもありそうです。
Updated by Shibafu Midorino over 4 years ago
気づいたことメモ
- 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 b194ce6dfc8782f32b0b5ce4d4ac71b748761324Intentダイアログの中身が空になる→ #1493
Updated by toshi_a 初音 about 4 years ago
- Blocked by deleted (機能 #1380: Gtk::CRUDに依存しているコードを減らす)