[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
weinig at apple.com
weinig at apple.com
Wed Dec 22 11:11:07 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit ee7d02711a1a095f6716a29de471dba810ec7584
Author: weinig at apple.com <weinig at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Wed Jul 14 18:54:34 2010 +0000
Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
Make changing Cursors work in WebKit2.
Reviewed by Darin Adler.
WebCore:
- Converted Mac and Windows Cursor implementations to lazily
create the platform cursor.
- Add HostWindow function to set the cursor and use it from Widget::setCursor.
- Rework Windows cursor code to use fewer global variables.
* WebCore.exp.in: Updated
* loader/EmptyClients.h:
(WebCore::EmptyChromeClient::setCursor):
(WebCore::EmptyChromeClient::setLastSetCursorToCurrentCursor):
Added empty implementations.
* page/Chrome.cpp:
(WebCore::Chrome::setCursor):
* page/Chrome.h:
* page/ChromeClient.h:
Change existing setCursor() function to take a Cursor instead of a
PlatformCursorHandle. Added setLastSetCursorToCurrentCursor.
* platform/Cursor.cpp:
* platform/Cursor.h:
Added Cursor Type and the option of lazily creating the native cursor
(used on Mac and Windows for now).
* platform/HostWindow.h:
Add setCursor.
* platform/mac/CursorMac.mm:
(WebCore::createCustomCursor): This no longer needs to call determineHotSpot
as that is done when on construction of the cursor now and the hotSpot passed
in is correct.
(WebCore::Cursor::ensurePlatformCursor):
(WebCore::Cursor::Cursor):
(WebCore::Cursor::~Cursor):
(WebCore::Cursor::operator=):
(WebCore::Cursor::platformCursor):
Convert to lazily creating the native cursor on the first request and
storing the type.
* platform/mac/WidgetMac.mm:
(WebCore::Widget::setCursor):
Use HostWindow::setCursor to set the cursor. This in turn will call the
ChromeClient.
* platform/win/CursorWin.cpp:
(WebCore::createSharedCursor):
(WebCore::loadSharedCursor):
(WebCore::loadCursorByName):
(WebCore::Cursor::ensurePlatformCursor):
(WebCore::SharedCursor::~SharedCursor):
(WebCore::Cursor::Cursor):
(WebCore::Cursor::~Cursor):
(WebCore::Cursor::operator=):
(WebCore::Cursor::platformCursor):
Convert to lazily creating the native cursor on the first request and
storing the type.
* platform/win/WidgetWin.cpp:
(WebCore::Widget::setCursor):
Use HostWindow::setCursor to set the cursor. This in turn will call the
ChromeClient.
* plugins/win/PluginViewWin.cpp:
(WebCore::PluginView::handleMouseEvent):
Use the new setLastSetCursorToCurrentCursor client function to ensure
the cursor is properly updated when over a plugin.
* platform/chromium/CursorChromium.cpp:
* platform/efl/CursorEfl.cpp:
* platform/gtk/CursorGtk.cpp:
* platform/haiku/CursorHaiku.cpp:
* platform/wince/CursorWince.cpp:
* platform/wx/CursorWx.cpp:
* platform/qt/CursorQt.cpp:
Change m_impl -> m_platformCursor.
WebKit:
* efl/WebCoreSupport/ChromeClientEfl.cpp:
(WebCore::ChromeClientEfl::setCursor):
* efl/WebCoreSupport/ChromeClientEfl.h:
Change prototype to match new one.
WebKit/chromium:
* src/ChromeClientImpl.h:
(WebKit::ChromeClientImpl::setCursor):
Change prototype to match new one.
* src/WebPopupMenuImpl.cpp:
(WebKit::WebPopupMenuImpl::setCursor):
* src/WebPopupMenuImpl.h:
Add empty setCursor function to satisfy the HostWindow interface.
WebKit/gtk:
* WebCoreSupport/ChromeClientGtk.cpp:
(WebKit::ChromeClient::setCursor):
* WebCoreSupport/ChromeClientGtk.h:
Change prototype to match new one.
WebKit/haiku:
* WebCoreSupport/ChromeClientHaiku.cpp:
(WebCore::ChromeClientHaiku::setCursor):
* WebCoreSupport/ChromeClientHaiku.h:
Change prototype to match new one.
WebKit/mac:
* WebCoreSupport/WebChromeClient.h:
* WebCoreSupport/WebChromeClient.mm:
(WebChromeClient::setCursor):
* WebView/WebView.mm:
Implement cursor changing at the WebKit level for the sake of WebKit2.
This functionality is being moved from WidgetMac.mm.
(+[WebView _pointingHandCursor]):
Update to use platformCursor() instead of impl().
WebKit/qt:
* WebCoreSupport/ChromeClientQt.cpp:
(WebCore::ChromeClientQt::setCursor):
* WebCoreSupport/ChromeClientQt.h:
Change prototype to match new one.
WebKit/win:
* WebCoreSupport/WebChromeClient.cpp:
(WebChromeClient::setCursor):
We now need to grab the native cursor out of the WebCore cursor.
(WebChromeClient::setLastSetCursorToCurrentCursor):
Sets the WebView's "last set cursor" to be the current cursor so that
the cursor is set correctly for plugins.
* WebCoreSupport/WebChromeClient.h:
* WebView.cpp:
(WebView::WebView):
(WebView::WebViewWndProc):
* WebView.h:
(WebView::setLastCursor):
Change the "last set cursor" to be stored as a member instead of a global.
WebKit/wx:
* WebKitSupport/ChromeClientWx.cpp:
(WebCore::ChromeClientWx::setCursor):
* WebKitSupport/ChromeClientWx.h:
Change prototype to match new one.
WebKit2:
* Shared/CoreIPCSupport/WebPageProxyMessageKinds.h:
Add SetCursor message.
* Shared/WebCoreArgumentCoders.h:
Add encoding/decoding of Cursors. For now we don't support Custom
cursors.
* UIProcess/API/mac/PageClientImpl.h:
* UIProcess/API/mac/PageClientImpl.mm:
(WebKit::PageClientImpl::setCursor):
* UIProcess/PageClient.h:
Add pass through functions to get the cursor from the WebPageProxy
to the WKView.
* UIProcess/API/mac/WKView.mm:
(-[WKView _setCursor:]):
* UIProcess/API/mac/WKViewInternal.h:
Implement changing the cursor.
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::didReceiveMessage):
(WebKit::WebPageProxy::setCursor):
* UIProcess/WebPageProxy.h:
Decode the cursor.
* UIProcess/win/WebView.cpp:
(WebKit::WebView::wndProc):
(WebKit::WebView::WebView):
(WebKit::WebView::onSetCursor):
(WebKit::WebView::setCursor):
* UIProcess/win/WebView.h:
Implement changing the cursor.
* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::setCursor):
(WebKit::WebChromeClient::setLastSetCursorToCurrentCursor):
* WebProcess/WebCoreSupport/WebChromeClient.h:
Encode the cursor when setCursor is called.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@63339 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 528522b..237f701 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,85 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ - Converted Mac and Windows Cursor implementations to lazily
+ create the platform cursor.
+ - Add HostWindow function to set the cursor and use it from Widget::setCursor.
+ - Rework Windows cursor code to use fewer global variables.
+
+ * WebCore.exp.in: Updated
+ * loader/EmptyClients.h:
+ (WebCore::EmptyChromeClient::setCursor):
+ (WebCore::EmptyChromeClient::setLastSetCursorToCurrentCursor):
+ Added empty implementations.
+
+ * page/Chrome.cpp:
+ (WebCore::Chrome::setCursor):
+ * page/Chrome.h:
+ * page/ChromeClient.h:
+ Change existing setCursor() function to take a Cursor instead of a
+ PlatformCursorHandle. Added setLastSetCursorToCurrentCursor.
+
+ * platform/Cursor.cpp:
+ * platform/Cursor.h:
+ Added Cursor Type and the option of lazily creating the native cursor
+ (used on Mac and Windows for now).
+
+ * platform/HostWindow.h:
+ Add setCursor.
+
+ * platform/mac/CursorMac.mm:
+ (WebCore::createCustomCursor): This no longer needs to call determineHotSpot
+ as that is done when on construction of the cursor now and the hotSpot passed
+ in is correct.
+ (WebCore::Cursor::ensurePlatformCursor):
+ (WebCore::Cursor::Cursor):
+ (WebCore::Cursor::~Cursor):
+ (WebCore::Cursor::operator=):
+ (WebCore::Cursor::platformCursor):
+ Convert to lazily creating the native cursor on the first request and
+ storing the type.
+
+ * platform/mac/WidgetMac.mm:
+ (WebCore::Widget::setCursor):
+ Use HostWindow::setCursor to set the cursor. This in turn will call the
+ ChromeClient.
+
+ * platform/win/CursorWin.cpp:
+ (WebCore::createSharedCursor):
+ (WebCore::loadSharedCursor):
+ (WebCore::loadCursorByName):
+ (WebCore::Cursor::ensurePlatformCursor):
+ (WebCore::SharedCursor::~SharedCursor):
+ (WebCore::Cursor::Cursor):
+ (WebCore::Cursor::~Cursor):
+ (WebCore::Cursor::operator=):
+ (WebCore::Cursor::platformCursor):
+ Convert to lazily creating the native cursor on the first request and
+ storing the type.
+
+ * platform/win/WidgetWin.cpp:
+ (WebCore::Widget::setCursor):
+ Use HostWindow::setCursor to set the cursor. This in turn will call the
+ ChromeClient.
+
+ * plugins/win/PluginViewWin.cpp:
+ (WebCore::PluginView::handleMouseEvent):
+ Use the new setLastSetCursorToCurrentCursor client function to ensure
+ the cursor is properly updated when over a plugin.
+
+ * platform/chromium/CursorChromium.cpp:
+ * platform/efl/CursorEfl.cpp:
+ * platform/gtk/CursorGtk.cpp:
+ * platform/haiku/CursorHaiku.cpp:
+ * platform/wince/CursorWince.cpp:
+ * platform/wx/CursorWx.cpp:
+ * platform/qt/CursorQt.cpp:
+ Change m_impl -> m_platformCursor.
+
2010-07-13 Eric Seidel <eric at webkit.org>
Reviewed by Adam Barth.
diff --git a/WebCore/WebCore.exp.in b/WebCore/WebCore.exp.in
index d8366f1..83e7d1d 100644
--- a/WebCore/WebCore.exp.in
+++ b/WebCore/WebCore.exp.in
@@ -394,6 +394,7 @@ __ZN7WebCore17DOMImplementation14isTextMIMETypeERKNS_6StringE
__ZN7WebCore17GlyphPageTreeNode18treeGlyphPageCountEv
__ZN7WebCore17HTMLPlugInElement11getNPObjectEv
__ZN7WebCore17HistoryController26saveDocumentAndScrollStateEv
+__ZN7WebCore17nameForCursorTypeENS_6Cursor4TypeE
__ZN7WebCore18deprecatedParseURLERKNS_6StringE
__ZN7WebCore18isStartOfParagraphERKNS_15VisiblePositionE
__ZN7WebCore19AnimationController16resumeAnimationsEPNS_8DocumentE
@@ -541,6 +542,9 @@ __ZN7WebCore5Range6setEndEN3WTF10PassRefPtrINS_4NodeEEEiRi
__ZN7WebCore5Range8setStartEN3WTF10PassRefPtrINS_4NodeEEEiRi
__ZN7WebCore5RangeD1Ev
__ZN7WebCore5cacheEv
+__ZN7WebCore6Cursor8fromTypeENS0_4TypeE
+__ZN7WebCore6CursorD1Ev
+__ZN7WebCore6CursoraSERKS0_
__ZN7WebCore6Editor10applyStyleEPNS_19CSSStyleDeclarationENS_10EditActionE
__ZN7WebCore6Editor10insertTextERKNS_6StringEPNS_5EventE
__ZN7WebCore6Editor13canDHTMLPasteEv
@@ -933,6 +937,7 @@ __ZNK7WebCore5Range19boundaryPointsValidEv
__ZNK7WebCore5Range9endOffsetERi
__ZNK7WebCore5Range9firstNodeEv
__ZNK7WebCore6Chrome12createWindowEPNS_5FrameERKNS_16FrameLoadRequestERKNS_14WindowFeaturesE
+__ZNK7WebCore6Cursor14platformCursorEv
__ZNK7WebCore6Editor13canEditRichlyEv
__ZNK7WebCore6Editor16compositionRangeEv
__ZNK7WebCore6Editor16fontForSelectionERb
diff --git a/WebCore/loader/EmptyClients.h b/WebCore/loader/EmptyClients.h
index e42ee1d..28d195d 100644
--- a/WebCore/loader/EmptyClients.h
+++ b/WebCore/loader/EmptyClients.h
@@ -153,7 +153,7 @@ public:
virtual PassOwnPtr<HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
- virtual bool setCursor(PlatformCursorHandle) { return false; }
+ virtual void setCursor(const Cursor&) { }
virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const {}
@@ -166,6 +166,9 @@ public:
virtual void scheduleCompositingLayerSync() {};
#endif
+#if PLATFORM(WIN)
+ virtual void setLastSetCursorToCurrentCursor() { }
+#endif
#if ENABLE(TOUCH_EVENTS)
virtual void needTouchEvents(bool) { }
#endif
diff --git a/WebCore/page/Chrome.cpp b/WebCore/page/Chrome.cpp
index f2e1d9d..0c66925 100644
--- a/WebCore/page/Chrome.cpp
+++ b/WebCore/page/Chrome.cpp
@@ -426,9 +426,9 @@ void Chrome::chooseIconForFiles(const Vector<String>& filenames, FileChooser* fi
m_client->chooseIconForFiles(filenames, fileChooser);
}
-bool Chrome::setCursor(PlatformCursorHandle cursor)
+void Chrome::setCursor(const Cursor& cursor)
{
- return m_client->setCursor(cursor);
+ m_client->setCursor(cursor);
}
#if ENABLE(NOTIFICATIONS)
diff --git a/WebCore/page/Chrome.h b/WebCore/page/Chrome.h
index 27bde83..537468a 100644
--- a/WebCore/page/Chrome.h
+++ b/WebCore/page/Chrome.h
@@ -69,6 +69,7 @@ namespace WebCore {
virtual IntRect windowToScreen(const IntRect&) const;
virtual PlatformPageClient platformPageClient() const;
virtual void scrollbarsModeDidChange() const;
+ virtual void setCursor(const Cursor&);
void scrollRectIntoView(const IntRect&) const;
@@ -135,8 +136,6 @@ namespace WebCore {
void runOpenPanel(Frame*, PassRefPtr<FileChooser>);
void chooseIconForFiles(const Vector<String>&, FileChooser*);
- bool setCursor(PlatformCursorHandle);
-
#if PLATFORM(MAC)
void focusNSView(NSView*);
#endif
diff --git a/WebCore/page/ChromeClient.h b/WebCore/page/ChromeClient.h
index aade75e..795b25c 100644
--- a/WebCore/page/ChromeClient.h
+++ b/WebCore/page/ChromeClient.h
@@ -135,11 +135,13 @@ namespace WebCore {
virtual IntPoint screenToWindow(const IntPoint&) const = 0;
virtual IntRect windowToScreen(const IntRect&) const = 0;
virtual PlatformPageClient platformPageClient() const = 0;
- virtual void contentsSizeChanged(Frame*, const IntSize&) const = 0;
- virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const = 0; // Currently only Mac has a non empty implementation.
+ virtual void scrollbarsModeDidChange() const = 0;
+ virtual void setCursor(const Cursor&) = 0;
// End methods used by HostWindow.
- virtual void scrollbarsModeDidChange() const = 0;
+ virtual void contentsSizeChanged(Frame*, const IntSize&) const = 0;
+ virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const = 0; // Currently only Mac has a non empty implementation.
+
virtual bool shouldMissingPluginMessageBeButton() const { return false; }
virtual void missingPluginButtonClicked(Element*) const { }
virtual void mouseDidMoveOverElement(const HitTestResult&, unsigned modifierFlags) = 0;
@@ -194,8 +196,6 @@ namespace WebCore {
// Asynchronous request to load an icon for specified filenames.
virtual void chooseIconForFiles(const Vector<String>&, FileChooser*) = 0;
- virtual bool setCursor(PlatformCursorHandle) = 0;
-
// Notification that the given form element has changed. This function
// will be called frequently, so handling should be very fast.
virtual void formStateDidChange(const Node*) = 0;
@@ -236,6 +236,10 @@ namespace WebCore {
virtual void willPopUpMenu(NSMenu *) { }
#endif
+#if PLATFORM(WIN)
+ virtual void setLastSetCursorToCurrentCursor() = 0;
+#endif
+
#if ENABLE(TOUCH_EVENTS)
virtual void needTouchEvents(bool) = 0;
#endif
diff --git a/WebCore/platform/Cursor.cpp b/WebCore/platform/Cursor.cpp
index 794a9dc..3f17ad9 100644
--- a/WebCore/platform/Cursor.cpp
+++ b/WebCore/platform/Cursor.cpp
@@ -46,4 +46,477 @@ IntPoint determineHotSpot(Image* image, const IntPoint& specifiedHotSpot)
return IntPoint();
}
+const Cursor& Cursor::fromType(Cursor::Type type)
+{
+ switch (type) {
+ case Cursor::Pointer:
+ return pointerCursor();
+ case Cursor::Cross:
+ return crossCursor();
+ case Cursor::Hand:
+ return handCursor();
+ case Cursor::IBeam:
+ return iBeamCursor();
+ case Cursor::Wait:
+ return waitCursor();
+ case Cursor::Help:
+ return helpCursor();
+ case Cursor::EastResize:
+ return eastResizeCursor();
+ case Cursor::NorthResize:
+ return northResizeCursor();
+ case Cursor::NorthEastResize:
+ return northEastResizeCursor();
+ case Cursor::NorthWestResize:
+ return northWestResizeCursor();
+ case Cursor::SouthResize:
+ return southResizeCursor();
+ case Cursor::SouthEastResize:
+ return southEastResizeCursor();
+ case Cursor::SouthWestResize:
+ return southWestResizeCursor();
+ case Cursor::WestResize:
+ return westResizeCursor();
+ case Cursor::NorthSouthResize:
+ return northSouthResizeCursor();
+ case Cursor::EastWestResize:
+ return eastWestResizeCursor();
+ case Cursor::NorthEastSouthWestResize:
+ return northEastSouthWestResizeCursor();
+ case Cursor::NorthWestSouthEastResize:
+ return northWestSouthEastResizeCursor();
+ case Cursor::ColumnResize:
+ return columnResizeCursor();
+ case Cursor::RowResize:
+ return rowResizeCursor();
+ case Cursor::MiddlePanning:
+ return middlePanningCursor();
+ case Cursor::EastPanning:
+ return eastPanningCursor();
+ case Cursor::NorthPanning:
+ return northPanningCursor();
+ case Cursor::NorthEastPanning:
+ return northEastPanningCursor();
+ case Cursor::NorthWestPanning:
+ return northWestPanningCursor();
+ case Cursor::SouthPanning:
+ return southPanningCursor();
+ case Cursor::SouthEastPanning:
+ return southEastPanningCursor();
+ case Cursor::SouthWestPanning:
+ return southWestPanningCursor();
+ case Cursor::WestPanning:
+ return westPanningCursor();
+ case Cursor::Move:
+ return moveCursor();
+ case Cursor::VerticalText:
+ return verticalTextCursor();
+ case Cursor::Cell:
+ return cellCursor();
+ case Cursor::ContextMenu:
+ return contextMenuCursor();
+ case Cursor::Alias:
+ return aliasCursor();
+ case Cursor::Progress:
+ return progressCursor();
+ case Cursor::NoDrop:
+ return noDropCursor();
+ case Cursor::Copy:
+ return copyCursor();
+ case Cursor::None:
+ return noneCursor();
+ case Cursor::NotAllowed:
+ return notAllowedCursor();
+ case Cursor::ZoomIn:
+ return zoomInCursor();
+ case Cursor::ZoomOut:
+ return zoomOutCursor();
+ case Cursor::Grab:
+ return grabCursor();
+ case Cursor::Grabbing:
+ return grabbingCursor();
+ case Cursor::Custom:
+ ASSERT_NOT_REACHED();
+ }
+ return pointerCursor();
+}
+
+const char* nameForCursorType(Cursor::Type type)
+{
+ switch (type) {
+ case Cursor::Pointer:
+ return "Pointer";
+ case Cursor::Cross:
+ return "Cross";
+ case Cursor::Hand:
+ return "Hand";
+ case Cursor::IBeam:
+ return "IBeam";
+ case Cursor::Wait:
+ return "Wait";
+ case Cursor::Help:
+ return "Help";
+ case Cursor::EastResize:
+ return "EastResize";
+ case Cursor::NorthResize:
+ return "NorthResize";
+ case Cursor::NorthEastResize:
+ return "NorthEastResize";
+ case Cursor::NorthWestResize:
+ return "NorthWestResize";
+ case Cursor::SouthResize:
+ return "SouthResize";
+ case Cursor::SouthEastResize:
+ return "SouthEastResize";
+ case Cursor::SouthWestResize:
+ return "SouthWestResize";
+ case Cursor::WestResize:
+ return "WestResize";
+ case Cursor::NorthSouthResize:
+ return "NorthSouthResize";
+ case Cursor::EastWestResize:
+ return "EastWestResize";
+ case Cursor::NorthEastSouthWestResize:
+ return "NorthEastSouthWestResize";
+ case Cursor::NorthWestSouthEastResize:
+ return "NorthWestSouthEastResize";
+ case Cursor::ColumnResize:
+ return "ColumnResize";
+ case Cursor::RowResize:
+ return "RowResize";
+ case Cursor::MiddlePanning:
+ return "MiddlePanning";
+ case Cursor::EastPanning:
+ return "EastPanning";
+ case Cursor::NorthPanning:
+ return "NorthPanning";
+ case Cursor::NorthEastPanning:
+ return "NorthEastPanning";
+ case Cursor::NorthWestPanning:
+ return "NorthWestPanning";
+ case Cursor::SouthPanning:
+ return "SouthPanning";
+ case Cursor::SouthEastPanning:
+ return "SouthEastPanning";
+ case Cursor::SouthWestPanning:
+ return "SouthWestPanning";
+ case Cursor::WestPanning:
+ return "WestPanning";
+ case Cursor::Move:
+ return "Move";
+ case Cursor::VerticalText:
+ return "VerticalText";
+ case Cursor::Cell:
+ return "Cell";
+ case Cursor::ContextMenu:
+ return "ContextMenu";
+ case Cursor::Alias:
+ return "Alias";
+ case Cursor::Progress:
+ return "Progress";
+ case Cursor::NoDrop:
+ return "NoDrop";
+ case Cursor::Copy:
+ return "Copy";
+ case Cursor::None:
+ return "None";
+ case Cursor::NotAllowed:
+ return "NotAllowed";
+ case Cursor::ZoomIn:
+ return "ZoomIn";
+ case Cursor::ZoomOut:
+ return "ZoomOut";
+ case Cursor::Grab:
+ return "Grab";
+ case Cursor::Grabbing:
+ return "Grabbing";
+ case Cursor::Custom:
+ return "Custom";
+ }
+
+ return "ERROR";
+}
+
+#if USE(LAZY_NATIVE_CURSOR)
+
+Cursor::Cursor(Image* image, const IntPoint& hotSpot)
+ : m_type(Custom)
+ , m_image(image)
+ , m_hotSpot(determineHotSpot(image, hotSpot))
+ , m_platformCursor(0)
+{
+}
+
+Cursor::Cursor(Type type)
+ : m_type(type)
+ , m_platformCursor(0)
+{
+}
+
+PlatformCursor Cursor::platformCursor() const
+{
+ ensurePlatformCursor();
+ return m_platformCursor;
+}
+
+const Cursor& pointerCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Pointer));
+ return c;
+}
+
+const Cursor& crossCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cross));
+ return c;
+}
+
+const Cursor& handCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Hand));
+ return c;
+}
+
+const Cursor& moveCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Move));
+ return c;
+}
+
+const Cursor& verticalTextCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::VerticalText));
+ return c;
+}
+
+const Cursor& cellCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cell));
+ return c;
+}
+
+const Cursor& contextMenuCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ContextMenu));
+ return c;
+}
+
+const Cursor& aliasCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Alias));
+ return c;
+}
+
+const Cursor& zoomInCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomIn));
+ return c;
+}
+
+const Cursor& zoomOutCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomOut));
+ return c;
+}
+
+const Cursor& copyCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Copy));
+ return c;
+}
+
+const Cursor& noneCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::None));
+ return c;
+}
+
+const Cursor& progressCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Progress));
+ return c;
+}
+
+const Cursor& noDropCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NoDrop));
+ return c;
+}
+
+const Cursor& notAllowedCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NotAllowed));
+ return c;
+}
+
+const Cursor& iBeamCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::IBeam));
+ return c;
+}
+
+const Cursor& waitCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Wait));
+ return c;
+}
+
+const Cursor& helpCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Help));
+ return c;
}
+
+const Cursor& eastResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastResize));
+ return c;
+}
+
+const Cursor& northResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthResize));
+ return c;
+}
+
+const Cursor& northEastResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastResize));
+ return c;
+}
+
+const Cursor& northWestResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestResize));
+ return c;
+}
+
+const Cursor& southResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthResize));
+ return c;
+}
+
+const Cursor& southEastResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastResize));
+ return c;
+}
+
+const Cursor& southWestResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestResize));
+ return c;
+}
+
+const Cursor& westResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestResize));
+ return c;
+}
+
+const Cursor& northSouthResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthSouthResize));
+ return c;
+}
+
+const Cursor& eastWestResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastWestResize));
+ return c;
+}
+
+const Cursor& northEastSouthWestResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastSouthWestResize));
+ return c;
+}
+
+const Cursor& northWestSouthEastResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestSouthEastResize));
+ return c;
+}
+
+const Cursor& columnResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ColumnResize));
+ return c;
+}
+
+const Cursor& rowResizeCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::RowResize));
+ return c;
+}
+
+const Cursor& middlePanningCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::MiddlePanning));
+ return c;
+}
+
+const Cursor& eastPanningCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastPanning));
+ return c;
+}
+
+const Cursor& northPanningCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthPanning));
+ return c;
+}
+
+const Cursor& northEastPanningCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastPanning));
+ return c;
+}
+
+const Cursor& northWestPanningCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestPanning));
+ return c;
+}
+
+const Cursor& southPanningCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthPanning));
+ return c;
+}
+
+const Cursor& southEastPanningCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastPanning));
+ return c;
+}
+
+const Cursor& southWestPanningCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestPanning));
+ return c;
+}
+
+const Cursor& westPanningCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestPanning));
+ return c;
+}
+
+const Cursor& grabCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grab));
+ return c;
+}
+
+const Cursor& grabbingCursor()
+{
+ DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grabbing));
+ return c;
+}
+
+#endif
+
+} // namespace WebCore
diff --git a/WebCore/platform/Cursor.h b/WebCore/platform/Cursor.h
index 12b1614..98d69b9 100644
--- a/WebCore/platform/Cursor.h
+++ b/WebCore/platform/Cursor.h
@@ -26,12 +26,15 @@
#ifndef Cursor_h
#define Cursor_h
+#include "Image.h"
+#include "IntPoint.h"
+#include <wtf/RefPtr.h>
+
#if PLATFORM(WIN)
typedef struct HICON__* HICON;
typedef HICON HCURSOR;
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
-#include <wtf/RefPtr.h>
#elif PLATFORM(GTK)
typedef struct _GdkCursor GdkCursor;
#elif PLATFORM(QT)
@@ -59,10 +62,13 @@ typedef struct HICON__ *HICON;
typedef HICON HCURSOR;
#endif
+#if PLATFORM(WIN) || PLATFORM(MAC)
+#define WTF_USE_LAZY_NATIVE_CURSOR 1
+#endif
+
namespace WebCore {
class Image;
- class IntPoint;
#if PLATFORM(WIN)
class SharedCursor : public RefCounted<SharedCursor> {
@@ -75,55 +81,113 @@ namespace WebCore {
HCURSOR m_nativeCursor;
};
typedef RefPtr<SharedCursor> PlatformCursor;
- typedef HCURSOR PlatformCursorHandle;
#elif PLATFORM(MAC)
typedef NSCursor* PlatformCursor;
- typedef NSCursor* PlatformCursorHandle;
#elif PLATFORM(GTK)
typedef GdkCursor* PlatformCursor;
- typedef GdkCursor* PlatformCursorHandle;
#elif PLATFORM(EFL)
typedef const char* PlatformCursor;
- typedef const char* PlatformCursorHandle;
#elif PLATFORM(QT) && !defined(QT_NO_CURSOR)
typedef QCursor PlatformCursor;
- typedef QCursor* PlatformCursorHandle;
#elif PLATFORM(WX)
typedef wxCursor* PlatformCursor;
- typedef wxCursor* PlatformCursorHandle;
#elif PLATFORM(CHROMIUM)
// See PlatformCursor.h
- typedef void* PlatformCursorHandle;
#elif PLATFORM(HAIKU)
typedef BCursor* PlatformCursor;
- typedef BCursor* PlatformCursorHandle;
#else
typedef void* PlatformCursor;
- typedef void* PlatformCursorHandle;
#endif
class Cursor {
public:
+ enum Type {
+ Pointer,
+ Cross,
+ Hand,
+ IBeam,
+ Wait,
+ Help,
+ EastResize,
+ NorthResize,
+ NorthEastResize,
+ NorthWestResize,
+ SouthResize,
+ SouthEastResize,
+ SouthWestResize,
+ WestResize,
+ NorthSouthResize,
+ EastWestResize,
+ NorthEastSouthWestResize,
+ NorthWestSouthEastResize,
+ ColumnResize,
+ RowResize,
+ MiddlePanning,
+ EastPanning,
+ NorthPanning,
+ NorthEastPanning,
+ NorthWestPanning,
+ SouthPanning,
+ SouthEastPanning,
+ SouthWestPanning,
+ WestPanning,
+ Move,
+ VerticalText,
+ Cell,
+ ContextMenu,
+ Alias,
+ Progress,
+ NoDrop,
+ Copy,
+ None,
+ NotAllowed,
+ ZoomIn,
+ ZoomOut,
+ Grab,
+ Grabbing,
+ Custom
+ };
+
+ static const Cursor& fromType(Cursor::Type);
+
Cursor()
#if !PLATFORM(QT) && !PLATFORM(EFL)
- : m_impl(0)
+ : m_platformCursor(0)
#endif
- { }
+ {
+ }
Cursor(Image*, const IntPoint& hotSpot);
Cursor(const Cursor&);
~Cursor();
Cursor& operator=(const Cursor&);
+#if USE(LAZY_NATIVE_CURSOR)
+ Cursor(Type);
+ Type type() const { return m_type; }
+ Image* image() const { return m_image.get(); }
+ const IntPoint& hotSpot() const { return m_hotSpot; }
+ PlatformCursor platformCursor() const;
+#else
Cursor(PlatformCursor);
- PlatformCursor impl() const { return m_impl; }
+ PlatformCursor impl() const { return m_platformCursor; }
+#endif
private:
- PlatformCursor m_impl;
+#if USE(LAZY_NATIVE_CURSOR)
+ void ensurePlatformCursor() const;
+
+ Type m_type;
+ RefPtr<Image> m_image;
+ IntPoint m_hotSpot;
+#endif
+
+ mutable PlatformCursor m_platformCursor;
};
IntPoint determineHotSpot(Image*, const IntPoint& specifiedHotSpot);
-
+ const char* nameForCursorType(Cursor::Type);
+
const Cursor& pointerCursor();
const Cursor& crossCursor();
const Cursor& handCursor();
diff --git a/WebCore/platform/HostWindow.h b/WebCore/platform/HostWindow.h
index e7316a7..b0ee653 100644
--- a/WebCore/platform/HostWindow.h
+++ b/WebCore/platform/HostWindow.h
@@ -31,6 +31,8 @@
namespace WebCore {
+class Cursor;
+
class HostWindow : public Noncopyable {
public:
virtual ~HostWindow() { }
@@ -56,6 +58,9 @@ public:
// To notify WebKit of scrollbar mode changes.
virtual void scrollbarsModeDidChange() const = 0;
+
+ // Request that the cursor change.
+ virtual void setCursor(const Cursor&) = 0;
};
} // namespace WebCore
diff --git a/WebCore/platform/chromium/CursorChromium.cpp b/WebCore/platform/chromium/CursorChromium.cpp
index 16fa634..0119f07 100644
--- a/WebCore/platform/chromium/CursorChromium.cpp
+++ b/WebCore/platform/chromium/CursorChromium.cpp
@@ -34,12 +34,12 @@
namespace WebCore {
Cursor::Cursor(const Cursor& other)
- : m_impl(other.m_impl)
+ : m_platformCursor(other.m_platformCursor)
{
}
Cursor::Cursor(Image* image, const IntPoint& hotSpot)
- : m_impl(image, hotSpot)
+ : m_platformCursor(image, hotSpot)
{
}
@@ -49,12 +49,12 @@ Cursor::~Cursor()
Cursor& Cursor::operator=(const Cursor& other)
{
- m_impl = other.m_impl;
+ m_platformCursor = other.m_platformCursor;
return *this;
}
Cursor::Cursor(PlatformCursor c)
- : m_impl(c)
+ : m_platformCursor(c)
{
}
diff --git a/WebCore/platform/efl/CursorEfl.cpp b/WebCore/platform/efl/CursorEfl.cpp
index c88830e..47141f9 100644
--- a/WebCore/platform/efl/CursorEfl.cpp
+++ b/WebCore/platform/efl/CursorEfl.cpp
@@ -45,33 +45,33 @@ namespace WebCore {
Cursor::Cursor(PlatformCursor p)
{
- m_impl = eina_stringshare_add(p);
+ m_platformCursor = eina_stringshare_add(p);
}
Cursor::Cursor(const Cursor& other)
{
- m_impl = eina_stringshare_ref(other.m_impl);
+ m_platformCursor = eina_stringshare_ref(other.m_platformCursor);
}
Cursor::~Cursor()
{
- if (m_impl) {
- eina_stringshare_del(m_impl);
- m_impl = 0;
+ if (m_platformCursor) {
+ eina_stringshare_del(m_platformCursor);
+ m_platformCursor = 0;
}
}
Cursor::Cursor(Image* image, const IntPoint& hotspot)
- : m_impl(0)
+ : m_platformCursor(0)
{
notImplemented();
}
Cursor& Cursor::operator=(const Cursor& other)
{
- eina_stringshare_ref(other.m_impl);
- eina_stringshare_del(m_impl);
- m_impl = other.m_impl;
+ eina_stringshare_ref(other.m_platformCursor);
+ eina_stringshare_del(m_platformCursor);
+ m_platformCursor = other.m_platformCursor;
return *this;
}
diff --git a/WebCore/platform/gtk/CursorGtk.cpp b/WebCore/platform/gtk/CursorGtk.cpp
index 017e486..a535f0c 100644
--- a/WebCore/platform/gtk/CursorGtk.cpp
+++ b/WebCore/platform/gtk/CursorGtk.cpp
@@ -57,38 +57,38 @@ static GdkCursor* customCursorNew(CustomCursorType cursorType)
Cursor::Cursor(const Cursor& other)
- : m_impl(other.m_impl)
+ : m_platformCursor(other.m_platformCursor)
{
- if (m_impl)
- gdk_cursor_ref(m_impl);
+ if (m_platformCursor)
+ gdk_cursor_ref(m_platformCursor);
}
Cursor::Cursor(Image* image, const IntPoint& hotSpot)
{
IntPoint effectiveHotSpot = determineHotSpot(image, hotSpot);
GdkPixbuf* pixbuf = image->getGdkPixbuf();
- m_impl = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pixbuf, effectiveHotSpot.x(), effectiveHotSpot.y());
+ m_platformCursor = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pixbuf, effectiveHotSpot.x(), effectiveHotSpot.y());
g_object_unref(pixbuf);
}
Cursor::~Cursor()
{
- if (m_impl)
- gdk_cursor_unref(m_impl);
+ if (m_platformCursor)
+ gdk_cursor_unref(m_platformCursor);
}
Cursor& Cursor::operator=(const Cursor& other)
{
- gdk_cursor_ref(other.m_impl);
- gdk_cursor_unref(m_impl);
- m_impl = other.m_impl;
+ gdk_cursor_ref(other.m_platformCursor);
+ gdk_cursor_unref(m_platformCursor);
+ m_platformCursor = other.m_platformCursor;
return *this;
}
Cursor::Cursor(GdkCursor* c)
- : m_impl(c)
+ : m_platformCursor(c)
{
- m_impl = c;
+ m_platformCursor = c;
// The GdkCursor may be NULL - the default cursor for the window.
if (c)
diff --git a/WebCore/platform/haiku/CursorHaiku.cpp b/WebCore/platform/haiku/CursorHaiku.cpp
index 21d678a..58833bc 100644
--- a/WebCore/platform/haiku/CursorHaiku.cpp
+++ b/WebCore/platform/haiku/CursorHaiku.cpp
@@ -34,31 +34,31 @@
namespace WebCore {
Cursor::Cursor(PlatformCursor cursor)
- : m_impl(cursor)
+ : m_platformCursor(cursor)
{
}
Cursor::Cursor(const Cursor& other)
- : m_impl(0)
+ : m_platformCursor(0)
{
*this = other;
}
Cursor::~Cursor()
{
- delete m_impl;
+ delete m_platformCursor;
}
Cursor::Cursor(Image*, const IntPoint&)
- : m_impl(0)
+ : m_platformCursor(0)
{
notImplemented();
}
Cursor& Cursor::operator=(const Cursor& other)
{
- delete m_impl;
- m_impl = other.m_impl ? new BCursor(*other.m_impl) : 0;
+ delete m_platformCursor;
+ m_platformCursor = other.m_platformCursor ? new BCursor(*other.m_platformCursor) : 0;
return *this;
}
diff --git a/WebCore/platform/mac/CursorMac.mm b/WebCore/platform/mac/CursorMac.mm
index 8cd54a1..1b985c5 100644
--- a/WebCore/platform/mac/CursorMac.mm
+++ b/WebCore/platform/mac/CursorMac.mm
@@ -28,8 +28,6 @@
#import "BlockExceptions.h"
#import "FoundationExtras.h"
-#import "Image.h"
-#import "IntPoint.h"
#import <wtf/StdLibExtras.h>
@interface WebCoreCursorBundle : NSObject { }
@@ -50,7 +48,7 @@ static NSCursor* createCustomCursor(Image* image, const IntPoint& hotSpot)
if (!img)
return 0;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
- return [[NSCursor alloc] initWithImage:img hotSpot:determineHotSpot(image, hotSpot)];
+ return [[NSCursor alloc] initWithImage:img hotSpot:hotSpot];
END_BLOCK_OBJC_EXCEPTIONS;
return 0;
}
@@ -76,281 +74,152 @@ static NSCursor* leakNamedCursor(const char* name, int x, int y)
return nil;
}
-Cursor::Cursor(Image* image, const IntPoint& hotSpot)
- : m_impl(HardRetainWithNSRelease(createCustomCursor(image, hotSpot)))
-{
+void Cursor::ensurePlatformCursor() const
+{
+ if (m_platformCursor)
+ return;
+
+ switch (m_type) {
+ case Cursor::Pointer:
+ m_platformCursor = HardRetain([NSCursor arrowCursor]);
+ break;
+ case Cursor::Cross:
+ m_platformCursor = HardRetain(leakNamedCursor("crossHairCursor", 11, 11));
+ break;
+ case Cursor::Hand:
+ m_platformCursor = HardRetain(leakNamedCursor("linkCursor", 6, 1));
+ break;
+ case Cursor::IBeam:
+ m_platformCursor = HardRetain([NSCursor IBeamCursor]);
+ break;
+ case Cursor::Wait:
+ m_platformCursor = HardRetain(leakNamedCursor("waitCursor", 7, 7));
+ break;
+ case Cursor::Help:
+ m_platformCursor = HardRetain(leakNamedCursor("helpCursor", 8, 8));
+ break;
+ case Cursor::Move:
+ case Cursor::MiddlePanning:
+ m_platformCursor = HardRetain(leakNamedCursor("moveCursor", 7, 7));
+ break;
+ case Cursor::EastResize:
+ case Cursor::EastPanning:
+ m_platformCursor = HardRetain(leakNamedCursor("eastResizeCursor", 14, 7));
+ break;
+ case Cursor::NorthResize:
+ case Cursor::NorthPanning:
+ m_platformCursor = HardRetain(leakNamedCursor("northResizeCursor", 7, 1));
+ break;
+ case Cursor::NorthEastResize:
+ case Cursor::NorthEastPanning:
+ m_platformCursor = HardRetain(leakNamedCursor("northEastResizeCursor", 14, 1));
+ break;
+ case Cursor::NorthWestResize:
+ case Cursor::NorthWestPanning:
+ m_platformCursor = HardRetain(leakNamedCursor("northWestResizeCursor", 0, 0));
+ break;
+ case Cursor::SouthResize:
+ case Cursor::SouthPanning:
+ m_platformCursor = HardRetain(leakNamedCursor("southResizeCursor", 7, 14));
+ break;
+ case Cursor::SouthEastResize:
+ case Cursor::SouthEastPanning:
+ m_platformCursor = HardRetain(leakNamedCursor("southEastResizeCursor", 14, 14));
+ break;
+ case Cursor::SouthWestResize:
+ case Cursor::SouthWestPanning:
+ m_platformCursor = HardRetain(leakNamedCursor("southWestResizeCursor", 1, 14));
+ break;
+ case Cursor::WestResize:
+ m_platformCursor = HardRetain(leakNamedCursor("westResizeCursor", 1, 7));
+ break;
+ case Cursor::NorthSouthResize:
+ m_platformCursor = HardRetain(leakNamedCursor("northSouthResizeCursor", 7, 7));
+ break;
+ case Cursor::EastWestResize:
+ case Cursor::WestPanning:
+ m_platformCursor = HardRetain(leakNamedCursor("eastWestResizeCursor", 7, 7));
+ break;
+ case Cursor::NorthEastSouthWestResize:
+ m_platformCursor = HardRetain(leakNamedCursor("northEastSouthWestResizeCursor", 7, 7));
+ break;
+ case Cursor::NorthWestSouthEastResize:
+ m_platformCursor = HardRetain(leakNamedCursor("northWestSouthEastResizeCursor", 7, 7));
+ break;
+ case Cursor::ColumnResize:
+ m_platformCursor = [NSCursor resizeLeftRightCursor];
+ break;
+ case Cursor::RowResize:
+ m_platformCursor = [NSCursor resizeUpDownCursor];
+ break;
+ case Cursor::VerticalText:
+ m_platformCursor = HardRetain(leakNamedCursor("verticalTextCursor", 7, 7));
+ break;
+ case Cursor::Cell:
+ m_platformCursor = HardRetain(leakNamedCursor("cellCursor", 7, 7));
+ break;
+ case Cursor::ContextMenu:
+ m_platformCursor = HardRetain(leakNamedCursor("contextMenuCursor", 3, 2));
+ break;
+ case Cursor::Alias:
+ m_platformCursor = HardRetain(leakNamedCursor("aliasCursor", 11, 3));
+ break;
+ case Cursor::Progress:
+ m_platformCursor = HardRetain(leakNamedCursor("progressCursor", 3, 2));
+ break;
+ case Cursor::NoDrop:
+ m_platformCursor = HardRetain(leakNamedCursor("noDropCursor", 3, 1));
+ break;
+ case Cursor::Copy:
+ m_platformCursor = HardRetain(leakNamedCursor("copyCursor", 3, 2));
+ break;
+ case Cursor::None:
+ m_platformCursor = HardRetain(leakNamedCursor("noneCursor", 7, 7));
+ break;
+ case Cursor::NotAllowed:
+ m_platformCursor = HardRetain(leakNamedCursor("notAllowedCursor", 11, 11));
+ break;
+ case Cursor::ZoomIn:
+ m_platformCursor = HardRetain(leakNamedCursor("zoomInCursor", 7, 7));
+ break;
+ case Cursor::ZoomOut:
+ m_platformCursor = HardRetain(leakNamedCursor("zoomOutCursor", 7, 7));
+ break;
+ case Cursor::Grab:
+ m_platformCursor = HardRetain([NSCursor openHandCursor]);
+ break;
+ case Cursor::Grabbing:
+ m_platformCursor = HardRetain([NSCursor closedHandCursor]);
+ break;
+ case Cursor::Custom:
+ m_platformCursor = HardRetainWithNSRelease(createCustomCursor(m_image.get(), m_hotSpot));
+ break;
+ }
}
Cursor::Cursor(const Cursor& other)
- : m_impl(HardRetain(other.m_impl))
+ : m_type(other.m_type)
+ , m_image(other.m_image)
+ , m_hotSpot(other.m_hotSpot)
+ , m_platformCursor(HardRetain(other.m_platformCursor))
{
}
-Cursor::~Cursor()
-{
- HardRelease(m_impl);
-}
-
Cursor& Cursor::operator=(const Cursor& other)
{
- HardRetain(other.m_impl);
- HardRelease(m_impl);
- m_impl = other.m_impl;
- return *this;
-}
-
-Cursor::Cursor(NSCursor* c)
- : m_impl(HardRetain(c))
-{
-}
-
-const Cursor& pointerCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor arrowCursor]));
- return c;
-}
-
-const Cursor& crossCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("crossHairCursor", 11, 11)));
- return c;
-}
-
-const Cursor& handCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("linkCursor", 6, 1)));
- return c;
-}
-
-const Cursor& moveCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("moveCursor", 7, 7)));
- return c;
-}
-
-const Cursor& verticalTextCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("verticalTextCursor", 7, 7)));
- return c;
-}
-
-const Cursor& cellCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("cellCursor", 7, 7)));
- return c;
-}
-
-const Cursor& contextMenuCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("contextMenuCursor", 3, 2)));
- return c;
-}
-
-const Cursor& aliasCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("aliasCursor", 11, 3)));
- return c;
-}
-
-const Cursor& zoomInCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("zoomInCursor", 7, 7)));
- return c;
-}
-
-const Cursor& zoomOutCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("zoomOutCursor", 7, 7)));
- return c;
-}
-
-const Cursor& copyCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("copyCursor", 3, 2)));
- return c;
-}
-
-const Cursor& noneCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("noneCursor", 7, 7)));
- return c;
-}
-
-const Cursor& progressCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("progressCursor", 3, 2)));
- return c;
-}
-
-const Cursor& noDropCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("noDropCursor", 3, 1)));
- return c;
-}
-
-const Cursor& notAllowedCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("notAllowedCursor", 11, 11)));
- return c;
-}
-
-const Cursor& iBeamCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor IBeamCursor]));
- return c;
-}
-
-const Cursor& waitCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("waitCursor", 7, 7)));
- return c;
-}
-
-const Cursor& helpCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("helpCursor", 8, 8)));
- return c;
-}
-
-const Cursor& eastResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("eastResizeCursor", 14, 7)));
- return c;
-}
-
-const Cursor& northResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northResizeCursor", 7, 1)));
- return c;
-}
-
-const Cursor& northEastResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northEastResizeCursor", 14, 1)));
- return c;
-}
-
-const Cursor& northWestResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northWestResizeCursor", 0, 0)));
- return c;
-}
-
-const Cursor& southResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("southResizeCursor", 7, 14)));
- return c;
-}
-
-const Cursor& southEastResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("southEastResizeCursor", 14, 14)));
- return c;
-}
-
-const Cursor& southWestResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("southWestResizeCursor", 1, 14)));
- return c;
-}
-
-const Cursor& westResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("westResizeCursor", 1, 7)));
- return c;
-}
-
-const Cursor& northSouthResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northSouthResizeCursor", 7, 7)));
- return c;
-}
-
-const Cursor& eastWestResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("eastWestResizeCursor", 7, 7)));
- return c;
-}
-
-const Cursor& northEastSouthWestResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northEastSouthWestResizeCursor", 7, 7)));
- return c;
-}
+ m_type = other.m_type;
+ m_image = other.m_image;
+ m_hotSpot = other.m_hotSpot;
-const Cursor& northWestSouthEastResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northWestSouthEastResizeCursor", 7, 7)));
- return c;
-}
-
-const Cursor& columnResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor resizeLeftRightCursor]));
- return c;
-}
-
-const Cursor& rowResizeCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor resizeUpDownCursor]));
- return c;
-}
-
-const Cursor& middlePanningCursor()
-{
- return moveCursor();
-}
-
-const Cursor& eastPanningCursor()
-{
- return eastResizeCursor();
-}
-
-const Cursor& northPanningCursor()
-{
- return northResizeCursor();
-}
-
-const Cursor& northEastPanningCursor()
-{
- return northEastResizeCursor();
-}
-
-const Cursor& northWestPanningCursor()
-{
- return northWestResizeCursor();
-}
-
-const Cursor& southPanningCursor()
-{
- return southResizeCursor();
-}
-
-const Cursor& southEastPanningCursor()
-{
- return southEastResizeCursor();
-}
-
-const Cursor& southWestPanningCursor()
-{
- return southWestResizeCursor();
-}
-
-const Cursor& westPanningCursor()
-{
- return westResizeCursor();
-}
-
-const Cursor& grabCursor()
-{
- DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor openHandCursor]));
- return c;
+ HardRetain(other.m_platformCursor);
+ HardRelease(m_platformCursor);
+ m_platformCursor = other.m_platformCursor;
+ return *this;
}
-const Cursor& grabbingCursor()
+Cursor::~Cursor()
{
- DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor closedHandCursor]));
- return c;
+ HardRelease(m_platformCursor);
}
-}
+} // namespace WebCore
diff --git a/WebCore/platform/mac/WidgetMac.mm b/WebCore/platform/mac/WidgetMac.mm
index 37c9e9f..2598591 100644
--- a/WebCore/platform/mac/WidgetMac.mm
+++ b/WebCore/platform/mac/WidgetMac.mm
@@ -123,11 +123,12 @@ void Widget::setFocus(bool focused)
END_BLOCK_OBJC_EXCEPTIONS;
}
- void Widget::setCursor(const Cursor& cursor)
- {
- if ([NSCursor currentCursor] == cursor.impl())
+void Widget::setCursor(const Cursor& cursor)
+{
+ ScrollView* view = root();
+ if (!view)
return;
- [cursor.impl() set];
+ view->hostWindow()->setCursor(cursor);
}
void Widget::show()
diff --git a/WebCore/platform/qt/CursorQt.cpp b/WebCore/platform/qt/CursorQt.cpp
index 2e495e7..6017daa 100644
--- a/WebCore/platform/qt/CursorQt.cpp
+++ b/WebCore/platform/qt/CursorQt.cpp
@@ -44,12 +44,12 @@
namespace WebCore {
Cursor::Cursor(PlatformCursor p)
- : m_impl(p)
+ : m_platformCursor(p)
{
}
Cursor::Cursor(const Cursor& other)
- : m_impl(other.m_impl)
+ : m_platformCursor(other.m_platformCursor)
{
}
@@ -61,13 +61,13 @@ Cursor::Cursor(Image* image, const IntPoint& hotSpot)
{
#ifndef QT_NO_CURSOR
IntPoint effectiveHotSpot = determineHotSpot(image, hotSpot);
- m_impl = QCursor(*(image->nativeImageForCurrentFrame()), effectiveHotSpot.x(), effectiveHotSpot.y());
+ m_platformCursor = QCursor(*(image->nativeImageForCurrentFrame()), effectiveHotSpot.x(), effectiveHotSpot.y());
#endif
}
Cursor& Cursor::operator=(const Cursor& other)
{
- m_impl = other.m_impl;
+ m_platformCursor = other.m_platformCursor;
return *this;
}
diff --git a/WebCore/platform/win/CursorWin.cpp b/WebCore/platform/win/CursorWin.cpp
index 22a535d..2dd1452 100644
--- a/WebCore/platform/win/CursorWin.cpp
+++ b/WebCore/platform/win/CursorWin.cpp
@@ -39,11 +39,6 @@
namespace WebCore {
-Cursor::Cursor(const Cursor& other)
- : m_impl(other.m_impl)
-{
-}
-
static inline bool supportsAlphaCursors()
{
OSVERSIONINFO osinfo = {0};
@@ -52,8 +47,10 @@ static inline bool supportsAlphaCursors()
return osinfo.dwMajorVersion > 5 || (osinfo.dwMajorVersion == 5 && osinfo.dwMinorVersion > 0);
}
-Cursor::Cursor(Image* img, const IntPoint& hotSpot)
+static PassRefPtr<SharedCursor> createSharedCursor(Image* img, const IntPoint& hotSpot)
{
+ RefPtr<SharedCursor> impl;
+
IntPoint effectiveHotSpot = determineHotSpot(img, hotSpot);
static bool doAlpha = supportsAlphaCursors();
BitmapInfo cursorImage = BitmapInfo::create(IntSize(img->width(), img->height()));
@@ -80,7 +77,7 @@ Cursor::Cursor(Image* img, const IntPoint& hotSpot)
ii.hbmMask = hMask.get();
ii.hbmColor = hCursor.get();
- m_impl = SharedCursor::create(CreateIconIndirect(&ii));
+ impl = SharedCursor::create(CreateIconIndirect(&ii));
} else {
// Platform doesn't support alpha blended cursors, so we need
// to create the mask manually
@@ -115,303 +112,183 @@ Cursor::Cursor(Image* img, const IntPoint& hotSpot)
icon.yHotspot = effectiveHotSpot.y();
icon.hbmMask = andMask.get();
icon.hbmColor = xorMask.get();
- m_impl = SharedCursor::create(CreateIconIndirect(&icon));
+ impl = SharedCursor::create(CreateIconIndirect(&icon));
DeleteDC(xorMaskDC);
DeleteDC(andMaskDC);
}
DeleteDC(workingDC);
ReleaseDC(0, dc);
-}
-Cursor::~Cursor()
-{
+ return impl.release();
}
-Cursor& Cursor::operator=(const Cursor& other)
-{
- m_impl = other.m_impl;
- return *this;
-}
-
-Cursor::Cursor(PlatformCursor c)
- : m_impl(c)
+static PassRefPtr<SharedCursor> loadSharedCursor(HINSTANCE hInstance, LPCTSTR lpCursorName)
{
+ return SharedCursor::create(::LoadCursor(hInstance, lpCursorName));
}
-static Cursor loadCursorByName(char* name, int x, int y)
+static PassRefPtr<SharedCursor> loadCursorByName(char* name, int x, int y)
{
IntPoint hotSpot(x, y);
- Cursor c;
RefPtr<Image> cursorImage(Image::loadPlatformResource(name));
- if (cursorImage && !cursorImage->isNull())
- c = Cursor(cursorImage.get(), hotSpot);
- else
- c = pointerCursor();
- return c;
-}
-
-static PassRefPtr<SharedCursor> loadSharedCursor(HINSTANCE hInstance, LPCTSTR lpCursorName)
-{
- return SharedCursor::create(LoadCursor(hInstance, lpCursorName));
-}
-
-const Cursor& pointerCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_ARROW);
- return c;
-}
-
-const Cursor& crossCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_CROSS);
- return c;
-}
-
-const Cursor& handCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_HAND);
- return c;
-}
-
-const Cursor& iBeamCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_IBEAM);
- return c;
-}
-
-const Cursor& waitCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_WAIT);
- return c;
-}
-
-const Cursor& helpCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_HELP);
- return c;
-}
-
-const Cursor& eastResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZEWE);
- return c;
-}
-
-const Cursor& northResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZENS);
- return c;
-}
-
-const Cursor& northEastResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZENESW);
- return c;
-}
-
-const Cursor& northWestResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZENWSE);
- return c;
-}
-
-const Cursor& southResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZENS);
- return c;
-}
-
-const Cursor& southEastResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZENWSE);
- return c;
-}
-
-const Cursor& southWestResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZENESW);
- return c;
-}
-
-const Cursor& westResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZEWE);
- return c;
-}
-
-const Cursor& northSouthResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZENS);
- return c;
-}
-
-const Cursor& eastWestResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZEWE);
- return c;
-}
-
-const Cursor& northEastSouthWestResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZENESW);
- return c;
-}
-
-const Cursor& northWestSouthEastResizeCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZENWSE);
- return c;
-}
-
-const Cursor& columnResizeCursor()
-{
- // FIXME: Windows does not have a standard column resize cursor <rdar://problem/5018591>
- static Cursor c = loadSharedCursor(0, IDC_SIZEWE);
- return c;
-}
-
-const Cursor& rowResizeCursor()
-{
- // FIXME: Windows does not have a standard row resize cursor <rdar://problem/5018591>
- static Cursor c = loadSharedCursor(0, IDC_SIZENS);
- return c;
-}
-
-const Cursor& middlePanningCursor()
-{
- static const Cursor c = loadCursorByName("panIcon", 8, 8);
- return c;
-}
-
-const Cursor& eastPanningCursor()
-{
- static const Cursor c = loadCursorByName("panEastCursor", 7, 7);
- return c;
-}
-
-const Cursor& northPanningCursor()
-{
- static const Cursor c = loadCursorByName("panNorthCursor", 7, 7);
- return c;
-}
-
-const Cursor& northEastPanningCursor()
-{
- static const Cursor c = loadCursorByName("panNorthEastCursor", 7, 7);
- return c;
-}
-
-const Cursor& northWestPanningCursor()
-{
- static const Cursor c = loadCursorByName("panNorthWestCursor", 7, 7);
- return c;
-}
-
-const Cursor& southPanningCursor()
-{
- static const Cursor c = loadCursorByName("panSouthCursor", 7, 7);
- return c;
-}
-
-const Cursor& southEastPanningCursor()
-{
- static const Cursor c = loadCursorByName("panSouthEastCursor", 7, 7);
- return c;
-}
-
-const Cursor& southWestPanningCursor()
-{
- static const Cursor c = loadCursorByName("panSouthWestCursor", 7, 7);
- return c;
-}
-
-const Cursor& westPanningCursor()
-{
- static const Cursor c = loadCursorByName("panWestCursor", 7, 7);
- return c;
-}
-
-const Cursor& moveCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_SIZEALL);
- return c;
-}
-
-const Cursor& verticalTextCursor()
-{
- static const Cursor c = loadCursorByName("verticalTextCursor", 7, 7);
- return c;
-}
-
-const Cursor& cellCursor()
-{
- return pointerCursor();
-}
-
-const Cursor& contextMenuCursor()
-{
- return pointerCursor();
-}
-
-const Cursor& aliasCursor()
-{
- return pointerCursor();
-}
-
-const Cursor& progressCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_APPSTARTING);
- return c;
-}
-
-const Cursor& noDropCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_NO);
- return c;
-}
-
-const Cursor& copyCursor()
-{
- return pointerCursor();
-}
-
-const Cursor& noneCursor()
-{
- return pointerCursor();
-}
-
-const Cursor& notAllowedCursor()
-{
- static Cursor c = loadSharedCursor(0, IDC_NO);
- return c;
-}
-
-const Cursor& zoomInCursor()
-{
- static const Cursor c = loadCursorByName("zoomInCursor", 7, 7);
- return c;
+ if (cursorImage && !cursorImage->isNull())
+ return createSharedCursor(cursorImage.get(), hotSpot);
+ return loadSharedCursor(0, IDC_ARROW);
+}
+
+void Cursor::ensurePlatformCursor() const
+{
+ if (m_platformCursor)
+ return;
+
+ switch (m_type) {
+ case Cursor::Pointer:
+ case Cursor::Cell:
+ case Cursor::ContextMenu:
+ case Cursor::Alias:
+ case Cursor::Copy:
+ case Cursor::None:
+ case Cursor::Grab:
+ case Cursor::Grabbing:
+ m_platformCursor = loadSharedCursor(0, IDC_ARROW);
+ break;
+ case Cursor::Cross:
+ m_platformCursor = loadSharedCursor(0, IDC_CROSS);
+ break;
+ case Cursor::Hand:
+ m_platformCursor = loadSharedCursor(0, IDC_HAND);
+ break;
+ case Cursor::IBeam:
+ m_platformCursor = loadSharedCursor(0, IDC_IBEAM);
+ break;
+ case Cursor::Wait:
+ m_platformCursor = loadSharedCursor(0, IDC_WAIT);
+ break;
+ case Cursor::Help:
+ m_platformCursor = loadSharedCursor(0, IDC_HELP);
+ break;
+ case Cursor::Move:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZEALL);
+ break;
+ case Cursor::MiddlePanning:
+ m_platformCursor = loadCursorByName("panIcon", 8, 8);
+ break;
+ case Cursor::EastResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZEWE);
+ break;
+ case Cursor::EastPanning:
+ m_platformCursor = loadCursorByName("panEastCursor", 7, 7);
+ break;
+ case Cursor::NorthResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENS);
+ break;
+ case Cursor::NorthPanning:
+ m_platformCursor = loadCursorByName("panNorthCursor", 7, 7);
+ break;
+ case Cursor::NorthEastResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENESW);
+ break;
+ case Cursor::NorthEastPanning:
+ m_platformCursor = loadCursorByName("panNorthEastCursor", 7, 7);
+ break;
+ case Cursor::NorthWestResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENWSE);
+ break;
+ case Cursor::NorthWestPanning:
+ m_platformCursor = loadCursorByName("panNorthWestCursor", 7, 7);
+ break;
+ case Cursor::SouthResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENS);
+ break;
+ case Cursor::SouthPanning:
+ m_platformCursor = loadCursorByName("panSouthCursor", 7, 7);
+ break;
+ case Cursor::SouthEastResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENWSE);
+ break;
+ case Cursor::SouthEastPanning:
+ m_platformCursor = loadCursorByName("panSouthEastCursor", 7, 7);
+ break;
+ case Cursor::SouthWestResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENESW);
+ break;
+ case Cursor::SouthWestPanning:
+ m_platformCursor = loadCursorByName("panSouthWestCursor", 7, 7);
+ break;
+ case Cursor::WestResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZEWE);
+ break;
+ case Cursor::NorthSouthResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENS);
+ break;
+ case Cursor::EastWestResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZEWE);
+ break;
+ case Cursor::WestPanning:
+ m_platformCursor = loadCursorByName("panWestCursor", 7, 7);
+ break;
+ case Cursor::NorthEastSouthWestResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENESW);
+ break;
+ case Cursor::NorthWestSouthEastResize:
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENWSE);
+ break;
+ case Cursor::ColumnResize:
+ // FIXME: Windows does not have a standard column resize cursor <rdar://problem/5018591>
+ m_platformCursor = loadSharedCursor(0, IDC_SIZEWE);
+ break;
+ case Cursor::RowResize:
+ // FIXME: Windows does not have a standard row resize cursor <rdar://problem/5018591>
+ m_platformCursor = loadSharedCursor(0, IDC_SIZENS);
+ break;
+ case Cursor::VerticalText:
+ m_platformCursor = loadCursorByName("verticalTextCursor", 7, 7);
+ break;
+ case Cursor::Progress:
+ m_platformCursor = loadSharedCursor(0, IDC_APPSTARTING);
+ break;
+ case Cursor::NoDrop:
+ break;
+ case Cursor::NotAllowed:
+ m_platformCursor = loadSharedCursor(0, IDC_NO);
+ break;
+ case Cursor::ZoomIn:
+ m_platformCursor = loadCursorByName("zoomInCursor", 7, 7);
+ break;
+ case Cursor::ZoomOut:
+ m_platformCursor = loadCursorByName("zoomOutCursor", 7, 7);
+ break;
+ case Cursor::Custom:
+ m_platformCursor = createSharedCursor(m_image.get(), m_hotSpot);
+ break;
+ }
}
-const Cursor& zoomOutCursor()
+SharedCursor::~SharedCursor()
{
- static const Cursor c = loadCursorByName("zoomOutCursor", 7, 7);
- return c;
+ DestroyIcon(m_nativeCursor);
}
-const Cursor& grabCursor()
+Cursor::Cursor(const Cursor& other)
+ : m_type(other.m_type)
+ , m_image(other.m_image)
+ , m_hotSpot(other.m_hotSpot)
+ , m_platformCursor(other.m_platformCursor)
{
- return pointerCursor();
}
-const Cursor& grabbingCursor()
+Cursor& Cursor::operator=(const Cursor& other)
{
- return pointerCursor();
+ m_type = other.m_type;
+ m_image = other.m_image;
+ m_hotSpot = other.m_hotSpot;
+ m_platformCursor = other.m_platformCursor;
+ return *this;
}
-SharedCursor::~SharedCursor()
+Cursor::~Cursor()
{
- DestroyIcon(m_nativeCursor);
}
-}
+} // namespace WebCore
diff --git a/WebCore/platform/win/WidgetWin.cpp b/WebCore/platform/win/WidgetWin.cpp
index 607c0d8..416260b 100644
--- a/WebCore/platform/win/WidgetWin.cpp
+++ b/WebCore/platform/win/WidgetWin.cpp
@@ -59,7 +59,6 @@ void Widget::hide()
{
}
-HCURSOR lastSetCursor = 0;
bool ignoreNextSetCursor = false;
void Widget::setCursor(const Cursor& cursor)
@@ -71,30 +70,10 @@ void Widget::setCursor(const Cursor& cursor)
return;
}
- if (!cursor.impl()->nativeCursor())
- return;
-
- lastSetCursor = cursor.impl()->nativeCursor();
-
ScrollView* view = root();
- if (!view || !view->isFrameView()) {
- SetCursor(lastSetCursor);
- return;
- }
-
- Frame* frame = static_cast<FrameView*>(view)->frame();
- if (!frame) {
- SetCursor(lastSetCursor);
+ if (!view)
return;
- }
-
- Page* page = frame->page();
- if (!page) {
- SetCursor(lastSetCursor);
- return;
- }
-
- page->chrome()->setCursor(lastSetCursor);
+ view->hostWindow()->setCursor(cursor);
}
void Widget::paint(GraphicsContext*, const IntRect&)
diff --git a/WebCore/platform/wince/CursorWince.cpp b/WebCore/platform/wince/CursorWince.cpp
index e35f1f9..d7dcfb4 100644
--- a/WebCore/platform/wince/CursorWince.cpp
+++ b/WebCore/platform/wince/CursorWince.cpp
@@ -38,12 +38,12 @@ static const Cursor& getCursor(CursorType type)
}
Cursor::Cursor(const Cursor& other)
-: m_impl(other.m_impl)
+: m_platformCursor(other.m_platformCursor)
{
}
Cursor::Cursor(Image* img, const IntPoint& hotspot)
-: m_impl(CursorNone)
+: m_platformCursor(CursorNone)
{
}
@@ -53,12 +53,12 @@ Cursor::~Cursor()
Cursor& Cursor::operator=(const Cursor& other)
{
- m_impl = other.m_impl;
+ m_platformCursor = other.m_platformCursor;
return *this;
}
Cursor::Cursor(PlatformCursor c)
-: m_impl(c)
+: m_platformCursor(c)
{
}
diff --git a/WebCore/platform/wx/CursorWx.cpp b/WebCore/platform/wx/CursorWx.cpp
index ed7f86b..dd61f1e 100644
--- a/WebCore/platform/wx/CursorWx.cpp
+++ b/WebCore/platform/wx/CursorWx.cpp
@@ -34,15 +34,15 @@
namespace WebCore {
Cursor::Cursor(const Cursor& other)
- : m_impl(other.m_impl)
+ : m_platformCursor(other.m_platformCursor)
{
}
Cursor::Cursor(Image* image, const IntPoint&)
{
- m_impl = 0;
+ m_platformCursor = 0;
// FIXME: figure out why the below code causes a crash
- //m_impl = new wxCursor( image->getWxBitmap()->ConvertToImage() );
+ //m_platformCursor = new wxCursor( image->getWxBitmap()->ConvertToImage() );
}
Cursor::~Cursor()
@@ -51,12 +51,12 @@ Cursor::~Cursor()
Cursor& Cursor::operator=(const Cursor& other)
{
- m_impl = other.m_impl;
+ m_platformCursor = other.m_platformCursor;
return *this;
}
Cursor::Cursor(wxCursor* c)
- : m_impl(c)
+ : m_platformCursor(c)
{
}
diff --git a/WebCore/plugins/win/PluginViewWin.cpp b/WebCore/plugins/win/PluginViewWin.cpp
index 1765939..8dbb04b 100644
--- a/WebCore/plugins/win/PluginViewWin.cpp
+++ b/WebCore/plugins/win/PluginViewWin.cpp
@@ -30,6 +30,8 @@
#include "BitmapImage.h"
#include "Bridge.h"
+#include "Chrome.h"
+#include "ChromeClient.h"
#include "Document.h"
#include "DocumentLoader.h"
#include "Element.h"
@@ -656,7 +658,6 @@ void PluginView::handleKeyboardEvent(KeyboardEvent* event)
}
#if !OS(WINCE)
-extern HCURSOR lastSetCursor;
extern bool ignoreNextSetCursor;
#endif
@@ -727,7 +728,8 @@ void PluginView::handleMouseEvent(MouseEvent* event)
// Currently, Widget::setCursor is always called after this function in EventHandler.cpp
// and since we don't want that we set ignoreNextSetCursor to true here to prevent that.
ignoreNextSetCursor = true;
- lastSetCursor = ::GetCursor();
+ if (Page* page = m_parentFrame->page())
+ page->chrome()->client()->setLastSetCursorToCurrentCursor();
#endif
}
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 2867fc1..bc7a747 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ * efl/WebCoreSupport/ChromeClientEfl.cpp:
+ (WebCore::ChromeClientEfl::setCursor):
+ * efl/WebCoreSupport/ChromeClientEfl.h:
+ Change prototype to match new one.
+
2010-07-14 Lucas De Marchi <lucas.demarchi at profusion.mobi>
Reviewed by Antonio Gomes.
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 4dfa580..b0ff7c5 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,19 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ * src/ChromeClientImpl.h:
+ (WebKit::ChromeClientImpl::setCursor):
+ Change prototype to match new one.
+
+ * src/WebPopupMenuImpl.cpp:
+ (WebKit::WebPopupMenuImpl::setCursor):
+ * src/WebPopupMenuImpl.h:
+ Add empty setCursor function to satisfy the HostWindow interface.
+
2010-07-13 Alexey Proskuryakov <ap at apple.com>
Reviewed by Darin Adler.
diff --git a/WebKit/chromium/src/ChromeClientImpl.h b/WebKit/chromium/src/ChromeClientImpl.h
index 84355c3..fa3dbca 100644
--- a/WebKit/chromium/src/ChromeClientImpl.h
+++ b/WebKit/chromium/src/ChromeClientImpl.h
@@ -126,7 +126,7 @@ public:
virtual void cancelGeolocationPermissionRequestForFrame(WebCore::Frame*, WebCore::Geolocation*);
virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
virtual void chooseIconForFiles(const Vector<WebCore::String>&, WebCore::FileChooser*);
- virtual bool setCursor(WebCore::PlatformCursorHandle) { return false; }
+ virtual void setCursor(const WebCore::Cursor&) { }
virtual void formStateDidChange(const WebCore::Node*);
virtual PassOwnPtr<WebCore::HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
#if ENABLE(TOUCH_EVENTS)
diff --git a/WebKit/chromium/src/WebPopupMenuImpl.cpp b/WebKit/chromium/src/WebPopupMenuImpl.cpp
index 2abdc62..886cb3e 100644
--- a/WebKit/chromium/src/WebPopupMenuImpl.cpp
+++ b/WebKit/chromium/src/WebPopupMenuImpl.cpp
@@ -318,6 +318,10 @@ void WebPopupMenuImpl::scrollbarsModeDidChange() const
// Nothing to be done since we have no concept of different scrollbar modes.
}
+void WebPopupMenuImpl::setCursor(const Cursor&)
+{
+}
+
//-----------------------------------------------------------------------------
// WebCore::FramelessScrollViewClient
diff --git a/WebKit/chromium/src/WebPopupMenuImpl.h b/WebKit/chromium/src/WebPopupMenuImpl.h
index 4f5c2de..edbb4ab 100644
--- a/WebKit/chromium/src/WebPopupMenuImpl.h
+++ b/WebKit/chromium/src/WebPopupMenuImpl.h
@@ -110,6 +110,7 @@ public:
virtual PlatformPageClient platformPageClient() const { return 0; }
virtual void scrollRectIntoView(const WebCore::IntRect&, const WebCore::ScrollView*) const;
virtual void scrollbarsModeDidChange() const;
+ virtual void setCursor(const WebCore::Cursor&);
// WebCore::FramelessScrollViewClient methods:
virtual void popupClosed(WebCore::FramelessScrollView*);
diff --git a/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp b/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
index 342654a..4b01b75 100644
--- a/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
+++ b/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
@@ -437,10 +437,9 @@ void ChromeClientEfl::formStateDidChange(const Node*)
notImplemented();
}
-bool ChromeClientEfl::setCursor(PlatformCursorHandle)
+void ChromeClientEfl::setCursor(const Cursor&)
{
notImplemented();
- return false;
}
void ChromeClientEfl::requestGeolocationPermissionForFrame(Frame*, Geolocation*)
diff --git a/WebKit/efl/WebCoreSupport/ChromeClientEfl.h b/WebKit/efl/WebCoreSupport/ChromeClientEfl.h
index 45bda59..ce8abd1 100644
--- a/WebKit/efl/WebCoreSupport/ChromeClientEfl.h
+++ b/WebKit/efl/WebCoreSupport/ChromeClientEfl.h
@@ -119,7 +119,7 @@ public:
virtual PassOwnPtr<HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
- virtual bool setCursor(PlatformCursorHandle);
+ virtual void setCursor(const Cursor&);
virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const {}
diff --git a/WebKit/gtk/ChangeLog b/WebKit/gtk/ChangeLog
index cddfac8..a1c1e5a 100644
--- a/WebKit/gtk/ChangeLog
+++ b/WebKit/gtk/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ * WebCoreSupport/ChromeClientGtk.cpp:
+ (WebKit::ChromeClient::setCursor):
+ * WebCoreSupport/ChromeClientGtk.h:
+ Change prototype to match new one.
+
2010-07-12 Martin Robinson <mrobinson at igalia.com>
Reviewed by Gustavo Noronha Silva.
diff --git a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp
index bb469c5..88440ba 100644
--- a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp
+++ b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp
@@ -591,10 +591,9 @@ void ChromeClient::chooseIconForFiles(const Vector<WebCore::String>& filenames,
chooser->iconLoaded(Icon::createIconForFiles(filenames));
}
-bool ChromeClient::setCursor(PlatformCursorHandle)
+void ChromeClient::setCursor(const Cursor&)
{
notImplemented();
- return false;
}
void ChromeClient::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
diff --git a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
index 46d015e..ce5c5a7 100644
--- a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
+++ b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
@@ -116,7 +116,7 @@ namespace WebKit {
virtual PassOwnPtr<WebCore::HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
- virtual bool setCursor(WebCore::PlatformCursorHandle);
+ virtual void setCursor(const WebCore::Cursor&);
virtual void scrollRectIntoView(const WebCore::IntRect&, const WebCore::ScrollView*) const {}
virtual void requestGeolocationPermissionForFrame(WebCore::Frame*, WebCore::Geolocation*);
diff --git a/WebKit/haiku/ChangeLog b/WebKit/haiku/ChangeLog
index d71c5e4..fe3b6a1 100644
--- a/WebKit/haiku/ChangeLog
+++ b/WebKit/haiku/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ * WebCoreSupport/ChromeClientHaiku.cpp:
+ (WebCore::ChromeClientHaiku::setCursor):
+ * WebCoreSupport/ChromeClientHaiku.h:
+ Change prototype to match new one.
+
2010-06-14 Ilya Tikhonovsky <loislo at chromium.org>
Reviewed by Pavel Feldman.
diff --git a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.cpp b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.cpp
index 2cf5c31..d18b84d 100644
--- a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.cpp
+++ b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.cpp
@@ -362,10 +362,9 @@ void ChromeClientHaiku::chooseIconForFiles(const Vector<String>& filenames, File
chooser->iconLoaded(Icon::createIconForFiles(filenames));
}
-bool ChromeClientHaiku::setCursor(PlatformCursorHandle)
+void ChromeClientHaiku::setCursor(const Cursor&)
{
notImplemented();
- return false;
}
// Notification that the given form element has changed. This function
diff --git a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h
index d5a372b..963e72f 100644
--- a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h
+++ b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h
@@ -140,7 +140,7 @@ namespace WebCore {
void runOpenPanel(Frame*, PassRefPtr<FileChooser>);
void chooseIconForFiles(const Vector<String>&, FileChooser*);
- bool setCursor(PlatformCursorHandle);
+ void setCursor(const Cursor&);
// Notification that the given form element has changed. This function
// will be called frequently, so handling should be very fast.
diff --git a/WebKit/mac/ChangeLog b/WebKit/mac/ChangeLog
index c368b96..ad51c92 100644
--- a/WebKit/mac/ChangeLog
+++ b/WebKit/mac/ChangeLog
@@ -1,3 +1,19 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ * WebCoreSupport/WebChromeClient.h:
+ * WebCoreSupport/WebChromeClient.mm:
+ (WebChromeClient::setCursor):
+ * WebView/WebView.mm:
+ Implement cursor changing at the WebKit level for the sake of WebKit2.
+ This functionality is being moved from WidgetMac.mm.
+ (+[WebView _pointingHandCursor]):
+ Update to use platformCursor() instead of impl().
+
2010-07-13 Simon Fraser <simon.fraser at apple.com>
Fix Tiger build.
diff --git a/WebKit/mac/WebCoreSupport/WebChromeClient.h b/WebKit/mac/WebCoreSupport/WebChromeClient.h
index ea59c4d..707d080 100644
--- a/WebKit/mac/WebCoreSupport/WebChromeClient.h
+++ b/WebKit/mac/WebCoreSupport/WebChromeClient.h
@@ -127,7 +127,7 @@ public:
virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
virtual void chooseIconForFiles(const Vector<WebCore::String>&, WebCore::FileChooser*);
- virtual bool setCursor(WebCore::PlatformCursorHandle) { return false; }
+ virtual void setCursor(const WebCore::Cursor&);
virtual WebCore::FloatRect customHighlightRect(WebCore::Node*, const WebCore::AtomicString& type,
const WebCore::FloatRect& lineRect);
diff --git a/WebKit/mac/WebCoreSupport/WebChromeClient.mm b/WebKit/mac/WebCoreSupport/WebChromeClient.mm
index 3bf310a..eb56240 100644
--- a/WebKit/mac/WebCoreSupport/WebChromeClient.mm
+++ b/WebKit/mac/WebCoreSupport/WebChromeClient.mm
@@ -48,6 +48,7 @@
#import <Foundation/Foundation.h>
#import <WebCore/BlockExceptions.h>
#import <WebCore/Console.h>
+#import <WebCore/Cursor.h>
#import <WebCore/Element.h>
#import <WebCore/FileChooser.h>
#import <WebCore/FloatRect.h>
@@ -659,6 +660,14 @@ void WebChromeClient::chooseIconForFiles(const Vector<String>& filenames, FileCh
chooser->iconLoaded(Icon::createIconForFiles(filenames));
}
+void WebChromeClient::setCursor(const WebCore::Cursor& cursor)
+{
+ NSCursor *platformCursor = cursor.platformCursor();
+ if ([NSCursor currentCursor] == platformCursor)
+ return;
+ [platformCursor set];
+}
+
KeyboardUIMode WebChromeClient::keyboardUIMode()
{
BEGIN_BLOCK_OBJC_EXCEPTIONS;
diff --git a/WebKit/mac/WebView/WebView.mm b/WebKit/mac/WebView/WebView.mm
index 3a59116..6881072 100644
--- a/WebKit/mac/WebView/WebView.mm
+++ b/WebKit/mac/WebView/WebView.mm
@@ -2220,7 +2220,7 @@ static inline IMP getMethod(id o, SEL s)
+ (NSCursor *)_pointingHandCursor
{
- return handCursor().impl();
+ return handCursor().platformCursor();
}
- (BOOL)_postsAcceleratedCompositingNotifications
diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog
index 160240f..006b6a7 100644
--- a/WebKit/qt/ChangeLog
+++ b/WebKit/qt/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ * WebCoreSupport/ChromeClientQt.cpp:
+ (WebCore::ChromeClientQt::setCursor):
+ * WebCoreSupport/ChromeClientQt.h:
+ Change prototype to match new one.
+
2010-07-07 Tor Arne Vestbø <tor.arne.vestbo at nokia.com>
Reviewed by Darin Adler.
diff --git a/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp b/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
index faec705..2c64a78 100644
--- a/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
+++ b/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
@@ -529,10 +529,9 @@ void ChromeClientQt::chooseIconForFiles(const Vector<String>& filenames, FileCho
chooser->iconLoaded(Icon::createIconForFiles(filenames));
}
-bool ChromeClientQt::setCursor(PlatformCursorHandle)
+void ChromeClientQt::setCursor(const Cursor&)
{
notImplemented();
- return false;
}
void ChromeClientQt::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
diff --git a/WebKit/qt/WebCoreSupport/ChromeClientQt.h b/WebKit/qt/WebCoreSupport/ChromeClientQt.h
index 4b55eb2..70b4a25 100644
--- a/WebKit/qt/WebCoreSupport/ChromeClientQt.h
+++ b/WebKit/qt/WebCoreSupport/ChromeClientQt.h
@@ -161,7 +161,7 @@ namespace WebCore {
virtual PassOwnPtr<HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
- virtual bool setCursor(PlatformCursorHandle);
+ virtual void setCursor(const Cursor&);
virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const {}
diff --git a/WebKit/win/ChangeLog b/WebKit/win/ChangeLog
index b4f9301..9d0703c 100644
--- a/WebKit/win/ChangeLog
+++ b/WebKit/win/ChangeLog
@@ -1,3 +1,25 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ * WebCoreSupport/WebChromeClient.cpp:
+ (WebChromeClient::setCursor):
+ We now need to grab the native cursor out of the WebCore cursor.
+
+ (WebChromeClient::setLastSetCursorToCurrentCursor):
+ Sets the WebView's "last set cursor" to be the current cursor so that
+ the cursor is set correctly for plugins.
+ * WebCoreSupport/WebChromeClient.h:
+ * WebView.cpp:
+ (WebView::WebView):
+ (WebView::WebViewWndProc):
+ * WebView.h:
+ (WebView::setLastCursor):
+ Change the "last set cursor" to be stored as a member instead of a global.
+
2010-07-13 Steve Falkenburg <sfalken at apple.com>
Windows build fix.
diff --git a/WebKit/win/WebCoreSupport/WebChromeClient.cpp b/WebKit/win/WebCoreSupport/WebChromeClient.cpp
index 42e5cc4..73532a6 100644
--- a/WebKit/win/WebCoreSupport/WebChromeClient.cpp
+++ b/WebKit/win/WebCoreSupport/WebChromeClient.cpp
@@ -782,21 +782,28 @@ void WebChromeClient::chooseIconForFiles(const Vector<WebCore::String>& filename
chooser->iconLoaded(Icon::createIconForFiles(filenames));
}
-bool WebChromeClient::setCursor(PlatformCursorHandle cursor)
+void WebChromeClient::setCursor(const Cursor& cursor)
{
- if (!cursor)
- return false;
+ HCURSOR platformCursor = cursor.platformCursor()->nativeCursor();
+ if (!platformCursor)
+ return;
if (COMPtr<IWebUIDelegate> delegate = uiDelegate()) {
COMPtr<IWebUIDelegatePrivate> delegatePrivate(Query, delegate);
if (delegatePrivate) {
- if (SUCCEEDED(delegatePrivate->webViewSetCursor(m_webView, reinterpret_cast<OLE_HANDLE>(cursor))))
- return true;
+ if (SUCCEEDED(delegatePrivate->webViewSetCursor(m_webView, reinterpret_cast<OLE_HANDLE>(platformCursor))))
+ return;
}
}
- ::SetCursor(cursor);
- return true;
+ m_webView->setLastCursor(platformCursor);
+ ::SetCursor(platformCursor);
+ return;
+}
+
+void WebChromeClient::setLastSetCursorToCurrentCursor()
+{
+ m_webView->setLastCursor(::GetCursor());
}
void WebChromeClient::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
diff --git a/WebKit/win/WebCoreSupport/WebChromeClient.h b/WebKit/win/WebCoreSupport/WebChromeClient.h
index c890af0..e7845a9 100644
--- a/WebKit/win/WebCoreSupport/WebChromeClient.h
+++ b/WebKit/win/WebCoreSupport/WebChromeClient.h
@@ -130,7 +130,8 @@ public:
virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
virtual void chooseIconForFiles(const Vector<WebCore::String>&, WebCore::FileChooser*);
- virtual bool setCursor(WebCore::PlatformCursorHandle cursor);
+ virtual void setCursor(const WebCore::Cursor&);
+ virtual void setLastSetCursorToCurrentCursor();
WebView* webView() const { return m_webView; }
diff --git a/WebKit/win/WebView.cpp b/WebKit/win/WebView.cpp
index b5c4fa8..a24944d 100644
--- a/WebKit/win/WebView.cpp
+++ b/WebKit/win/WebView.cpp
@@ -344,6 +344,7 @@ WebView::WebView()
, m_isAcceleratedCompositing(false)
#endif
, m_nextDisplayIsSynchronous(false)
+ , m_lastSetCursor(0)
{
JSC::initializeThreading();
WTF::initializeMainThread();
@@ -1972,10 +1973,6 @@ bool WebView::registerWebViewWindowClass()
return !!RegisterClassEx(&wcex);
}
-namespace WebCore {
- extern HCURSOR lastSetCursor;
-}
-
static HWND findTopLevelParent(HWND window)
{
if (!window)
@@ -2250,10 +2247,8 @@ LRESULT CALLBACK WebView::WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam,
}
break;
case WM_SETCURSOR:
- if (handled = webView->page()->chrome()->setCursor(lastSetCursor))
- break;
-
- __fallthrough;
+ handled = ::SetCursor(webView->m_lastSetCursor);
+ break;
case WM_VSCROLL:
handled = webView->verticalScroll(wParam, lParam);
break;
diff --git a/WebKit/win/WebView.h b/WebKit/win/WebView.h
index 514f376..2ab9795 100644
--- a/WebKit/win/WebView.h
+++ b/WebKit/win/WebView.h
@@ -903,6 +903,8 @@ public:
void enterFullscreenForNode(WebCore::Node*);
void exitFullscreen();
+ void setLastCursor(HCURSOR cursor) { m_lastSetCursor = cursor; }
+
private:
void setZoomMultiplier(float multiplier, bool isTextOnly);
float zoomMultiplier(bool isTextOnly);
@@ -1042,6 +1044,8 @@ protected:
#endif
bool m_nextDisplayIsSynchronous;
+
+ HCURSOR m_lastSetCursor;
};
#endif
diff --git a/WebKit/wx/ChangeLog b/WebKit/wx/ChangeLog
index 9d89858..f14e87c 100644
--- a/WebKit/wx/ChangeLog
+++ b/WebKit/wx/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ * WebKitSupport/ChromeClientWx.cpp:
+ (WebCore::ChromeClientWx::setCursor):
+ * WebKitSupport/ChromeClientWx.h:
+ Change prototype to match new one.
+
2010-07-07 Kevin Ollivier <kevino at theolliviers.com>
[wx] Build fix after change in Page constructor.
diff --git a/WebKit/wx/WebKitSupport/ChromeClientWx.cpp b/WebKit/wx/WebKitSupport/ChromeClientWx.cpp
index a19644d..d81a20c 100644
--- a/WebKit/wx/WebKitSupport/ChromeClientWx.cpp
+++ b/WebKit/wx/WebKitSupport/ChromeClientWx.cpp
@@ -447,10 +447,9 @@ void ChromeClientWx::chooseIconForFiles(const Vector<String>& filenames, FileCho
chooser->iconLoaded(Icon::createIconForFiles(filenames));
}
-bool ChromeClientWx::setCursor(PlatformCursorHandle)
+void ChromeClientWx::setCursor(const Cursor&)
{
notImplemented();
- return false;
}
void ChromeClientWx::requestGeolocationPermissionForFrame(Frame*, Geolocation*)
diff --git a/WebKit/wx/WebKitSupport/ChromeClientWx.h b/WebKit/wx/WebKitSupport/ChromeClientWx.h
index b900f3e..4b156ed 100644
--- a/WebKit/wx/WebKitSupport/ChromeClientWx.h
+++ b/WebKit/wx/WebKitSupport/ChromeClientWx.h
@@ -134,7 +134,7 @@ public:
virtual PassOwnPtr<HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
- virtual bool setCursor(PlatformCursorHandle);
+ virtual void setCursor(const Cursor&);
virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const {}
diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index fa96df4..4119181 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,49 @@
+2010-07-14 Sam Weinig <sam at webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+ Make changing Cursors work in WebKit2.
+
+ * Shared/CoreIPCSupport/WebPageProxyMessageKinds.h:
+ Add SetCursor message.
+
+ * Shared/WebCoreArgumentCoders.h:
+ Add encoding/decoding of Cursors. For now we don't support Custom
+ cursors.
+
+ * UIProcess/API/mac/PageClientImpl.h:
+ * UIProcess/API/mac/PageClientImpl.mm:
+ (WebKit::PageClientImpl::setCursor):
+ * UIProcess/PageClient.h:
+ Add pass through functions to get the cursor from the WebPageProxy
+ to the WKView.
+
+ * UIProcess/API/mac/WKView.mm:
+ (-[WKView _setCursor:]):
+ * UIProcess/API/mac/WKViewInternal.h:
+ Implement changing the cursor.
+
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::didReceiveMessage):
+ (WebKit::WebPageProxy::setCursor):
+ * UIProcess/WebPageProxy.h:
+ Decode the cursor.
+
+ * UIProcess/win/WebView.cpp:
+ (WebKit::WebView::wndProc):
+ (WebKit::WebView::WebView):
+ (WebKit::WebView::onSetCursor):
+ (WebKit::WebView::setCursor):
+ * UIProcess/win/WebView.h:
+ Implement changing the cursor.
+
+ * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+ (WebKit::WebChromeClient::setCursor):
+ (WebKit::WebChromeClient::setLastSetCursorToCurrentCursor):
+ * WebProcess/WebCoreSupport/WebChromeClient.h:
+ Encode the cursor when setCursor is called.
+
2010-07-13 Anders Carlsson <andersca at apple.com>
Reviewed by Sam Weinig.
diff --git a/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h b/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
index 4ed4442..2c95624 100644
--- a/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
+++ b/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
@@ -63,6 +63,7 @@ enum Kind {
DidStartProgress,
DidStartProvisionalLoadForFrame,
DidUpdateHistoryTitle,
+ SetCursor,
SetToolTip,
TakeFocus,
diff --git a/WebKit2/Shared/WebCoreArgumentCoders.h b/WebKit2/Shared/WebCoreArgumentCoders.h
index 723be6f..89dd5f9 100644
--- a/WebKit2/Shared/WebCoreArgumentCoders.h
+++ b/WebKit2/Shared/WebCoreArgumentCoders.h
@@ -30,6 +30,7 @@
#include "ArgumentDecoder.h"
#include "ArgumentEncoder.h"
#include "Arguments.h"
+#include <WebCore/Cursor.h>
#include <WebCore/FloatRect.h>
#include <WebCore/IntRect.h>
#include <WebCore/PlatformString.h>
@@ -110,6 +111,30 @@ template<> struct ArgumentCoder<WebCore::PluginInfo> {
}
};
+template<> struct ArgumentCoder<WebCore::Cursor> {
+ static void encode(ArgumentEncoder* encoder, const WebCore::Cursor& cursor)
+ {
+ // FIXME: Support custom cursors.
+ if (cursor.type() == WebCore::Cursor::Custom)
+ encoder->encode(static_cast<uint32_t>(WebCore::Cursor::Pointer));
+ else
+ encoder->encode(static_cast<uint32_t>(cursor.type()));
+ }
+
+ static bool decode(ArgumentDecoder* decoder, WebCore::Cursor& cursor)
+ {
+ uint32_t typeInt;
+ if (!decoder->decode(typeInt))
+ return false;
+
+ WebCore::Cursor::Type type = static_cast<WebCore::Cursor::Type>(typeInt);
+ ASSERT(type != WebCore::Cursor::Custom);
+
+ cursor = WebCore::Cursor::fromType(type);
+ return true;
+ }
+};
+
} // namespace CoreIPC
#endif // WebCoreArgumentCoders_h
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.h b/WebKit2/UIProcess/API/mac/PageClientImpl.h
index a9f1dfd..65ba0df 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.h
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.h
@@ -46,7 +46,8 @@ private:
virtual void processDidRevive();
virtual void takeFocus(bool direction);
virtual void toolTipChanged(const WebCore::String& oldToolTip, const WebCore::String& newToolTip);
-
+ virtual void setCursor(const WebCore::Cursor&);
+
WKView* m_wkView;
};
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.mm b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
index ff6daca..24cb721 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.mm
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
@@ -28,6 +28,7 @@
#import "WKAPICast.h"
#import "WKStringCF.h"
#import "WKViewInternal.h"
+#import <WebCore/Cursor.h>
#import <WebCore/FoundationExtras.h>
#import <WebCore/PlatformString.h>
@@ -69,4 +70,9 @@ void PageClientImpl::toolTipChanged(const String& oldToolTip, const String& newT
[m_wkView _toolTipChangedFrom:nsStringFromWebCoreString(oldToolTip) to:nsStringFromWebCoreString(newToolTip)];
}
+void PageClientImpl::setCursor(const WebCore::Cursor& cursor)
+{
+ [m_wkView _setCursor:cursor.platformCursor()];
+}
+
} // namespace WebKit
diff --git a/WebKit2/UIProcess/API/mac/WKView.mm b/WebKit2/UIProcess/API/mac/WKView.mm
index 78c9a5e..2a9e0cd 100644
--- a/WebKit2/UIProcess/API/mac/WKView.mm
+++ b/WebKit2/UIProcess/API/mac/WKView.mm
@@ -319,6 +319,12 @@ static bool isViewVisible(NSView *view)
[[self window] selectKeyViewPrecedingView:self];
}
+- (void)_setCursor:(NSCursor *)cursor
+{
+ if ([NSCursor currentCursor] == cursor)
+ return;
+ [cursor set];
+}
// Any non-zero value will do, but using something recognizable might help us debug some day.
#define TRACKING_RECT_TAG 0xBADFACE
diff --git a/WebKit2/UIProcess/API/mac/WKViewInternal.h b/WebKit2/UIProcess/API/mac/WKViewInternal.h
index 4067cdc..1e882af 100644
--- a/WebKit2/UIProcess/API/mac/WKViewInternal.h
+++ b/WebKit2/UIProcess/API/mac/WKViewInternal.h
@@ -30,6 +30,7 @@
- (void)_processDidRevive;
- (void)_takeFocus:(BOOL)direction;
- (void)_toolTipChangedFrom:(NSString *)oldToolTip to:(NSString *)newToolTip;
+- (void)_setCursor:(NSCursor *)cursor;
#if USE(ACCELERATED_COMPOSITING)
- (void)_startAcceleratedCompositing:(CALayer *)rootLayer;
diff --git a/WebKit2/UIProcess/PageClient.h b/WebKit2/UIProcess/PageClient.h
index 3178835..0dbd20e 100644
--- a/WebKit2/UIProcess/PageClient.h
+++ b/WebKit2/UIProcess/PageClient.h
@@ -28,6 +28,7 @@
namespace WebCore {
class String;
+ class Cursor;
}
namespace WebKit {
@@ -41,6 +42,8 @@ public:
virtual void takeFocus(bool direction) = 0;
virtual void toolTipChanged(const WebCore::String&, const WebCore::String&) = 0;
+
+ virtual void setCursor(const WebCore::Cursor&) = 0;
};
} // namespace WebKit
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index dfe54f0..4070dcb 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -531,6 +531,13 @@ void WebPageProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::M
setToolTip(toolTip);
break;
}
+ case WebPageProxyMessage::SetCursor: {
+ Cursor cursor;
+ if (!arguments.decode(cursor))
+ return;
+ setCursor(cursor);
+ break;
+ }
case WebPageProxyMessage::ShowPage: {
showPage();
break;
@@ -843,6 +850,11 @@ void WebPageProxy::setToolTip(const String& toolTip)
m_pageClient->toolTipChanged(oldToolTip, m_toolTip);
}
+void WebPageProxy::setCursor(const WebCore::Cursor& cursor)
+{
+ m_pageClient->setCursor(cursor);
+}
+
void WebPageProxy::didReceiveEvent(WebEvent::Type type)
{
switch (type) {
diff --git a/WebKit2/UIProcess/WebPageProxy.h b/WebKit2/UIProcess/WebPageProxy.h
index 7527ce9..ca88206 100644
--- a/WebKit2/UIProcess/WebPageProxy.h
+++ b/WebKit2/UIProcess/WebPageProxy.h
@@ -52,6 +52,7 @@ namespace CoreIPC {
namespace WebCore {
class IntSize;
+ class Cursor;
}
struct WKContextStatistics;
@@ -190,11 +191,13 @@ private:
void takeFocus(bool direction);
void setToolTip(const WebCore::String&);
+ void setCursor(const WebCore::Cursor&);
void didReceiveEvent(WebEvent::Type);
void didRunJavaScriptInMainFrame(const WebCore::String&, uint64_t);
void didGetRenderTreeExternalRepresentation(const WebCore::String&, uint64_t);
+
#if PLATFORM(WIN)
PageClient* m_pageClient;
#else
diff --git a/WebKit2/UIProcess/win/WebView.cpp b/WebKit2/UIProcess/win/WebView.cpp
index b0c481a..7d9e85b 100644
--- a/WebKit2/UIProcess/win/WebView.cpp
+++ b/WebKit2/UIProcess/win/WebView.cpp
@@ -129,6 +129,9 @@ LRESULT WebView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_SHOWWINDOW:
lResult = onShowWindowEvent(hWnd, message, wParam, lParam, handled);
break;
+ case WM_SETCURSOR:
+ lResult = onSetCursor(hWnd, message, wParam, lParam, handled);
+ break;
default:
handled = false;
break;
@@ -170,6 +173,7 @@ WebView::WebView(RECT rect, WebPageNamespace* pageNamespace, HWND hostWindow)
, m_hostWindow(hostWindow)
, m_topLevelParentWindow(0)
, m_toolTipWindow(0)
+ , m_lastCursorSet(0)
, m_trackingMouseLeave(false)
, m_isBeingDestroyed(false)
{
@@ -408,6 +412,12 @@ LRESULT WebView::onShowWindowEvent(HWND hWnd, UINT message, WPARAM wParam, LPARA
return 0;
}
+LRESULT WebView::onSetCursor(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
+{
+ handled = ::SetCursor(m_lastCursorSet);
+ return 0;
+}
+
bool WebView::isActive()
{
HWND activeWindow = ::GetActiveWindow();
@@ -533,6 +543,16 @@ void WebView::toolTipChanged(const String&, const String& newToolTip)
::SendMessage(m_toolTipWindow, TTM_ACTIVATE, !newToolTip.isEmpty(), 0);
}
+void WebView::setCursor(const WebCore::Cursor& cursor)
+{
+ HCURSOR platformCursor = cursor.platformCursor()->nativeCursor();
+ if (!platformCursor)
+ return;
+
+ m_lastCursorSet = platformCursor;
+ ::SetCursor(platformCursor);
+}
+
// WebCore::WindowMessageListener
void WebView::windowReceivedMessage(HWND, UINT message, WPARAM wParam, LPARAM)
diff --git a/WebKit2/UIProcess/win/WebView.h b/WebKit2/UIProcess/win/WebView.h
index 9e7a962..120280d 100644
--- a/WebKit2/UIProcess/win/WebView.h
+++ b/WebKit2/UIProcess/win/WebView.h
@@ -76,6 +76,7 @@ private:
LRESULT onKillFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onTimerEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onShowWindowEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
+ LRESULT onSetCursor(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
bool isActive();
void updateActiveState();
@@ -93,6 +94,7 @@ private:
virtual void processDidRevive();
virtual void takeFocus(bool direction);
virtual void toolTipChanged(const WebCore::String&, const WebCore::String&);
+ virtual void setCursor(const WebCore::Cursor&);
// WebCore::WindowMessageListener
virtual void windowReceivedMessage(HWND, UINT message, WPARAM, LPARAM);
@@ -103,6 +105,8 @@ private:
HWND m_topLevelParentWindow;
HWND m_toolTipWindow;
+ HCURSOR m_lastCursorSet;
+
bool m_trackingMouseLeave;
bool m_isBeingDestroyed;
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
index 9fb5ba7..26ad000 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
+++ b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
@@ -416,10 +416,9 @@ void WebChromeClient::chooseIconForFiles(const Vector<String>&, FileChooser*)
notImplemented();
}
-bool WebChromeClient::setCursor(PlatformCursorHandle)
+void WebChromeClient::setCursor(const Cursor& cursor)
{
- notImplemented();
- return false;
+ WebProcess::shared().connection()->send(WebPageProxyMessage::SetCursor, m_page->pageID(), CoreIPC::In(cursor));
}
void WebChromeClient::formStateDidChange(const Node*)
@@ -477,4 +476,11 @@ void WebChromeClient::needTouchEvents(bool)
}
#endif
+#if PLATFORM(WIN)
+void WebChromeClient::setLastSetCursorToCurrentCursor()
+{
+}
+#endif
+
+
} // namespace WebKit
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h
index c992716..dd487b4 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h
+++ b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h
@@ -151,7 +151,7 @@ private:
virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
virtual void chooseIconForFiles(const Vector<WebCore::String>&, WebCore::FileChooser*);
- virtual bool setCursor(WebCore::PlatformCursorHandle);
+ virtual void setCursor(const WebCore::Cursor&);
// Notification that the given form element has changed. This function
// will be called frequently, so handling should be very fast.
@@ -175,7 +175,11 @@ private:
#if ENABLE(TOUCH_EVENTS)
virtual void needTouchEvents(bool);
#endif
-
+
+#if PLATFORM(WIN)
+ virtual void setLastSetCursorToCurrentCursor();
+#endif
+
WebCore::String m_cachedToolTip;
WebPage* m_page;
};
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list