Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(360)

Side by Side Diff: views/widget/native_widget_gtk.cc

Issue 7942004: Consolidate/cleanup event cracking code; single out GdkEvents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge removal of compact nav. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « views/views.gyp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "views/widget/native_widget_gtk.h" 5 #include "views/widget/native_widget_gtk.h"
6 6
7 #include <gdk/gdk.h> 7 #include <gdk/gdk.h>
8 #include <gdk/gdkx.h> 8 #include <gdk/gdkx.h>
9 #include <X11/extensions/shape.h> 9 #include <X11/extensions/shape.h>
10 #include <X11/Xatom.h> 10 #include <X11/Xatom.h>
(...skipping 24 matching lines...) Expand all
35 #include "views/views_delegate.h" 35 #include "views/views_delegate.h"
36 #include "views/widget/drop_target_gtk.h" 36 #include "views/widget/drop_target_gtk.h"
37 #include "views/widget/gtk_views_fixed.h" 37 #include "views/widget/gtk_views_fixed.h"
38 #include "views/widget/gtk_views_window.h" 38 #include "views/widget/gtk_views_window.h"
39 #include "views/widget/native_widget_views.h" 39 #include "views/widget/native_widget_views.h"
40 #include "views/widget/root_view.h" 40 #include "views/widget/root_view.h"
41 #include "views/widget/widget_delegate.h" 41 #include "views/widget/widget_delegate.h"
42 #include "views/window/hit_test.h" 42 #include "views/window/hit_test.h"
43 43
44 #if defined(TOUCH_UI) 44 #if defined(TOUCH_UI)
45 #include "ui/base/touch/touch_factory.h"
45 #include "views/widget/tooltip_manager_views.h" 46 #include "views/widget/tooltip_manager_views.h"
46 #include "views/touchui/touch_factory.h"
47 #else 47 #else
48 #include "views/widget/tooltip_manager_gtk.h" 48 #include "views/widget/tooltip_manager_gtk.h"
49 #endif 49 #endif
50 50
51 #if defined(HAVE_IBUS) 51 #if defined(HAVE_IBUS)
52 #include "views/ime/input_method_ibus.h" 52 #include "views/ime/input_method_ibus.h"
53 #endif 53 #endif
54 54
55 using ui::OSExchangeData; 55 using ui::OSExchangeData;
56 using ui::OSExchangeDataProviderGtk; 56 using ui::OSExchangeDataProviderGtk;
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 should_handle_menu_key_release_(false), 373 should_handle_menu_key_release_(false),
374 dragged_view_(NULL), 374 dragged_view_(NULL),
375 painted_(false), 375 painted_(false),
376 has_pointer_grab_(false), 376 has_pointer_grab_(false),
377 has_keyboard_grab_(false), 377 has_keyboard_grab_(false),
378 grab_notify_signal_id_(0), 378 grab_notify_signal_id_(0),
379 is_menu_(false) { 379 is_menu_(false) {
380 #if defined(TOUCH_UI) 380 #if defined(TOUCH_UI)
381 // Make sure the touch factory is initialized so that it can setup XInput2 for 381 // Make sure the touch factory is initialized so that it can setup XInput2 for
382 // the widget. 382 // the widget.
383 TouchFactory::GetInstance(); 383 ui::TouchFactory::GetInstance();
384 #endif 384 #endif
385 static bool installed_message_loop_observer = false; 385 static bool installed_message_loop_observer = false;
386 if (!installed_message_loop_observer) { 386 if (!installed_message_loop_observer) {
387 installed_message_loop_observer = true; 387 installed_message_loop_observer = true;
388 MessageLoopForUI* loop = MessageLoopForUI::current(); 388 MessageLoopForUI* loop = MessageLoopForUI::current();
389 if (loop) 389 if (loop)
390 loop->AddObserver(DropObserver::GetInstance()); 390 loop->AddObserver(DropObserver::GetInstance());
391 } 391 }
392 } 392 }
393 393
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after
919 NULL, NULL, GDK_CURRENT_TIME); 919 NULL, NULL, GDK_CURRENT_TIME);
920 // NOTE: technically grab may fail. We may want to try and continue on in 920 // NOTE: technically grab may fail. We may want to try and continue on in
921 // that case. 921 // that case.
922 DCHECK_EQ(GDK_GRAB_SUCCESS, pointer_grab_status); 922 DCHECK_EQ(GDK_GRAB_SUCCESS, pointer_grab_status);
923 has_pointer_grab_ = pointer_grab_status == GDK_GRAB_SUCCESS; 923 has_pointer_grab_ = pointer_grab_status == GDK_GRAB_SUCCESS;
924 924
925 #if defined(TOUCH_UI) 925 #if defined(TOUCH_UI)
926 ::Window window = GDK_WINDOW_XID(window_contents()->window); 926 ::Window window = GDK_WINDOW_XID(window_contents()->window);
927 Display* display = GDK_WINDOW_XDISPLAY(window_contents()->window); 927 Display* display = GDK_WINDOW_XDISPLAY(window_contents()->window);
928 bool xi2grab = 928 bool xi2grab =
929 TouchFactory::GetInstance()->GrabTouchDevices(display, window); 929 ui::TouchFactory::GetInstance()->GrabTouchDevices(display, window);
930 // xi2grab should always succeed if has_pointer_grab_ succeeded. 930 // xi2grab should always succeed if has_pointer_grab_ succeeded.
931 DCHECK(xi2grab); 931 DCHECK(xi2grab);
932 has_pointer_grab_ = has_pointer_grab_ && xi2grab; 932 has_pointer_grab_ = has_pointer_grab_ && xi2grab;
933 #endif 933 #endif
934 } 934 }
935 } 935 }
936 936
937 void NativeWidgetGtk::ReleaseMouseCapture() { 937 void NativeWidgetGtk::ReleaseMouseCapture() {
938 bool delegate_lost_capture = HasMouseCapture(); 938 bool delegate_lost_capture = HasMouseCapture();
939 if (GTK_WIDGET_HAS_GRAB(window_contents_)) 939 if (GTK_WIDGET_HAS_GRAB(window_contents_))
940 gtk_grab_remove(window_contents_); 940 gtk_grab_remove(window_contents_);
941 if (grab_notify_signal_id_) { 941 if (grab_notify_signal_id_) {
942 g_signal_handler_disconnect(window_contents_, grab_notify_signal_id_); 942 g_signal_handler_disconnect(window_contents_, grab_notify_signal_id_);
943 grab_notify_signal_id_ = 0; 943 grab_notify_signal_id_ = 0;
944 } 944 }
945 if (has_pointer_grab_) { 945 if (has_pointer_grab_) {
946 has_pointer_grab_ = false; 946 has_pointer_grab_ = false;
947 gdk_pointer_ungrab(GDK_CURRENT_TIME); 947 gdk_pointer_ungrab(GDK_CURRENT_TIME);
948 #if defined(TOUCH_UI) 948 #if defined(TOUCH_UI)
949 TouchFactory::GetInstance()->UngrabTouchDevices( 949 ui::TouchFactory::GetInstance()->UngrabTouchDevices(
950 GDK_WINDOW_XDISPLAY(window_contents()->window)); 950 GDK_WINDOW_XDISPLAY(window_contents()->window));
951 #endif 951 #endif
952 } 952 }
953 if (delegate_lost_capture) 953 if (delegate_lost_capture)
954 delegate_->OnMouseCaptureLost(); 954 delegate_->OnMouseCaptureLost();
955 } 955 }
956 956
957 bool NativeWidgetGtk::HasMouseCapture() const { 957 bool NativeWidgetGtk::HasMouseCapture() const {
958 return GTK_WIDGET_HAS_GRAB(window_contents_) || has_pointer_grab_; 958 return GTK_WIDGET_HAS_GRAB(window_contents_) || has_pointer_grab_;
959 } 959 }
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
1303 // 3) If it's never painted before. The first expose event will 1303 // 3) If it's never painted before. The first expose event will
1304 // paint the area that has to be painted. 1304 // paint the area that has to be painted.
1305 if (widget_ && GTK_WIDGET_DRAWABLE(widget_) && painted_) { 1305 if (widget_ && GTK_WIDGET_DRAWABLE(widget_) && painted_) {
1306 gtk_widget_queue_draw_area(widget_, rect.x(), rect.y(), rect.width(), 1306 gtk_widget_queue_draw_area(widget_, rect.x(), rect.y(), rect.width(),
1307 rect.height()); 1307 rect.height());
1308 } 1308 }
1309 } 1309 }
1310 1310
1311 void NativeWidgetGtk::SetCursor(gfx::NativeCursor cursor) { 1311 void NativeWidgetGtk::SetCursor(gfx::NativeCursor cursor) {
1312 #if defined(TOUCH_UI) 1312 #if defined(TOUCH_UI)
1313 if (TouchFactory::GetInstance()->keep_mouse_cursor()) 1313 if (ui::TouchFactory::GetInstance()->keep_mouse_cursor())
1314 cursor = gfx::GetCursor(GDK_ARROW); 1314 cursor = gfx::GetCursor(GDK_ARROW);
1315 else if (!TouchFactory::GetInstance()->is_cursor_visible()) 1315 else if (!ui::TouchFactory::GetInstance()->is_cursor_visible())
1316 cursor = gfx::GetCursor(GDK_BLANK_CURSOR); 1316 cursor = gfx::GetCursor(GDK_BLANK_CURSOR);
1317 #endif 1317 #endif
1318 // |window_contents_| is placed on top of |widget_|. So the cursor needs to be 1318 // |window_contents_| is placed on top of |widget_|. So the cursor needs to be
1319 // set on |window_contents_| instead of |widget_|. 1319 // set on |window_contents_| instead of |widget_|.
1320 if (window_contents_) 1320 if (window_contents_)
1321 gdk_window_set_cursor(window_contents_->window, cursor); 1321 gdk_window_set_cursor(window_contents_->window, cursor);
1322 } 1322 }
1323 1323
1324 void NativeWidgetGtk::ClearNativeFocus() { 1324 void NativeWidgetGtk::ClearNativeFocus() {
1325 DCHECK(!child_); 1325 DCHECK(!child_);
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
1687 return false; 1687 return false;
1688 1688
1689 // Only top-level Widget should have an InputMethod instance. 1689 // Only top-level Widget should have an InputMethod instance.
1690 InputMethod* input_method = GetWidget()->GetInputMethod(); 1690 InputMethod* input_method = GetWidget()->GetInputMethod();
1691 if (input_method) 1691 if (input_method)
1692 input_method->OnBlur(); 1692 input_method->OnBlur();
1693 return false; 1693 return false;
1694 } 1694 }
1695 1695
1696 gboolean NativeWidgetGtk::OnEventKey(GtkWidget* widget, GdkEventKey* event) { 1696 gboolean NativeWidgetGtk::OnEventKey(GtkWidget* widget, GdkEventKey* event) {
1697 KeyEvent key(reinterpret_cast<NativeEvent>(event)); 1697 KeyEvent key(reinterpret_cast<GdkEvent*>(event));
1698 InputMethod* input_method = GetWidget()->GetInputMethod(); 1698 InputMethod* input_method = GetWidget()->GetInputMethod();
1699 if (input_method) 1699 if (input_method)
1700 input_method->DispatchKeyEvent(key); 1700 input_method->DispatchKeyEvent(key);
1701 else 1701 else
1702 DispatchKeyEventPostIME(key); 1702 DispatchKeyEventPostIME(key);
1703 1703
1704 // Returns true to prevent GtkWindow's default key event handler. 1704 // Returns true to prevent GtkWindow's default key event handler.
1705 return true; 1705 return true;
1706 } 1706 }
1707 1707
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1744 has_pointer_grab_ = false; 1744 has_pointer_grab_ = false;
1745 if (has_keyboard_grab_) { 1745 if (has_keyboard_grab_) {
1746 has_keyboard_grab_ = false; 1746 has_keyboard_grab_ = false;
1747 gdk_keyboard_ungrab(GDK_CURRENT_TIME); 1747 gdk_keyboard_ungrab(GDK_CURRENT_TIME);
1748 } 1748 }
1749 delegate_->OnMouseCaptureLost(); 1749 delegate_->OnMouseCaptureLost();
1750 } 1750 }
1751 ReleaseMouseCapture(); 1751 ReleaseMouseCapture();
1752 1752
1753 #if defined(HAVE_XINPUT2) && defined(TOUCH_UI) 1753 #if defined(HAVE_XINPUT2) && defined(TOUCH_UI)
1754 TouchFactory::GetInstance()->UngrabTouchDevices( 1754 ui::TouchFactory::GetInstance()->UngrabTouchDevices(
1755 GDK_WINDOW_XDISPLAY(window_contents()->window)); 1755 GDK_WINDOW_XDISPLAY(window_contents()->window));
1756 #endif 1756 #endif
1757 return false; // To let other widgets get the event. 1757 return false; // To let other widgets get the event.
1758 } 1758 }
1759 1759
1760 void NativeWidgetGtk::OnGrabNotify(GtkWidget* widget, gboolean was_grabbed) { 1760 void NativeWidgetGtk::OnGrabNotify(GtkWidget* widget, gboolean was_grabbed) {
1761 // Sent when gtk_grab_add changes. 1761 // Sent when gtk_grab_add changes.
1762 if (!window_contents_) 1762 if (!window_contents_)
1763 return; // Grab broke after window destroyed, don't try processing it. 1763 return; // Grab broke after window destroyed, don't try processing it.
1764 if (!was_grabbed) // Indicates we've been shadowed (lost grab). 1764 if (!was_grabbed) // Indicates we've been shadowed (lost grab).
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1839 // Send the key event to View hierarchy first. 1839 // Send the key event to View hierarchy first.
1840 bool handled = delegate_->OnKeyEvent(key); 1840 bool handled = delegate_->OnKeyEvent(key);
1841 1841
1842 if (key.key_code() == ui::VKEY_PROCESSKEY || handled) 1842 if (key.key_code() == ui::VKEY_PROCESSKEY || handled)
1843 return; 1843 return;
1844 1844
1845 // Dispatch the key event to native GtkWidget hierarchy. 1845 // Dispatch the key event to native GtkWidget hierarchy.
1846 // To prevent GtkWindow from handling the key event as a keybinding, we need 1846 // To prevent GtkWindow from handling the key event as a keybinding, we need
1847 // to bypass GtkWindow's default key event handler and dispatch the event 1847 // to bypass GtkWindow's default key event handler and dispatch the event
1848 // here. 1848 // here.
1849 GdkEventKey* event = reinterpret_cast<GdkEventKey*>(key.native_event()); 1849 GdkEventKey* event = reinterpret_cast<GdkEventKey*>(key.gdk_event());
1850 if (!handled && event && GTK_IS_WINDOW(widget_)) 1850 if (!handled && event && GTK_IS_WINDOW(widget_))
1851 handled = gtk_window_propagate_key_event(GTK_WINDOW(widget_), event); 1851 handled = gtk_window_propagate_key_event(GTK_WINDOW(widget_), event);
1852 1852
1853 // On Linux, in order to handle VKEY_MENU (Alt) accelerator key correctly and 1853 // On Linux, in order to handle VKEY_MENU (Alt) accelerator key correctly and
1854 // avoid issues like: http://crbug.com/40966 and http://crbug.com/49701, we 1854 // avoid issues like: http://crbug.com/40966 and http://crbug.com/49701, we
1855 // should only send the key event to the focus manager if it's not handled by 1855 // should only send the key event to the focus manager if it's not handled by
1856 // any View or native GtkWidget. 1856 // any View or native GtkWidget.
1857 // The flow is different when the focus is in a RenderWidgetHostViewGtk, which 1857 // The flow is different when the focus is in a RenderWidgetHostViewGtk, which
1858 // always consumes the key event and send it back to us later by calling 1858 // always consumes the key event and send it back to us later by calling
1859 // HandleKeyboardEvent() directly, if it's not handled by webkit. 1859 // HandleKeyboardEvent() directly, if it's not handled by webkit.
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
2271 button_pressed = event->type == GDK_BUTTON_PRESS || 2271 button_pressed = event->type == GDK_BUTTON_PRESS ||
2272 event->type == GDK_2BUTTON_PRESS || 2272 event->type == GDK_2BUTTON_PRESS ||
2273 event->type == GDK_3BUTTON_PRESS; 2273 event->type == GDK_3BUTTON_PRESS;
2274 gdk_event_free(event); 2274 gdk_event_free(event);
2275 } 2275 }
2276 return button_pressed; 2276 return button_pressed;
2277 } 2277 }
2278 2278
2279 } // namespace internal 2279 } // namespace internal
2280 } // namespace views 2280 } // namespace views
OLDNEW
« no previous file with comments | « views/views.gyp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698