2009-03-27 Dirk Schulze <krit@webkit.org>
[WebKit-https.git] / WebCore / platform / gtk / CursorGtk.cpp
1 /*
2  * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
3  * Copyright (C) 2007 Christian Dywan <christian@twotoasts.de>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include "config.h"
29 #include "CursorGtk.h"
30
31 #include "NotImplemented.h"
32 #include <wtf/Assertions.h>
33
34 #include <gdk/gdk.h>
35 #include <gtk/gtk.h>
36
37 namespace WebCore {
38
39 static GdkCursor* customCursorNew(CustomCursorType cursorType)
40 {
41     CustomCursor cursor = CustomCursors[cursorType];
42     GdkCursor* c = gdk_cursor_new_from_name(gdk_display_get_default(), cursor.name);
43     if (!c) {
44         const GdkColor fg = { 0, 0, 0, 0 };
45         const GdkColor bg = { 65535, 65535, 65535, 65535 };
46
47         GdkPixmap* source = gdk_bitmap_create_from_data(NULL, cursor.bits, 32, 32);
48         GdkPixmap* mask = gdk_bitmap_create_from_data(NULL, cursor.mask_bits, 32, 32);
49         c = gdk_cursor_new_from_pixmap(source, mask, &fg, &bg, cursor.hot_x, cursor.hot_y);
50         g_object_unref(source);
51         g_object_unref(mask);
52     }
53     return c;
54 }
55
56
57 Cursor::Cursor(const Cursor& other)
58     : m_impl(other.m_impl)
59 {
60     if (m_impl)
61         gdk_cursor_ref(m_impl);
62 }
63
64 Cursor::Cursor(Image*, const IntPoint&)
65 {
66     // FIXME: We don't support images for cursors yet.
67     // This is just a placeholder to avoid crashes.
68     Cursor other(crossCursor());
69     m_impl = other.m_impl;
70
71     if (m_impl)
72         gdk_cursor_ref(m_impl);
73 }
74
75 Cursor::~Cursor()
76 {
77     if (m_impl)
78         gdk_cursor_unref(m_impl);
79 }
80
81 Cursor& Cursor::operator=(const Cursor& other)
82 {
83     gdk_cursor_ref(other.m_impl);
84     gdk_cursor_unref(m_impl);
85     m_impl = other.m_impl;
86     return *this;
87 }
88
89 Cursor::Cursor(GdkCursor* c)
90     : m_impl(c)
91 {
92     m_impl = c;
93     ASSERT(c);
94     gdk_cursor_ref(c);
95 }
96
97 const Cursor& pointerCursor()
98 {
99     static Cursor c = gdk_cursor_new(GDK_LEFT_PTR);
100     return c;
101 }
102
103 const Cursor& crossCursor()
104 {
105     static Cursor c = gdk_cursor_new(GDK_CROSS);
106     return c;
107 }
108
109 const Cursor& handCursor()
110 {
111     static Cursor c = gdk_cursor_new(GDK_HAND2);
112     return c;
113 }
114
115 const Cursor& moveCursor()
116 {
117     static Cursor c = gdk_cursor_new(GDK_FLEUR);
118     return c;
119 }
120
121 const Cursor& iBeamCursor()
122 {
123     static Cursor c = gdk_cursor_new(GDK_XTERM);
124     return c;
125 }
126
127 const Cursor& waitCursor()
128 {
129     static Cursor c = gdk_cursor_new(GDK_WATCH);
130     return c;
131 }
132
133 const Cursor& helpCursor()
134 {
135     static Cursor c = gdk_cursor_new(GDK_QUESTION_ARROW);
136     return c;
137 }
138
139 const Cursor& eastResizeCursor()
140 {
141     static Cursor c = gdk_cursor_new(GDK_RIGHT_SIDE);
142     return c;
143 }
144
145 const Cursor& northResizeCursor()
146 {
147     static Cursor c = gdk_cursor_new(GDK_TOP_SIDE);
148     return c;
149 }
150
151 const Cursor& northEastResizeCursor()
152 {
153     static Cursor c = gdk_cursor_new(GDK_TOP_RIGHT_CORNER);
154     return c;
155 }
156
157 const Cursor& northWestResizeCursor()
158 {
159     static Cursor c = gdk_cursor_new(GDK_TOP_LEFT_CORNER);
160     return c;
161 }
162
163 const Cursor& southResizeCursor()
164 {
165     static Cursor c = gdk_cursor_new(GDK_BOTTOM_SIDE);
166     return c;
167 }
168
169 const Cursor& southEastResizeCursor()
170 {
171     static Cursor c = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
172     return c;
173 }
174
175 const Cursor& southWestResizeCursor()
176 {
177     static Cursor c = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
178     return c;
179 }
180
181 const Cursor& westResizeCursor()
182 {
183     static Cursor c = gdk_cursor_new(GDK_LEFT_SIDE);
184     return c;
185 }
186
187 const Cursor& northSouthResizeCursor()
188 {
189     static Cursor c = gdk_cursor_new(GDK_TOP_TEE);
190     return c;
191 }
192
193 const Cursor& eastWestResizeCursor()
194 {
195     static Cursor c = gdk_cursor_new(GDK_LEFT_SIDE);
196     return c;
197 }
198
199 const Cursor& northEastSouthWestResizeCursor()
200 {
201     static Cursor c = gdk_cursor_new(GDK_SIZING);
202     return c;
203 }
204
205 const Cursor& northWestSouthEastResizeCursor()
206 {
207     static Cursor c = gdk_cursor_new(GDK_SIZING);
208     return c;
209 }
210
211 const Cursor& columnResizeCursor()
212 {
213     static Cursor c = gdk_cursor_new(GDK_DOUBLE_ARROW);
214     return c;
215 }
216
217 const Cursor& rowResizeCursor()
218 {
219     static Cursor c = gdk_cursor_new(GDK_DOUBLE_ARROW);
220     return c;
221 }
222     
223 const Cursor& middlePanningCursor()
224 {
225     return moveCursor();
226 }
227
228 const Cursor& eastPanningCursor()
229 {
230     return eastResizeCursor();
231 }
232
233 const Cursor& northPanningCursor()
234 {
235     return northResizeCursor();
236 }
237
238 const Cursor& northEastPanningCursor()
239 {
240     return northEastResizeCursor();
241 }
242
243 const Cursor& northWestPanningCursor()
244 {
245     return northWestResizeCursor();
246 }
247
248 const Cursor& southPanningCursor()
249 {
250     return southResizeCursor();
251 }
252
253 const Cursor& southEastPanningCursor()
254 {
255     return southEastResizeCursor();
256 }
257
258 const Cursor& southWestPanningCursor()
259 {
260     return southWestResizeCursor();
261 }
262
263 const Cursor& westPanningCursor()
264 {
265     return westResizeCursor();
266 }
267     
268
269 const Cursor& verticalTextCursor()
270 {
271     static Cursor c = customCursorNew(CustomCursorVerticalText);
272     return c;
273 }
274
275 const Cursor& cellCursor()
276 {
277     notImplemented();
278     return pointerCursor();
279 }
280
281 const Cursor& contextMenuCursor()
282 {
283     static Cursor c = customCursorNew(CustomCursorContextMenu);
284     return c;
285 }
286
287 const Cursor& noDropCursor()
288 {
289     notImplemented();
290     return pointerCursor();
291 }
292
293 const Cursor& copyCursor()
294 {
295     static Cursor c = customCursorNew(CustomCursorCopy);
296     return c;
297 }
298
299 const Cursor& progressCursor()
300 {
301     notImplemented();
302     return pointerCursor();
303 }
304
305 const Cursor& aliasCursor()
306 {
307     static Cursor c = customCursorNew(CustomCursorAlias);
308     return c;
309 }
310
311 const Cursor& noneCursor()
312 {
313     notImplemented();
314     return pointerCursor();
315 }
316
317 const Cursor& notAllowedCursor()
318 {
319     notImplemented();
320     return pointerCursor();
321 }
322
323 const Cursor& zoomInCursor()
324 {
325     static Cursor c = customCursorNew(CustomCursorZoomIn);
326     return c;
327 }
328
329 const Cursor& zoomOutCursor()
330 {
331     static Cursor c = customCursorNew(CustomCursorZoomOut);
332     return c;
333 }
334
335 const Cursor& grabCursor()
336 {
337     notImplemented();
338     return pointerCursor();
339 }
340
341 const Cursor& grabbingCursor()
342 {
343     notImplemented();
344     return pointerCursor();
345 }
346
347 }