diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-26 20:03:37 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-26 20:03:37 +0000 |
commit | a7d8894b94d271931f4c04900030f93022589b03 (patch) | |
tree | 69eb53222d1f2c35da58a01bc78ac81d881584c9 /chrome/browser/gtk/tabs/tab_gtk.cc | |
parent | a4fc8d30896e63e7074ac06dbd7b13b00732f3c0 (diff) | |
download | chromium_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.cc | 45 |
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_); } } |