| 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/browser_window_gtk.h" | 5 #include "chrome/browser/ui/gtk/browser_window_gtk.h" |
| 6 | 6 |
| 7 #include <gdk/gdkkeysyms.h> | 7 #include <gdk/gdkkeysyms.h> |
| 8 | 8 |
| 9 #include <dlfcn.h> | 9 #include <dlfcn.h> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 // of calling gtk_window_resize directly. This is done to avoid a WM "feature" | 250 // of calling gtk_window_resize directly. This is done to avoid a WM "feature" |
| 251 // where setting the window size to the monitor size causes the WM to set the | 251 // where setting the window size to the monitor size causes the WM to set the |
| 252 // EWMH for full screen mode. | 252 // EWMH for full screen mode. |
| 253 void SetWindowSize(GtkWindow* window, const gfx::Size& size) { | 253 void SetWindowSize(GtkWindow* window, const gfx::Size& size) { |
| 254 gfx::Size new_size = size; | 254 gfx::Size new_size = size; |
| 255 | 255 |
| 256 gint current_width = 0; | 256 gint current_width = 0; |
| 257 gint current_height = 0; | 257 gint current_height = 0; |
| 258 gtk_window_get_size(window, ¤t_width, ¤t_height); | 258 gtk_window_get_size(window, ¤t_width, ¤t_height); |
| 259 GdkRectangle size_with_decorations = {0}; | 259 GdkRectangle size_with_decorations = {0}; |
| 260 if (GTK_WIDGET(window)->window) { | 260 GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET(window)); |
| 261 gdk_window_get_frame_extents(GTK_WIDGET(window)->window, | 261 if (gdk_window) { |
| 262 gdk_window_get_frame_extents(gdk_window, |
| 262 &size_with_decorations); | 263 &size_with_decorations); |
| 263 } | 264 } |
| 264 | 265 |
| 265 if (current_width == size_with_decorations.width && | 266 if (current_width == size_with_decorations.width && |
| 266 current_height == size_with_decorations.height) { | 267 current_height == size_with_decorations.height) { |
| 267 // Make sure the window doesn't match any monitor size. We compare against | 268 // Make sure the window doesn't match any monitor size. We compare against |
| 268 // all monitors because we don't know which monitor the window is going to | 269 // all monitors because we don't know which monitor the window is going to |
| 269 // open on (the WM decides that). | 270 // open on (the WM decides that). |
| 270 GdkScreen* screen = gtk_window_get_screen(window); | 271 GdkScreen* screen = gtk_window_get_screen(window); |
| 271 gint num_monitors = gdk_screen_get_n_monitors(screen); | 272 gint num_monitors = gdk_screen_get_n_monitors(screen); |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 736 // the window is destroyed. | 737 // the window is destroyed. |
| 737 global_menu_bar_->Disable(); | 738 global_menu_bar_->Disable(); |
| 738 gtk_widget_destroy(window); | 739 gtk_widget_destroy(window); |
| 739 } | 740 } |
| 740 | 741 |
| 741 void BrowserWindowGtk::Activate() { | 742 void BrowserWindowGtk::Activate() { |
| 742 gtk_window_present(window_); | 743 gtk_window_present(window_); |
| 743 } | 744 } |
| 744 | 745 |
| 745 void BrowserWindowGtk::Deactivate() { | 746 void BrowserWindowGtk::Deactivate() { |
| 746 gdk_window_lower(GTK_WIDGET(window_)->window); | 747 gdk_window_lower(gtk_widget_get_window(GTK_WIDGET(window_))); |
| 747 } | 748 } |
| 748 | 749 |
| 749 bool BrowserWindowGtk::IsActive() const { | 750 bool BrowserWindowGtk::IsActive() const { |
| 750 return is_active_; | 751 return is_active_; |
| 751 } | 752 } |
| 752 | 753 |
| 753 void BrowserWindowGtk::FlashFrame() { | 754 void BrowserWindowGtk::FlashFrame() { |
| 754 // May not be respected by all window managers. | 755 // May not be respected by all window managers. |
| 755 gtk_window_set_urgency_hint(window_, TRUE); | 756 gtk_window_set_urgency_hint(window_, TRUE); |
| 756 } | 757 } |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1254 // Update all the UI bits. | 1255 // Update all the UI bits. |
| 1255 UpdateTitleBar(); | 1256 UpdateTitleBar(); |
| 1256 MaybeShowBookmarkBar(false); | 1257 MaybeShowBookmarkBar(false); |
| 1257 } | 1258 } |
| 1258 | 1259 |
| 1259 void BrowserWindowGtk::ActiveWindowChanged(GdkWindow* active_window) { | 1260 void BrowserWindowGtk::ActiveWindowChanged(GdkWindow* active_window) { |
| 1260 // Do nothing if we're in the process of closing the browser window. | 1261 // Do nothing if we're in the process of closing the browser window. |
| 1261 if (!window_) | 1262 if (!window_) |
| 1262 return; | 1263 return; |
| 1263 | 1264 |
| 1264 bool is_active = (GTK_WIDGET(window_)->window == active_window); | 1265 bool is_active = gtk_widget_get_window(GTK_WIDGET(window_)) == active_window; |
| 1265 bool changed = (is_active != is_active_); | 1266 bool changed = (is_active != is_active_); |
| 1266 | 1267 |
| 1267 if (is_active && changed) { | 1268 if (is_active && changed) { |
| 1268 // If there's an app modal dialog (e.g., JS alert), try to redirect | 1269 // If there's an app modal dialog (e.g., JS alert), try to redirect |
| 1269 // the user's attention to the window owning the dialog. | 1270 // the user's attention to the window owning the dialog. |
| 1270 if (AppModalDialogQueue::GetInstance()->HasActiveDialog()) { | 1271 if (AppModalDialogQueue::GetInstance()->HasActiveDialog()) { |
| 1271 AppModalDialogQueue::GetInstance()->ActivateModalDialog(); | 1272 AppModalDialogQueue::GetInstance()->ActivateModalDialog(); |
| 1272 return; | 1273 return; |
| 1273 } | 1274 } |
| 1274 } | 1275 } |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1550 gtk_floating_container_add_floating( | 1551 gtk_floating_container_add_floating( |
| 1551 GTK_FLOATING_CONTAINER(render_area_floating_container_), | 1552 GTK_FLOATING_CONTAINER(render_area_floating_container_), |
| 1552 findbar->widget()); | 1553 findbar->widget()); |
| 1553 } | 1554 } |
| 1554 | 1555 |
| 1555 void BrowserWindowGtk::ResetCustomFrameCursor() { | 1556 void BrowserWindowGtk::ResetCustomFrameCursor() { |
| 1556 if (!frame_cursor_) | 1557 if (!frame_cursor_) |
| 1557 return; | 1558 return; |
| 1558 | 1559 |
| 1559 frame_cursor_ = NULL; | 1560 frame_cursor_ = NULL; |
| 1560 gdk_window_set_cursor(GTK_WIDGET(window_)->window, NULL); | 1561 gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(window_)), NULL); |
| 1561 } | 1562 } |
| 1562 | 1563 |
| 1563 // static | 1564 // static |
| 1564 BrowserWindowGtk* BrowserWindowGtk::GetBrowserWindowForNativeWindow( | 1565 BrowserWindowGtk* BrowserWindowGtk::GetBrowserWindowForNativeWindow( |
| 1565 gfx::NativeWindow window) { | 1566 gfx::NativeWindow window) { |
| 1566 if (window) { | 1567 if (window) { |
| 1567 return static_cast<BrowserWindowGtk*>( | 1568 return static_cast<BrowserWindowGtk*>( |
| 1568 g_object_get_qdata(G_OBJECT(window), GetBrowserWindowQuarkKey())); | 1569 g_object_get_qdata(G_OBJECT(window), GetBrowserWindowQuarkKey())); |
| 1569 } | 1570 } |
| 1570 | 1571 |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1766 gtk_widget_show(bookmark_bar_->widget()); | 1767 gtk_widget_show(bookmark_bar_->widget()); |
| 1767 | 1768 |
| 1768 g_signal_connect_after(bookmark_bar_->widget(), "expose-event", | 1769 g_signal_connect_after(bookmark_bar_->widget(), "expose-event", |
| 1769 G_CALLBACK(OnBookmarkBarExposeThunk), this); | 1770 G_CALLBACK(OnBookmarkBarExposeThunk), this); |
| 1770 g_signal_connect(bookmark_bar_->widget(), "size-allocate", | 1771 g_signal_connect(bookmark_bar_->widget(), "size-allocate", |
| 1771 G_CALLBACK(OnBookmarkBarSizeAllocateThunk), this); | 1772 G_CALLBACK(OnBookmarkBarSizeAllocateThunk), this); |
| 1772 } | 1773 } |
| 1773 | 1774 |
| 1774 // We have to realize the window before we try to apply a window shape mask. | 1775 // We have to realize the window before we try to apply a window shape mask. |
| 1775 gtk_widget_realize(GTK_WIDGET(window_)); | 1776 gtk_widget_realize(GTK_WIDGET(window_)); |
| 1776 state_ = gdk_window_get_state(GTK_WIDGET(window_)->window); | 1777 state_ = gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(window_))); |
| 1777 // Note that calling this the first time is necessary to get the | 1778 // Note that calling this the first time is necessary to get the |
| 1778 // proper control layout. | 1779 // proper control layout. |
| 1779 UpdateCustomFrame(); | 1780 UpdateCustomFrame(); |
| 1780 | 1781 |
| 1781 // We have to call this after the first window is created, but after that only | 1782 // We have to call this after the first window is created, but after that only |
| 1782 // when the theme changes. | 1783 // when the theme changes. |
| 1783 static bool default_icon_set = false; | 1784 static bool default_icon_set = false; |
| 1784 if (!default_icon_set) { | 1785 if (!default_icon_set) { |
| 1785 gtk_util::SetDefaultWindowIcon(window_); | 1786 gtk_util::SetDefaultWindowIcon(window_); |
| 1786 default_icon_set = true; | 1787 default_icon_set = true; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1845 // The bottom two rects are mirror images of the top two rects. | 1846 // The bottom two rects are mirror images of the top two rects. |
| 1846 GdkRectangle bot_mid_rect = top_mid_rect; | 1847 GdkRectangle bot_mid_rect = top_mid_rect; |
| 1847 bot_mid_rect.y = height - 3; | 1848 bot_mid_rect.y = height - 3; |
| 1848 GdkRectangle bot_bot_rect = top_top_rect; | 1849 GdkRectangle bot_bot_rect = top_top_rect; |
| 1849 bot_bot_rect.y = height - 1; | 1850 bot_bot_rect.y = height - 1; |
| 1850 GdkRegion* mask = gdk_region_rectangle(&top_top_rect); | 1851 GdkRegion* mask = gdk_region_rectangle(&top_top_rect); |
| 1851 gdk_region_union_with_rect(mask, &top_mid_rect); | 1852 gdk_region_union_with_rect(mask, &top_mid_rect); |
| 1852 gdk_region_union_with_rect(mask, &mid_rect); | 1853 gdk_region_union_with_rect(mask, &mid_rect); |
| 1853 gdk_region_union_with_rect(mask, &bot_mid_rect); | 1854 gdk_region_union_with_rect(mask, &bot_mid_rect); |
| 1854 gdk_region_union_with_rect(mask, &bot_bot_rect); | 1855 gdk_region_union_with_rect(mask, &bot_bot_rect); |
| 1855 gdk_window_shape_combine_region(GTK_WIDGET(window_)->window, mask, 0, 0); | 1856 gdk_window_shape_combine_region(gtk_widget_get_window(GTK_WIDGET(window_)), |
| 1857 mask, 0, 0); |
| 1856 gdk_region_destroy(mask); | 1858 gdk_region_destroy(mask); |
| 1857 gtk_alignment_set_padding(GTK_ALIGNMENT(window_container_), 1, | 1859 gtk_alignment_set_padding(GTK_ALIGNMENT(window_container_), 1, |
| 1858 kFrameBorderThickness, kFrameBorderThickness, kFrameBorderThickness); | 1860 kFrameBorderThickness, kFrameBorderThickness, kFrameBorderThickness); |
| 1859 } else { | 1861 } else { |
| 1860 // XFCE disables the system decorations if there's an xshape set. | 1862 // XFCE disables the system decorations if there's an xshape set. |
| 1861 if (UseCustomFrame()) { | 1863 if (UseCustomFrame()) { |
| 1862 // Disable rounded corners. Simply passing in a NULL region doesn't | 1864 // Disable rounded corners. Simply passing in a NULL region doesn't |
| 1863 // seem to work on KWin, so manually set the shape to the whole window. | 1865 // seem to work on KWin, so manually set the shape to the whole window. |
| 1864 GdkRectangle rect = { 0, 0, width, height }; | 1866 GdkRectangle rect = { 0, 0, width, height }; |
| 1865 GdkRegion* mask = gdk_region_rectangle(&rect); | 1867 GdkRegion* mask = gdk_region_rectangle(&rect); |
| 1866 gdk_window_shape_combine_region(GTK_WIDGET(window_)->window, mask, 0, 0); | 1868 gdk_window_shape_combine_region( |
| 1869 gtk_widget_get_window(GTK_WIDGET(window_)), mask, 0, 0); |
| 1867 gdk_region_destroy(mask); | 1870 gdk_region_destroy(mask); |
| 1868 } else { | 1871 } else { |
| 1869 gdk_window_shape_combine_region(GTK_WIDGET(window_)->window, NULL, 0, 0); | 1872 gdk_window_shape_combine_region( |
| 1873 gtk_widget_get_window(GTK_WIDGET(window_)), NULL, 0, 0); |
| 1870 } | 1874 } |
| 1871 gtk_alignment_set_padding(GTK_ALIGNMENT(window_container_), 0, 0, 0, 0); | 1875 gtk_alignment_set_padding(GTK_ALIGNMENT(window_container_), 0, 0, 0, 0); |
| 1872 } | 1876 } |
| 1873 } | 1877 } |
| 1874 | 1878 |
| 1875 void BrowserWindowGtk::ConnectAccelerators() { | 1879 void BrowserWindowGtk::ConnectAccelerators() { |
| 1876 accel_group_ = gtk_accel_group_new(); | 1880 accel_group_ = gtk_accel_group_new(); |
| 1877 gtk_window_add_accel_group(window_, accel_group_); | 1881 gtk_window_add_accel_group(window_, accel_group_); |
| 1878 | 1882 |
| 1879 AcceleratorsGtk* accelerators = AcceleratorsGtk::GetInstance(); | 1883 AcceleratorsGtk* accelerators = AcceleratorsGtk::GetInstance(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1896 } | 1900 } |
| 1897 | 1901 |
| 1898 gfx::Size BrowserWindowGtk::GetNonClientFrameSize() const { | 1902 gfx::Size BrowserWindowGtk::GetNonClientFrameSize() const { |
| 1899 return gfx::Size(window_container_->allocation.width - | 1903 return gfx::Size(window_container_->allocation.width - |
| 1900 render_area_floating_container_->allocation.width, | 1904 render_area_floating_container_->allocation.width, |
| 1901 window_container_->allocation.height - | 1905 window_container_->allocation.height - |
| 1902 render_area_floating_container_->allocation.height); | 1906 render_area_floating_container_->allocation.height); |
| 1903 } | 1907 } |
| 1904 | 1908 |
| 1905 void BrowserWindowGtk::InvalidateWindow() { | 1909 void BrowserWindowGtk::InvalidateWindow() { |
| 1906 gdk_window_invalidate_rect(GTK_WIDGET(window_)->window, | 1910 gdk_window_invalidate_rect(gtk_widget_get_window(GTK_WIDGET(window_)), |
| 1907 >K_WIDGET(window_)->allocation, TRUE); | 1911 >K_WIDGET(window_)->allocation, TRUE); |
| 1908 } | 1912 } |
| 1909 | 1913 |
| 1910 void BrowserWindowGtk::SaveWindowPosition() { | 1914 void BrowserWindowGtk::SaveWindowPosition() { |
| 1911 // Browser::SaveWindowPlacement is used for session restore. | 1915 // Browser::SaveWindowPlacement is used for session restore. |
| 1912 ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL; | 1916 ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL; |
| 1913 if (IsMaximized()) | 1917 if (IsMaximized()) |
| 1914 show_state = ui::SHOW_STATE_MAXIMIZED; | 1918 show_state = ui::SHOW_STATE_MAXIMIZED; |
| 1915 else if (IsMinimized()) | 1919 else if (IsMinimized()) |
| 1916 show_state = ui::SHOW_STATE_MINIMIZED; | 1920 show_state = ui::SHOW_STATE_MINIMIZED; |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2051 | 2055 |
| 2052 // Prevents the default handler from handling this event. | 2056 // Prevents the default handler from handling this event. |
| 2053 return TRUE; | 2057 return TRUE; |
| 2054 } | 2058 } |
| 2055 | 2059 |
| 2056 gboolean BrowserWindowGtk::OnMouseMoveEvent(GtkWidget* widget, | 2060 gboolean BrowserWindowGtk::OnMouseMoveEvent(GtkWidget* widget, |
| 2057 GdkEventMotion* event) { | 2061 GdkEventMotion* event) { |
| 2058 // This method is used to update the mouse cursor when over the edge of the | 2062 // This method is used to update the mouse cursor when over the edge of the |
| 2059 // custom frame. If the custom frame is off or we're over some other widget, | 2063 // custom frame. If the custom frame is off or we're over some other widget, |
| 2060 // do nothing. | 2064 // do nothing. |
| 2061 if (!UseCustomFrame() || event->window != widget->window) { | 2065 if (!UseCustomFrame() || event->window != gtk_widget_get_window(widget)) { |
| 2062 // Reset the cursor. | 2066 // Reset the cursor. |
| 2063 if (frame_cursor_) { | 2067 if (frame_cursor_) { |
| 2064 frame_cursor_ = NULL; | 2068 frame_cursor_ = NULL; |
| 2065 gdk_window_set_cursor(GTK_WIDGET(window_)->window, NULL); | 2069 gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(window_)), NULL); |
| 2066 } | 2070 } |
| 2067 return FALSE; | 2071 return FALSE; |
| 2068 } | 2072 } |
| 2069 | 2073 |
| 2070 // Update the cursor if we're on the custom frame border. | 2074 // Update the cursor if we're on the custom frame border. |
| 2071 GdkWindowEdge edge; | 2075 GdkWindowEdge edge; |
| 2072 bool has_hit_edge = GetWindowEdge(static_cast<int>(event->x), | 2076 bool has_hit_edge = GetWindowEdge(static_cast<int>(event->x), |
| 2073 static_cast<int>(event->y), &edge); | 2077 static_cast<int>(event->y), &edge); |
| 2074 GdkCursorType new_cursor = GDK_LAST_CURSOR; | 2078 GdkCursorType new_cursor = GDK_LAST_CURSOR; |
| 2075 if (has_hit_edge) | 2079 if (has_hit_edge) |
| 2076 new_cursor = GdkWindowEdgeToGdkCursorType(edge); | 2080 new_cursor = GdkWindowEdgeToGdkCursorType(edge); |
| 2077 | 2081 |
| 2078 GdkCursorType last_cursor = GDK_LAST_CURSOR; | 2082 GdkCursorType last_cursor = GDK_LAST_CURSOR; |
| 2079 if (frame_cursor_) | 2083 if (frame_cursor_) |
| 2080 last_cursor = frame_cursor_->type; | 2084 last_cursor = frame_cursor_->type; |
| 2081 | 2085 |
| 2082 if (last_cursor != new_cursor) { | 2086 if (last_cursor != new_cursor) { |
| 2083 if (has_hit_edge) { | 2087 if (has_hit_edge) { |
| 2084 frame_cursor_ = gfx::GetCursor(new_cursor); | 2088 frame_cursor_ = gfx::GetCursor(new_cursor); |
| 2085 } else { | 2089 } else { |
| 2086 frame_cursor_ = NULL; | 2090 frame_cursor_ = NULL; |
| 2087 } | 2091 } |
| 2088 gdk_window_set_cursor(GTK_WIDGET(window_)->window, frame_cursor_); | 2092 gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(window_)), |
| 2093 frame_cursor_); |
| 2089 } | 2094 } |
| 2090 return FALSE; | 2095 return FALSE; |
| 2091 } | 2096 } |
| 2092 | 2097 |
| 2093 gboolean BrowserWindowGtk::OnButtonPressEvent(GtkWidget* widget, | 2098 gboolean BrowserWindowGtk::OnButtonPressEvent(GtkWidget* widget, |
| 2094 GdkEventButton* event) { | 2099 GdkEventButton* event) { |
| 2095 // Handle back/forward. | 2100 // Handle back/forward. |
| 2096 if (event->type == GDK_BUTTON_PRESS) { | 2101 if (event->type == GDK_BUTTON_PRESS) { |
| 2097 if (event->button == 8) { | 2102 if (event->button == 8) { |
| 2098 browser_->GoBack(CURRENT_TAB); | 2103 browser_->GoBack(CURRENT_TAB); |
| 2099 return TRUE; | 2104 return TRUE; |
| 2100 } else if (event->button == 9) { | 2105 } else if (event->button == 9) { |
| 2101 browser_->GoForward(CURRENT_TAB); | 2106 browser_->GoForward(CURRENT_TAB); |
| 2102 return TRUE; | 2107 return TRUE; |
| 2103 } | 2108 } |
| 2104 } | 2109 } |
| 2105 | 2110 |
| 2106 // Handle left, middle and right clicks. In particular, we care about clicks | 2111 // Handle left, middle and right clicks. In particular, we care about clicks |
| 2107 // in the custom frame border and clicks in the titlebar. | 2112 // in the custom frame border and clicks in the titlebar. |
| 2108 | 2113 |
| 2109 // Make the button press coordinate relative to the browser window. | 2114 // Make the button press coordinate relative to the browser window. |
| 2110 int win_x, win_y; | 2115 int win_x, win_y; |
| 2111 gdk_window_get_origin(GTK_WIDGET(window_)->window, &win_x, &win_y); | 2116 GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET(window_)); |
| 2117 gdk_window_get_origin(gdk_window, &win_x, &win_y); |
| 2112 | 2118 |
| 2113 GdkWindowEdge edge; | 2119 GdkWindowEdge edge; |
| 2114 gfx::Point point(static_cast<int>(event->x_root - win_x), | 2120 gfx::Point point(static_cast<int>(event->x_root - win_x), |
| 2115 static_cast<int>(event->y_root - win_y)); | 2121 static_cast<int>(event->y_root - win_y)); |
| 2116 bool has_hit_edge = GetWindowEdge(point.x(), point.y(), &edge); | 2122 bool has_hit_edge = GetWindowEdge(point.x(), point.y(), &edge); |
| 2117 | 2123 |
| 2118 // Ignore clicks that are in/below the browser toolbar. | 2124 // Ignore clicks that are in/below the browser toolbar. |
| 2119 GtkWidget* toolbar = toolbar_->widget(); | 2125 GtkWidget* toolbar = toolbar_->widget(); |
| 2120 if (!gtk_widget_get_visible(toolbar)) { | 2126 if (!gtk_widget_get_visible(toolbar)) { |
| 2121 // If the toolbar is not showing, use the location of web contents as the | 2127 // If the toolbar is not showing, use the location of web contents as the |
| 2122 // boundary of where to ignore clicks. | 2128 // boundary of where to ignore clicks. |
| 2123 toolbar = render_area_vbox_; | 2129 toolbar = render_area_vbox_; |
| 2124 } | 2130 } |
| 2125 gint toolbar_y; | 2131 gint toolbar_y; |
| 2126 gtk_widget_get_pointer(toolbar, NULL, &toolbar_y); | 2132 gtk_widget_get_pointer(toolbar, NULL, &toolbar_y); |
| 2127 bool has_hit_titlebar = !IsFullscreen() && (toolbar_y < 0) | 2133 bool has_hit_titlebar = !IsFullscreen() && (toolbar_y < 0) |
| 2128 && !has_hit_edge; | 2134 && !has_hit_edge; |
| 2129 if (event->button == 1) { | 2135 if (event->button == 1) { |
| 2130 if (GDK_BUTTON_PRESS == event->type) { | 2136 if (GDK_BUTTON_PRESS == event->type) { |
| 2131 guint32 last_click_time = last_click_time_; | 2137 guint32 last_click_time = last_click_time_; |
| 2132 gfx::Point last_click_position = last_click_position_; | 2138 gfx::Point last_click_position = last_click_position_; |
| 2133 last_click_time_ = event->time; | 2139 last_click_time_ = event->time; |
| 2134 last_click_position_ = gfx::Point(static_cast<int>(event->x), | 2140 last_click_position_ = gfx::Point(static_cast<int>(event->x), |
| 2135 static_cast<int>(event->y)); | 2141 static_cast<int>(event->y)); |
| 2136 | 2142 |
| 2137 // Raise the window after a click on either the titlebar or the border to | 2143 // Raise the window after a click on either the titlebar or the border to |
| 2138 // match the behavior of most window managers, unless that behavior has | 2144 // match the behavior of most window managers, unless that behavior has |
| 2139 // been suppressed. | 2145 // been suppressed. |
| 2140 if ((has_hit_titlebar || has_hit_edge) && !suppress_window_raise_) | 2146 if ((has_hit_titlebar || has_hit_edge) && !suppress_window_raise_) |
| 2141 gdk_window_raise(GTK_WIDGET(window_)->window); | 2147 gdk_window_raise(gdk_window); |
| 2142 | 2148 |
| 2143 if (has_hit_titlebar) { | 2149 if (has_hit_titlebar) { |
| 2144 return HandleTitleBarLeftMousePress( | 2150 return HandleTitleBarLeftMousePress( |
| 2145 event, last_click_time, last_click_position); | 2151 event, last_click_time, last_click_position); |
| 2146 } else if (has_hit_edge) { | 2152 } else if (has_hit_edge) { |
| 2147 gtk_window_begin_resize_drag(window_, edge, event->button, | 2153 gtk_window_begin_resize_drag(window_, edge, event->button, |
| 2148 static_cast<gint>(event->x_root), | 2154 static_cast<gint>(event->x_root), |
| 2149 static_cast<gint>(event->y_root), | 2155 static_cast<gint>(event->y_root), |
| 2150 event->time); | 2156 event->time); |
| 2151 return TRUE; | 2157 return TRUE; |
| 2152 } | 2158 } |
| 2153 } else if (GDK_2BUTTON_PRESS == event->type) { | 2159 } else if (GDK_2BUTTON_PRESS == event->type) { |
| 2154 if (has_hit_titlebar) { | 2160 if (has_hit_titlebar) { |
| 2155 // Maximize/restore on double click. | 2161 // Maximize/restore on double click. |
| 2156 if (IsMaximized()) { | 2162 if (IsMaximized()) { |
| 2157 UnMaximize(); | 2163 UnMaximize(); |
| 2158 } else { | 2164 } else { |
| 2159 gtk_window_maximize(window_); | 2165 gtk_window_maximize(window_); |
| 2160 } | 2166 } |
| 2161 return TRUE; | 2167 return TRUE; |
| 2162 } | 2168 } |
| 2163 } | 2169 } |
| 2164 } else if (event->button == 2) { | 2170 } else if (event->button == 2) { |
| 2165 if (has_hit_titlebar || has_hit_edge) { | 2171 if (has_hit_titlebar || has_hit_edge) { |
| 2166 gdk_window_lower(GTK_WIDGET(window_)->window); | 2172 gdk_window_lower(gdk_window); |
| 2167 } | 2173 } |
| 2168 return TRUE; | 2174 return TRUE; |
| 2169 } else if (event->button == 3) { | 2175 } else if (event->button == 3) { |
| 2170 if (has_hit_titlebar) { | 2176 if (has_hit_titlebar) { |
| 2171 titlebar_->ShowContextMenu(event); | 2177 titlebar_->ShowContextMenu(event); |
| 2172 return TRUE; | 2178 return TRUE; |
| 2173 } | 2179 } |
| 2174 } | 2180 } |
| 2175 | 2181 |
| 2176 return FALSE; // Continue to propagate the event. | 2182 return FALSE; // Continue to propagate the event. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2234 return FALSE; | 2240 return FALSE; |
| 2235 } | 2241 } |
| 2236 | 2242 |
| 2237 void BrowserWindowGtk::ShowSupportedWindowFeatures() { | 2243 void BrowserWindowGtk::ShowSupportedWindowFeatures() { |
| 2238 if (IsTabStripSupported()) | 2244 if (IsTabStripSupported()) |
| 2239 tabstrip_->Show(); | 2245 tabstrip_->Show(); |
| 2240 | 2246 |
| 2241 if (IsToolbarSupported()) { | 2247 if (IsToolbarSupported()) { |
| 2242 toolbar_->Show(); | 2248 toolbar_->Show(); |
| 2243 gtk_widget_show(toolbar_border_); | 2249 gtk_widget_show(toolbar_border_); |
| 2244 gdk_window_lower(toolbar_border_->window); | 2250 gdk_window_lower(gtk_widget_get_window(toolbar_border_)); |
| 2245 } | 2251 } |
| 2246 | 2252 |
| 2247 if (IsBookmarkBarSupported()) | 2253 if (IsBookmarkBarSupported()) |
| 2248 MaybeShowBookmarkBar(false); | 2254 MaybeShowBookmarkBar(false); |
| 2249 } | 2255 } |
| 2250 | 2256 |
| 2251 void BrowserWindowGtk::HideUnsupportedWindowFeatures() { | 2257 void BrowserWindowGtk::HideUnsupportedWindowFeatures() { |
| 2252 if (!IsTabStripSupported()) | 2258 if (!IsTabStripSupported()) |
| 2253 tabstrip_->Hide(); | 2259 tabstrip_->Hide(); |
| 2254 | 2260 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2337 | 2343 |
| 2338 bool BrowserWindowGtk::UseCustomFrame() { | 2344 bool BrowserWindowGtk::UseCustomFrame() { |
| 2339 // We don't use the custom frame for app mode windows or app window popups. | 2345 // We don't use the custom frame for app mode windows or app window popups. |
| 2340 return use_custom_frame_pref_.GetValue() && !browser_->is_app(); | 2346 return use_custom_frame_pref_.GetValue() && !browser_->is_app(); |
| 2341 } | 2347 } |
| 2342 | 2348 |
| 2343 bool BrowserWindowGtk::BoundsMatchMonitorSize() { | 2349 bool BrowserWindowGtk::BoundsMatchMonitorSize() { |
| 2344 // A screen can be composed of multiple monitors. | 2350 // A screen can be composed of multiple monitors. |
| 2345 GdkScreen* screen = gtk_window_get_screen(window_); | 2351 GdkScreen* screen = gtk_window_get_screen(window_); |
| 2346 gint monitor_num = gdk_screen_get_monitor_at_window(screen, | 2352 gint monitor_num = gdk_screen_get_monitor_at_window(screen, |
| 2347 GTK_WIDGET(window_)->window); | 2353 gtk_widget_get_window(GTK_WIDGET(window_))); |
| 2348 | 2354 |
| 2349 GdkRectangle monitor_size; | 2355 GdkRectangle monitor_size; |
| 2350 gdk_screen_get_monitor_geometry(screen, monitor_num, &monitor_size); | 2356 gdk_screen_get_monitor_geometry(screen, monitor_num, &monitor_size); |
| 2351 return bounds_.size() == gfx::Size(monitor_size.width, monitor_size.height); | 2357 return bounds_.size() == gfx::Size(monitor_size.width, monitor_size.height); |
| 2352 } | 2358 } |
| 2353 | 2359 |
| 2354 void BrowserWindowGtk::PlaceBookmarkBar(bool is_floating) { | 2360 void BrowserWindowGtk::PlaceBookmarkBar(bool is_floating) { |
| 2355 GtkWidget* target_parent = NULL; | 2361 GtkWidget* target_parent = NULL; |
| 2356 if (!is_floating) { | 2362 if (!is_floating) { |
| 2357 // Place the bookmark bar at the end of |window_vbox_|; this happens after | 2363 // Place the bookmark bar at the end of |window_vbox_|; this happens after |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2406 wm_type == ui::WM_OPENBOX || | 2412 wm_type == ui::WM_OPENBOX || |
| 2407 wm_type == ui::WM_XFWM4); | 2413 wm_type == ui::WM_XFWM4); |
| 2408 } | 2414 } |
| 2409 | 2415 |
| 2410 // static | 2416 // static |
| 2411 BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) { | 2417 BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) { |
| 2412 BrowserWindowGtk* browser_window_gtk = new BrowserWindowGtk(browser); | 2418 BrowserWindowGtk* browser_window_gtk = new BrowserWindowGtk(browser); |
| 2413 browser_window_gtk->Init(); | 2419 browser_window_gtk->Init(); |
| 2414 return browser_window_gtk; | 2420 return browser_window_gtk; |
| 2415 } | 2421 } |
| OLD | NEW |