diff options
author | toshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8> | 2012-09-14 17:29:15 +0000 |
---|---|---|
committer | toshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8> | 2012-09-14 17:29:15 +0000 |
commit | 02320d9982e18f75eba83e9f0fc6c727ad043df9 (patch) | |
tree | 64ccdf68e4a0187a503651e3fcd4145a46357be3 /core | |
parent | 5a7e0259021e2c9bb6b7164be7debd6f6332d73f (diff) | |
download | mikutter-02320d9982e18f75eba83e9f0fc6c727ad043df9.tar.gz |
mikutter内部のフォーカス切り替えイベントに、Gtkから発生したものかを判別するフラグを持たせて、Gtk由来ならgtkプラグインは無視するようにした closes #491
git-svn-id: svn://toshia.dip.jp/mikutter/trunk@990 03aab468-d3d2-4883-8b12-f661bbf03fa8
Diffstat (limited to 'core')
-rw-r--r-- | core/plugin/gtk/gtk.rb | 55 | ||||
-rw-r--r-- | core/plugin/gui/hierarchy_child.rb | 5 | ||||
-rw-r--r-- | core/plugin/gui/hierarchy_parent.rb | 10 | ||||
-rw-r--r-- | core/plugin/gui/pane.rb | 2 | ||||
-rw-r--r-- | core/plugin/gui/timeline.rb | 4 | ||||
-rw-r--r-- | core/plugin/gui/window.rb | 2 |
6 files changed, 44 insertions, 34 deletions
diff --git a/core/plugin/gtk/gtk.rb b/core/plugin/gtk/gtk.rb index 4a279d84..7b90fa07 100644 --- a/core/plugin/gtk/gtk.rb +++ b/core/plugin/gtk/gtk.rb @@ -57,7 +57,7 @@ Plugin.create :gtk do # Gtk.main_quit false } window.ssc(:focus_in_event) { - i_window.active! + i_window.active!(true, true) false } window.ssc('key_press_event'){ |widget, event| @@ -89,7 +89,7 @@ Plugin.create :gtk do false } pane.ssc(:switch_page){ |this, page, pagenum| if pagenum == pane.page - i_pane.set_active_child(pane.get_nth_page(pagenum).i_tab) + i_pane.set_active_child(pane.get_nth_page(pagenum).i_tab, true) else notice "switch_page: pagenum(#{pagenum}) != pane.page(#{pane.page})" end } pane.signal_connect(:page_added){ |this, tabcontainer, index| @@ -140,7 +140,7 @@ Plugin.create :gtk do @profiletabs_by_slug[i_tab.slug] = tab end tab_update_icon(i_tab) tab.ssc(:focus_in_event) { - i_tab.active! + i_tab.active!(true, true) false } tab.ssc(:key_press_event){ |widget, event| @@ -162,7 +162,7 @@ Plugin.create :gtk do @timelines_by_slug[i_timeline.slug] = timeline focus_in_event = lambda { |this, event| if this.focus? - i_timeline.active! + i_timeline.active!(true, true) else notice "timeline_created: focus_in_event: event receive but not has focus #{i_timeline}" end false } @@ -248,7 +248,7 @@ Plugin.create :gtk do next if not postbox_parent postbox = @postboxes_by_slug[i_postbox.slug] = postbox_parent.add_postbox(i_postbox) postbox.post.ssc(:focus_in_event) { - i_postbox.active! + i_postbox.active!(true, true) false } postbox.post.ssc('key_press_event'){ |widget, event| Plugin::GUI.keypress(Gtk::keyname([event.keyval ,event.state]), i_postbox) } @@ -347,28 +347,31 @@ Plugin.create :gtk do if not statusbar.destroyed? statusbar.remove(cid, mid) end } end end - on_gui_child_activated do |i_parent, i_child| + on_gui_child_activated do |i_parent, i_child, by_toolkit| type_strict i_parent => Plugin::GUI::HierarchyParent, i_child => Plugin::GUI::HierarchyChild - if i_child.is_a?(Plugin::GUI::TabLike) - i_pane = i_parent - i_tab = i_child - notice "gui_child_activated: tab active #{i_pane} => #{i_tab}" - pane = widgetof(i_pane) - tab = widgetof(i_tab) - if pane and tab - pagenum = pane.get_tab_pos_by_tab(tab) - pane.page = pagenum if pagenum and pane.page != pagenum end - elsif i_parent.is_a?(Plugin::GUI::Window) - i_term = i_child.respond_to?(:active_chain) ? i_child.active_chain.last : i_child - if i_term - window = widgetof(i_parent) - widget = widgetof(i_term) - if window and widget - notice "ACTIVATE! #{window} => #{widget}" - if widget.respond_to? :active - widget.active - else - window.set_focus(widget) end end end end end + if by_toolkit + notice "activate by toolkit. ignore." + else + if i_child.is_a?(Plugin::GUI::TabLike) + i_pane = i_parent + i_tab = i_child + notice "gui_child_activated: tab active #{i_pane} => #{i_tab}" + pane = widgetof(i_pane) + tab = widgetof(i_tab) + if pane and tab + pagenum = pane.get_tab_pos_by_tab(tab) + pane.page = pagenum if pagenum and pane.page != pagenum end + elsif i_parent.is_a?(Plugin::GUI::Window) + i_term = i_child.respond_to?(:active_chain) ? i_child.active_chain.last : i_child + if i_term + window = widgetof(i_parent) + widget = widgetof(i_term) + if window and widget + notice "ACTIVATE! #{window} => #{widget}" + if widget.respond_to? :active + widget.active + else + window.set_focus(widget) end end end end end end filter_gui_postbox_input_editable do |i_postbox, editable| postbox = widgetof(i_postbox) diff --git a/core/plugin/gui/hierarchy_child.rb b/core/plugin/gui/hierarchy_child.rb index ece0c607..95df48ba 100644 --- a/core/plugin/gui/hierarchy_child.rb +++ b/core/plugin/gui/hierarchy_child.rb @@ -44,10 +44,11 @@ module Plugin::GUI::HierarchyChild # 親を再帰的に辿り、selfをアクティブに設定する # ==== Args # [just_this] 再帰的に呼び出されたのではなく、直接これをアクティブに指定されたなら真 + # [by_toolkit] UIツールキットの入力でアクティブになった場合真 # ==== Return # self - def active!(just_this=true) - @parent.set_active_child(self).active!(false) + def active!(just_this=true, by_toolkit=false) + @parent.set_active_child(self, by_toolkit).active!(false, by_toolkit) self end module Extended diff --git a/core/plugin/gui/hierarchy_parent.rb b/core/plugin/gui/hierarchy_parent.rb index af74c252..5ff9c28a 100644 --- a/core/plugin/gui/hierarchy_parent.rb +++ b/core/plugin/gui/hierarchy_parent.rb @@ -58,10 +58,16 @@ module Plugin::GUI::HierarchyParent def children @children ||= [] end - def set_active_child(child) + # 子 _child_ をアクティブに設定する + # ==== Args + # [child] アクティブにする子 + # [by_toolkit] UIツールキットの入力でアクティブになった場合真 + # ==== Return + # self + def set_active_child(child, by_toolkit=false) type_strict child => tcor(Plugin::GUI::HierarchyChild, NilClass) @active_child = child - Plugin.call(:gui_child_activated, self, child) if child + Plugin.call(:gui_child_activated, self, child, by_toolkit) if child notice "active child set #{self.inspect} => #{child.inspect}" self end diff --git a/core/plugin/gui/pane.rb b/core/plugin/gui/pane.rb index 251f6a24..694d4bb3 100644 --- a/core/plugin/gui/pane.rb +++ b/core/plugin/gui/pane.rb @@ -25,7 +25,7 @@ class Plugin::GUI::Pane Plugin.call(:pane_created, self) end - def active!(just_this=true) + def active!(just_this=true, by_toolkit=false) @@default = self super end diff --git a/core/plugin/gui/timeline.rb b/core/plugin/gui/timeline.rb index 47c40be8..0eaf9edb 100644 --- a/core/plugin/gui/timeline.rb +++ b/core/plugin/gui/timeline.rb @@ -41,8 +41,8 @@ class Plugin::GUI::Timeline # このタイムラインをアクティブにする。また、子のPostboxは非アクティブにする # ==== Return # self - def active!(just_this=true) - set_active_child(nil) if just_this + def active!(just_this=true, by_toolkit=false) + set_active_child(nil, by_toolkit) if just_this super end # 選択されているMessageを返す diff --git a/core/plugin/gui/window.rb b/core/plugin/gui/window.rb index fb74550f..cf053e9b 100644 --- a/core/plugin/gui/window.rb +++ b/core/plugin/gui/window.rb @@ -23,7 +23,7 @@ class Plugin::GUI::Window end # self がアクティブになったことを報告する - def active!(just_this=true) + def active!(just_this=true, by_toolkit=false) @@active = self end |