• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef Cursor_h
27 #define Cursor_h
28 
29 #include "Image.h"
30 #include "IntPoint.h"
31 #include <wtf/RefPtr.h>
32 
33 #if PLATFORM(WIN)
34 typedef struct HICON__* HICON;
35 typedef HICON HCURSOR;
36 #include <wtf/PassRefPtr.h>
37 #include <wtf/RefCounted.h>
38 #elif PLATFORM(MAC)
39 #include <wtf/RetainPtr.h>
40 #elif PLATFORM(GTK)
41 #include "GRefPtrGtk.h"
42 #elif PLATFORM(QT)
43 #include <QCursor>
44 #elif PLATFORM(CHROMIUM)
45 #include "PlatformCursor.h"
46 #elif PLATFORM(HAIKU)
47 #include <app/Cursor.h>
48 #endif
49 
50 #if PLATFORM(MAC)
51 #ifdef __OBJC__
52 @class NSCursor;
53 #else
54 class NSCursor;
55 #endif
56 #endif
57 
58 #if PLATFORM(WX)
59 class wxCursor;
60 #endif
61 
62 #if PLATFORM(WIN)
63 typedef struct HICON__ *HICON;
64 typedef HICON HCURSOR;
65 #endif
66 
67 #if PLATFORM(WIN) || PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(QT)
68 #define WTF_USE_LAZY_NATIVE_CURSOR 1
69 #endif
70 
71 namespace WebCore {
72 
73     class Image;
74 
75 #if PLATFORM(WIN)
76     class SharedCursor : public RefCounted<SharedCursor> {
77     public:
create(HCURSOR nativeCursor)78         static PassRefPtr<SharedCursor> create(HCURSOR nativeCursor) { return adoptRef(new SharedCursor(nativeCursor)); }
79         ~SharedCursor();
nativeCursor()80         HCURSOR nativeCursor() const { return m_nativeCursor; }
81     private:
SharedCursor(HCURSOR nativeCursor)82         SharedCursor(HCURSOR nativeCursor) : m_nativeCursor(nativeCursor) { }
83         HCURSOR m_nativeCursor;
84     };
85     typedef RefPtr<SharedCursor> PlatformCursor;
86 #elif PLATFORM(MAC)
87     typedef NSCursor *PlatformCursor;
88 #elif PLATFORM(GTK)
89     typedef GRefPtr<GdkCursor> PlatformCursor;
90 #elif PLATFORM(EFL)
91     typedef const char* PlatformCursor;
92 #elif PLATFORM(QT) && !defined(QT_NO_CURSOR)
93     // Do not need to be shared but need to be created dynamically via ensurePlatformCursor.
94     typedef QCursor* PlatformCursor;
95 #elif PLATFORM(WX)
96     typedef wxCursor* PlatformCursor;
97 #elif PLATFORM(CHROMIUM)
98     // See PlatformCursor.h
99 #elif PLATFORM(HAIKU)
100     typedef BCursor* PlatformCursor;
101 #else
102     typedef void* PlatformCursor;
103 #endif
104 
105     class Cursor {
106     public:
107         enum Type {
108             Pointer,
109             Cross,
110             Hand,
111             IBeam,
112             Wait,
113             Help,
114             EastResize,
115             NorthResize,
116             NorthEastResize,
117             NorthWestResize,
118             SouthResize,
119             SouthEastResize,
120             SouthWestResize,
121             WestResize,
122             NorthSouthResize,
123             EastWestResize,
124             NorthEastSouthWestResize,
125             NorthWestSouthEastResize,
126             ColumnResize,
127             RowResize,
128             MiddlePanning,
129             EastPanning,
130             NorthPanning,
131             NorthEastPanning,
132             NorthWestPanning,
133             SouthPanning,
134             SouthEastPanning,
135             SouthWestPanning,
136             WestPanning,
137             Move,
138             VerticalText,
139             Cell,
140             ContextMenu,
141             Alias,
142             Progress,
143             NoDrop,
144             Copy,
145             None,
146             NotAllowed,
147             ZoomIn,
148             ZoomOut,
149             Grab,
150             Grabbing,
151             Custom
152         };
153 
154         static const Cursor& fromType(Cursor::Type);
155 
Cursor()156         Cursor()
157 #if !PLATFORM(EFL)
158             : m_platformCursor(0)
159 #endif
160         {
161         }
162 
163         Cursor(Image*, const IntPoint& hotSpot);
164         Cursor(const Cursor&);
165         ~Cursor();
166         Cursor& operator=(const Cursor&);
167 
168 #if USE(LAZY_NATIVE_CURSOR)
169         Cursor(Type);
type()170         Type type() const { return m_type; }
image()171         Image* image() const { return m_image.get(); }
hotSpot()172         const IntPoint& hotSpot() const { return m_hotSpot; }
173         PlatformCursor platformCursor() const;
174 #else
175         Cursor(PlatformCursor);
impl()176         PlatformCursor impl() const { return m_platformCursor; }
177 #endif
178 
179      private:
180 #if USE(LAZY_NATIVE_CURSOR)
181         void ensurePlatformCursor() const;
182 
183         Type m_type;
184         RefPtr<Image> m_image;
185         IntPoint m_hotSpot;
186 #endif
187 
188 #if !PLATFORM(MAC)
189         mutable PlatformCursor m_platformCursor;
190 #else
191         mutable RetainPtr<NSCursor> m_platformCursor;
192 #endif
193     };
194 
195     IntPoint determineHotSpot(Image*, const IntPoint& specifiedHotSpot);
196     const char* nameForCursorType(Cursor::Type);
197 
198     const Cursor& pointerCursor();
199     const Cursor& crossCursor();
200     const Cursor& handCursor();
201     const Cursor& moveCursor();
202     const Cursor& iBeamCursor();
203     const Cursor& waitCursor();
204     const Cursor& helpCursor();
205     const Cursor& eastResizeCursor();
206     const Cursor& northResizeCursor();
207     const Cursor& northEastResizeCursor();
208     const Cursor& northWestResizeCursor();
209     const Cursor& southResizeCursor();
210     const Cursor& southEastResizeCursor();
211     const Cursor& southWestResizeCursor();
212     const Cursor& westResizeCursor();
213     const Cursor& northSouthResizeCursor();
214     const Cursor& eastWestResizeCursor();
215     const Cursor& northEastSouthWestResizeCursor();
216     const Cursor& northWestSouthEastResizeCursor();
217     const Cursor& columnResizeCursor();
218     const Cursor& rowResizeCursor();
219     const Cursor& middlePanningCursor();
220     const Cursor& eastPanningCursor();
221     const Cursor& northPanningCursor();
222     const Cursor& northEastPanningCursor();
223     const Cursor& northWestPanningCursor();
224     const Cursor& southPanningCursor();
225     const Cursor& southEastPanningCursor();
226     const Cursor& southWestPanningCursor();
227     const Cursor& westPanningCursor();
228     const Cursor& verticalTextCursor();
229     const Cursor& cellCursor();
230     const Cursor& contextMenuCursor();
231     const Cursor& noDropCursor();
232     const Cursor& notAllowedCursor();
233     const Cursor& progressCursor();
234     const Cursor& aliasCursor();
235     const Cursor& zoomInCursor();
236     const Cursor& zoomOutCursor();
237     const Cursor& copyCursor();
238     const Cursor& noneCursor();
239     const Cursor& grabCursor();
240     const Cursor& grabbingCursor();
241 
242 } // namespace WebCore
243 
244 #endif // Cursor_h
245