| Index: chrome/browser/automation/ui_controls_linux.cc
|
| ===================================================================
|
| --- chrome/browser/automation/ui_controls_linux.cc (revision 23880)
|
| +++ chrome/browser/automation/ui_controls_linux.cc (working copy)
|
| @@ -7,8 +7,10 @@
|
| #include <gtk/gtk.h>
|
| #include <gdk/gdkkeysyms.h>
|
|
|
| +#include "base/gfx/rect.h"
|
| #include "base/logging.h"
|
| #include "base/message_loop.h"
|
| +#include "chrome/common/gtk_util.h"
|
| #include "chrome/test/automation/automation_constants.h"
|
|
|
| namespace {
|
| @@ -46,6 +48,24 @@
|
| GdkEventType type_;
|
| };
|
|
|
| +class ClickTask : public Task {
|
| + public:
|
| + ClickTask(ui_controls::MouseButton button, int state, Task* followup)
|
| + : button_(button), state_(state), followup_(followup) {
|
| + }
|
| +
|
| + virtual ~ClickTask() {}
|
| +
|
| + virtual void Run() {
|
| + ui_controls::SendMouseEventsNotifyWhenDone(button_, state_, followup_);
|
| + }
|
| +
|
| + private:
|
| + ui_controls::MouseButton button_;
|
| + int state_;
|
| + Task* followup_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| namespace ui_controls {
|
| @@ -109,20 +129,21 @@
|
| return rv;
|
| }
|
|
|
| -bool SendMouseClick(const gfx::Point& point, MouseButton type) {
|
| +bool SendMouseEvents(MouseButton type, int state) {
|
| GdkEvent* event = gdk_event_new(GDK_BUTTON_PRESS);
|
|
|
| - event->button.window = gdk_window_at_pointer(NULL, NULL);
|
| - g_object_ref(event->button.window);
|
| event->button.send_event = false;
|
| event->button.time = EventTimeNow();
|
|
|
| - event->motion.x_root = point.x();
|
| - event->motion.y_root = point.x();
|
| + gint x, y;
|
| + event->button.window = gdk_window_at_pointer(&x, &y);
|
| + g_object_ref(event->button.window);
|
| + event->motion.x = x;
|
| + event->motion.y = y;
|
| gint origin_x, origin_y;
|
| gdk_window_get_origin(event->button.window, &origin_x, &origin_y);
|
| - event->button.x = point.x() - origin_x;
|
| - event->button.y = point.y() - origin_y;
|
| + event->button.x_root = x + origin_x;
|
| + event->button.y_root = y + origin_y;
|
|
|
| event->button.axes = NULL;
|
| // TODO(estade): as above, we may want to pack this with the actual state.
|
| @@ -131,13 +152,15 @@
|
| event->button.device = gdk_device_get_core_pointer();
|
|
|
| event->button.type = GDK_BUTTON_PRESS;
|
| - gdk_event_put(event);
|
| + 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++;
|
| - gdk_event_put(release_event);
|
| + if (state & UP)
|
| + gdk_event_put(release_event);
|
|
|
| gdk_event_free(event);
|
| gdk_event_free(release_event);
|
| @@ -145,12 +168,24 @@
|
| return false;
|
| }
|
|
|
| -// TODO(estade): need to figure out a better type for this than View.
|
| -void MoveMouseToCenterAndPress(views::View* view,
|
| +bool SendMouseEventsNotifyWhenDone(MouseButton type, int state, Task* task) {
|
| + bool rv = SendMouseEvents(type, state);
|
| + MessageLoop::current()->PostTask(FROM_HERE, task);
|
| + return rv;
|
| +}
|
| +
|
| +bool SendMouseClick(MouseButton type) {
|
| + return SendMouseEvents(type, UP | DOWN);
|
| +}
|
| +
|
| +void MoveMouseToCenterAndPress(GtkWidget* widget,
|
| MouseButton button,
|
| int state,
|
| Task* task) {
|
| - NOTIMPLEMENTED();
|
| + gfx::Rect bounds = gtk_util::GetWidgetScreenBounds(widget);
|
| + SendMouseMoveNotifyWhenDone(bounds.x() + bounds.width() / 2,
|
| + bounds.y() + bounds.height() / 2,
|
| + new ClickTask(button, state, task));
|
| }
|
|
|
| } // namespace ui_controls
|
|
|