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/browser_window_gtk.h" | 5 #include "chrome/browser/gtk/browser_window_gtk.h" |
6 | 6 |
7 #include <gdk/gdkkeysyms.h> | 7 #include <gdk/gdkkeysyms.h> |
8 #include <X11/XF86keysym.h> | 8 #include <X11/XF86keysym.h> |
9 | 9 |
10 #include <string> | 10 #include <string> |
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 DrawContentShadow(cr, window); | 596 DrawContentShadow(cr, window); |
597 | 597 |
598 cairo_destroy(cr); | 598 cairo_destroy(cr); |
599 | 599 |
600 if (window->UseCustomFrame() && !window->IsMaximized()) { | 600 if (window->UseCustomFrame() && !window->IsMaximized()) { |
601 static NineBox custom_frame_border( | 601 static NineBox custom_frame_border( |
602 IDR_WINDOW_TOP_LEFT_CORNER, | 602 IDR_WINDOW_TOP_LEFT_CORNER, |
603 IDR_WINDOW_TOP_CENTER, | 603 IDR_WINDOW_TOP_CENTER, |
604 IDR_WINDOW_TOP_RIGHT_CORNER, | 604 IDR_WINDOW_TOP_RIGHT_CORNER, |
605 IDR_WINDOW_LEFT_SIDE, | 605 IDR_WINDOW_LEFT_SIDE, |
606 0, | 606 NULL, |
607 IDR_WINDOW_RIGHT_SIDE, | 607 IDR_WINDOW_RIGHT_SIDE, |
608 IDR_WINDOW_BOTTOM_LEFT_CORNER, | 608 IDR_WINDOW_BOTTOM_LEFT_CORNER, |
609 IDR_WINDOW_BOTTOM_CENTER, | 609 IDR_WINDOW_BOTTOM_CENTER, |
610 IDR_WINDOW_BOTTOM_RIGHT_CORNER); | 610 IDR_WINDOW_BOTTOM_RIGHT_CORNER); |
611 | 611 |
612 custom_frame_border.RenderToWidget(widget); | 612 custom_frame_border.RenderToWidget(widget); |
613 } | 613 } |
614 | 614 |
615 return FALSE; // Allow subwidgets to paint. | 615 return FALSE; // Allow subwidgets to paint. |
616 } | 616 } |
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1818 } | 1818 } |
1819 | 1819 |
1820 // Handle left, middle and right clicks. In particular, we care about clicks | 1820 // Handle left, middle and right clicks. In particular, we care about clicks |
1821 // in the custom frame border and clicks in the titlebar. | 1821 // in the custom frame border and clicks in the titlebar. |
1822 | 1822 |
1823 // Make the button press coordinate relative to the browser window. | 1823 // Make the button press coordinate relative to the browser window. |
1824 int win_x, win_y; | 1824 int win_x, win_y; |
1825 gdk_window_get_origin(GTK_WIDGET(browser->window_)->window, &win_x, &win_y); | 1825 gdk_window_get_origin(GTK_WIDGET(browser->window_)->window, &win_x, &win_y); |
1826 | 1826 |
1827 GdkWindowEdge edge; | 1827 GdkWindowEdge edge; |
1828 gfx::Point point(static_cast<int>(event->x_root - win_x), | 1828 gfx::Point point(event->x_root - win_x, event->y_root - win_y); |
1829 static_cast<int>( event->y_root - win_y)); | |
1830 bool has_hit_edge = browser->GetWindowEdge(point.x(), point.y(), &edge); | 1829 bool has_hit_edge = browser->GetWindowEdge(point.x(), point.y(), &edge); |
1831 | 1830 |
1832 // Ignore clicks that are in/below the browser toolbar. | 1831 // Ignore clicks that are in/below the browser toolbar. |
1833 GtkWidget* toolbar = browser->toolbar_->widget(); | 1832 GtkWidget* toolbar = browser->toolbar_->widget(); |
1834 if (!GTK_WIDGET_VISIBLE(toolbar)) { | 1833 if (!GTK_WIDGET_VISIBLE(toolbar)) { |
1835 // If the toolbar is not showing, use the location of web contents as the | 1834 // If the toolbar is not showing, use the location of web contents as the |
1836 // boundary of where to ignore clicks. | 1835 // boundary of where to ignore clicks. |
1837 toolbar = browser->render_area_vbox_; | 1836 toolbar = browser->render_area_vbox_; |
1838 } | 1837 } |
1839 gint toolbar_y; | 1838 gint toolbar_y; |
1840 gtk_widget_get_pointer(toolbar, NULL, &toolbar_y); | 1839 gtk_widget_get_pointer(toolbar, NULL, &toolbar_y); |
1841 bool has_hit_titlebar = !browser->IsFullscreen() && (toolbar_y < 0) | 1840 bool has_hit_titlebar = !browser->IsFullscreen() && (toolbar_y < 0) |
1842 && !has_hit_edge; | 1841 && !has_hit_edge; |
1843 if (event->button == 1) { | 1842 if (event->button == 1) { |
1844 if (GDK_BUTTON_PRESS == event->type) { | 1843 if (GDK_BUTTON_PRESS == event->type) { |
1845 guint32 last_click_time = browser->last_click_time_; | 1844 guint32 last_click_time = browser->last_click_time_; |
1846 gfx::Point last_click_position = browser->last_click_position_; | 1845 gfx::Point last_click_position = browser->last_click_position_; |
1847 browser->last_click_time_ = event->time; | 1846 browser->last_click_time_ = event->time; |
1848 browser->last_click_position_ = gfx::Point(static_cast<int>(event->x), | 1847 browser->last_click_position_ = gfx::Point(event->x, event->y); |
1849 static_cast<int>(event->y)); | |
1850 | 1848 |
1851 if (has_hit_titlebar) { | 1849 if (has_hit_titlebar) { |
1852 // We want to start a move when the user single clicks, but not start a | 1850 // We want to start a move when the user single clicks, but not start a |
1853 // move when the user double clicks. However, a double click sends the | 1851 // move when the user double clicks. However, a double click sends the |
1854 // following GDK events: GDK_BUTTON_PRESS, GDK_BUTTON_RELEASE, | 1852 // following GDK events: GDK_BUTTON_PRESS, GDK_BUTTON_RELEASE, |
1855 // GDK_BUTTON_PRESS, GDK_2BUTTON_PRESS, GDK_BUTTON_RELEASE. If we | 1853 // GDK_BUTTON_PRESS, GDK_2BUTTON_PRESS, GDK_BUTTON_RELEASE. If we |
1856 // start a gtk_window_begin_move_drag on the second GDK_BUTTON_PRESS, | 1854 // start a gtk_window_begin_move_drag on the second GDK_BUTTON_PRESS, |
1857 // the call to gtk_window_maximize fails. To work around this, we | 1855 // the call to gtk_window_maximize fails. To work around this, we |
1858 // keep track of the last click and if it's going to be a double click, | 1856 // keep track of the last click and if it's going to be a double click, |
1859 // we don't call gtk_window_begin_move_drag. | 1857 // we don't call gtk_window_begin_move_drag. |
1860 static GtkSettings* settings = gtk_settings_get_default(); | 1858 static GtkSettings* settings = gtk_settings_get_default(); |
1861 gint double_click_time = 250; | 1859 gint double_click_time = 250; |
1862 gint double_click_distance = 5; | 1860 gint double_click_distance = 5; |
1863 g_object_get(G_OBJECT(settings), | 1861 g_object_get(G_OBJECT(settings), |
1864 "gtk-double-click-time", &double_click_time, | 1862 "gtk-double-click-time", &double_click_time, |
1865 "gtk-double-click-distance", &double_click_distance, | 1863 "gtk-double-click-distance", &double_click_distance, |
1866 NULL); | 1864 NULL); |
1867 | 1865 |
1868 guint32 click_time = event->time - last_click_time; | 1866 guint32 click_time = event->time - last_click_time; |
1869 int click_move_x = static_cast<int>(event->x - last_click_position.x()); | 1867 int click_move_x = event->x - last_click_position.x(); |
1870 int click_move_y = static_cast<int>(event->y - last_click_position.y()); | 1868 int click_move_y = event->y - last_click_position.y(); |
1871 | 1869 |
1872 if (click_time > static_cast<guint32>(double_click_time) || | 1870 if (click_time > static_cast<guint32>(double_click_time) || |
1873 click_move_x > double_click_distance || | 1871 click_move_x > double_click_distance || |
1874 click_move_y > double_click_distance) { | 1872 click_move_y > double_click_distance) { |
1875 gtk_window_begin_move_drag(browser->window_, event->button, | 1873 gtk_window_begin_move_drag(browser->window_, event->button, |
1876 static_cast<gint>(event->x_root), | 1874 event->x_root, event->y_root, event->time); |
1877 static_cast<gint>(event->y_root), | |
1878 event->time); | |
1879 return TRUE; | 1875 return TRUE; |
1880 } | 1876 } |
1881 } else if (has_hit_edge) { | 1877 } else if (has_hit_edge) { |
1882 gtk_window_begin_resize_drag(browser->window_, edge, event->button, | 1878 gtk_window_begin_resize_drag(browser->window_, edge, event->button, |
1883 static_cast<gint>(event->x_root), | 1879 event->x_root, event->y_root, event->time); |
1884 static_cast<gint>(event->y_root), | |
1885 event->time); | |
1886 return TRUE; | 1880 return TRUE; |
1887 } | 1881 } |
1888 } else if (GDK_2BUTTON_PRESS == event->type) { | 1882 } else if (GDK_2BUTTON_PRESS == event->type) { |
1889 if (has_hit_titlebar) { | 1883 if (has_hit_titlebar) { |
1890 // Maximize/restore on double click. | 1884 // Maximize/restore on double click. |
1891 if (browser->IsMaximized()) { | 1885 if (browser->IsMaximized()) { |
1892 gtk_window_unmaximize(browser->window_); | 1886 gtk_window_unmaximize(browser->window_); |
1893 } else { | 1887 } else { |
1894 gtk_window_maximize(browser->window_); | 1888 gtk_window_maximize(browser->window_); |
1895 } | 1889 } |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2090 // special-case the ones where the custom frame should be used. These names | 2084 // special-case the ones where the custom frame should be used. These names |
2091 // are taken from the WMs' source code. | 2085 // are taken from the WMs' source code. |
2092 return (wm_name == "Blackbox" || | 2086 return (wm_name == "Blackbox" || |
2093 wm_name == "compiz" || | 2087 wm_name == "compiz" || |
2094 wm_name == "e16" || // Enlightenment DR16 | 2088 wm_name == "e16" || // Enlightenment DR16 |
2095 wm_name == "KWin" || | 2089 wm_name == "KWin" || |
2096 wm_name == "Metacity" || | 2090 wm_name == "Metacity" || |
2097 wm_name == "Openbox" || | 2091 wm_name == "Openbox" || |
2098 wm_name == "Xfwm4"); | 2092 wm_name == "Xfwm4"); |
2099 } | 2093 } |
OLD | NEW |