1/*
2 * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
3 * Copyright (C) 2007 Christian Dywan <christian@twotoasts.de>
4 * Copyright (C) 2010-2012 Igalia S.L.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include "config.h"
30#include "Cursor.h"
31
32#include "Image.h"
33#include "IntPoint.h"
34#include <gdk/gdk.h>
35
36namespace WebCore {
37
38static GRefPtr<GdkCursor> createNamedCursor(const char* name)
39{
40 return adoptGRef(gdk_cursor_new_from_name(gdk_display_get_default(), name));
41}
42
43static GRefPtr<GdkCursor> createCustomCursor(Image* image, const IntPoint& hotSpot)
44{
45 GRefPtr<GdkPixbuf> pixbuf = adoptGRef(image->getGdkPixbuf());
46
47 if (!image->nativeImageForCurrentFrame() || !pixbuf)
48 return 0;
49
50 IntPoint effectiveHotSpot = determineHotSpot(image, hotSpot);
51 return adoptGRef(gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pixbuf.get(), effectiveHotSpot.x(), effectiveHotSpot.y()));
52}
53
54void Cursor::ensurePlatformCursor() const
55{
56 if (m_platformCursor || m_type == Cursor::Pointer)
57 return;
58
59 switch (m_type) {
60 case Cursor::Pointer:
61 // A null GdkCursor is the default cursor for the window.
62 m_platformCursor = 0;
63 break;
64 case Cursor::Cross:
65 m_platformCursor = createNamedCursor("crosshair");
66 break;
67 case Cursor::Hand:
68 m_platformCursor = createNamedCursor("pointer");
69 break;
70 case Cursor::IBeam:
71 m_platformCursor = createNamedCursor("text");
72 break;
73 case Cursor::Wait:
74 m_platformCursor = createNamedCursor("wait");
75 break;
76 case Cursor::Help:
77 m_platformCursor = createNamedCursor("help");
78 break;
79 case Cursor::Move:
80 case Cursor::MiddlePanning:
81 m_platformCursor = createNamedCursor("move");
82 break;
83 case Cursor::EastResize:
84 case Cursor::EastPanning:
85 m_platformCursor = createNamedCursor("e-resize");
86 break;
87 case Cursor::NorthResize:
88 case Cursor::NorthPanning:
89 m_platformCursor = createNamedCursor("n-resize");
90 break;
91 case Cursor::NorthEastResize:
92 case Cursor::NorthEastPanning:
93 m_platformCursor = createNamedCursor("ne-resize");
94 break;
95 case Cursor::NorthWestResize:
96 case Cursor::NorthWestPanning:
97 m_platformCursor = createNamedCursor("nw-resize");
98 break;
99 case Cursor::SouthResize:
100 case Cursor::SouthPanning:
101 m_platformCursor = createNamedCursor("s-resize");
102 break;
103 case Cursor::SouthEastResize:
104 case Cursor::SouthEastPanning:
105 m_platformCursor = createNamedCursor("se-resize");
106 break;
107 case Cursor::SouthWestResize:
108 case Cursor::SouthWestPanning:
109 m_platformCursor = createNamedCursor("sw-resize");
110 break;
111 case Cursor::WestResize:
112 case Cursor::WestPanning:
113 m_platformCursor = createNamedCursor("w-resize");
114 break;
115 case Cursor::NorthSouthResize:
116 m_platformCursor = createNamedCursor("ns-resize");
117 break;
118 case Cursor::EastWestResize:
119 m_platformCursor = createNamedCursor("ew-resize");
120 break;
121 case Cursor::NorthEastSouthWestResize:
122 m_platformCursor = createNamedCursor("nesw-resize");
123 break;
124 case Cursor::NorthWestSouthEastResize:
125 m_platformCursor = createNamedCursor("nwse-resize");
126 break;
127 case Cursor::ColumnResize:
128 m_platformCursor = createNamedCursor("col-resize");
129 break;
130 case Cursor::RowResize:
131 m_platformCursor = createNamedCursor("row-resize");
132 break;
133 case Cursor::VerticalText:
134 m_platformCursor = createNamedCursor("vertical-text");
135 break;
136 case Cursor::Cell:
137 m_platformCursor = createNamedCursor("cell");
138 break;
139 case Cursor::ContextMenu:
140 m_platformCursor = createNamedCursor("context-menu");
141 break;
142 case Cursor::Alias:
143 m_platformCursor = createNamedCursor("alias");
144 break;
145 case Cursor::Progress:
146 m_platformCursor = createNamedCursor("progress");
147 break;
148 case Cursor::NoDrop:
149 m_platformCursor = createNamedCursor("no-drop");
150 break;
151 case Cursor::NotAllowed:
152 m_platformCursor = createNamedCursor("not-allowed");
153 break;
154 case Cursor::Copy:
155 m_platformCursor = createNamedCursor("copy");
156 break;
157 case Cursor::None:
158 m_platformCursor = createNamedCursor("none");
159 break;
160 case Cursor::ZoomIn:
161 m_platformCursor = createNamedCursor("zoom-in");
162 break;
163 case Cursor::ZoomOut:
164 m_platformCursor = createNamedCursor("zoom-out");
165 break;
166 case Cursor::Grab:
167 m_platformCursor = createNamedCursor("grab");
168 break;
169 case Cursor::Grabbing:
170 m_platformCursor = createNamedCursor("grabbing");
171 break;
172 case Cursor::Custom:
173 m_platformCursor = createCustomCursor(m_image.get(), m_hotSpot);
174 break;
175 }
176}
177
178}
179