Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
218 lines (176 loc) · 6.14 KB

SDL_ph_mouse.c

File metadata and controls

218 lines (176 loc) · 6.14 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
Apr 26, 2001
Apr 26, 2001
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
Apr 26, 2001
Apr 26, 2001
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Apr 26, 2001
Apr 26, 2001
14
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Apr 26, 2001
Apr 26, 2001
18
19
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Apr 26, 2001
Apr 26, 2001
21
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
23
24
#include "SDL_mouse.h"
Feb 16, 2006
Feb 16, 2006
25
26
#include "../../events/SDL_events_c.h"
#include "../SDL_cursor_c.h"
Apr 26, 2001
Apr 26, 2001
27
28
#include "SDL_ph_mouse_c.h"
Jan 20, 2003
Jan 20, 2003
29
30
struct WMcursor
{
Jul 10, 2006
Jul 10, 2006
31
PhCursorDef_t *ph_cursor;
Apr 26, 2001
Apr 26, 2001
32
33
};
Jul 10, 2006
Jul 10, 2006
34
35
void
ph_FreeWMCursor(_THIS, WMcursor * cursor)
Apr 26, 2001
Apr 26, 2001
36
{
Jul 10, 2006
Jul 10, 2006
37
if (window != NULL) {
Mar 23, 2002
Mar 23, 2002
38
SDL_Lock_EventThread();
Apr 26, 2001
Apr 26, 2001
39
Jul 10, 2006
Jul 10, 2006
40
41
if (PtSetResource(window, Pt_ARG_CURSOR_TYPE, Ph_CURSOR_INHERIT, 0)
< 0) {
Mar 23, 2002
Mar 23, 2002
42
43
44
45
/* TODO: output error msg */
}
SDL_Unlock_EventThread();
Jul 10, 2006
Jul 10, 2006
46
}
Aug 4, 2003
Aug 4, 2003
47
Feb 7, 2006
Feb 7, 2006
48
SDL_free(cursor);
Apr 26, 2001
Apr 26, 2001
49
50
}
Jul 10, 2006
Jul 10, 2006
51
52
53
WMcursor *
ph_CreateWMCursor(_THIS, Uint8 * data, Uint8 * mask, int w, int h, int hot_x,
int hot_y)
Apr 26, 2001
Apr 26, 2001
54
{
Jul 10, 2006
Jul 10, 2006
55
WMcursor *cursor;
Jan 20, 2003
Jan 20, 2003
56
57
58
59
int clen, i;
unsigned char bit, databit, maskbit;
/* Allocate and initialize the cursor memory */
Jul 10, 2006
Jul 10, 2006
60
if ((cursor = (WMcursor *) SDL_malloc(sizeof(WMcursor))) == NULL) {
Jan 20, 2003
Jan 20, 2003
61
SDL_OutOfMemory();
Jul 10, 2006
Jul 10, 2006
62
return (NULL);
Jan 20, 2003
Jan 20, 2003
63
}
Jul 10, 2006
Jul 10, 2006
64
SDL_memset(cursor, 0, sizeof(WMcursor));
Jan 20, 2003
Jan 20, 2003
65
Jul 10, 2006
Jul 10, 2006
66
67
cursor->ph_cursor =
(PhCursorDef_t *) SDL_malloc(sizeof(PhCursorDef_t) + 32 * 4 * 2);
Aug 4, 2003
Aug 4, 2003
68
Jul 10, 2006
Jul 10, 2006
69
if (cursor->ph_cursor == NULL) {
Aug 4, 2003
Aug 4, 2003
70
71
72
SDL_SetError("ph_CreateWMCursor(): cursor malloc failed !\n");
return NULL;
}
Jan 20, 2003
Jan 20, 2003
73
Jul 10, 2006
Jul 10, 2006
74
SDL_memset(cursor->ph_cursor, 0, (sizeof(PhCursorDef_t) + 32 * 4 * 2));
Jan 20, 2003
Jan 20, 2003
75
Jul 10, 2006
Jul 10, 2006
76
77
78
79
80
81
cursor->ph_cursor->hdr.type = Ph_RDATA_CURSOR;
cursor->ph_cursor->size1.x = (short) w;
cursor->ph_cursor->size1.y = (short) h;
cursor->ph_cursor->offset1.x = (short) hot_x;
cursor->ph_cursor->offset1.y = (short) hot_y;
cursor->ph_cursor->bytesperline1 = (char) w / 8;
Jan 20, 2003
Jan 20, 2003
82
cursor->ph_cursor->color1 = Pg_WHITE;
Jul 10, 2006
Jul 10, 2006
83
84
85
86
87
cursor->ph_cursor->size2.x = (short) w;
cursor->ph_cursor->size2.y = (short) h;
cursor->ph_cursor->offset2.x = (short) hot_x;
cursor->ph_cursor->offset2.y = (short) hot_y;
cursor->ph_cursor->bytesperline2 = (char) w / 8;
Jan 20, 2003
Jan 20, 2003
88
89
cursor->ph_cursor->color2 = Pg_BLACK;
Jul 10, 2006
Jul 10, 2006
90
clen = (w / 8) * h;
Jan 20, 2003
Jan 20, 2003
91
92
/* Copy the mask and the data to different bitmap planes */
Jul 10, 2006
Jul 10, 2006
93
94
for (i = 0; i < clen; ++i) {
for (bit = 0; bit < 8; bit++) {
Jan 20, 2003
Jan 20, 2003
95
96
databit = data[i] & (1 << bit);
maskbit = mask[i] & (1 << bit);
Apr 26, 2001
Apr 26, 2001
97
Jan 20, 2003
Jan 20, 2003
98
99
100
cursor->ph_cursor->images[i] |= (databit == 0) ? maskbit : 0;
/* If the databit != 0, treat it as a black pixel and
* ignore the maskbit (can't do an inverted color) */
Jul 10, 2006
Jul 10, 2006
101
cursor->ph_cursor->images[i + clen] |= databit;
Jan 20, 2003
Jan 20, 2003
102
103
104
105
}
}
/* #bytes following the hdr struct */
Jul 10, 2006
Jul 10, 2006
106
107
cursor->ph_cursor->hdr.len =
sizeof(PhCursorDef_t) + clen * 2 - sizeof(PhRegionDataHdr_t);
Jan 20, 2003
Jan 20, 2003
108
109
110
return (cursor);
}
Apr 26, 2001
Apr 26, 2001
111
Jul 10, 2006
Jul 10, 2006
112
113
PhCursorDef_t
ph_GetWMPhCursor(WMcursor * cursor)
Apr 26, 2001
Apr 26, 2001
114
{
Aug 30, 2003
Aug 30, 2003
115
return (*cursor->ph_cursor);
Apr 26, 2001
Apr 26, 2001
116
117
}
Jul 10, 2006
Jul 10, 2006
118
119
int
ph_ShowWMCursor(_THIS, WMcursor * cursor)
Apr 26, 2001
Apr 26, 2001
120
{
Jan 20, 2003
Jan 20, 2003
121
122
123
124
PtArg_t args[3];
int nargs = 0;
/* Don't do anything if the display is gone */
Jul 10, 2006
Jul 10, 2006
125
if (window == NULL) {
Jan 20, 2003
Jan 20, 2003
126
127
128
129
return (0);
}
/* looks like photon can't draw mouse cursor in direct mode */
Jul 10, 2006
Jul 10, 2006
130
131
132
133
134
135
136
if (this->screen->flags & SDL_FULLSCREEN) {
/* disable the fake mouse in the fullscreen OpenGL mode */
if (this->screen->flags & SDL_INTERNALOPENGL) {
cursor = NULL;
} else {
return (0);
}
Jan 20, 2003
Jan 20, 2003
137
138
}
Aug 4, 2003
Aug 4, 2003
139
/* Set the photon cursor, or blank if cursor is NULL */
Jul 10, 2006
Jul 10, 2006
140
if (cursor != NULL) {
Jan 20, 2003
Jan 20, 2003
141
142
PtSetArg(&args[0], Pt_ARG_CURSOR_TYPE, Ph_CURSOR_BITMAP, 0);
/* Could set next to any PgColor_t value */
Jul 10, 2006
Jul 10, 2006
143
144
145
PtSetArg(&args[1], Pt_ARG_CURSOR_COLOR, Ph_CURSOR_DEFAULT_COLOR, 0);
PtSetArg(&args[2], Pt_ARG_BITMAP_CURSOR, cursor->ph_cursor,
(cursor->ph_cursor->hdr.len + sizeof(PhRegionDataHdr_t)));
Jan 20, 2003
Jan 20, 2003
146
nargs = 3;
Jul 10, 2006
Jul 10, 2006
147
148
} else { /* Ph_CURSOR_NONE */
Aug 4, 2003
Aug 4, 2003
149
PtSetArg(&args[0], Pt_ARG_CURSOR_TYPE, Ph_CURSOR_NONE, 0);
Jan 20, 2003
Jan 20, 2003
150
151
152
153
154
nargs = 1;
}
SDL_Lock_EventThread();
Jul 10, 2006
Jul 10, 2006
155
if (PtSetResources(window, nargs, args) < 0) {
Jan 20, 2003
Jan 20, 2003
156
return (0);
Jul 10, 2006
Jul 10, 2006
157
}
Jan 20, 2003
Jan 20, 2003
158
159
160
161
SDL_Unlock_EventThread();
return (1);
Apr 26, 2001
Apr 26, 2001
162
163
}
Aug 30, 2003
Aug 30, 2003
164
Jul 10, 2006
Jul 10, 2006
165
166
void
ph_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
Apr 26, 2001
Apr 26, 2001
167
{
Mar 23, 2002
Mar 23, 2002
168
short abs_x, abs_y;
Feb 20, 2002
Feb 20, 2002
169
Mar 23, 2002
Mar 23, 2002
170
SDL_Lock_EventThread();
Jul 10, 2006
Jul 10, 2006
171
172
PtGetAbsPosition(window, &abs_x, &abs_y);
PhMoveCursorAbs(PhInputGroup(NULL), x + abs_x, y + abs_y);
Mar 23, 2002
Mar 23, 2002
173
SDL_Unlock_EventThread();
Apr 26, 2001
Apr 26, 2001
174
175
176
}
Jul 10, 2006
Jul 10, 2006
177
178
void
ph_CheckMouseMode(_THIS)
Apr 26, 2001
Apr 26, 2001
179
{
Mar 23, 2002
Mar 23, 2002
180
/* If the mouse is hidden and input is grabbed, we use relative mode */
Jul 10, 2006
Jul 10, 2006
181
182
if (!(SDL_cursorstate & CURSOR_VISIBLE)
&& (this->input_grab != SDL_GRAB_OFF)) {
Mar 23, 2002
Mar 23, 2002
183
mouse_relative = 1;
Jul 10, 2006
Jul 10, 2006
184
} else {
Mar 23, 2002
Mar 23, 2002
185
186
mouse_relative = 0;
}
Apr 26, 2001
Apr 26, 2001
187
}
Aug 30, 2003
Aug 30, 2003
188
189
Jul 10, 2006
Jul 10, 2006
190
191
void
ph_UpdateMouse(_THIS)
Aug 30, 2003
Aug 30, 2003
192
193
194
195
196
197
198
199
200
201
202
{
PhCursorInfo_t phcursor;
short abs_x;
short abs_y;
/* Lock the event thread, in multi-threading environments */
SDL_Lock_EventThread();
/* synchronizing photon mouse cursor position and SDL mouse position, if cursor appears over window. */
PtGetAbsPosition(window, &abs_x, &abs_y);
PhQueryCursor(PhInputGroup(NULL), &phcursor);
Jul 10, 2006
Jul 10, 2006
203
204
205
206
if (((phcursor.pos.x >= abs_x)
&& (phcursor.pos.x <= abs_x + this->screen->w))
&& ((phcursor.pos.y >= abs_y)
&& (phcursor.pos.y <= abs_y + this->screen->h))) {
Aug 30, 2003
Aug 30, 2003
207
SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
Jul 10, 2006
Jul 10, 2006
208
209
210
SDL_PrivateMouseMotion(0, 0, phcursor.pos.x - abs_x,
phcursor.pos.y - abs_y);
} else {
Aug 30, 2003
Aug 30, 2003
211
212
213
214
215
216
SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
}
/* Unlock the event thread, in multi-threading environments */
SDL_Unlock_EventThread();
}
Jul 10, 2006
Jul 10, 2006
217
218
/* vi: set ts=4 sw=4 expandtab: */