[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
mrobinson at webkit.org
mrobinson at webkit.org
Wed Dec 22 11:39:49 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 1c1e03b4b8cb10541b53a2cfe8ad3b9324bac9dc
Author: mrobinson at webkit.org <mrobinson at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Aug 3 02:44:57 2010 +0000
2010-08-02 Martin Robinson <mrobinson at igalia.com>
Reviewed by Gustavo Noronha Silva.
[GTK] WebKit2 requires lazy cursor support
https://bugs.webkit.org/show_bug.cgi?id=43053
Add lazy cursor support for GTK+. Lazy cursor support is used on some
WebKit2 ports to support changing the cursor.
No new tests, as this should not change functionality.
* platform/Cursor.h: Changed the m_platformCursor member to be a GRefPtr.
This simplifies the logic a great deal.
* platform/gtk/CursorGtk.cpp:
(WebCore::createNamedCursor): Added, adapted from existing code.
(WebCore::createCustomCursor): Added, adapted from existing code.
(WebCore::Cursor::ensurePlatformCursor): Added.
(WebCore::Cursor::Cursor): Added.
(WebCore::Cursor::operator=): Added.
(WebCore::Cursor::~Cursor): Added.
* platform/gtk/WidgetGtk.cpp:
(WebCore::Widget::setCursor): Call platformCusor now to get the actual GdkCursor.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@64526 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index d754bd9..9aa34d7 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,27 @@
+2010-08-02 Martin Robinson <mrobinson at igalia.com>
+
+ Reviewed by Gustavo Noronha Silva.
+
+ [GTK] WebKit2 requires lazy cursor support
+ https://bugs.webkit.org/show_bug.cgi?id=43053
+
+ Add lazy cursor support for GTK+. Lazy cursor support is used on some
+ WebKit2 ports to support changing the cursor.
+
+ No new tests, as this should not change functionality.
+
+ * platform/Cursor.h: Changed the m_platformCursor member to be a GRefPtr.
+ This simplifies the logic a great deal.
+ * platform/gtk/CursorGtk.cpp:
+ (WebCore::createNamedCursor): Added, adapted from existing code.
+ (WebCore::createCustomCursor): Added, adapted from existing code.
+ (WebCore::Cursor::ensurePlatformCursor): Added.
+ (WebCore::Cursor::Cursor): Added.
+ (WebCore::Cursor::operator=): Added.
+ (WebCore::Cursor::~Cursor): Added.
+ * platform/gtk/WidgetGtk.cpp:
+ (WebCore::Widget::setCursor): Call platformCusor now to get the actual GdkCursor.
+
2010-08-02 Rajiv Makhijani <rajivmakhijani at chromium.org>
Reviewed by Adam Barth.
diff --git a/WebCore/platform/Cursor.h b/WebCore/platform/Cursor.h
index 98d69b9..5e547ef 100644
--- a/WebCore/platform/Cursor.h
+++ b/WebCore/platform/Cursor.h
@@ -36,7 +36,7 @@ typedef HICON HCURSOR;
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#elif PLATFORM(GTK)
-typedef struct _GdkCursor GdkCursor;
+#include "GRefPtrGtk.h"
#elif PLATFORM(QT)
#include <QCursor>
#elif PLATFORM(CHROMIUM)
@@ -62,7 +62,7 @@ typedef struct HICON__ *HICON;
typedef HICON HCURSOR;
#endif
-#if PLATFORM(WIN) || PLATFORM(MAC)
+#if PLATFORM(WIN) || PLATFORM(MAC) || PLATFORM(GTK)
#define WTF_USE_LAZY_NATIVE_CURSOR 1
#endif
@@ -84,7 +84,7 @@ namespace WebCore {
#elif PLATFORM(MAC)
typedef NSCursor* PlatformCursor;
#elif PLATFORM(GTK)
- typedef GdkCursor* PlatformCursor;
+ typedef GRefPtr<GdkCursor> PlatformCursor;
#elif PLATFORM(EFL)
typedef const char* PlatformCursor;
#elif PLATFORM(QT) && !defined(QT_NO_CURSOR)
diff --git a/WebCore/platform/gtk/CursorGtk.cpp b/WebCore/platform/gtk/CursorGtk.cpp
index a535f0c..050db0c 100644
--- a/WebCore/platform/gtk/CursorGtk.cpp
+++ b/WebCore/platform/gtk/CursorGtk.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2006 Michael Emmel mike.emmel at gmail.com
* Copyright (C) 2007 Christian Dywan <christian at twotoasts.de>
+ * Copyright (C) 2010 Igalia S.L.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -30,318 +31,172 @@
#include "Image.h"
#include "IntPoint.h"
-
-#include <wtf/Assertions.h>
-
#include <gdk/gdk.h>
#include <gtk/gtk.h>
+#include <wtf/Assertions.h>
namespace WebCore {
-static GdkCursor* customCursorNew(CustomCursorType cursorType)
+static GdkCursor* createNamedCursor(CustomCursorType cursorType)
{
CustomCursor cursor = CustomCursors[cursorType];
GdkCursor* c = gdk_cursor_new_from_name(gdk_display_get_default(), cursor.name);
- if (!c) {
- const GdkColor fg = { 0, 0, 0, 0 };
- const GdkColor bg = { 65535, 65535, 65535, 65535 };
+ if (c)
+ return c;
- GdkPixmap* source = gdk_bitmap_create_from_data(NULL, cursor.bits, 32, 32);
- GdkPixmap* mask = gdk_bitmap_create_from_data(NULL, cursor.mask_bits, 32, 32);
- c = gdk_cursor_new_from_pixmap(source, mask, &fg, &bg, cursor.hot_x, cursor.hot_y);
- g_object_unref(source);
- g_object_unref(mask);
- }
- return c;
+ const GdkColor fg = { 0, 0, 0, 0 };
+ const GdkColor bg = { 65535, 65535, 65535, 65535 };
+ GRefPtr<GdkPixmap> source = adoptGRef(gdk_bitmap_create_from_data(0, cursor.bits, 32, 32));
+ GRefPtr<GdkPixmap> mask = adoptGRef(gdk_bitmap_create_from_data(0, cursor.mask_bits, 32, 32));
+ return gdk_cursor_new_from_pixmap(source.get(), mask.get(), &fg, &bg, cursor.hot_x, cursor.hot_y);
}
-
-Cursor::Cursor(const Cursor& other)
- : m_platformCursor(other.m_platformCursor)
-{
- if (m_platformCursor)
- gdk_cursor_ref(m_platformCursor);
-}
-
-Cursor::Cursor(Image* image, const IntPoint& hotSpot)
+static GdkCursor* createCustomCursor(Image* image, const IntPoint& hotSpot)
{
IntPoint effectiveHotSpot = determineHotSpot(image, hotSpot);
- GdkPixbuf* pixbuf = image->getGdkPixbuf();
- m_platformCursor = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pixbuf, effectiveHotSpot.x(), effectiveHotSpot.y());
- g_object_unref(pixbuf);
+ GRefPtr<GdkPixbuf> pixbuf = adoptGRef(image->getGdkPixbuf());
+ return gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pixbuf.get(), effectiveHotSpot.x(), effectiveHotSpot.y());
+}
+
+void Cursor::ensurePlatformCursor() const
+{
+ if (m_platformCursor || m_type == Cursor::Pointer)
+ return;
+
+ switch (m_type) {
+ case Cursor::Pointer:
+ // A null GdkCursor is the default cursor for the window.
+ m_platformCursor = 0;
+ break;
+ case Cursor::Cross:
+ m_platformCursor = gdk_cursor_new(GDK_CROSS);
+ break;
+ case Cursor::Hand:
+ m_platformCursor = gdk_cursor_new(GDK_HAND2);
+ break;
+ case Cursor::IBeam:
+ m_platformCursor = gdk_cursor_new(GDK_XTERM);
+ break;
+ case Cursor::Wait:
+ m_platformCursor = gdk_cursor_new(GDK_WATCH);
+ break;
+ case Cursor::Help:
+ m_platformCursor = gdk_cursor_new(GDK_QUESTION_ARROW);
+ break;
+ case Cursor::Move:
+ case Cursor::MiddlePanning:
+ m_platformCursor = gdk_cursor_new(GDK_FLEUR);
+ break;
+ case Cursor::EastResize:
+ case Cursor::EastPanning:
+ m_platformCursor = gdk_cursor_new(GDK_RIGHT_SIDE);
+ break;
+ case Cursor::NorthResize:
+ case Cursor::NorthPanning:
+ m_platformCursor = gdk_cursor_new(GDK_TOP_SIDE);
+ break;
+ case Cursor::NorthEastResize:
+ case Cursor::NorthEastPanning:
+ m_platformCursor = gdk_cursor_new(GDK_LEFT_SIDE);
+ break;
+ case Cursor::NorthWestResize:
+ case Cursor::NorthWestPanning:
+ m_platformCursor = gdk_cursor_new(GDK_TOP_LEFT_CORNER);
+ break;
+ case Cursor::SouthResize:
+ case Cursor::SouthPanning:
+ m_platformCursor = gdk_cursor_new(GDK_BOTTOM_SIDE);
+ break;
+ case Cursor::SouthEastResize:
+ case Cursor::SouthEastPanning:
+ m_platformCursor = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
+ break;
+ case Cursor::SouthWestResize:
+ case Cursor::SouthWestPanning:
+ m_platformCursor = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
+ break;
+ case Cursor::WestResize:
+ m_platformCursor = gdk_cursor_new(GDK_LEFT_SIDE);
+ break;
+ case Cursor::NorthSouthResize:
+ m_platformCursor = gdk_cursor_new(GDK_TOP_TEE);
+ break;
+ case Cursor::EastWestResize:
+ case Cursor::WestPanning:
+ m_platformCursor = gdk_cursor_new(GDK_LEFT_SIDE);
+ break;
+ case Cursor::NorthEastSouthWestResize:
+ case Cursor::NorthWestSouthEastResize:
+ m_platformCursor = gdk_cursor_new(GDK_SIZING);
+ break;
+ case Cursor::ColumnResize:
+ m_platformCursor = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
+ break;
+ case Cursor::RowResize:
+ m_platformCursor = gdk_cursor_new(GDK_SB_V_DOUBLE_ARROW);
+ break;
+ case Cursor::VerticalText:
+ m_platformCursor = createNamedCursor(CustomCursorVerticalText);
+ break;
+ case Cursor::Cell:
+ m_platformCursor = gdk_cursor_new(GDK_PLUS);
+ break;
+ case Cursor::ContextMenu:
+ m_platformCursor = createNamedCursor(CustomCursorContextMenu);
+ break;
+ case Cursor::Alias:
+ m_platformCursor = createNamedCursor(CustomCursorAlias);
+ break;
+ case Cursor::Progress:
+ m_platformCursor = createNamedCursor(CustomCursorProgress);
+ break;
+ case Cursor::NoDrop:
+ case Cursor::NotAllowed:
+ m_platformCursor = createNamedCursor(CustomCursorNoDrop);
+ break;
+ case Cursor::Copy:
+ m_platformCursor = createNamedCursor(CustomCursorCopy);
+ break;
+ case Cursor::None:
+ m_platformCursor = createNamedCursor(CustomCursorNone);
+ break;
+ case Cursor::ZoomIn:
+ m_platformCursor = createNamedCursor(CustomCursorZoomIn);
+ break;
+ case Cursor::ZoomOut:
+ m_platformCursor = createNamedCursor(CustomCursorZoomOut);
+ break;
+ case Cursor::Grab:
+ m_platformCursor = createNamedCursor(CustomCursorGrab);
+ break;
+ case Cursor::Grabbing:
+ m_platformCursor = createNamedCursor(CustomCursorGrabbing);
+ break;
+ case Cursor::Custom:
+ m_platformCursor = createCustomCursor(m_image.get(), m_hotSpot);
+ break;
+ }
}
-Cursor::~Cursor()
+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)
{
- if (m_platformCursor)
- gdk_cursor_unref(m_platformCursor);
}
Cursor& Cursor::operator=(const Cursor& other)
{
- gdk_cursor_ref(other.m_platformCursor);
- gdk_cursor_unref(m_platformCursor);
+ m_type = other.m_type;
+ m_image = other.m_image;
+ m_hotSpot = other.m_hotSpot;
m_platformCursor = other.m_platformCursor;
return *this;
}
-Cursor::Cursor(GdkCursor* c)
- : m_platformCursor(c)
-{
- m_platformCursor = c;
-
- // The GdkCursor may be NULL - the default cursor for the window.
- if (c)
- gdk_cursor_ref(c);
-}
-
-const Cursor& pointerCursor()
-{
- static Cursor c = 0;
- return c;
-}
-
-const Cursor& crossCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_CROSS);
- return c;
-}
-
-const Cursor& handCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_HAND2);
- return c;
-}
-
-const Cursor& moveCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_FLEUR);
- return c;
-}
-
-const Cursor& iBeamCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_XTERM);
- return c;
-}
-
-const Cursor& waitCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_WATCH);
- return c;
-}
-
-const Cursor& helpCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_QUESTION_ARROW);
- return c;
-}
-
-const Cursor& eastResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_RIGHT_SIDE);
- return c;
-}
-
-const Cursor& northResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_TOP_SIDE);
- return c;
-}
-
-const Cursor& northEastResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_TOP_RIGHT_CORNER);
- return c;
-}
-
-const Cursor& northWestResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_TOP_LEFT_CORNER);
- return c;
-}
-
-const Cursor& southResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_BOTTOM_SIDE);
- return c;
-}
-
-const Cursor& southEastResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
- return c;
-}
-
-const Cursor& southWestResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
- return c;
-}
-
-const Cursor& westResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_LEFT_SIDE);
- return c;
-}
-
-const Cursor& northSouthResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_TOP_TEE);
- return c;
-}
-
-const Cursor& eastWestResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_LEFT_SIDE);
- return c;
-}
-
-const Cursor& northEastSouthWestResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_SIZING);
- return c;
-}
-
-const Cursor& northWestSouthEastResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_SIZING);
- return c;
-}
-
-const Cursor& columnResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
- return c;
-}
-
-const Cursor& rowResizeCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_SB_V_DOUBLE_ARROW);
- 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& verticalTextCursor()
-{
- static Cursor c = customCursorNew(CustomCursorVerticalText);
- return c;
-}
-
-const Cursor& cellCursor()
-{
- static Cursor c = gdk_cursor_new(GDK_PLUS);
- return c;
-}
-
-const Cursor& contextMenuCursor()
-{
- static Cursor c = customCursorNew(CustomCursorContextMenu);
- return c;
-}
-
-const Cursor& noDropCursor()
-{
- static Cursor c = customCursorNew(CustomCursorNoDrop);
- return c;
-}
-
-const Cursor& copyCursor()
-{
- static Cursor c = customCursorNew(CustomCursorCopy);
- return c;
-}
-
-const Cursor& progressCursor()
-{
- static Cursor c = customCursorNew(CustomCursorProgress);
- return c;
-}
-
-const Cursor& aliasCursor()
-{
- static Cursor c = customCursorNew(CustomCursorAlias);
- return c;
-}
-
-const Cursor& noneCursor()
-{
- static Cursor c = customCursorNew(CustomCursorNone);
- return c;
-}
-
-const Cursor& notAllowedCursor()
-{
- return noDropCursor();
-}
-
-const Cursor& zoomInCursor()
-{
- static Cursor c = customCursorNew(CustomCursorZoomIn);
- return c;
-}
-
-const Cursor& zoomOutCursor()
-{
- static Cursor c = customCursorNew(CustomCursorZoomOut);
- return c;
-}
-
-const Cursor& grabCursor()
-{
- static Cursor c = customCursorNew(CustomCursorGrab);
- return c;
-}
-
-const Cursor& grabbingCursor()
+Cursor::~Cursor()
{
- static Cursor c = customCursorNew(CustomCursorGrabbing);
- return c;
}
}
diff --git a/WebCore/platform/gtk/WidgetGtk.cpp b/WebCore/platform/gtk/WidgetGtk.cpp
index c2c11bd..db316d5 100644
--- a/WebCore/platform/gtk/WidgetGtk.cpp
+++ b/WebCore/platform/gtk/WidgetGtk.cpp
@@ -67,7 +67,7 @@ static GdkDrawable* gdkDrawable(PlatformWidget widget)
void Widget::setCursor(const Cursor& cursor)
{
- GdkCursor* platformCursor = cursor.impl();
+ GdkCursor* platformCursor = cursor.platformCursor().get();
// http://bugs.webkit.org/show_bug.cgi?id=16388
// [GTK] Widget::setCursor() gets called frequently
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list