diff options
-rw-r--r-- | chrome/browser/gtk/hover_controller_gtk.cc | 15 | ||||
-rw-r--r-- | chrome/browser/gtk/hover_controller_gtk.h | 27 | ||||
-rw-r--r-- | chrome/browser/gtk/tab_contents_drag_source.cc | 45 | ||||
-rw-r--r-- | chrome/browser/gtk/tab_contents_drag_source.h | 6 |
4 files changed, 33 insertions, 60 deletions
diff --git a/chrome/browser/gtk/hover_controller_gtk.cc b/chrome/browser/gtk/hover_controller_gtk.cc index 50a8f1a..0737a97 100644 --- a/chrome/browser/gtk/hover_controller_gtk.cc +++ b/chrome/browser/gtk/hover_controller_gtk.cc @@ -16,12 +16,12 @@ HoverControllerGtk::HoverControllerGtk(GtkWidget* button) g_object_ref(button_); gtk_chrome_button_set_hover_state(GTK_CHROME_BUTTON(button_), 0); - g_signal_connect(button_, "enter-notify-event", + signals_.Connect(button_, "enter-notify-event", G_CALLBACK(OnEnterThunk), this); - g_signal_connect(button_, "leave-notify-event", + signals_.Connect(button_, "leave-notify-event", G_CALLBACK(OnLeaveThunk), this); - g_signal_connect(button_, "destroy", - G_CALLBACK(OnButtonDestroyThunk), this); + signals_.Connect(button_, "destroy", + G_CALLBACK(OnDestroyThunk), this); #ifndef NDEBUG if (g_object_get_data(G_OBJECT(button_), kHoverControllerGtkKey)) @@ -54,10 +54,7 @@ HoverControllerGtk* HoverControllerGtk::GetHoverControllerGtk( void HoverControllerGtk::Destroy() { gtk_chrome_button_set_hover_state(GTK_CHROME_BUTTON(button_), -1.0); - g_signal_handlers_disconnect_by_func( - button_, - reinterpret_cast<gpointer>(OnButtonDestroyThunk), - this); + g_object_set_data(G_OBJECT(button_), kHoverControllerGtkKey, NULL); g_object_unref(button_); button_ = NULL; @@ -111,6 +108,6 @@ gboolean HoverControllerGtk::OnLeave(GtkWidget* widget, return FALSE; } -void HoverControllerGtk::OnButtonDestroy(GtkWidget* widget) { +void HoverControllerGtk::OnDestroy(GtkWidget* widget) { Destroy(); } diff --git a/chrome/browser/gtk/hover_controller_gtk.h b/chrome/browser/gtk/hover_controller_gtk.h index 6867503..10196ad 100644 --- a/chrome/browser/gtk/hover_controller_gtk.h +++ b/chrome/browser/gtk/hover_controller_gtk.h @@ -7,6 +7,7 @@ #include <gtk/gtk.h> +#include "app/gtk_signal.h" #include "app/slide_animation.h" #include "app/throb_animation.h" #include "base/scoped_ptr.h" @@ -44,30 +45,18 @@ class HoverControllerGtk : public AnimationDelegate { virtual void AnimationEnded(const Animation* animation); virtual void AnimationCanceled(const Animation* animation); - static gboolean OnEnterThunk(GtkWidget* widget, - GdkEventCrossing* event, - HoverControllerGtk* hover_controller) { - return hover_controller->OnEnter(widget, event); - } - gboolean OnEnter(GtkWidget* widget, GdkEventCrossing* event); - - static gboolean OnLeaveThunk(GtkWidget* widget, - GdkEventCrossing* event, - HoverControllerGtk* hover_controller) { - return hover_controller->OnLeave(widget, event); - } - gboolean OnLeave(GtkWidget* widget, GdkEventCrossing* event); - - static void OnButtonDestroyThunk(GtkWidget* widget, - HoverControllerGtk* hover_controller) { - hover_controller->OnButtonDestroy(widget); - } - void OnButtonDestroy(GtkWidget* widget); + CHROMEGTK_CALLBACK_1(HoverControllerGtk, gboolean, OnEnter, + GdkEventCrossing*); + CHROMEGTK_CALLBACK_1(HoverControllerGtk, gboolean, OnLeave, + GdkEventCrossing*); + CHROMEGTK_CALLBACK_0(HoverControllerGtk, void, OnDestroy); ThrobAnimation throb_animation_; SlideAnimation hover_animation_; GtkWidget* button_; + GtkSignalRegistrar signals_; + DISALLOW_COPY_AND_ASSIGN(HoverControllerGtk); }; diff --git a/chrome/browser/gtk/tab_contents_drag_source.cc b/chrome/browser/gtk/tab_contents_drag_source.cc index c3d94c0..ffd914e 100644 --- a/chrome/browser/gtk/tab_contents_drag_source.cc +++ b/chrome/browser/gtk/tab_contents_drag_source.cc @@ -32,29 +32,25 @@ TabContentsDragSource::TabContentsDragSource( : tab_contents_view_(tab_contents_view), drag_pixbuf_(NULL), drag_failed_(false), - drag_widget_(NULL), - drag_icon_(NULL) { - drag_widget_ = gtk_invisible_new(); - g_signal_connect(drag_widget_, "drag-failed", + drag_widget_(gtk_invisible_new()), + drag_icon_(gtk_window_new(GTK_WINDOW_POPUP)) { + g_object_ref(drag_widget_); + signals_.Connect(drag_widget_, "drag-failed", G_CALLBACK(OnDragFailedThunk), this); - g_signal_connect(drag_widget_, "drag-begin", G_CALLBACK(OnDragBeginThunk), + signals_.Connect(drag_widget_, "drag-begin", + G_CALLBACK(OnDragBeginThunk), this); - g_signal_connect(drag_widget_, "drag-end", G_CALLBACK(OnDragEndThunk), this); - g_signal_connect(drag_widget_, "drag-data-get", + signals_.Connect(drag_widget_, "drag-end", + G_CALLBACK(OnDragEndThunk), this); + signals_.Connect(drag_widget_, "drag-data-get", G_CALLBACK(OnDragDataGetThunk), this); - g_object_ref_sink(drag_widget_); + + g_object_ref(drag_icon_); + signals_.Connect(drag_icon_, "expose-event", + G_CALLBACK(OnDragIconExposeThunk), this); } TabContentsDragSource::~TabContentsDragSource() { - g_signal_handlers_disconnect_by_func(drag_widget_, - reinterpret_cast<gpointer>(OnDragFailedThunk), this); - g_signal_handlers_disconnect_by_func(drag_widget_, - reinterpret_cast<gpointer>(OnDragBeginThunk), this); - g_signal_handlers_disconnect_by_func(drag_widget_, - reinterpret_cast<gpointer>(OnDragEndThunk), this); - g_signal_handlers_disconnect_by_func(drag_widget_, - reinterpret_cast<gpointer>(OnDragDataGetThunk), this); - // Break the current drag, if any. if (drop_data_.get()) { gtk_grab_add(drag_widget_); @@ -63,9 +59,8 @@ TabContentsDragSource::~TabContentsDragSource() { drop_data_.reset(); } - gtk_widget_destroy(drag_widget_); g_object_unref(drag_widget_); - drag_widget_ = NULL; + g_object_unref(drag_icon_); } TabContents* TabContentsDragSource::tab_contents() const { @@ -319,18 +314,14 @@ void TabContentsDragSource::OnDragBegin(GtkWidget* sender, } if (drag_pixbuf_) { - drag_icon_ = gtk_window_new(GTK_WINDOW_POPUP); - g_object_ref_sink(drag_icon_); - g_signal_connect(drag_icon_, "expose-event", - G_CALLBACK(OnDragIconExposeThunk), this); gtk_widget_set_size_request(drag_icon_, gdk_pixbuf_get_width(drag_pixbuf_), gdk_pixbuf_get_height(drag_pixbuf_)); - GdkScreen* screen = gtk_widget_get_screen(GTK_WIDGET(drag_icon_)); + GdkScreen* screen = gtk_widget_get_screen(drag_icon_); GdkColormap* rgba = gdk_screen_get_rgba_colormap(screen); if (rgba) - gtk_widget_set_colormap(GTK_WIDGET(drag_icon_), rgba); + gtk_widget_set_colormap(drag_icon_, rgba); gtk_drag_set_icon_widget(drag_context, drag_icon_, image_offset_.x(), image_offset_.y()); @@ -339,10 +330,6 @@ void TabContentsDragSource::OnDragBegin(GtkWidget* sender, void TabContentsDragSource::OnDragEnd(GtkWidget* sender, GdkDragContext* drag_context) { - if (drag_icon_) { - g_object_unref(drag_icon_); - drag_icon_ = NULL; - } if (drag_pixbuf_) { g_object_unref(drag_pixbuf_); drag_pixbuf_ = NULL; diff --git a/chrome/browser/gtk/tab_contents_drag_source.h b/chrome/browser/gtk/tab_contents_drag_source.h index f43629f..d11e4e1 100644 --- a/chrome/browser/gtk/tab_contents_drag_source.h +++ b/chrome/browser/gtk/tab_contents_drag_source.h @@ -90,11 +90,11 @@ class TabContentsDragSource : public MessageLoopForUI::Observer { // The URL to download from for a drag-out download. GURL download_url_; - // The widget that provides visual feedback for the drag. We use this instead - // of gtk_drag_set_icon_pixbuf() because some window managers will use shadows - // or other visual effects on top level windows. + // The widget that provides visual feedback for the drag. GtkWidget* drag_icon_; + GtkSignalRegistrar signals_; + DISALLOW_COPY_AND_ASSIGN(TabContentsDragSource); }; |