diff options
Diffstat (limited to 'views')
-rw-r--r-- | views/widget/root_view.cc | 7 | ||||
-rw-r--r-- | views/widget/widget_gtk.cc | 21 | ||||
-rw-r--r-- | views/window/window_gtk.cc | 20 |
3 files changed, 36 insertions, 12 deletions
diff --git a/views/widget/root_view.cc b/views/widget/root_view.cc index c64dc08..5a8bb74 100644 --- a/views/widget/root_view.cc +++ b/views/widget/root_view.cc @@ -16,6 +16,10 @@ #include "views/widget/widget.h" #include "views/window/window.h" +#if defined(OS_LINUX) +#include "views/widget/widget_gtk.h" +#endif // defined(OS_LINUX) + namespace views { ///////////////////////////////////////////////////////////////////////////// @@ -929,7 +933,8 @@ void RootView::SetActiveCursor(gfx::NativeCursor cursor) { previous_cursor_ = NULL; } #elif defined(OS_LINUX) - gfx::NativeView native_view = GetWidget()->GetNativeView(); + gfx::NativeView native_view = + static_cast<WidgetGtk*>(GetWidget())->window_contents(); if (!native_view) return; gdk_window_set_cursor(native_view->window, cursor); diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc index 91726afe..2c4c80a 100644 --- a/views/widget/widget_gtk.cc +++ b/views/widget/widget_gtk.cc @@ -798,6 +798,10 @@ gboolean WidgetGtk::OnEnterNotify(GtkWidget* widget, GdkEventCrossing* event) { last_mouse_move_x_ = event->x_root; last_mouse_move_y_ = event->y_root; last_mouse_event_was_move_ = true; + + int x = 0, y = 0; + GetContainedWidgetEventCoordinates(event, &x, &y); + // If this event is the result of pressing a button then one of the button // modifiers is set. Unset it as we're compensating for the leave generated // when you press a button. @@ -805,7 +809,7 @@ gboolean WidgetGtk::OnEnterNotify(GtkWidget* widget, GdkEventCrossing* event) { ~(Event::EF_LEFT_BUTTON_DOWN | Event::EF_MIDDLE_BUTTON_DOWN | Event::EF_RIGHT_BUTTON_DOWN)); - MouseEvent mouse_move(Event::ET_MOUSE_MOVED, event->x, event->y, flags); + MouseEvent mouse_move(Event::ET_MOUSE_MOVED, x, y, flags); root_view_->OnMouseMoved(mouse_move); } @@ -820,10 +824,13 @@ gboolean WidgetGtk::OnLeaveNotify(GtkWidget* widget, GdkEventCrossing* event) { } gboolean WidgetGtk::OnMotionNotify(GtkWidget* widget, GdkEventMotion* event) { + int x = 0, y = 0; + GetContainedWidgetEventCoordinates(event, &x, &y); + if (has_capture_ && is_mouse_down_) { last_mouse_event_was_move_ = false; int flags = Event::GetFlagsFromGdkState(event->state); - MouseEvent mouse_drag(Event::ET_MOUSE_DRAGGED, event->x, event->y, flags); + MouseEvent mouse_drag(Event::ET_MOUSE_DRAGGED, x, y, flags); root_view_->OnMouseDragged(mouse_drag); return true; } @@ -837,7 +844,7 @@ gboolean WidgetGtk::OnMotionNotify(GtkWidget* widget, GdkEventMotion* event) { last_mouse_move_y_ = screen_loc.y(); last_mouse_event_was_move_ = true; int flags = Event::GetFlagsFromGdkState(event->state); - MouseEvent mouse_move(Event::ET_MOUSE_MOVED, event->x, event->y, flags); + MouseEvent mouse_move(Event::ET_MOUSE_MOVED, x, y, flags); root_view_->OnMouseMoved(mouse_move); return true; } @@ -1006,12 +1013,16 @@ bool WidgetGtk::ProcessMousePressed(GdkEventButton* event) { return true; } - return false; + // Returns true to consume the event when widget is not transparent. + return !transparent_; } void WidgetGtk::ProcessMouseReleased(GdkEventButton* event) { + int x = 0, y = 0; + GetContainedWidgetEventCoordinates(event, &x, &y); + last_mouse_event_was_move_ = false; - MouseEvent mouse_up(Event::ET_MOUSE_RELEASED, event->x, event->y, + MouseEvent mouse_up(Event::ET_MOUSE_RELEASED, x, y, GetFlagsForEventButton(*event)); // Release the capture first, that way we don't get confused if // OnMouseReleased blocks. diff --git a/views/window/window_gtk.cc b/views/window/window_gtk.cc index fbfa3ce..1c7fd88 100644 --- a/views/window/window_gtk.cc +++ b/views/window/window_gtk.cc @@ -259,8 +259,11 @@ void WindowGtk::FrameTypeChanged() { // WindowGtk, WidgetGtk overrides: gboolean WindowGtk::OnButtonPress(GtkWidget* widget, GdkEventButton* event) { + int x = 0, y = 0; + GetContainedWidgetEventCoordinates(event, &x, &y); + int hittest_code = - non_client_view_->NonClientHitTest(gfx::Point(event->x, event->y)); + non_client_view_->NonClientHitTest(gfx::Point(x, y)); switch (hittest_code) { case HTCAPTION: { MouseEvent mouse_pressed(Event::ET_MOUSE_PRESSED, event->x, event->y, @@ -314,13 +317,18 @@ gboolean WindowGtk::OnConfigureEvent(GtkWidget* widget, } gboolean WindowGtk::OnMotionNotify(GtkWidget* widget, GdkEventMotion* event) { + int x = 0, y = 0; + GetContainedWidgetEventCoordinates(event, &x, &y); + // Update the cursor for the screen edge. int hittest_code = - non_client_view_->NonClientHitTest(gfx::Point(event->x, event->y)); - GdkCursorType cursor_type = HitTestCodeToGdkCursorType(hittest_code); - GdkCursor* cursor = gdk_cursor_new(cursor_type); - gdk_window_set_cursor(widget->window, cursor); - gdk_cursor_destroy(cursor); + non_client_view_->NonClientHitTest(gfx::Point(x, y)); + if (hittest_code != HTCLIENT) { + GdkCursorType cursor_type = HitTestCodeToGdkCursorType(hittest_code); + GdkCursor* cursor = gdk_cursor_new(cursor_type); + gdk_window_set_cursor(widget->window, cursor); + gdk_cursor_destroy(cursor); + } return WidgetGtk::OnMotionNotify(widget, event); } |