diff options
Diffstat (limited to 'chrome/browser/gtk/tabs')
-rw-r--r-- | chrome/browser/gtk/tabs/tab_gtk.cc | 43 | ||||
-rw-r--r-- | chrome/browser/gtk/tabs/tab_gtk.h | 18 |
2 files changed, 27 insertions, 34 deletions
diff --git a/chrome/browser/gtk/tabs/tab_gtk.cc b/chrome/browser/gtk/tabs/tab_gtk.cc index 25bb1db..d188cac 100644 --- a/chrome/browser/gtk/tabs/tab_gtk.cc +++ b/chrome/browser/gtk/tabs/tab_gtk.cc @@ -143,17 +143,6 @@ TabGtk::~TabGtk() { } // static -void TabGtk::GdkEventHandler(GdkEvent* event, void* data) { - TabGtk* tab = static_cast<TabGtk*>(data); - - if (event->type == GDK_MOTION_NOTIFY && tab && tab->dragging_) { - tab->delegate_->ContinueDrag(NULL); - } - - gtk_main_do_event(event); -} - -// static gboolean TabGtk::OnMousePress(GtkWidget* widget, GdkEventButton* event, TabGtk* tab) { if (event->button == 1) { @@ -198,7 +187,7 @@ gboolean TabGtk::OnLeaveNotify(GtkWidget* widget, GdkEventCrossing* event, // static void TabGtk::OnDragBegin(GtkWidget* widget, GdkDragContext* context, TabGtk* tab) { - gdk_event_handler_set(TabGtk::GdkEventHandler, tab, NULL); + MessageLoopForUI::current()->AddObserver(tab); int x, y; gdk_window_get_pointer(tab->event_box_->window, &x, &y, NULL); @@ -219,18 +208,7 @@ void TabGtk::OnDragEnd(GtkWidget* widget, GdkDragContext* context, // Clean up the drag helper, which is re-created on the next mouse press. tab->delegate_->EndDrag(false); - // Reset the user data pointer for our event handler. - gdk_event_handler_set(TabGtk::GdkEventHandler, NULL, NULL); -} - -// static -gboolean TabGtk::OnDragMotion(GtkWidget* widget, - GdkDragContext* context, - guint x, guint y, - guint time, - TabGtk* tab) { - tab->delegate_->ContinueDrag(context); - return TRUE; + MessageLoopForUI::current()->RemoveObserver(tab); } // static @@ -245,6 +223,23 @@ gboolean TabGtk::OnDragFailed(GtkWidget* widget, GdkDragContext* context, } /////////////////////////////////////////////////////////////////////////////// +// TabGtk, MessageLoop::Observer implementation: + +void TabGtk::WillProcessEvent(GdkEvent* event) { + // Nothing to do. +} + +void TabGtk::DidProcessEvent(GdkEvent* event) { + switch (event->type) { + case GDK_MOTION_NOTIFY: + delegate_->ContinueDrag(NULL); + break; + default: + break; + } +} + +/////////////////////////////////////////////////////////////////////////////// // TabGtk, TabRendererGtk overrides: bool TabGtk::IsSelected() const { diff --git a/chrome/browser/gtk/tabs/tab_gtk.h b/chrome/browser/gtk/tabs/tab_gtk.h index 195d04c..9abe929 100644 --- a/chrome/browser/gtk/tabs/tab_gtk.h +++ b/chrome/browser/gtk/tabs/tab_gtk.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_GTK_TABS_TAB_GTK_H_ #include "base/basictypes.h" +#include "base/message_loop.h" #include "chrome/browser/gtk/tabs/tab_renderer_gtk.h" #include "chrome/browser/tabs/tab_strip_model.h" @@ -13,7 +14,8 @@ namespace gfx { class Path; } -class TabGtk : public TabRendererGtk { +class TabGtk : public TabRendererGtk, + public MessageLoopForUI::Observer { public: // An interface implemented by an object that can help this Tab complete // various actions. The index parameter is the index of this Tab in the @@ -83,10 +85,6 @@ class TabGtk : public TabRendererGtk { virtual void CloseButtonClicked(); virtual void UpdateData(TabContents* contents, bool loading_only); - // The callback that is called for every gdk event. We use it to inspect for - // drag-motion events when the drag is outside of the source tab. - static void GdkEventHandler(GdkEvent* event, void* tab); - // button-press-event handler that handles mouse clicks. static gboolean OnMousePress(GtkWidget* widget, GdkEventButton* event, TabGtk* tab); @@ -111,15 +109,15 @@ class TabGtk : public TabRendererGtk { static void OnDragEnd(GtkWidget* widget, GdkDragContext* context, TabGtk* tab); - // drag-motion handler that handles drag movements in the tabstrip. - static gboolean OnDragMotion(GtkWidget* widget, GdkDragContext* context, - guint x, guint y, guint time, - TabGtk* tab); - // drag-failed handler that is emitted when the drag fails. static gboolean OnDragFailed(GtkWidget* widget, GdkDragContext* context, GtkDragResult result, TabGtk* tab); + protected: + // MessageLoop::Observer implementation: + virtual void WillProcessEvent(GdkEvent* event); + virtual void DidProcessEvent(GdkEvent* event); + private: class ContextMenuController; friend class ContextMenuController; |