summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-04 06:40:42 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-04 06:40:42 +0000
commit9abf8dd6daf601bd5215f612fd530ca009c2e5bd (patch)
treedb13bad567f4803dce769b316713509e0cc96083 /views
parent926049f2fee49ce29144c9456112b4199fdb23e7 (diff)
downloadchromium_src-9abf8dd6daf601bd5215f612fd530ca009c2e5bd.zip
chromium_src-9abf8dd6daf601bd5215f612fd530ca009c2e5bd.tar.gz
chromium_src-9abf8dd6daf601bd5215f612fd530ca009c2e5bd.tar.bz2
Replace HCURSOR usage in views::View with a new gfx::NativeCursor type that also supports GdkCursor*, and wires this up with the existing implementors of the GetCursorForPoint method.
This allows us to get rid of one of the most annoying NOTIMPLEMENTED()s in views-gtk. BUG=none TEST=none Review URL: http://codereview.chromium.org/119150 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17614 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r--views/controls/button/image_button.cc4
-rw-r--r--views/controls/link.cc16
-rw-r--r--views/controls/link.h5
-rw-r--r--views/controls/single_split_view.cc13
-rw-r--r--views/controls/single_split_view.h2
-rw-r--r--views/view.cc5
-rw-r--r--views/view.h14
-rw-r--r--views/view_win.cc4
-rw-r--r--views/widget/root_view.cc40
-rw-r--r--views/widget/root_view.h7
10 files changed, 64 insertions, 46 deletions
diff --git a/views/controls/button/image_button.cc b/views/controls/button/image_button.cc
index a4f9123..85f5f4e 100644
--- a/views/controls/button/image_button.cc
+++ b/views/controls/button/image_button.cc
@@ -18,9 +18,9 @@ static const int kDefaultHeight = 14; // Default button height if no theme.
ImageButton::ImageButton(ButtonListener* listener)
: CustomButton(listener),
+ background_image_(NULL),
h_alignment_(ALIGN_LEFT),
- v_alignment_(ALIGN_TOP),
- background_image_(NULL) {
+ v_alignment_(ALIGN_TOP) {
// By default, we request that the gfx::Canvas passed to our View::Paint()
// implementation is flipped horizontally so that the button's bitmaps are
// mirrored when the UI directionality is right-to-left.
diff --git a/views/controls/link.cc b/views/controls/link.cc
index 14bc112..34a9e46 100644
--- a/views/controls/link.cc
+++ b/views/controls/link.cc
@@ -4,6 +4,10 @@
#include "views/controls/link.h"
+#if defined(OS_LINUX)
+#include <gdk/gdk.h>
+#endif
+
#include "app/gfx/font.h"
#include "base/logging.h"
#include "views/event.h"
@@ -184,17 +188,19 @@ void Link::SetEnabled(bool f) {
}
}
-#if defined(OS_WIN)
-HCURSOR Link::GetCursorForPoint(Event::EventType event_type, int x, int y) {
+gfx::NativeCursor Link::GetCursorForPoint(Event::EventType event_type, int x,
+ int y) {
if (enabled_) {
- if (!g_hand_cursor) {
+#if defined(OS_WIN)
+ if (!g_hand_cursor)
g_hand_cursor = LoadCursor(NULL, IDC_HAND);
- }
return g_hand_cursor;
+#elif defined(OS_LINUX)
+ return gdk_cursor_new(GDK_HAND2);
+#endif
} else {
return NULL;
}
}
-#endif
} // namespace views
diff --git a/views/controls/link.h b/views/controls/link.h
index 91e77ad..c574b6e 100644
--- a/views/controls/link.h
+++ b/views/controls/link.h
@@ -54,9 +54,8 @@ class Link : public Label {
// Set whether the link is enabled.
virtual void SetEnabled(bool f);
-#if defined(OS_WIN)
- virtual HCURSOR GetCursorForPoint(Event::EventType event_type, int x, int y);
-#endif
+ virtual gfx::NativeCursor GetCursorForPoint(Event::EventType event_type,
+ int x, int y);
virtual std::string GetClassName() const;
diff --git a/views/controls/single_split_view.cc b/views/controls/single_split_view.cc
index b40fca2..c741233 100644
--- a/views/controls/single_split_view.cc
+++ b/views/controls/single_split_view.cc
@@ -4,6 +4,10 @@
#include "views/controls/single_split_view.h"
+#if defined(OS_LINUX)
+#include <gdk/gdk.h>
+#endif
+
#include "app/gfx/canvas.h"
#include "skia/ext/skia_utils_win.h"
#include "views/background.h"
@@ -55,12 +59,15 @@ gfx::Size SingleSplitView::GetPreferredSize() {
return gfx::Size(width, height);
}
-HCURSOR SingleSplitView::GetCursorForPoint(Event::EventType event_type,
- int x,
- int y) {
+gfx::NativeCursor SingleSplitView::GetCursorForPoint(Event::EventType event_type,
+ int x, int y) {
if (IsPointInDivider(x)) {
+#if defined(OS_WIN)
static HCURSOR resize_cursor = LoadCursor(NULL, IDC_SIZEWE);
return resize_cursor;
+#elif defined(OS_LINUX)
+ return gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
+#endif
}
return NULL;
}
diff --git a/views/controls/single_split_view.h b/views/controls/single_split_view.h
index a531800..9d25918 100644
--- a/views/controls/single_split_view.h
+++ b/views/controls/single_split_view.h
@@ -22,7 +22,7 @@ class SingleSplitView : public views::View {
virtual gfx::Size GetPreferredSize();
// Overriden to return a resize cursor when over the divider.
- virtual HCURSOR GetCursorForPoint(Event::EventType event_type, int x, int y);
+ virtual gfx::NativeCursor GetCursorForPoint(Event::EventType event_type, int x, int y);
void set_divider_x(int divider_x) { divider_x_ = divider_x; }
int divider_x() { return divider_x_; }
diff --git a/views/view.cc b/views/view.cc
index b93c3c8..f817f1c 100644
--- a/views/view.cc
+++ b/views/view.cc
@@ -397,6 +397,11 @@ gfx::Insets View::GetInsets() const {
return insets;
}
+gfx::NativeCursor View::GetCursorForPoint(Event::EventType event_type, int x,
+ int y) {
+ return NULL;
+}
+
void View::SetContextMenuController(ContextMenuController* menu_controller) {
context_menu_controller_ = menu_controller;
}
diff --git a/views/view.h b/views/view.h
index 63fd56d..03291c6 100644
--- a/views/view.h
+++ b/views/view.h
@@ -12,6 +12,7 @@
#include <string>
#include <vector>
+#include "base/gfx/native_widget_types.h"
#include "base/gfx/rect.h"
#include "base/scoped_ptr.h"
#include "views/accelerator.h"
@@ -811,14 +812,15 @@ class View : public AcceleratorTarget {
// insets is returned.
virtual gfx::Insets GetInsets() const;
-#if defined(OS_WIN)
- // TODO(port): Make GetCursorForPoint portable.
-
// Return the cursor that should be used for this view or NULL if
// the default cursor should be used. The provided point is in the
- // receiver's coordinate system.
- virtual HCURSOR GetCursorForPoint(Event::EventType event_type, int x, int y);
-#endif // defined(OS_WIN)
+ // receiver's coordinate system. The caller is responsible for managing the
+ // lifetime of the returned object, though that lifetime may vary from
+ // platform to platform. On Windows, the cursor is a shared resource but in
+ // Gtk, the framework destroys the returned cursor after setting it.
+ virtual gfx::NativeCursor GetCursorForPoint(Event::EventType event_type,
+ int x,
+ int y);
// Convenience to test whether a point is within this view's bounds
virtual bool HitTest(const gfx::Point& l) const;
diff --git a/views/view_win.cc b/views/view_win.cc
index 92a6396..cff8e53 100644
--- a/views/view_win.cc
+++ b/views/view_win.cc
@@ -66,10 +66,6 @@ bool View::HitTest(const gfx::Point& l) const {
return false;
}
-HCURSOR View::GetCursorForPoint(Event::EventType event_type, int x, int y) {
- return NULL;
-}
-
void View::Focus() {
// Set the native focus to the root view window so it receives the keyboard
// messages.
diff --git a/views/widget/root_view.cc b/views/widget/root_view.cc
index fb64756..fd42412 100644
--- a/views/widget/root_view.cc
+++ b/views/widget/root_view.cc
@@ -467,29 +467,13 @@ void RootView::OnMouseMoved(const MouseEvent& e) {
0);
mouse_move_handler_->OnMouseMoved(moved_event);
-#if defined(OS_WIN)
- HCURSOR cursor = mouse_move_handler_->GetCursorForPoint(
+ gfx::NativeCursor cursor = mouse_move_handler_->GetCursorForPoint(
moved_event.GetType(), moved_event.x(), moved_event.y());
- if (cursor) {
- previous_cursor_ = ::SetCursor(cursor);
- } else if (previous_cursor_) {
- ::SetCursor(previous_cursor_);
- previous_cursor_ = NULL;
- }
-#else
- NOTIMPLEMENTED();
-#endif
+ SetActiveCursor(cursor);
} else if (mouse_move_handler_ != NULL) {
MouseEvent exited_event(Event::ET_MOUSE_EXITED, 0, 0, 0);
mouse_move_handler_->OnMouseExited(exited_event);
-#if defined(OS_WIN)
- if (previous_cursor_) {
- ::SetCursor(previous_cursor_);
- previous_cursor_ = NULL;
- }
-#else
- NOTIMPLEMENTED();
-#endif
+ SetActiveCursor(NULL);
}
}
@@ -922,4 +906,22 @@ View* RootView::GetDragView() {
return drag_view_;
}
+void RootView::SetActiveCursor(gfx::NativeCursor cursor) {
+#if defined(OS_WIN)
+ if (cursor) {
+ previous_cursor_ = ::SetCursor(cursor);
+ } else if (previous_cursor_) {
+ ::SetCursor(previous_cursor_);
+ previous_cursor_ = NULL;
+ }
+#elif defined(OS_LINUX)
+ if (cursor) {
+ gdk_window_set_cursor(GetWidget()->GetNativeView()->window, cursor);
+ gdk_cursor_destroy(cursor);
+ } else {
+ gdk_window_set_cursor(GetWidget()->GetNativeView()->window, NULL);
+ }
+#endif
+}
+
} // namespace views
diff --git a/views/widget/root_view.h b/views/widget/root_view.h
index ae73eef..8f0df1f 100644
--- a/views/widget/root_view.h
+++ b/views/widget/root_view.h
@@ -269,6 +269,9 @@ class RootView : public View,
// If a view is dragging, this returns it. Otherwise returns NULL.
View* GetDragView();
+ // Sets the current cursor, or resets it to the last one if NULL is provided.
+ void SetActiveCursor(gfx::NativeCursor cursor);
+
// The view currently handing down - drag - up
View* mouse_pressed_handler_;
@@ -299,10 +302,8 @@ class RootView : public View,
// true if mouse_handler_ has been explicitly set
bool explicit_mouse_handler_;
-#if defined(OS_WIN)
// Previous cursor
- HCURSOR previous_cursor_;
-#endif
+ gfx::NativeCursor previous_cursor_;
// Default keyboard handler
View* default_keyboard_handler_;