xref: /haiku/src/servers/app/ServerCursor.h (revision b671e9bbdbd10268a042b4f4cc4317ccd03d105e)
1 /*
2  * Copyright 2001-2006, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		DarkWyrm <bpmagic@columbus.rr.com>
7  *		Stephan Aßmus <superstippi@gmx.de>
8  *		Axel Dörfler, axeld@pinc-software.de
9  */
10 #ifndef SERVER_CURSOR_H
11 #define SERVER_CURSOR_H
12 
13 
14 #include "ServerBitmap.h"
15 
16 #include <Point.h>
17 #include <String.h>
18 
19 class ServerApp;
20 class CursorManager;
21 
22 
23 class ServerCursor : public ServerBitmap {
24  public:
25 							ServerCursor(BRect r, color_space space,
26 										 int32 flags, BPoint hotspot,
27 										 int32 bytesperrow = -1,
28 										 screen_id screen = B_MAIN_SCREEN_ID);
29 							ServerCursor(const uint8* cursorDataFromR5);
30 							ServerCursor(const uint8* alreadyPaddedData,
31 										 uint32 width, uint32 height,
32 										 color_space format);
33 							ServerCursor(const ServerCursor* cursor);
34 
35 	virtual					~ServerCursor();
36 
37 	//! Returns the cursor's hot spot
38 			void			SetHotSpot(BPoint pt);
39 			BPoint			GetHotSpot() const
40 								{ return fHotSpot; }
41 
42 			void			SetOwningTeam(team_id tid)
43 								{ fOwningTeam = tid; }
44 			team_id			OwningTeam() const
45 								{ return fOwningTeam; }
46 
47 			int32			Token() const
48 								{ return fToken; }
49 
50 			void			Acquire()
51 								{ atomic_add(&fReferenceCount, 1); }
52 			bool			Release();
53 			int32			ReferenceCount() { return fReferenceCount; }
54 
55 			void			AttachedToManager(CursorManager* manager);
56 
57 			const uint8*	CursorData() const
58 								{ return fCursorData; }
59 
60  private:
61 	friend class CursorManager;
62 
63 			BPoint			fHotSpot;
64 			team_id			fOwningTeam;
65 			vint32			fReferenceCount;
66 			uint8*			fCursorData;
67 			CursorManager*	fManager;
68 };
69 
70 
71 class ServerCursorReference {
72 public:
73 							ServerCursorReference()
74 								: fCursor(NULL)
75 							{
76 							}
77 							ServerCursorReference(ServerCursor* cursor)
78 								: fCursor(cursor)
79 							{
80 								if (fCursor)
81 									fCursor->Acquire();
82 							}
83 							ServerCursorReference(const ServerCursorReference& other)
84 								: fCursor(other.fCursor)
85 							{
86 								if (fCursor)
87 									fCursor->Acquire();
88 							}
89 	virtual					~ServerCursorReference()
90 							{
91 								if (fCursor)
92 									fCursor->Release();
93 							}
94 
95 	ServerCursorReference&	operator=(const ServerCursorReference& other)
96 							{
97 								SetCursor(other.fCursor);
98 								return *this;
99 							}
100 
101 	void					SetCursor(ServerCursor* cursor)
102 							{
103 								if (fCursor == cursor)
104 									return;
105 								if (cursor)
106 									cursor->Acquire();
107 								ServerCursor* oldCursor = fCursor;
108 								fCursor = cursor;
109 								if (oldCursor)
110 									oldCursor->Release();
111 							}
112 	ServerCursor*			Cursor() const
113 							{
114 								return fCursor;
115 							}
116 private:
117 	ServerCursor*			fCursor;
118 };
119 
120 
121 #endif	// SERVER_CURSOR_H
122