| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/ui/gtk/tabs/tab_strip_gtk.h" | 5 #include "chrome/browser/ui/gtk/tabs/tab_strip_gtk.h" |
| 6 | 6 |
| 7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/debug/trace_event.h" |
| 11 #include "base/i18n/rtl.h" | 12 #include "base/i18n/rtl.h" |
| 12 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 13 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
| 14 #include "chrome/browser/autocomplete/autocomplete.h" | 15 #include "chrome/browser/autocomplete/autocomplete.h" |
| 15 #include "chrome/browser/autocomplete/autocomplete_classifier.h" | 16 #include "chrome/browser/autocomplete/autocomplete_classifier.h" |
| 16 #include "chrome/browser/autocomplete/autocomplete_match.h" | 17 #include "chrome/browser/autocomplete/autocomplete_match.h" |
| 17 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
| 18 #include "chrome/browser/tabs/tab_strip_model_delegate.h" | 19 #include "chrome/browser/tabs/tab_strip_model_delegate.h" |
| 19 #include "chrome/browser/themes/theme_service.h" | 20 #include "chrome/browser/themes/theme_service.h" |
| 20 #include "chrome/browser/ui/browser.h" | 21 #include "chrome/browser/ui/browser.h" |
| (...skipping 936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 957 | 958 |
| 958 return NULL; | 959 return NULL; |
| 959 } | 960 } |
| 960 | 961 |
| 961 //////////////////////////////////////////////////////////////////////////////// | 962 //////////////////////////////////////////////////////////////////////////////// |
| 962 // TabStripGtk, TabStripModelObserver implementation: | 963 // TabStripGtk, TabStripModelObserver implementation: |
| 963 | 964 |
| 964 void TabStripGtk::TabInsertedAt(TabContentsWrapper* contents, | 965 void TabStripGtk::TabInsertedAt(TabContentsWrapper* contents, |
| 965 int index, | 966 int index, |
| 966 bool foreground) { | 967 bool foreground) { |
| 968 TRACE_EVENT0("ui::gtk", "TabStripGtk::TabInsertedAt"); |
| 969 |
| 967 DCHECK(contents); | 970 DCHECK(contents); |
| 968 DCHECK(index == TabStripModel::kNoTab || model_->ContainsIndex(index)); | 971 DCHECK(index == TabStripModel::kNoTab || model_->ContainsIndex(index)); |
| 969 | 972 |
| 970 StopAnimation(); | 973 StopAnimation(); |
| 971 | 974 |
| 972 bool contains_tab = false; | 975 bool contains_tab = false; |
| 973 TabGtk* tab = NULL; | 976 TabGtk* tab = NULL; |
| 974 // First see if this Tab is one that was dragged out of this TabStrip and is | 977 // First see if this Tab is one that was dragged out of this TabStrip and is |
| 975 // now being dragged back in. In this case, the DraggedTabController actually | 978 // now being dragged back in. In this case, the DraggedTabController actually |
| 976 // has the Tab already constructed and we can just insert it into our list | 979 // has the Tab already constructed and we can just insert it into our list |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1030 // Have to do this _after_ calling StartRemoveTabAnimation, so that any | 1033 // Have to do this _after_ calling StartRemoveTabAnimation, so that any |
| 1031 // previous remove is completed fully and index is valid in sync with the | 1034 // previous remove is completed fully and index is valid in sync with the |
| 1032 // model index. | 1035 // model index. |
| 1033 GetTabAt(index)->set_closing(true); | 1036 GetTabAt(index)->set_closing(true); |
| 1034 } | 1037 } |
| 1035 | 1038 |
| 1036 void TabStripGtk::ActiveTabChanged(TabContentsWrapper* old_contents, | 1039 void TabStripGtk::ActiveTabChanged(TabContentsWrapper* old_contents, |
| 1037 TabContentsWrapper* new_contents, | 1040 TabContentsWrapper* new_contents, |
| 1038 int index, | 1041 int index, |
| 1039 bool user_gesture) { | 1042 bool user_gesture) { |
| 1043 TRACE_EVENT0("ui::gtk", "TabStripGtk::ActiveTabChanged"); |
| 1040 ReStack(); | 1044 ReStack(); |
| 1041 } | 1045 } |
| 1042 | 1046 |
| 1043 void TabStripGtk::TabSelectionChanged(TabStripModel* tab_strip_model, | 1047 void TabStripGtk::TabSelectionChanged(TabStripModel* tab_strip_model, |
| 1044 const TabStripSelectionModel& old_model) { | 1048 const TabStripSelectionModel& old_model) { |
| 1045 // We have "tiny tabs" if the tabs are so tiny that the unselected ones are | 1049 // We have "tiny tabs" if the tabs are so tiny that the unselected ones are |
| 1046 // a different size to the selected ones. | 1050 // a different size to the selected ones. |
| 1047 bool tiny_tabs = current_unselected_width_ != current_selected_width_; | 1051 bool tiny_tabs = current_unselected_width_ != current_selected_width_; |
| 1048 if (!IsAnimating() && (!needs_resize_layout_ || tiny_tabs)) | 1052 if (!IsAnimating() && (!needs_resize_layout_ || tiny_tabs)) |
| 1049 Layout(); | 1053 Layout(); |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1600 GdkScreen* screen = gdk_screen_get_default(); | 1604 GdkScreen* screen = gdk_screen_get_default(); |
| 1601 GdkDisplay* display = gdk_screen_get_display(screen); | 1605 GdkDisplay* display = gdk_screen_get_display(screen); |
| 1602 gint x, y; | 1606 gint x, y; |
| 1603 gdk_display_get_pointer(display, NULL, &x, &y, NULL); | 1607 gdk_display_get_pointer(display, NULL, &x, &y, NULL); |
| 1604 gfx::Point cursor_point(x, y); | 1608 gfx::Point cursor_point(x, y); |
| 1605 | 1609 |
| 1606 return bds.Contains(cursor_point); | 1610 return bds.Contains(cursor_point); |
| 1607 } | 1611 } |
| 1608 | 1612 |
| 1609 void TabStripGtk::ReStack() { | 1613 void TabStripGtk::ReStack() { |
| 1614 TRACE_EVENT0("ui::gtk", "TabStripGtk::ReStack"); |
| 1615 |
| 1610 if (!gtk_widget_get_realized(tabstrip_.get())) { | 1616 if (!gtk_widget_get_realized(tabstrip_.get())) { |
| 1611 // If the window isn't realized yet, we can't stack them yet. It will be | 1617 // If the window isn't realized yet, we can't stack them yet. It will be |
| 1612 // done by the OnMap signal handler. | 1618 // done by the OnMap signal handler. |
| 1613 return; | 1619 return; |
| 1614 } | 1620 } |
| 1615 int tab_count = GetTabCount(); | 1621 int tab_count = GetTabCount(); |
| 1616 TabGtk* active_tab = NULL; | 1622 TabGtk* active_tab = NULL; |
| 1617 for (int i = tab_count - 1; i >= 0; --i) { | 1623 for (int i = tab_count - 1; i >= 0; --i) { |
| 1618 TabGtk* tab = GetTabAt(i); | 1624 TabGtk* tab = GetTabAt(i); |
| 1619 if (tab->IsActive()) | 1625 if (tab->IsActive()) |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1796 CreateContainer(); | 1802 CreateContainer(); |
| 1797 drop_arrow = GetDropArrowImage(point_down); | 1803 drop_arrow = GetDropArrowImage(point_down); |
| 1798 } | 1804 } |
| 1799 | 1805 |
| 1800 TabStripGtk::DropInfo::~DropInfo() { | 1806 TabStripGtk::DropInfo::~DropInfo() { |
| 1801 DestroyContainer(); | 1807 DestroyContainer(); |
| 1802 } | 1808 } |
| 1803 | 1809 |
| 1804 gboolean TabStripGtk::DropInfo::OnExposeEvent(GtkWidget* widget, | 1810 gboolean TabStripGtk::DropInfo::OnExposeEvent(GtkWidget* widget, |
| 1805 GdkEventExpose* event) { | 1811 GdkEventExpose* event) { |
| 1812 TRACE_EVENT0("ui::gtk", "TabStripGtk::DropInfo::OnExposeEvent"); |
| 1813 |
| 1806 if (ui::IsScreenComposited()) { | 1814 if (ui::IsScreenComposited()) { |
| 1807 SetContainerTransparency(); | 1815 SetContainerTransparency(); |
| 1808 } else { | 1816 } else { |
| 1809 SetContainerShapeMask(); | 1817 SetContainerShapeMask(); |
| 1810 } | 1818 } |
| 1811 | 1819 |
| 1812 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); | 1820 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); |
| 1813 gdk_cairo_rectangle(cr, &event->area); | 1821 gdk_cairo_rectangle(cr, &event->area); |
| 1814 cairo_clip(cr); | 1822 cairo_clip(cr); |
| 1815 | 1823 |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1983 | 1991 |
| 1984 if (layout) | 1992 if (layout) |
| 1985 Layout(); | 1993 Layout(); |
| 1986 } | 1994 } |
| 1987 | 1995 |
| 1988 void TabStripGtk::OnMap(GtkWidget* widget) { | 1996 void TabStripGtk::OnMap(GtkWidget* widget) { |
| 1989 ReStack(); | 1997 ReStack(); |
| 1990 } | 1998 } |
| 1991 | 1999 |
| 1992 gboolean TabStripGtk::OnExpose(GtkWidget* widget, GdkEventExpose* event) { | 2000 gboolean TabStripGtk::OnExpose(GtkWidget* widget, GdkEventExpose* event) { |
| 2001 TRACE_EVENT0("ui::gtk", "TabStripGtk::OnExpose"); |
| 2002 |
| 1993 if (gdk_region_empty(event->region)) | 2003 if (gdk_region_empty(event->region)) |
| 1994 return TRUE; | 2004 return TRUE; |
| 1995 | 2005 |
| 1996 // If we're only repainting favicons, optimize the paint path and only draw | 2006 // If we're only repainting favicons, optimize the paint path and only draw |
| 1997 // the favicons. | 2007 // the favicons. |
| 1998 GdkRectangle* rects; | 2008 GdkRectangle* rects; |
| 1999 gint num_rects; | 2009 gint num_rects; |
| 2000 gdk_region_get_rectangles(event->region, &rects, &num_rects); | 2010 gdk_region_get_rectangles(event->region, &rects, &num_rects); |
| 2001 qsort(rects, num_rects, sizeof(GdkRectangle), CompareGdkRectangles); | 2011 qsort(rects, num_rects, sizeof(GdkRectangle), CompareGdkRectangles); |
| 2002 std::vector<int> tabs_to_repaint; | 2012 std::vector<int> tabs_to_repaint; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2062 // Paint the selected tab last, so it overlaps all the others. | 2072 // Paint the selected tab last, so it overlaps all the others. |
| 2063 if (selected_tab) { | 2073 if (selected_tab) { |
| 2064 gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()), | 2074 gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()), |
| 2065 selected_tab->widget(), event); | 2075 selected_tab->widget(), event); |
| 2066 } | 2076 } |
| 2067 | 2077 |
| 2068 return TRUE; | 2078 return TRUE; |
| 2069 } | 2079 } |
| 2070 | 2080 |
| 2071 void TabStripGtk::OnSizeAllocate(GtkWidget* widget, GtkAllocation* allocation) { | 2081 void TabStripGtk::OnSizeAllocate(GtkWidget* widget, GtkAllocation* allocation) { |
| 2082 TRACE_EVENT0("ui::gtk", "TabStripGtk::OnSizeAllocate"); |
| 2083 |
| 2072 gfx::Rect bounds = gfx::Rect(allocation->x, allocation->y, | 2084 gfx::Rect bounds = gfx::Rect(allocation->x, allocation->y, |
| 2073 allocation->width, allocation->height); | 2085 allocation->width, allocation->height); |
| 2074 | 2086 |
| 2075 // Nothing to do if the bounds are the same. If we don't catch this, we'll | 2087 // Nothing to do if the bounds are the same. If we don't catch this, we'll |
| 2076 // get an infinite loop of size-allocate signals. | 2088 // get an infinite loop of size-allocate signals. |
| 2077 if (bounds_ == bounds) | 2089 if (bounds_ == bounds) |
| 2078 return; | 2090 return; |
| 2079 | 2091 |
| 2080 SetBounds(bounds); | 2092 SetBounds(bounds); |
| 2081 | 2093 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2228 } | 2240 } |
| 2229 | 2241 |
| 2230 void TabStripGtk::SetNewTabButtonBackground() { | 2242 void TabStripGtk::SetNewTabButtonBackground() { |
| 2231 SkColor color = theme_service_->GetColor( | 2243 SkColor color = theme_service_->GetColor( |
| 2232 ThemeService::COLOR_BUTTON_BACKGROUND); | 2244 ThemeService::COLOR_BUTTON_BACKGROUND); |
| 2233 SkBitmap* background = theme_service_->GetBitmapNamed( | 2245 SkBitmap* background = theme_service_->GetBitmapNamed( |
| 2234 IDR_THEME_WINDOW_CONTROL_BACKGROUND); | 2246 IDR_THEME_WINDOW_CONTROL_BACKGROUND); |
| 2235 SkBitmap* mask = theme_service_->GetBitmapNamed(IDR_NEWTAB_BUTTON_MASK); | 2247 SkBitmap* mask = theme_service_->GetBitmapNamed(IDR_NEWTAB_BUTTON_MASK); |
| 2236 newtab_button_->SetBackground(color, background, mask); | 2248 newtab_button_->SetBackground(color, background, mask); |
| 2237 } | 2249 } |
| OLD | NEW |