#include "SDL_internal.h"
#ifdef SDL_VIDEO_DRIVER_DUMMY
#include "../SDL_sysvideo.h"
#include "../SDL_pixels_c.h"
#include "../../events/SDL_events_c.h"
#ifdef SDL_INPUT_LINUXEV
#include "../../core/linux/SDL_evdev.h"
#endif
#include "SDL_nullvideo.h"
#include "SDL_nullevents_c.h"
#include "SDL_nullframebuffer_c.h"
#define DUMMYVID_DRIVER_NAME "dummy"
#define DUMMYVID_DRIVER_EVDEV_NAME "evdev"
static bool DUMMY_VideoInitCommon(SDL_VideoDevice *_this);
static bool DUMMY_VideoInit(SDL_VideoDevice *_this);
static void DUMMY_VideoQuit(SDL_VideoDevice *_this);
#ifdef SDL_INPUT_LINUXEV
static bool DUMMY_EVDEV_VideoInit(SDL_VideoDevice *_this);
static void DUMMY_EVDEV_VideoQuit(SDL_VideoDevice *_this);
#endif
static bool DUMMY_SetWindowPosition(SDL_VideoDevice *_this, SDL_Window *window)
{
SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_MOVED, window->pending.x, window->pending.y);
return true;
}
static void DUMMY_SetWindowSize(SDL_VideoDevice *_this, SDL_Window *window)
{
SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESIZED, window->pending.w, window->pending.h);
}
static bool DUMMY_Available(const char *drivername)
{
const char *hint = SDL_GetHint(SDL_HINT_VIDEO_DRIVER);
if (hint && SDL_strstr(hint, drivername) != NULL) {
return true;
}
return false;
}
static void DUMMY_DeleteDevice(SDL_VideoDevice *device)
{
SDL_free(device);
}
static SDL_VideoDevice *DUMMY_InternalCreateDevice(const char *enable_hint)
{
SDL_VideoDevice *device;
if (!DUMMY_Available(enable_hint)) {
return NULL;
}
device = (SDL_VideoDevice *)SDL_calloc(1, sizeof(SDL_VideoDevice));
if (!device) {
return NULL;
}
device->is_dummy = true;
device->VideoInit = DUMMY_VideoInit;
device->VideoQuit = DUMMY_VideoQuit;
device->PumpEvents = DUMMY_PumpEvents;
device->SetWindowSize = DUMMY_SetWindowSize;
device->SetWindowPosition = DUMMY_SetWindowPosition;
device->CreateWindowFramebuffer = SDL_DUMMY_CreateWindowFramebuffer;
device->UpdateWindowFramebuffer = SDL_DUMMY_UpdateWindowFramebuffer;
device->DestroyWindowFramebuffer = SDL_DUMMY_DestroyWindowFramebuffer;
device->free = DUMMY_DeleteDevice;
return device;
}
static SDL_VideoDevice *DUMMY_CreateDevice(void)
{
return DUMMY_InternalCreateDevice(DUMMYVID_DRIVER_NAME);
}
VideoBootStrap DUMMY_bootstrap = {
DUMMYVID_DRIVER_NAME, "SDL dummy video driver",
DUMMY_CreateDevice,
NULL, false
};
#ifdef SDL_INPUT_LINUXEV
static bool DUMMY_EVDEV_VideoInit(SDL_VideoDevice *_this)
{
if (!DUMMY_VideoInitCommon(_this)) {
return false;
}
SDL_EVDEV_Init();
return true;
}
static void DUMMY_EVDEV_VideoQuit(SDL_VideoDevice *_this)
{
SDL_EVDEV_Quit();
}
static void DUMMY_EVDEV_Poll(SDL_VideoDevice *_this)
{
(void)_this;
SDL_EVDEV_Poll();
}
static SDL_VideoDevice *DUMMY_EVDEV_CreateDevice(void)
{
SDL_VideoDevice *device = DUMMY_InternalCreateDevice(DUMMYVID_DRIVER_EVDEV_NAME);
if (device) {
device->VideoInit = DUMMY_EVDEV_VideoInit;
device->VideoQuit = DUMMY_EVDEV_VideoQuit;
device->PumpEvents = DUMMY_EVDEV_Poll;
}
return device;
}
VideoBootStrap DUMMY_evdev_bootstrap = {
DUMMYVID_DRIVER_EVDEV_NAME, "SDL dummy video driver with evdev",
DUMMY_EVDEV_CreateDevice,
NULL, false
};
#endif
static bool DUMMY_SetRelativeMouseMode(bool enabled)
{
return true;
}
bool DUMMY_VideoInitCommon(SDL_VideoDevice *_this)
{
SDL_DisplayMode mode;
SDL_zero(mode);
mode.format = SDL_PIXELFORMAT_XRGB8888;
mode.w = 1024;
mode.h = 768;
if (SDL_AddBasicVideoDisplay(&mode) == 0) {
return false;
}
return true;
}
bool DUMMY_VideoInit(SDL_VideoDevice *_this)
{
if (!DUMMY_VideoInitCommon(_this)) {
return false;
}
SDL_GetMouse()->SetRelativeMouseMode = DUMMY_SetRelativeMouseMode;
return true;
}
void DUMMY_VideoQuit(SDL_VideoDevice *_this)
{
}
#endif