xref: /haiku/src/servers/app/ServerCursor.h (revision 9760dcae2038d47442f4658c2575844c6cf92c40)
1 /*
2  * Copyright 2001-2009, 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 
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				AttachedToManager(CursorManager* manager);
51 
52 			const uint8*		CursorData() const
53 									{ return fCursorData; }
54 
55 protected:
56 	virtual	void				LastReferenceReleased();
57 
58 private:
59 	friend class CursorManager;
60 
61 			BPoint				fHotSpot;
62 			team_id				fOwningTeam;
63 			uint8*				fCursorData;
64 			CursorManager*		fManager;
65 };
66 
67 
68 class ServerCursorReference {
69 public:
70 	ServerCursorReference()
71 		:
72 		fCursor(NULL)
73 	{
74 	}
75 
76 	ServerCursorReference(ServerCursor* cursor)
77 		:
78 		fCursor(cursor)
79 	{
80 		if (fCursor)
81 			fCursor->AcquireReference();
82 	}
83 
84 	ServerCursorReference(const ServerCursorReference& other)
85 		:
86 		fCursor(other.fCursor)
87 	{
88 		if (fCursor)
89 			fCursor->AcquireReference();
90 	}
91 
92 	virtual ~ServerCursorReference()
93 	{
94 		if (fCursor)
95 			fCursor->ReleaseReference();
96 	}
97 
98 	ServerCursorReference& operator=(const ServerCursorReference& other)
99 	{
100 		SetCursor(other.fCursor);
101 		return *this;
102 	}
103 
104 	void SetCursor(ServerCursor* cursor)
105 	{
106 		if (fCursor == cursor)
107 			return;
108 
109 		if (cursor)
110 			cursor->AcquireReference();
111 
112 		ServerCursor* oldCursor = fCursor;
113 
114 		fCursor = cursor;
115 
116 		if (oldCursor)
117 			oldCursor->ReleaseReference();
118 	}
119 
120 	ServerCursor* Cursor() const
121 	{
122 		return fCursor;
123 	}
124 
125 private:
126 	ServerCursor*			fCursor;
127 };
128 
129 
130 #endif	// SERVER_CURSOR_H
131