Skip to content

Latest commit

 

History

History
167 lines (133 loc) · 3.64 KB

SDL_gemmouse.c

File metadata and controls

167 lines (133 loc) · 3.64 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Feb 1, 2006
Feb 1, 2006
3
Copyright (C) 1997-2006 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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sam Lantinga
slouken@libsdl.org
*/
/*
* GEM Mouse manager
*
* Patrice Mandin
*/
#include <gem.h>
#include "SDL_mouse.h"
#include "SDL_events_c.h"
#include "SDL_cursor_c.h"
#include "SDL_gemmouse_c.h"
/* Defines */
Nov 12, 2003
Nov 12, 2003
38
39
/*#define DEBUG_VIDEO_GEM 1*/
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#define MAXCURWIDTH 16
#define MAXCURHEIGHT 16
/* The implementation dependent data for the window manager cursor */
struct WMcursor {
MFORM *mform_p;
};
void GEM_FreeWMCursor(_THIS, WMcursor *cursor)
{
if (cursor == NULL)
return;
graf_mouse(ARROW, NULL);
if (cursor->mform_p != NULL)
Feb 7, 2006
Feb 7, 2006
57
SDL_free(cursor->mform_p);
Feb 7, 2006
Feb 7, 2006
59
SDL_free(cursor);
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
}
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;
/* 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
77
cursor = (WMcursor *)SDL_malloc(sizeof(WMcursor));
78
79
80
81
82
83
if ( cursor == NULL ) {
SDL_OutOfMemory();
return(NULL);
}
/* Allocate mform */
Feb 7, 2006
Feb 7, 2006
84
new_mform = (MFORM *)SDL_malloc(sizeof(MFORM));
85
if (new_mform == NULL) {
Feb 7, 2006
Feb 7, 2006
86
SDL_free(cursor);
87
88
89
90
91
92
93
94
95
96
97
98
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
99
for (i=0;i<MAXCURHEIGHT;i++) {
100
101
102
103
104
new_mform->mf_mask[i]=0;
new_mform->mf_data[i]=0;
}
if (w<=8) {
Nov 12, 2003
Nov 12, 2003
105
for (i=0;i<h;i++) {
106
107
108
109
new_mform->mf_mask[i]= mask[i]<<8;
new_mform->mf_data[i]= data[i]<<8;
}
} else {
Nov 12, 2003
Nov 12, 2003
110
for (i=0;i<h;i++) {
111
112
113
114
115
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];
}
}
Nov 12, 2003
Nov 12, 2003
116
117
118
119
120
121
122
123
#ifdef DEBUG_VIDEO_GEM
for (i=0; i<h ;i++) {
printf("sdl:video:gem: cursor, line %d = 0x%04x\n", i, new_mform->mf_mask[i]);
}
printf("sdl:video:gem: CreateWMCursor(): done\n");
#endif
124
125
126
127
128
return cursor;
}
int GEM_ShowWMCursor(_THIS, WMcursor *cursor)
{
Nov 12, 2003
Nov 12, 2003
129
/*
130
131
132
133
134
if (cursor == NULL) {
graf_mouse(M_OFF, NULL);
} else if (cursor->mform_p) {
graf_mouse(USER_DEF, cursor->mform_p);
}
Nov 12, 2003
Nov 12, 2003
135
136
137
138
*/
#ifdef DEBUG_VIDEO_GEM
printf("sdl:video:gem: ShowWMCursor(0x%08x)\n", (long) cursor);
#endif
139
140
141
142
return 1;
}
Mar 26, 2002
Mar 26, 2002
143
#if 0
144
145
void GEM_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
{
Mar 26, 2002
Mar 26, 2002
146
147
/* This seems to work only on AES 3.4 (Falcon) */
148
149
150
EVNTREC warpevent;
warpevent.ap_event = APPEVNT_MOUSE;
Mar 26, 2002
Mar 26, 2002
151
warpevent.ap_value = (x << 16) | y;
152
153
154
appl_tplay(&warpevent, 1, 1000);
}
Mar 26, 2002
Mar 26, 2002
155
#endif
156
157
158
159
void GEM_CheckMouseMode(_THIS)
{
/* If the mouse is hidden and input is grabbed, we use relative mode */
Jan 25, 2006
Jan 25, 2006
160
161
if ( (!(SDL_cursorstate & CURSOR_VISIBLE)) &&
/*(this->input_grab != SDL_GRAB_OFF) && */ /* Damn GEM can not grab */
Mar 26, 2002
Mar 26, 2002
162
(SDL_GetAppState() & SDL_APPACTIVE) ) {
163
164
165
166
167
GEM_mouse_relative = SDL_TRUE;
} else {
GEM_mouse_relative = SDL_FALSE;
}
}