OLD | NEW |
---|---|
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/gtk/tabs/tab_strip_gtk.h" | 5 #include "chrome/browser/gtk/tabs/tab_strip_gtk.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "app/gfx/canvas_paint.h" | 9 #include "app/gfx/canvas_paint.h" |
10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
822 for (; it != tab_data_.end(); ++it) { | 822 for (; it != tab_data_.end(); ++it) { |
823 if (it->tab == tab) { | 823 if (it->tab == tab) { |
824 if (!model_->closing_all()) | 824 if (!model_->closing_all()) |
825 NOTREACHED() << "Leaving in an inconsistent state!"; | 825 NOTREACHED() << "Leaving in an inconsistent state!"; |
826 tab_data_.erase(it); | 826 tab_data_.erase(it); |
827 break; | 827 break; |
828 } | 828 } |
829 } | 829 } |
830 | 830 |
831 gtk_container_remove(GTK_CONTAINER(tabstrip_.get()), tab->widget()); | 831 gtk_container_remove(GTK_CONTAINER(tabstrip_.get()), tab->widget()); |
832 delete tab; | 832 // If we delete the dragged source tab here, the gtk drag-n-drop API won't |
833 // get a change to clean up and remove any references it's added to the tab | |
834 // widget, so we'll leak the widget. | |
835 MessageLoop::current()->DeleteSoon(FROM_HERE, tab); | |
tony
2009/07/21 22:55:44
You're sure that the gtk d&d api will get to run b
| |
833 | 836 |
834 // Force a layout here, because if we've just quickly drag detached a Tab, | 837 // Force a layout here, because if we've just quickly drag detached a Tab, |
835 // the stopping of the active animation above may have left the TabStrip in a | 838 // the stopping of the active animation above may have left the TabStrip in a |
836 // bad (visual) state. | 839 // bad (visual) state. |
837 Layout(); | 840 Layout(); |
838 } | 841 } |
839 | 842 |
840 gfx::Rect TabStripGtk::GetIdealBounds(int index) { | 843 gfx::Rect TabStripGtk::GetIdealBounds(int index) { |
841 DCHECK(index >= 0 && index < GetTabCount()); | 844 DCHECK(index >= 0 && index < GetTabCount()); |
842 return tab_data_.at(index).ideal_bounds; | 845 return tab_data_.at(index).ideal_bounds; |
(...skipping 1076 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1919 message.set_type(TabOverviewTypes::Message::WM_SWITCH_TO_OVERVIEW_MODE); | 1922 message.set_type(TabOverviewTypes::Message::WM_SWITCH_TO_OVERVIEW_MODE); |
1920 GtkWidget* browser_widget = GTK_WIDGET( | 1923 GtkWidget* browser_widget = GTK_WIDGET( |
1921 static_cast<BrowserWindowGtk*>(browser->window())->GetNativeHandle()); | 1924 static_cast<BrowserWindowGtk*>(browser->window())->GetNativeHandle()); |
1922 message.set_param(0, x11_util::GetX11WindowFromGtkWidget(browser_widget)); | 1925 message.set_param(0, x11_util::GetX11WindowFromGtkWidget(browser_widget)); |
1923 TabOverviewTypes::instance()->SendMessage(message); | 1926 TabOverviewTypes::instance()->SendMessage(message); |
1924 | 1927 |
1925 UserMetrics::RecordAction(L"TabOverview_PressedTabOverviewButton", | 1928 UserMetrics::RecordAction(L"TabOverview_PressedTabOverviewButton", |
1926 tabstrip->model_->profile()); | 1929 tabstrip->model_->profile()); |
1927 } | 1930 } |
1928 #endif | 1931 #endif |
OLD | NEW |