Skip to content

Latest commit

 

History

History
205 lines (164 loc) · 4.71 KB

SDL_gemmouse.c

File metadata and controls

205 lines (164 loc) · 4.71 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 Sam Lantinga
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
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.
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.
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
18
19
20
21
Sam Lantinga
slouken@libsdl.org
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
23
24
25
26
27
28
29
30
31
32
/*
* GEM Mouse manager
*
* Patrice Mandin
*/
#include <gem.h>
#include "SDL_mouse.h"
Feb 16, 2006
Feb 16, 2006
33
34
#include "../../events/SDL_events_c.h"
#include "../SDL_cursor_c.h"
35
#include "SDL_gemmouse_c.h"
Jun 14, 2006
Jun 14, 2006
36
#include "SDL_gemvideo.h"
Aug 26, 2011
Aug 26, 2011
37
#include "../ataricommon/SDL_xbiosevents_c.h"
38
39
40
/* Defines */
Nov 12, 2003
Nov 12, 2003
41
42
/*#define DEBUG_VIDEO_GEM 1*/
43
44
45
46
47
#define MAXCURWIDTH 16
#define MAXCURHEIGHT 16
void GEM_FreeWMCursor(_THIS, WMcursor *cursor)
{
Jun 14, 2006
Jun 14, 2006
48
49
50
51
#ifdef DEBUG_VIDEO_GEM
printf("sdl:video:gem: free cursor\n");
#endif
52
53
54
55
56
57
if (cursor == NULL)
return;
graf_mouse(ARROW, NULL);
if (cursor->mform_p != NULL)
Feb 7, 2006
Feb 7, 2006
58
SDL_free(cursor->mform_p);
Feb 7, 2006
Feb 7, 2006
60
SDL_free(cursor);
61
62
63
64
65
66
67
68
69
}
WMcursor *GEM_CreateWMCursor(_THIS,
Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
{
WMcursor *cursor;
MFORM *new_mform;
int i;
Jun 14, 2006
Jun 14, 2006
70
71
72
73
74
75
#ifdef DEBUG_VIDEO_GEM
Uint16 *data1, *mask1;
printf("sdl:video:gem: create cursor\n");
#endif
76
77
78
79
80
81
82
83
/* Check the size */
if ( (w > MAXCURWIDTH) || (h > MAXCURHEIGHT) ) {
SDL_SetError("Only cursors of dimension (%dx%d) are allowed",
MAXCURWIDTH, MAXCURHEIGHT);
return(NULL);
}
/* Allocate the cursor memory */
Feb 7, 2006
Feb 7, 2006
84
cursor = (WMcursor *)SDL_malloc(sizeof(WMcursor));
85
86
87
88
89
90
if ( cursor == NULL ) {
SDL_OutOfMemory();
return(NULL);
}
/* Allocate mform */
Feb 7, 2006
Feb 7, 2006
91
new_mform = (MFORM *)SDL_malloc(sizeof(MFORM));
92
if (new_mform == NULL) {
Feb 7, 2006
Feb 7, 2006
93
SDL_free(cursor);
94
95
96
97
98
99
100
101
102
103
104
105
SDL_OutOfMemory();
return(NULL);
}
cursor->mform_p = new_mform;
new_mform->mf_xhot = hot_x;
new_mform->mf_yhot = hot_y;
new_mform->mf_nplanes = 1;
new_mform->mf_fg = 0;
new_mform->mf_bg = 1;
Nov 12, 2003
Nov 12, 2003
106
for (i=0;i<MAXCURHEIGHT;i++) {
107
108
new_mform->mf_mask[i]=0;
new_mform->mf_data[i]=0;
Jun 14, 2006
Jun 14, 2006
109
110
111
112
113
114
#ifdef DEBUG_VIDEO_GEM
data1 = (Uint16 *) &data[i<<1];
mask1 = (Uint16 *) &mask[i<<1];
printf("sdl:video:gem: source: line %d: data=0x%04x, mask=0x%04x\n",
i, data1[i], mask1[i]);
#endif
115
116
117
}
if (w<=8) {
Nov 12, 2003
Nov 12, 2003
118
for (i=0;i<h;i++) {
119
120
121
122
new_mform->mf_mask[i]= mask[i]<<8;
new_mform->mf_data[i]= data[i]<<8;
}
} else {
Nov 12, 2003
Nov 12, 2003
123
for (i=0;i<h;i++) {
Jun 14, 2006
Jun 14, 2006
124
125
new_mform->mf_mask[i]= (mask[i<<1]<<8) | mask[(i<<1)+1];
new_mform->mf_data[i]= (data[i<<1]<<8) | data[(i<<1)+1];
126
127
128
}
}
Nov 12, 2003
Nov 12, 2003
129
130
#ifdef DEBUG_VIDEO_GEM
for (i=0; i<h ;i++) {
Jun 14, 2006
Jun 14, 2006
131
132
printf("sdl:video:gem: cursor: line %d: data=0x%04x, mask=0x%04x\n",
i, new_mform->mf_data[i], new_mform->mf_mask[i]);
Nov 12, 2003
Nov 12, 2003
133
134
135
136
137
}
printf("sdl:video:gem: CreateWMCursor(): done\n");
#endif
138
139
140
141
142
return cursor;
}
int GEM_ShowWMCursor(_THIS, WMcursor *cursor)
{
Jun 14, 2006
Jun 14, 2006
143
GEM_cursor = cursor;
Jul 13, 2007
Jul 13, 2007
144
145
GEM_CheckMouseMode(this);
Jun 14, 2006
Jun 14, 2006
146
Nov 12, 2003
Nov 12, 2003
147
148
149
#ifdef DEBUG_VIDEO_GEM
printf("sdl:video:gem: ShowWMCursor(0x%08x)\n", (long) cursor);
#endif
150
151
152
153
return 1;
}
Mar 26, 2002
Mar 26, 2002
154
#if 0
155
156
void GEM_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
{
Mar 26, 2002
Mar 26, 2002
157
158
/* This seems to work only on AES 3.4 (Falcon) */
159
160
161
EVNTREC warpevent;
warpevent.ap_event = APPEVNT_MOUSE;
Mar 26, 2002
Mar 26, 2002
162
warpevent.ap_value = (x << 16) | y;
163
164
165
appl_tplay(&warpevent, 1, 1000);
}
Mar 26, 2002
Mar 26, 2002
166
#endif
167
168
169
void GEM_CheckMouseMode(_THIS)
{
Jul 13, 2007
Jul 13, 2007
170
171
172
const Uint8 full_focus = (SDL_APPACTIVE|SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS);
int set_system_cursor = 1, show_system_cursor = 1;
Jun 14, 2006
Jun 14, 2006
173
174
175
176
#ifdef DEBUG_VIDEO_GEM
printf("sdl:video:gem: check mouse mode\n");
#endif
177
/* If the mouse is hidden and input is grabbed, we use relative mode */
Jul 13, 2007
Jul 13, 2007
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
GEM_mouse_relative = (!(SDL_cursorstate & CURSOR_VISIBLE))
&& (this->input_grab != SDL_GRAB_OFF)
&& (SDL_GetAppState() & SDL_APPACTIVE);
SDL_AtariXbios_LockMousePosition(GEM_mouse_relative);
if (SDL_cursorstate & CURSOR_VISIBLE) {
/* Application defined cursor only over the application window */
if ((SDL_GetAppState() & full_focus) == full_focus) {
if (GEM_cursor) {
graf_mouse(USER_DEF, GEM_cursor->mform_p);
set_system_cursor = 0;
} else {
show_system_cursor = 0;
}
}
193
} else {
Jul 13, 2007
Jul 13, 2007
194
195
196
197
198
199
200
201
202
203
/* Mouse cursor hidden only over the application window */
if ((SDL_GetAppState() & full_focus) == full_focus) {
set_system_cursor = 0;
show_system_cursor = 0;
}
}
graf_mouse(show_system_cursor ? M_ON : M_OFF, NULL);
if (set_system_cursor) {
graf_mouse(ARROW, NULL);
204
205
}
}