This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_DirectFB_video.c
258 lines (201 loc) · 6.79 KB
1
/*
2
SDL - Simple DirectMedia Layer
3
Copyright (C) 1997-2009 Sam Lantinga
4
5
6
7
8
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
13
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
Lesser General Public License for more details.
14
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
Sam Lantinga
slouken@libsdl.org
21
22
23
SDL1.3 implementation by couriersud@arcor.de
24
*/
25
26
27
#include "SDL_config.h"
28
29
30
31
32
33
34
35
36
/* DirectFB video driver implementation.
*/
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <directfb.h>
37
#include <directfb_version.h>
38
39
40
#include "SDL_video.h"
#include "SDL_mouse.h"
41
42
43
#include "../SDL_sysvideo.h"
#include "../SDL_pixels_c.h"
#include "../../events/SDL_events_c.h"
44
45
#include "SDL_DirectFB_video.h"
#include "SDL_DirectFB_events.h"
46
47
#include "SDL_DirectFB_render.h"
#include "SDL_DirectFB_mouse.h"
48
49
50
#include "SDL_DirectFB_dyn.h"
51
52
53
54
/* Initialization/Query functions */
static int DirectFB_VideoInit(_THIS);
static void DirectFB_VideoQuit(_THIS);
55
56
static int DirectFB_Available(void);
static SDL_VideoDevice *DirectFB_CreateDevice(int devindex);
57
58
59
60
static int DirectFB_SetDisplayGammaRamp(_THIS, Uint16 * ramp);
static int DirectFB_GetDisplayGammaRamp(_THIS, Uint16 * ramp);
61
62
63
64
VideoBootStrap DirectFB_bootstrap = {
"directfb", "DirectFB",
DirectFB_Available, DirectFB_CreateDevice
};
65
66
67
/* DirectFB driver bootstrap functions */
68
69
static int
DirectFB_Available(void)
70
{
71
72
73
if (!SDL_DirectFB_LoadLibrary())
return 0;
SDL_DirectFB_UnLoadLibrary();
74
return 1;
75
76
}
77
78
static void
DirectFB_DeleteDevice(SDL_VideoDevice * device)
79
{
80
81
82
SDL_DirectFB_UnLoadLibrary();
SDL_DFB_FREE(device->driverdata);
SDL_DFB_FREE(device);
83
84
}
85
86
static SDL_VideoDevice *
DirectFB_CreateDevice(int devindex)
87
{
88
89
SDL_VideoDevice *device;
90
91
92
if (!SDL_DirectFB_LoadLibrary())
return NULL;
93
/* Initialize all variables that we clean on shutdown */
94
95
96
SDL_DFB_CALLOC(device, 1, sizeof(SDL_VideoDevice));
/* Set the function pointers */
97
98
99
100
/* Set the function pointers */
device->VideoInit = DirectFB_VideoInit;
device->VideoQuit = DirectFB_VideoQuit;
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
device->GetDisplayModes = DirectFB_GetDisplayModes;
device->SetDisplayMode = DirectFB_SetDisplayMode;
#if 0
device->SetDisplayGammaRamp = DirectFB_SetDisplayGammaRamp;
device->GetDisplayGammaRamp = DirectFB_GetDisplayGammaRamp;
#else
device->SetDisplayGammaRamp = NULL;
device->GetDisplayGammaRamp = NULL;
#endif
device->PumpEvents = DirectFB_PumpEventsWindow;
device->CreateWindow = DirectFB_CreateWindow;
device->CreateWindowFrom = DirectFB_CreateWindowFrom;
device->SetWindowTitle = DirectFB_SetWindowTitle;
device->SetWindowPosition = DirectFB_SetWindowPosition;
device->SetWindowSize = DirectFB_SetWindowSize;
device->ShowWindow = DirectFB_ShowWindow;
device->HideWindow = DirectFB_HideWindow;
device->RaiseWindow = DirectFB_RaiseWindow;
device->MaximizeWindow = DirectFB_MaximizeWindow;
device->MinimizeWindow = DirectFB_MinimizeWindow;
device->RestoreWindow = DirectFB_RestoreWindow;
device->SetWindowGrab = DirectFB_SetWindowGrab;
device->DestroyWindow = DirectFB_DestroyWindow;
device->GetWindowWMInfo = DirectFB_GetWindowWMInfo;
#if SDL_DIRECTFB_OPENGL
device->GL_LoadLibrary = DirectFB_GL_LoadLibrary;
device->GL_GetProcAddress = DirectFB_GL_GetProcAddress;
device->GL_MakeCurrent = DirectFB_GL_MakeCurrent;
device->GL_CreateContext = DirectFB_GL_CreateContext;
device->GL_SetSwapInterval = DirectFB_GL_SetSwapInterval;
device->GL_GetSwapInterval = DirectFB_GL_GetSwapInterval;
device->GL_SwapWindow = DirectFB_GL_SwapWindow;
device->GL_DeleteContext = DirectFB_GL_DeleteContext;
#endif
138
139
140
141
device->free = DirectFB_DeleteDevice;
return device;
142
143
144
145
error:
if (device)
free(device);
return (0);
146
147
}
148
149
static int
DirectFB_VideoInit(_THIS)
150
{
151
IDirectFB *dfb = NULL;
152
DFB_DeviceData *devdata = NULL;
153
char *stemp;
154
DFBResult ret;
155
156
157
SDL_DFB_CALLOC(devdata, 1, sizeof(*devdata));
158
SDL_DFB_CHECKERR(DirectFBInit(NULL, NULL));
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/* avoid switching to the framebuffer when we
* are running X11 */
stemp = getenv(DFBENV_USE_X11_CHECK);
if (stemp)
ret = atoi(stemp);
else
ret = 1;
if (ret) {
if (getenv("DISPLAY"))
DirectFBSetOption("system", "x11");
else
DirectFBSetOption("disable-module", "x11input");
}
devdata->use_linux_input = 1; /* default: on */
stemp = getenv(DFBENV_USE_LINUX_INPUT);
if (stemp)
devdata->use_linux_input = atoi(stemp);
if (!devdata->use_linux_input)
DirectFBSetOption("disable-module", "linux_input");
SDL_DFB_CHECKERR(DirectFBCreate(&dfb));
184
185
186
187
188
devdata->use_yuv_underlays = 0; /* default: off */
stemp = getenv(DFBENV_USE_YUV_UNDERLAY);
if (stemp)
devdata->use_yuv_underlays = atoi(stemp);
189
190
191
/* Create global Eventbuffer for axis events */
192
if (devdata->use_linux_input) {
193
194
195
196
197
198
199
200
201
SDL_DFB_CHECKERR(dfb->
CreateInputEventBuffer(dfb, DICAPS_ALL,
DFB_TRUE, &devdata->events));
} else {
SDL_DFB_CHECKERR(dfb->
CreateInputEventBuffer(dfb,
DICAPS_AXES /*DICAPS_ALL */ ,
DFB_TRUE, &devdata->events));
}
202
203
204
205
devdata->initialized = 1;
devdata->dfb = dfb;
devdata->firstwin = NULL;
206
207
_this->driverdata = devdata;
208
209
DirectFB_InitModes(_this);
210
211
#if SDL_DIRECTFB_OPENGL
212
DirectFB_GL_Initialize(_this);
213
#endif
214
215
216
DirectFB_AddRenderDriver(_this);
DirectFB_InitMouse(_this);
217
DirectFB_InitKeyboard(_this);
218
219
220
return 0;
221
222
223
error:
224
SDL_DFB_FREE(devdata);
225
226
SDL_DFB_RELEASE(dfb);
return -1;
227
228
}
229
230
static void
DirectFB_VideoQuit(_THIS)
231
{
232
233
DFB_DeviceData *devdata = (DFB_DeviceData *) _this->driverdata;
234
235
236
DirectFB_QuitModes(_this);
DirectFB_QuitKeyboard(_this);
DirectFB_QuitMouse(_this);
237
238
SDL_DFB_RELEASE(devdata->events);
239
SDL_DFB_RELEASE(devdata->dfb);
240
241
#if SDL_DIRECTFB_OPENGL
242
DirectFB_GL_Shutdown(_this);
243
#endif
244
245
246
devdata->initialized = 0;
}
247
248
249
static int
DirectFB_SetDisplayGammaRamp(_THIS, Uint16 * ramp)
250
{
251
return -1;
252
253
}
254
static int
255
DirectFB_GetDisplayGammaRamp(_THIS, Uint16 * ramp)
256
{
257
return -1;
258
}