Mercurial > sdl-ios-xcode
annotate src/video/x11/SDL_x11mouse.c @ 1358:c71e05b4dc2e
More header massaging... works great on Windows. ;-)
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 10 Feb 2006 06:48:43 +0000 |
parents | 604d73db6802 |
children | 19418e4422cb |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1168
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1168
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1168
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1168
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1168
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1168
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1168
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
80
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
23 #include <X11/Xlib.h> | |
24 #include <X11/Xutil.h> | |
25 | |
26 #include "SDL_mouse.h" | |
27 #include "SDL_events_c.h" | |
28 #include "SDL_cursor_c.h" | |
29 #include "SDL_x11dga_c.h" | |
30 #include "SDL_x11mouse_c.h" | |
31 | |
32 | |
33 /* The implementation dependent data for the window manager cursor */ | |
34 struct WMcursor { | |
35 Cursor x_cursor; | |
36 }; | |
37 | |
38 | |
39 void X11_FreeWMCursor(_THIS, WMcursor *cursor) | |
40 { | |
41 if ( SDL_Display != NULL ) { | |
42 SDL_Lock_EventThread(); | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
43 pXFreeCursor(SDL_Display, cursor->x_cursor); |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
44 pXSync(SDL_Display, False); |
0 | 45 SDL_Unlock_EventThread(); |
46 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
47 SDL_free(cursor); |
0 | 48 } |
49 | |
50 WMcursor *X11_CreateWMCursor(_THIS, | |
51 Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y) | |
52 { | |
53 WMcursor *cursor; | |
54 XGCValues GCvalues; | |
55 GC GCcursor; | |
56 XImage *data_image, *mask_image; | |
57 Pixmap data_pixmap, mask_pixmap; | |
58 int clen, i; | |
59 char *x_data, *x_mask; | |
60 static XColor black = { 0, 0, 0, 0 }; | |
61 static XColor white = { 0xffff, 0xffff, 0xffff, 0xffff }; | |
62 | |
63 /* Allocate the cursor memory */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
64 cursor = (WMcursor *)SDL_malloc(sizeof(WMcursor)); |
0 | 65 if ( cursor == NULL ) { |
66 SDL_OutOfMemory(); | |
67 return(NULL); | |
68 } | |
69 | |
70 /* Mix the mask and the data */ | |
71 clen = (w/8)*h; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
72 x_data = (char *)SDL_malloc(clen); |
0 | 73 if ( x_data == NULL ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
74 SDL_free(cursor); |
0 | 75 SDL_OutOfMemory(); |
76 return(NULL); | |
77 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
78 x_mask = (char *)SDL_malloc(clen); |
0 | 79 if ( x_mask == NULL ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
80 SDL_free(cursor); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
81 SDL_free(x_data); |
0 | 82 SDL_OutOfMemory(); |
83 return(NULL); | |
84 } | |
85 for ( i=0; i<clen; ++i ) { | |
86 /* The mask is OR'd with the data to turn inverted color | |
87 pixels black since inverted color cursors aren't supported | |
88 under X11. | |
89 */ | |
90 x_mask[i] = data[i] | mask[i]; | |
91 x_data[i] = data[i]; | |
92 } | |
93 | |
94 /* Prevent the event thread from running while we use the X server */ | |
95 SDL_Lock_EventThread(); | |
96 | |
97 /* Create the data image */ | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
98 data_image = pXCreateImage(SDL_Display, |
0 | 99 DefaultVisual(SDL_Display, SDL_Screen), |
100 1, XYBitmap, 0, x_data, w, h, 8, w/8); | |
101 data_image->byte_order = MSBFirst; | |
102 data_image->bitmap_bit_order = MSBFirst; | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
103 data_pixmap = pXCreatePixmap(SDL_Display, SDL_Root, w, h, 1); |
0 | 104 |
105 /* Create the data mask */ | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
106 mask_image = pXCreateImage(SDL_Display, |
0 | 107 DefaultVisual(SDL_Display, SDL_Screen), |
108 1, XYBitmap, 0, x_mask, w, h, 8, w/8); | |
109 mask_image->byte_order = MSBFirst; | |
110 mask_image->bitmap_bit_order = MSBFirst; | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
111 mask_pixmap = pXCreatePixmap(SDL_Display, SDL_Root, w, h, 1); |
0 | 112 |
113 /* Create the graphics context */ | |
114 GCvalues.function = GXcopy; | |
115 GCvalues.foreground = ~0; | |
116 GCvalues.background = 0; | |
117 GCvalues.plane_mask = AllPlanes; | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
118 GCcursor = pXCreateGC(SDL_Display, data_pixmap, |
0 | 119 (GCFunction|GCForeground|GCBackground|GCPlaneMask), |
120 &GCvalues); | |
121 | |
122 /* Blit the images to the pixmaps */ | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
123 pXPutImage(SDL_Display, data_pixmap, GCcursor, data_image, |
0 | 124 0, 0, 0, 0, w, h); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
125 pXPutImage(SDL_Display, mask_pixmap, GCcursor, mask_image, |
0 | 126 0, 0, 0, 0, w, h); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
127 pXFreeGC(SDL_Display, GCcursor); |
0 | 128 /* These free the x_data and x_mask memory pointers */ |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
129 pXDestroyImage(data_image); |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
130 pXDestroyImage(mask_image); |
0 | 131 |
132 /* Create the cursor */ | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
133 cursor->x_cursor = pXCreatePixmapCursor(SDL_Display, data_pixmap, |
0 | 134 mask_pixmap, &black, &white, hot_x, hot_y); |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
135 pXFreePixmap(SDL_Display, data_pixmap); |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
136 pXFreePixmap(SDL_Display, mask_pixmap); |
0 | 137 |
138 /* Release the event thread */ | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
139 pXSync(SDL_Display, False); |
0 | 140 SDL_Unlock_EventThread(); |
141 | |
142 return(cursor); | |
143 } | |
144 | |
145 int X11_ShowWMCursor(_THIS, WMcursor *cursor) | |
146 { | |
147 /* Don't do anything if the display is gone */ | |
148 if ( SDL_Display == NULL ) { | |
149 return(0); | |
150 } | |
151 | |
152 /* Set the X11 cursor cursor, or blank if cursor is NULL */ | |
153 if ( SDL_Window ) { | |
154 SDL_Lock_EventThread(); | |
155 if ( cursor == NULL ) { | |
156 if ( SDL_BlankCursor != NULL ) { | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
157 pXDefineCursor(SDL_Display, SDL_Window, |
0 | 158 SDL_BlankCursor->x_cursor); |
159 } | |
160 } else { | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
161 pXDefineCursor(SDL_Display, SDL_Window, cursor->x_cursor); |
0 | 162 } |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
163 pXSync(SDL_Display, False); |
0 | 164 SDL_Unlock_EventThread(); |
165 } | |
166 return(1); | |
167 } | |
168 | |
169 void X11_WarpWMCursor(_THIS, Uint16 x, Uint16 y) | |
170 { | |
171 if ( using_dga & DGA_MOUSE ) { | |
527
5c74ac147358
Fixed mouse warp position bug with offset video modes
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
172 SDL_PrivateMouseMotion(0, 0, x, y); |
5c74ac147358
Fixed mouse warp position bug with offset video modes
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
173 } else if ( mouse_relative) { |
5c74ac147358
Fixed mouse warp position bug with offset video modes
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
174 /* RJR: March 28, 2000 |
5c74ac147358
Fixed mouse warp position bug with offset video modes
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
175 leave physical cursor at center of screen if |
5c74ac147358
Fixed mouse warp position bug with offset video modes
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
176 mouse hidden and grabbed */ |
0 | 177 SDL_PrivateMouseMotion(0, 0, x, y); |
178 } else { | |
179 SDL_Lock_EventThread(); | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
180 pXWarpPointer(SDL_Display, None, SDL_Window, 0, 0, 0, 0, x, y); |
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
181 pXSync(SDL_Display, False); |
0 | 182 SDL_Unlock_EventThread(); |
183 } | |
184 } | |
185 | |
186 /* Sets the mouse acceleration from a string of the form: | |
187 2/1/0 | |
188 The first number is the numerator, followed by the acceleration | |
189 denumenator and threshold. | |
190 */ | |
191 static void SetMouseAccel(_THIS, const char *accel_param) | |
192 { | |
193 int i; | |
194 int accel_value[3]; | |
195 char *mouse_param, *mouse_param_buf, *pin; | |
196 | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
197 mouse_param_buf = (char *)SDL_malloc(SDL_strlen(accel_param)+1); |
0 | 198 if ( ! mouse_param_buf ) { |
199 return; | |
200 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
201 SDL_strcpy(mouse_param_buf, accel_param); |
0 | 202 mouse_param = mouse_param_buf; |
203 | |
204 for ( i=0; (i < 3) && mouse_param; ++i ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
205 pin = SDL_strchr(mouse_param, '/'); |
0 | 206 if ( pin ) { |
207 *pin = '\0'; | |
208 } | |
209 accel_value[i] = atoi(mouse_param); | |
210 if ( pin ) { | |
211 mouse_param = pin+1; | |
212 } else { | |
213 mouse_param = NULL; | |
214 } | |
215 } | |
216 if ( mouse_param_buf ) { | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
217 pXChangePointerControl(SDL_Display, True, True, |
0 | 218 accel_value[0], accel_value[1], accel_value[2]); |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
219 SDL_free(mouse_param_buf); |
0 | 220 } |
221 } | |
222 | |
223 /* Check to see if we need to enter or leave mouse relative mode */ | |
224 void X11_CheckMouseModeNoLock(_THIS) | |
225 { | |
79
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
226 char *env_override; |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
227 int enable_relative = 1; |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
228 |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
229 /* Allow the user to override the relative mouse mode. |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
230 They almost never want to do this, as it seriously affects |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
231 applications that rely on continuous relative mouse motion. |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
232 */ |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
233 env_override = SDL_getenv("SDL_MOUSE_RELATIVE"); |
79
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
234 if ( env_override ) { |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
235 enable_relative = atoi(env_override); |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
236 } |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
237 |
0 | 238 /* If the mouse is hidden and input is grabbed, we use relative mode */ |
79
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
239 if ( enable_relative && |
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
240 !(SDL_cursorstate & CURSOR_VISIBLE) && |
0 | 241 (this->input_grab != SDL_GRAB_OFF) && |
79
ffadd05de74d
Allow the user to override the relative mouse mode.
Sam Lantinga <slouken@lokigames.com>
parents:
78
diff
changeset
|
242 (SDL_GetAppState() & SDL_APPACTIVE) ) { |
0 | 243 if ( ! mouse_relative ) { |
244 X11_EnableDGAMouse(this); | |
245 if ( ! (using_dga & DGA_MOUSE) ) { | |
246 char *xmouse_accel; | |
247 | |
248 SDL_GetMouseState(&mouse_last.x, &mouse_last.y); | |
249 /* Use as raw mouse mickeys as possible */ | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
250 pXGetPointerControl(SDL_Display, |
0 | 251 &mouse_accel.numerator, |
252 &mouse_accel.denominator, | |
253 &mouse_accel.threshold); | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
254 xmouse_accel=SDL_getenv("SDL_VIDEO_X11_MOUSEACCEL"); |
0 | 255 if ( xmouse_accel ) { |
256 SetMouseAccel(this, xmouse_accel); | |
257 } | |
258 } | |
259 mouse_relative = 1; | |
260 } | |
261 } else { | |
262 if ( mouse_relative ) { | |
263 if ( using_dga & DGA_MOUSE ) { | |
264 X11_DisableDGAMouse(this); | |
265 } else { | |
1168
045f186426e1
Dynamically load X11 libraries like we currently do for alsa, esd, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
888
diff
changeset
|
266 pXChangePointerControl(SDL_Display, True, True, |
0 | 267 mouse_accel.numerator, |
268 mouse_accel.denominator, | |
269 mouse_accel.threshold); | |
270 } | |
271 mouse_relative = 0; | |
272 } | |
273 } | |
274 } | |
275 void X11_CheckMouseMode(_THIS) | |
276 { | |
277 SDL_Lock_EventThread(); | |
278 X11_CheckMouseModeNoLock(this); | |
279 SDL_Unlock_EventThread(); | |
280 } |