Chromium Code Reviews| Index: ui/ui_controls/ui_controls_gtk.cc |
| diff --git a/ui/ui_controls/ui_controls_gtk.cc b/ui/ui_controls/ui_controls_gtk.cc |
| index c0e22df30d5687f32d68df7a5cf6bf1a92ac7561..da4c0e1d22997575e197a4e1371e8b90d2d827af 100644 |
| --- a/ui/ui_controls/ui_controls_gtk.cc |
| +++ b/ui/ui_controls/ui_controls_gtk.cc |
| @@ -94,156 +94,169 @@ void FakeAMouseMotionEvent(gint x, gint y) { |
| namespace ui_controls { |
| -bool SendKeyPress(gfx::NativeWindow window, |
| - ui::KeyboardCode key, |
| - bool control, |
| - bool shift, |
| - bool alt, |
| - bool command) { |
| - DCHECK(!command); // No command key on Linux |
| - GdkWindow* event_window = NULL; |
| - GtkWidget* grab_widget = gtk_grab_get_current(); |
| - if (grab_widget) { |
| - // If there is a grab, send all events to the grabbed widget. |
| - event_window = gtk_widget_get_window(grab_widget); |
| - } else if (window) { |
| - event_window = gtk_widget_get_window(GTK_WIDGET(window)); |
| - } else { |
| - // No target was specified. Send the events to the active toplevel. |
| - GList* windows = gtk_window_list_toplevels(); |
| - for (GList* element = windows; element; element = g_list_next(element)) { |
| - GtkWindow* this_window = GTK_WINDOW(element->data); |
| - if (gtk_window_is_active(this_window)) { |
| - event_window = gtk_widget_get_window(GTK_WIDGET(this_window)); |
| - break; |
| +namespace { |
| + |
| +class UIControlsGtk : public UIControls { |
| + |
| + bool SendKeyPress(gfx::NativeWindow window, |
| + ui::KeyboardCode key, |
| + bool control, |
| + bool shift, |
| + bool alt, |
| + bool command) OVERRIDE { |
| + DCHECK(!command); // No command key on Linux |
| + GdkWindow* event_window = NULL; |
| + GtkWidget* grab_widget = gtk_grab_get_current(); |
| + if (grab_widget) { |
| + // If there is a grab, send all events to the grabbed widget. |
| + event_window = gtk_widget_get_window(grab_widget); |
| + } else if (window) { |
| + event_window = gtk_widget_get_window(GTK_WIDGET(window)); |
| + } else { |
| + // No target was specified. Send the events to the active toplevel. |
| + GList* windows = gtk_window_list_toplevels(); |
| + for (GList* element = windows; element; element = g_list_next(element)) { |
| + GtkWindow* this_window = GTK_WINDOW(element->data); |
| + if (gtk_window_is_active(this_window)) { |
| + event_window = gtk_widget_get_window(GTK_WIDGET(this_window)); |
| + break; |
| + } |
| } |
| + g_list_free(windows); |
| + } |
| + if (!event_window) { |
| + NOTREACHED() << "Window not specified and none is active"; |
| + return false; |
| } |
| - g_list_free(windows); |
| - } |
| - if (!event_window) { |
| - NOTREACHED() << "Window not specified and none is active"; |
| - return false; |
| - } |
| - std::vector<GdkEvent*> events; |
| - ui::SynthesizeKeyPressEvents(event_window, key, control, shift, alt, &events); |
| - for (std::vector<GdkEvent*>::iterator iter = events.begin(); |
| - iter != events.end(); ++iter) { |
| - gdk_event_put(*iter); |
| - // gdk_event_put appends a copy of the event. |
| - gdk_event_free(*iter); |
| - } |
| + std::vector<GdkEvent*> events; |
| + ui::SynthesizeKeyPressEvents( |
| + event_window, key, control, shift, alt, &events); |
| + for (std::vector<GdkEvent*>::iterator iter = events.begin(); |
| + iter != events.end(); ++iter) { |
| + gdk_event_put(*iter); |
| + // gdk_event_put appends a copy of the event. |
| + gdk_event_free(*iter); |
| + } |
| - return true; |
| -} |
| + return true; |
| + } |
| -bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window, |
| - ui::KeyboardCode key, |
| - bool control, |
| - bool shift, |
| - bool alt, |
| - bool command, |
| - const base::Closure& task) { |
| - DCHECK(!command); // No command key on Linux |
| - int release_count = 1; |
| - if (control) |
| - release_count++; |
| - if (shift) |
| - release_count++; |
| - if (alt) |
| - release_count++; |
| - // This object will delete itself after running |task|. |
| - new EventWaiter(task, GDK_KEY_RELEASE, release_count); |
| - return SendKeyPress(window, key, control, shift, alt, command); |
| -} |
| + bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window, |
| + ui::KeyboardCode key, |
| + bool control, |
| + bool shift, |
| + bool alt, |
| + bool command, |
| + const base::Closure& task) OVERRIDE { |
| + DCHECK(!command); // No command key on Linux |
| + int release_count = 1; |
| + if (control) |
| + release_count++; |
| + if (shift) |
| + release_count++; |
| + if (alt) |
| + release_count++; |
| + // This object will delete itself after running |task|. |
| + new EventWaiter(task, GDK_KEY_RELEASE, release_count); |
| + return SendKeyPress(window, key, control, shift, alt, command); |
| + } |
| -bool SendMouseMove(long x, long y) { |
| - gdk_display_warp_pointer(gdk_display_get_default(), gdk_screen_get_default(), |
| - x, y); |
| - // Sometimes gdk_display_warp_pointer fails to send back any indication of |
| - // the move, even though it succesfully moves the server cursor. We fake it in |
| - // order to get drags to work. |
| - FakeAMouseMotionEvent(x, y); |
| - return true; |
| -} |
| + bool SendMouseMove(long x, long y) OVERRIDE { |
| + gdk_display_warp_pointer( |
| + gdk_display_get_default(), gdk_screen_get_default(), x, y); |
| + // Sometimes gdk_display_warp_pointer fails to send back any indication of |
| + // the move, even though it succesfully moves the server cursor. We fake |
| + // it in order to get drags to work. |
| + FakeAMouseMotionEvent(x, y); |
| + return true; |
| + } |
| -bool SendMouseMoveNotifyWhenDone(long x, long y, const base::Closure& task) { |
| - bool rv = SendMouseMove(x, y); |
| - new EventWaiter(task, GDK_MOTION_NOTIFY, 1); |
| - return rv; |
| -} |
| + bool SendMouseMoveNotifyWhenDone( |
| + long x, long y, const base::Closure& task) OVERRIDE { |
| + bool rv = SendMouseMove(x, y); |
| + new EventWaiter(task, GDK_MOTION_NOTIFY, 1); |
| + return rv; |
| + } |
| -bool SendMouseEvents(MouseButton type, int state) { |
| - GdkEvent* event = gdk_event_new(GDK_BUTTON_PRESS); |
| + bool SendMouseEvents(MouseButton type, int state) OVERRIDE { |
| + GdkEvent* event = gdk_event_new(GDK_BUTTON_PRESS); |
| + |
| + event->button.send_event = false; |
| + event->button.time = XTimeNow(); |
| + |
| + gint x, y; |
| + GtkWidget* grab_widget = gtk_grab_get_current(); |
| + if (grab_widget) { |
| + // If there is a grab, we need to target all events at it regardless of |
| + // what widget the mouse is over. |
| + event->button.window = gtk_widget_get_window(grab_widget); |
| + gdk_window_get_pointer(event->button.window, &x, &y, NULL); |
| + } else { |
| + event->button.window = gdk_window_at_pointer(&x, &y); |
| + CHECK(event->button.window); |
| + } |
| - event->button.send_event = false; |
| - event->button.time = XTimeNow(); |
| + g_object_ref(event->button.window); |
| + event->button.x = x; |
| + event->button.y = y; |
| + gint origin_x, origin_y; |
| + gdk_window_get_origin(event->button.window, &origin_x, &origin_y); |
| + event->button.x_root = x + origin_x; |
| + event->button.y_root = y + origin_y; |
| + |
| + event->button.axes = NULL; |
| + GdkModifierType modifier; |
| + gdk_window_get_pointer(event->button.window, NULL, NULL, &modifier); |
| + event->button.state = modifier; |
| + event->button.button = type == LEFT ? 1 : (type == MIDDLE ? 2 : 3); |
| + event->button.device = gdk_device_get_core_pointer(); |
| + |
| + event->button.type = GDK_BUTTON_PRESS; |
| + if (state & DOWN) |
| + gdk_event_put(event); |
| + |
| + // Also send a release event. |
| + GdkEvent* release_event = gdk_event_copy(event); |
| + release_event->button.type = GDK_BUTTON_RELEASE; |
| + release_event->button.time++; |
| + if (state & UP) |
| + gdk_event_put(release_event); |
| + |
| + gdk_event_free(event); |
| + gdk_event_free(release_event); |
| - gint x, y; |
| - GtkWidget* grab_widget = gtk_grab_get_current(); |
| - if (grab_widget) { |
| - // If there is a grab, we need to target all events at it regardless of |
| - // what widget the mouse is over. |
| - event->button.window = gtk_widget_get_window(grab_widget); |
| - gdk_window_get_pointer(event->button.window, &x, &y, NULL); |
| - } else { |
| - event->button.window = gdk_window_at_pointer(&x, &y); |
| - CHECK(event->button.window); |
| + return false; |
| } |
| - g_object_ref(event->button.window); |
| - event->button.x = x; |
| - event->button.y = y; |
| - gint origin_x, origin_y; |
| - gdk_window_get_origin(event->button.window, &origin_x, &origin_y); |
| - event->button.x_root = x + origin_x; |
| - event->button.y_root = y + origin_y; |
| - |
| - event->button.axes = NULL; |
| - GdkModifierType modifier; |
| - gdk_window_get_pointer(event->button.window, NULL, NULL, &modifier); |
| - event->button.state = modifier; |
| - event->button.button = type == LEFT ? 1 : (type == MIDDLE ? 2 : 3); |
| - event->button.device = gdk_device_get_core_pointer(); |
| - |
| - event->button.type = GDK_BUTTON_PRESS; |
| - if (state & DOWN) |
| - gdk_event_put(event); |
| - |
| - // Also send a release event. |
| - GdkEvent* release_event = gdk_event_copy(event); |
| - release_event->button.type = GDK_BUTTON_RELEASE; |
| - release_event->button.time++; |
| - if (state & UP) |
| - gdk_event_put(release_event); |
| - |
| - gdk_event_free(event); |
| - gdk_event_free(release_event); |
| - |
| - return false; |
| -} |
| + bool SendMouseEventsNotifyWhenDone(MouseButton type, |
| + int state, |
| + const base::Closure& task) OVERRIDE { |
| + bool rv = SendMouseEvents(type, state); |
| + GdkEventType wait_type; |
| + if (state & UP) { |
| + wait_type = GDK_BUTTON_RELEASE; |
| + } else { |
| + if (type == LEFT) |
| + wait_type = GDK_BUTTON_PRESS; |
| + else if (type == MIDDLE) |
| + wait_type = GDK_2BUTTON_PRESS; |
| + else |
| + wait_type = GDK_3BUTTON_PRESS; |
| + } |
| + new EventWaiter(task, wait_type, 1); |
| + return rv; |
| + } |
| -bool SendMouseEventsNotifyWhenDone(MouseButton type, |
| - int state, |
| - const base::Closure& task) { |
| - bool rv = SendMouseEvents(type, state); |
| - GdkEventType wait_type; |
| - if (state & UP) { |
| - wait_type = GDK_BUTTON_RELEASE; |
| - } else { |
| - if (type == LEFT) |
| - wait_type = GDK_BUTTON_PRESS; |
| - else if (type == MIDDLE) |
| - wait_type = GDK_2BUTTON_PRESS; |
| - else |
| - wait_type = GDK_3BUTTON_PRESS; |
| + bool SendMouseClick(MouseButton type) { |
| + return SendMouseEvents(type, UP | DOWN); |
| } |
|
oshima
2012/11/15 23:37:41
DISALLOW_COPY_AND_ASSIGN
scottmg
2012/11/16 17:58:54
Done.
|
| - new EventWaiter(task, wait_type, 1); |
| - return rv; |
| -} |
| +}; |
| + |
| +} // namespace |
| -bool SendMouseClick(MouseButton type) { |
| - return SendMouseEvents(type, UP | DOWN); |
| +UIControls* CreateNativeUIControls() { |
| + return new UIControlsGtk; |
| } |
| } // namespace ui_controls |