summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/tabs/tab_gtk.cc
diff options
context:
space:
mode:
authorjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-26 20:03:37 +0000
committerjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-26 20:03:37 +0000
commita7d8894b94d271931f4c04900030f93022589b03 (patch)
tree69eb53222d1f2c35da58a01bc78ac81d881584c9 /chrome/browser/gtk/tabs/tab_gtk.cc
parenta4fc8d30896e63e7074ac06dbd7b13b00732f3c0 (diff)
downloadchromium_src-a7d8894b94d271931f4c04900030f93022589b03.zip
chromium_src-a7d8894b94d271931f4c04900030f93022589b03.tar.gz
chromium_src-a7d8894b94d271931f4c04900030f93022589b03.tar.bz2
Implement dragging a tab out of a TabStripGtk into its own browser window.
BUG=none TEST=Open a browser window with two tabs, pull one of the tabs out of the tab strip. On release, a new window should be created with the dragged tab contents. Review URL: http://codereview.chromium.org/113787 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16894 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/tabs/tab_gtk.cc')
-rw-r--r--chrome/browser/gtk/tabs/tab_gtk.cc45
1 files changed, 26 insertions, 19 deletions
diff --git a/chrome/browser/gtk/tabs/tab_gtk.cc b/chrome/browser/gtk/tabs/tab_gtk.cc
index 6e2e0d9..96663f7 100644
--- a/chrome/browser/gtk/tabs/tab_gtk.cc
+++ b/chrome/browser/gtk/tabs/tab_gtk.cc
@@ -103,30 +103,31 @@ TabGtk::TabGtk(TabDelegate* delegate)
delegate_(delegate),
closing_(false),
dragging_(false) {
- event_box_.Own(gtk_event_box_new());
- gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE);
- gtk_drag_source_set(event_box_.get(), GDK_BUTTON1_MASK,
+ event_box_ = gtk_event_box_new();
+ g_object_ref(event_box_);
+ gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_), FALSE);
+ gtk_drag_source_set(event_box_, GDK_BUTTON1_MASK,
target_table, G_N_ELEMENTS(target_table),
GDK_ACTION_MOVE);
- g_signal_connect(G_OBJECT(event_box_.get()), "button-press-event",
+ g_signal_connect(G_OBJECT(event_box_), "button-press-event",
G_CALLBACK(OnMousePress), this);
- g_signal_connect(G_OBJECT(event_box_.get()), "button-release-event",
+ g_signal_connect(G_OBJECT(event_box_), "button-release-event",
G_CALLBACK(OnMouseRelease), this);
- g_signal_connect(G_OBJECT(event_box_.get()), "enter-notify-event",
+ g_signal_connect(G_OBJECT(event_box_), "enter-notify-event",
G_CALLBACK(OnEnterNotify), this);
- g_signal_connect(G_OBJECT(event_box_.get()), "leave-notify-event",
+ g_signal_connect(G_OBJECT(event_box_), "leave-notify-event",
G_CALLBACK(OnLeaveNotify), this);
- g_signal_connect_after(G_OBJECT(event_box_.get()), "drag-begin",
+ g_signal_connect_after(G_OBJECT(event_box_), "drag-begin",
G_CALLBACK(OnDragBegin), this);
- g_signal_connect_after(G_OBJECT(event_box_.get()), "drag-end",
+ g_signal_connect_after(G_OBJECT(event_box_), "drag-end",
G_CALLBACK(OnDragEnd), this);
- g_signal_connect_after(G_OBJECT(event_box_.get()), "drag-failed",
+ g_signal_connect_after(G_OBJECT(event_box_), "drag-failed",
G_CALLBACK(OnDragFailed), this);
- gtk_widget_add_events(event_box_.get(),
+ gtk_widget_add_events(event_box_,
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
GDK_LEAVE_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
- gtk_container_add(GTK_CONTAINER(event_box_.get()), TabRendererGtk::widget());
- gtk_widget_show_all(event_box_.get());
+ gtk_container_add(GTK_CONTAINER(event_box_), TabRendererGtk::widget());
+ gtk_widget_show_all(event_box_);
}
TabGtk::~TabGtk() {
@@ -138,7 +139,10 @@ TabGtk::~TabGtk() {
ContextMenuClosed();
}
- event_box_.Destroy();
+ gtk_widget_destroy(event_box_);
+
+ // Reset the user data pointer for our event handler.
+ gdk_event_handler_set(TabGtk::GdkEventHandler, NULL, NULL);
}
// static
@@ -200,7 +204,7 @@ void TabGtk::OnDragBegin(GtkWidget* widget, GdkDragContext* context,
gdk_event_handler_set(TabGtk::GdkEventHandler, tab, NULL);
int x, y;
- gdk_window_get_pointer(tab->event_box_.get()->window, &x, &y, NULL);
+ gdk_window_get_pointer(tab->event_box_->window, &x, &y, NULL);
// Make the mouse coordinate relative to the tab.
x -= tab->bounds().x();
@@ -236,7 +240,10 @@ gboolean TabGtk::OnDragMotion(GtkWidget* widget,
gboolean TabGtk::OnDragFailed(GtkWidget* widget, GdkDragContext* context,
GtkDragResult result,
TabGtk* tab) {
- tab->delegate_->EndDrag(false);
+ // TODO(jhawkins): Implement an EndDrag method that wraps up functionality
+ // of OnDragEnd and OnDragFailed. Take |result| into account for a canceled
+ // drag action.
+ OnDragEnd(widget, context, tab);
return TRUE;
}
@@ -248,14 +255,14 @@ bool TabGtk::IsSelected() const {
}
bool TabGtk::IsVisible() const {
- return GTK_WIDGET_FLAGS(event_box_.get()) & GTK_VISIBLE;
+ return GTK_WIDGET_FLAGS(event_box_) & GTK_VISIBLE;
}
void TabGtk::SetVisible(bool visible) const {
if (visible) {
- gtk_widget_show(event_box_.get());
+ gtk_widget_show(event_box_);
} else {
- gtk_widget_hide(event_box_.get());
+ gtk_widget_hide(event_box_);
}
}