comparison src/video/maccommon/SDL_macmouse.c @ 0:74212992fb08

Initial revision
author Sam Lantinga <slouken@lokigames.com>
date Thu, 26 Apr 2001 16:45:43 +0000
parents
children e92aa316c517
comparison
equal deleted inserted replaced
-1:000000000000 0:74212992fb08
1 /*
2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
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
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
19 Sam Lantinga
20 slouken@devolution.com
21 */
22
23 #ifdef SAVE_RCSID
24 static char rcsid =
25 "@(#) $Id$";
26 #endif
27
28 #include <stdlib.h>
29 #include <stdio.h>
30 #if TARGET_API_MAC_CARBON
31 #include <Carbon.h>
32 #else
33 #include <Quickdraw.h>
34 #endif
35
36 /* Routines that are not supported by the Carbon API... */
37 #if !TARGET_API_MAC_CARBON
38 #include <CursorDevices.h>
39 #endif
40
41 #include "SDL_error.h"
42 #include "SDL_mouse.h"
43 #include "SDL_macmouse_c.h"
44
45
46 /* The implementation dependent data for the window manager cursor */
47 struct WMcursor {
48 Cursor curs;
49 };
50
51
52 void Mac_FreeWMCursor(_THIS, WMcursor *cursor)
53 {
54 free(cursor);
55 }
56
57 WMcursor *Mac_CreateWMCursor(_THIS,
58 Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
59 {
60 WMcursor *cursor;
61 int row, bytes;
62
63 /* Allocate the cursor memory */
64 cursor = (WMcursor *)malloc(sizeof(WMcursor));
65 if ( cursor == NULL ) {
66 SDL_OutOfMemory();
67 return(NULL);
68 }
69 memset(cursor, 0, sizeof(*cursor));
70
71 bytes = (w/8);
72 if ( bytes > 2 ) {
73 bytes = 2;
74 }
75 for ( row=0; row<h && (row < 16); ++row ) {
76 memcpy(&cursor->curs.data[row], data, bytes);
77 data += w/8;
78 }
79 for ( row=0; row<h && (row < 16); ++row ) {
80 memcpy(&cursor->curs.mask[row], mask, bytes);
81 mask += w/8;
82 }
83 cursor->curs.hotSpot.h = hot_x;
84 cursor->curs.hotSpot.v = hot_y;
85
86 /* That was easy. :) */
87 return(cursor);
88 }
89
90 int Mac_cursor_showing = 1;
91
92 int Mac_ShowWMCursor(_THIS, WMcursor *cursor)
93 {
94 if ( cursor == NULL ) {
95 if ( Mac_cursor_showing ) {
96 HideCursor();
97 Mac_cursor_showing = 0;
98 }
99 } else {
100 SetCursor(&cursor->curs);
101 if ( ! Mac_cursor_showing ) {
102 ShowCursor();
103 Mac_cursor_showing = 1;
104 }
105 }
106 return(1);
107 }
108
109 void Mac_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
110 {
111 #if !TARGET_API_MAC_CARBON
112 CursorDevice *cursordevice;
113
114 cursordevice = nil;
115 CursorDeviceNextDevice(&cursordevice);
116 if ( cursordevice != nil ) {
117 WindowPtr saveport;
118 Point where;
119
120 GetPort(&saveport);
121 SetPort(SDL_Window);
122 where.h = x;
123 where.v = y;
124 LocalToGlobal(&where);
125 SetPort(saveport);
126 CursorDeviceMoveTo(cursordevice, where.h, where.v);
127 }
128 #endif /* !TARGET_API_MAC_CARBON */
129 }
130