Index: chrome/browser/gtk/tabs/tab_gtk.cc |
=================================================================== |
--- chrome/browser/gtk/tabs/tab_gtk.cc (revision 16177) |
+++ chrome/browser/gtk/tabs/tab_gtk.cc (working copy) |
@@ -100,16 +100,13 @@ |
TabGtk::TabGtk(TabDelegate* delegate) |
: TabRendererGtk(), |
delegate_(delegate), |
- closing_(false) { |
+ 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, |
target_table, G_N_ELEMENTS(target_table), |
GDK_ACTION_MOVE); |
- gtk_drag_dest_set(event_box_.get(), GTK_DEST_DEFAULT_DROP, |
- target_table, G_N_ELEMENTS(target_table), |
- GDK_ACTION_MOVE); |
- gtk_drag_dest_set_track_motion(event_box_.get(), true); |
g_signal_connect(G_OBJECT(event_box_.get()), "button-press-event", |
G_CALLBACK(OnMousePress), this); |
g_signal_connect(G_OBJECT(event_box_.get()), "button-release-event", |
@@ -119,13 +116,11 @@ |
g_signal_connect(G_OBJECT(event_box_.get()), "leave-notify-event", |
G_CALLBACK(OnLeaveNotify), this); |
g_signal_connect_after(G_OBJECT(event_box_.get()), "drag-begin", |
- G_CALLBACK(&OnDragBegin), this); |
+ G_CALLBACK(OnDragBegin), this); |
g_signal_connect_after(G_OBJECT(event_box_.get()), "drag-end", |
- G_CALLBACK(&OnDragEnd), this); |
+ G_CALLBACK(OnDragEnd), this); |
g_signal_connect_after(G_OBJECT(event_box_.get()), "drag-failed", |
- G_CALLBACK(&OnDragFailed), this); |
- g_signal_connect_after(G_OBJECT(event_box_.get()), "drag-motion", |
- G_CALLBACK(&OnDragMotion), this); |
+ G_CALLBACK(OnDragFailed), this); |
gtk_widget_add_events(event_box_.get(), |
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | |
GDK_LEAVE_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); |
@@ -148,6 +143,17 @@ |
} |
// static |
+void TabGtk::GdkEventHandler(GdkEvent* event, void* data) { |
+ TabGtk* tab = static_cast<TabGtk*>(data); |
+ |
+ if (event->type == GDK_MOTION_NOTIFY && 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) { |
@@ -192,14 +198,23 @@ |
// static |
void TabGtk::OnDragBegin(GtkWidget* widget, GdkDragContext* context, |
TabGtk* tab) { |
+ gdk_event_handler_set(TabGtk::GdkEventHandler, tab, NULL); |
+ |
int x, y; |
gdk_window_get_pointer(tab->event_box_.get()->window, &x, &y, NULL); |
+ |
+ // Make the mouse coordinate relative to the tab. |
+ x -= tab->bounds().x(); |
+ y -= tab->bounds().y(); |
+ |
+ tab->dragging_ = true; |
tab->delegate_->MaybeStartDrag(tab, gfx::Point(x, y)); |
} |
// static |
void TabGtk::OnDragEnd(GtkWidget* widget, GdkDragContext* context, |
TabGtk* tab) { |
+ tab->dragging_ = false; |
// Notify the drag helper that we're done with any potential drag operations. |
// Clean up the drag helper, which is re-created on the next mouse press. |
tab->delegate_->EndDrag(false); |
@@ -219,7 +234,7 @@ |
gboolean TabGtk::OnDragFailed(GtkWidget* widget, GdkDragContext* context, |
GtkDragResult result, |
TabGtk* tab) { |
- tab->delegate_->EndDrag(true); |
+ tab->delegate_->EndDrag(false); |
return TRUE; |
} |
@@ -230,6 +245,18 @@ |
return delegate_->IsTabSelected(this); |
} |
+bool TabGtk::IsVisible() const { |
+ return GTK_WIDGET_FLAGS(event_box_.get()) & GTK_VISIBLE; |
+} |
+ |
+void TabGtk::SetVisible(bool visible) const { |
+ if (visible) { |
+ gtk_widget_show(event_box_.get()); |
+ } else { |
+ gtk_widget_hide(event_box_.get()); |
+ } |
+} |
+ |
void TabGtk::CloseButtonResized(const gfx::Rect& bounds) { |
gtk_fixed_move(GTK_FIXED(TabRendererGtk::widget()), |
close_button_.get()->widget(), bounds.x(), bounds.y()); |