2006-07-18 07:49:51 +00:00
|
|
|
|
|
|
|
/* A simple test program framework */
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
|
|
|
|
#define VIDEO_USAGE \
|
2010-07-05 22:45:15 -07:00
|
|
|
"[--video driver] [--renderer driver] [--info all|video|modes|render|event] [--display N] [--fullscreen | --windows N] [--title title] [--center | --position X,Y] [--geometry WxH] [--depth N] [--refresh R] [--vsync] [--noframe] [--resize] [--minimize] [--maximize] [--grab] [--double] [--triple]"
|
2006-07-18 07:49:51 +00:00
|
|
|
|
|
|
|
#define AUDIO_USAGE \
|
|
|
|
"[--rate N] [--format U8|S8|U16|U16LE|U16BE|S16|S16LE|S16BE] [--channels N] [--samples N]"
|
|
|
|
|
2009-06-11 06:03:05 +00:00
|
|
|
struct pformat {
|
2009-06-10 05:56:36 +00:00
|
|
|
Uint32 id;
|
2009-06-11 06:03:05 +00:00
|
|
|
const char* idstr;
|
|
|
|
} pixel_format[]={
|
|
|
|
{SDL_PIXELFORMAT_INDEX1LSB, "SDL_PIXELFORMAT_INDEX1LSB"},
|
|
|
|
{SDL_PIXELFORMAT_INDEX1MSB, "SDL_PIXELFORMAT_INDEX1MSB"},
|
|
|
|
{SDL_PIXELFORMAT_INDEX4LSB, "SDL_PIXELFORMAT_INDEX4LSB"},
|
|
|
|
{SDL_PIXELFORMAT_INDEX4MSB, "SDL_PIXELFORMAT_INDEX4MSB"},
|
|
|
|
{SDL_PIXELFORMAT_INDEX8, "SDL_PIXELFORMAT_INDEX8"},
|
|
|
|
{SDL_PIXELFORMAT_RGB332, "SDL_PIXELFORMAT_RGB332"},
|
|
|
|
{SDL_PIXELFORMAT_RGB444, "SDL_PIXELFORMAT_RGB444"},
|
|
|
|
{SDL_PIXELFORMAT_RGB555, "SDL_PIXELFORMAT_RGB555"},
|
|
|
|
{SDL_PIXELFORMAT_BGR555, "SDL_PIXELFORMAT_BGR555"},
|
|
|
|
{SDL_PIXELFORMAT_ARGB4444, "SDL_PIXELFORMAT_ARGB4444"},
|
|
|
|
{SDL_PIXELFORMAT_ABGR4444, "SDL_PIXELFORMAT_ABGR4444"},
|
|
|
|
{SDL_PIXELFORMAT_ARGB1555, "SDL_PIXELFORMAT_ARGB1555"},
|
|
|
|
{SDL_PIXELFORMAT_ABGR1555, "SDL_PIXELFORMAT_ABGR1555"},
|
|
|
|
{SDL_PIXELFORMAT_RGB565, "SDL_PIXELFORMAT_RGB565"},
|
|
|
|
{SDL_PIXELFORMAT_BGR565, "SDL_PIXELFORMAT_BGR565"},
|
|
|
|
{SDL_PIXELFORMAT_RGB24, "SDL_PIXELFORMAT_RGB24"},
|
|
|
|
{SDL_PIXELFORMAT_BGR24, "SDL_PIXELFORMAT_BGR24"},
|
|
|
|
{SDL_PIXELFORMAT_RGB888, "SDL_PIXELFORMAT_RGB888"},
|
|
|
|
{SDL_PIXELFORMAT_BGR888, "SDL_PIXELFORMAT_BGR888"},
|
|
|
|
{SDL_PIXELFORMAT_ARGB8888, "SDL_PIXELFORMAT_ARGB8888"},
|
|
|
|
{SDL_PIXELFORMAT_RGBA8888, "SDL_PIXELFORMAT_RGBA8888"},
|
|
|
|
{SDL_PIXELFORMAT_ABGR8888, "SDL_PIXELFORMAT_ABGR8888"},
|
|
|
|
{SDL_PIXELFORMAT_BGRA8888, "SDL_PIXELFORMAT_BGRA8888"},
|
|
|
|
{SDL_PIXELFORMAT_ARGB2101010, "SDL_PIXELFORMAT_ARGB2101010"},
|
|
|
|
{SDL_PIXELFORMAT_YV12, "SDL_PIXELFORMAT_YV12"},
|
|
|
|
{SDL_PIXELFORMAT_IYUV, "SDL_PIXELFORMAT_IYUV"},
|
|
|
|
{SDL_PIXELFORMAT_YUY2, "SDL_PIXELFORMAT_YUY2"},
|
|
|
|
{SDL_PIXELFORMAT_UYVY, "SDL_PIXELFORMAT_UYVY"},
|
|
|
|
{SDL_PIXELFORMAT_YVYU, "SDL_PIXELFORMAT_YVYU"}
|
2009-06-10 05:56:36 +00:00
|
|
|
};
|
|
|
|
|
2009-06-11 06:03:05 +00:00
|
|
|
const char* PixelFormatToString(Uint32 pformat)
|
2009-06-10 05:56:36 +00:00
|
|
|
{
|
2009-06-11 06:03:05 +00:00
|
|
|
Uint32 it=0;
|
|
|
|
|
|
|
|
do {
|
|
|
|
if (pixel_format[it].idstr == NULL) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (pixel_format[it].id == pformat) {
|
|
|
|
return pixel_format[it].idstr;
|
|
|
|
}
|
|
|
|
it++;
|
|
|
|
} while(1);
|
|
|
|
|
|
|
|
return "SDL_PIXELFORMAT_UNKNOWN";
|
2009-06-10 05:56:36 +00:00
|
|
|
}
|
|
|
|
|
2006-07-18 07:49:51 +00:00
|
|
|
CommonState *
|
|
|
|
CommonCreateState(char **argv, Uint32 flags)
|
|
|
|
{
|
|
|
|
CommonState *state = SDL_calloc(1, sizeof(*state));
|
|
|
|
if (!state) {
|
|
|
|
SDL_OutOfMemory();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Initialize some defaults */
|
|
|
|
state->argv = argv;
|
|
|
|
state->flags = flags;
|
|
|
|
state->window_title = argv[0];
|
2009-12-01 05:57:15 +00:00
|
|
|
state->window_flags = 0;
|
2006-07-18 07:49:51 +00:00
|
|
|
state->window_x = SDL_WINDOWPOS_UNDEFINED;
|
|
|
|
state->window_y = SDL_WINDOWPOS_UNDEFINED;
|
2009-06-11 06:03:05 +00:00
|
|
|
state->window_w = DEFAULT_WINDOW_WIDTH;
|
|
|
|
state->window_h = DEFAULT_WINDOW_HEIGHT;
|
2006-07-18 07:49:51 +00:00
|
|
|
state->num_windows = 1;
|
|
|
|
state->audiospec.freq = 22050;
|
|
|
|
state->audiospec.format = AUDIO_S16;
|
|
|
|
state->audiospec.channels = 2;
|
|
|
|
state->audiospec.samples = 2048;
|
2009-10-21 14:51:42 +00:00
|
|
|
|
|
|
|
/* Set some very sane GL defaults */
|
|
|
|
state->gl_red_size = 3;
|
|
|
|
state->gl_green_size = 3;
|
|
|
|
state->gl_blue_size = 2;
|
|
|
|
state->gl_alpha_size = 0;
|
|
|
|
state->gl_buffer_size = 0;
|
|
|
|
state->gl_depth_size = 16;
|
|
|
|
state->gl_stencil_size = 0;
|
|
|
|
state->gl_double_buffer = 1;
|
|
|
|
state->gl_accum_red_size = 0;
|
|
|
|
state->gl_accum_green_size = 0;
|
|
|
|
state->gl_accum_blue_size = 0;
|
|
|
|
state->gl_accum_alpha_size = 0;
|
|
|
|
state->gl_stereo = 0;
|
|
|
|
state->gl_multisamplebuffers = 0;
|
|
|
|
state->gl_multisamplesamples = 0;
|
|
|
|
state->gl_retained_backing = 1;
|
2009-12-15 20:53:09 +00:00
|
|
|
state->gl_accelerated = -1;
|
2009-10-21 14:51:42 +00:00
|
|
|
state->gl_major_version = 2;
|
|
|
|
state->gl_minor_version = 1;
|
|
|
|
|
2006-07-18 07:49:51 +00:00
|
|
|
return state;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
CommonArg(CommonState * state, int index)
|
|
|
|
{
|
|
|
|
char **argv = state->argv;
|
|
|
|
|
|
|
|
if (SDL_strcasecmp(argv[index], "--video") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
state->videodriver = argv[index];
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--renderer") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
state->renderdriver = argv[index];
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--info") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "all") == 0) {
|
|
|
|
state->verbose |=
|
|
|
|
(VERBOSE_VIDEO | VERBOSE_MODES | VERBOSE_RENDER |
|
|
|
|
VERBOSE_EVENT);
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "video") == 0) {
|
|
|
|
state->verbose |= VERBOSE_VIDEO;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "modes") == 0) {
|
|
|
|
state->verbose |= VERBOSE_MODES;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "render") == 0) {
|
|
|
|
state->verbose |= VERBOSE_RENDER;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "event") == 0) {
|
|
|
|
state->verbose |= VERBOSE_EVENT;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--display") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
state->display = SDL_atoi(argv[index]);
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--fullscreen") == 0) {
|
|
|
|
state->window_flags |= SDL_WINDOW_FULLSCREEN;
|
|
|
|
state->num_windows = 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--windows") == 0) {
|
|
|
|
++index;
|
2006-07-19 05:03:21 +00:00
|
|
|
if (!argv[index] || !SDL_isdigit(*argv[index])) {
|
2006-07-18 07:49:51 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (!(state->window_flags & SDL_WINDOW_FULLSCREEN)) {
|
|
|
|
state->num_windows = SDL_atoi(argv[index]);
|
|
|
|
}
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--title") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
state->window_title = argv[index];
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--center") == 0) {
|
|
|
|
state->window_x = SDL_WINDOWPOS_CENTERED;
|
|
|
|
state->window_y = SDL_WINDOWPOS_CENTERED;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--position") == 0) {
|
|
|
|
char *x, *y;
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
x = argv[index];
|
|
|
|
y = argv[index];
|
|
|
|
while (*y && *y != ',') {
|
|
|
|
++y;
|
|
|
|
}
|
|
|
|
if (!*y) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
*y++ = '\0';
|
|
|
|
state->window_x = SDL_atoi(x);
|
|
|
|
state->window_y = SDL_atoi(y);
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--geometry") == 0) {
|
|
|
|
char *w, *h;
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
w = argv[index];
|
|
|
|
h = argv[index];
|
|
|
|
while (*h && *h != 'x') {
|
|
|
|
++h;
|
|
|
|
}
|
|
|
|
if (!*h) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
*h++ = '\0';
|
|
|
|
state->window_w = SDL_atoi(w);
|
|
|
|
state->window_h = SDL_atoi(h);
|
|
|
|
return 2;
|
|
|
|
}
|
2007-07-23 01:11:52 +00:00
|
|
|
if (SDL_strcasecmp(argv[index], "--depth") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
state->depth = SDL_atoi(argv[index]);
|
|
|
|
return 2;
|
|
|
|
}
|
2006-07-18 07:49:51 +00:00
|
|
|
if (SDL_strcasecmp(argv[index], "--refresh") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
state->refresh_rate = SDL_atoi(argv[index]);
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--vsync") == 0) {
|
2006-08-05 17:09:42 +00:00
|
|
|
state->render_flags |= SDL_RENDERER_PRESENTVSYNC;
|
2006-07-18 07:49:51 +00:00
|
|
|
return 1;
|
|
|
|
}
|
2009-10-13 11:24:36 +00:00
|
|
|
if (SDL_strcasecmp(argv[index], "--double") == 0) {
|
|
|
|
state->render_flags |= SDL_RENDERER_PRESENTFLIP2;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--triple") == 0) {
|
|
|
|
state->render_flags |= SDL_RENDERER_PRESENTFLIP3;
|
|
|
|
return 1;
|
|
|
|
}
|
2006-07-18 07:49:51 +00:00
|
|
|
if (SDL_strcasecmp(argv[index], "--noframe") == 0) {
|
|
|
|
state->window_flags |= SDL_WINDOW_BORDERLESS;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--resize") == 0) {
|
|
|
|
state->window_flags |= SDL_WINDOW_RESIZABLE;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--minimize") == 0) {
|
|
|
|
state->window_flags |= SDL_WINDOW_MINIMIZED;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--maximize") == 0) {
|
|
|
|
state->window_flags |= SDL_WINDOW_MAXIMIZED;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--grab") == 0) {
|
|
|
|
state->window_flags |= SDL_WINDOW_INPUT_GRABBED;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--rate") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
state->audiospec.freq = SDL_atoi(argv[index]);
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--format") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "U8") == 0) {
|
|
|
|
state->audiospec.format = AUDIO_U8;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "S8") == 0) {
|
|
|
|
state->audiospec.format = AUDIO_S8;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "U16") == 0) {
|
|
|
|
state->audiospec.format = AUDIO_U16;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "U16LE") == 0) {
|
|
|
|
state->audiospec.format = AUDIO_U16LSB;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "U16BE") == 0) {
|
|
|
|
state->audiospec.format = AUDIO_U16MSB;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "S16") == 0) {
|
|
|
|
state->audiospec.format = AUDIO_S16;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "S16LE") == 0) {
|
|
|
|
state->audiospec.format = AUDIO_S16LSB;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "S16BE") == 0) {
|
|
|
|
state->audiospec.format = AUDIO_S16MSB;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--channels") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
2007-07-12 20:00:50 +00:00
|
|
|
state->audiospec.channels = (Uint8) SDL_atoi(argv[index]);
|
2006-07-18 07:49:51 +00:00
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if (SDL_strcasecmp(argv[index], "--samples") == 0) {
|
|
|
|
++index;
|
|
|
|
if (!argv[index]) {
|
|
|
|
return -1;
|
|
|
|
}
|
2007-07-12 20:00:50 +00:00
|
|
|
state->audiospec.samples = (Uint16) SDL_atoi(argv[index]);
|
2006-07-18 07:49:51 +00:00
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
if ((SDL_strcasecmp(argv[index], "-h") == 0)
|
|
|
|
|| (SDL_strcasecmp(argv[index], "--help") == 0)) {
|
|
|
|
/* Print the usage message */
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *
|
|
|
|
CommonUsage(CommonState * state)
|
|
|
|
{
|
|
|
|
switch (state->flags & (SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {
|
|
|
|
case SDL_INIT_VIDEO:
|
|
|
|
return VIDEO_USAGE;
|
|
|
|
case SDL_INIT_AUDIO:
|
|
|
|
return AUDIO_USAGE;
|
|
|
|
case (SDL_INIT_VIDEO | SDL_INIT_AUDIO):
|
|
|
|
return VIDEO_USAGE " " AUDIO_USAGE;
|
|
|
|
default:
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
PrintRendererFlag(Uint32 flag)
|
|
|
|
{
|
|
|
|
switch (flag) {
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_RENDERER_SINGLEBUFFER:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "SingleBuffer");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_RENDERER_PRESENTCOPY:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "PresentCopy");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_RENDERER_PRESENTFLIP2:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "PresentFlip2");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_RENDERER_PRESENTFLIP3:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "PresentFlip3");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_RENDERER_PRESENTDISCARD:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "PresentDiscard");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_RENDERER_PRESENTVSYNC:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "PresentVSync");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_RENDERER_ACCELERATED:
|
2006-07-22 18:01:56 +00:00
|
|
|
fprintf(stderr, "Accelerated");
|
|
|
|
break;
|
2006-07-18 07:49:51 +00:00
|
|
|
default:
|
|
|
|
fprintf(stderr, "0x%8.8x", flag);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
PrintBlendMode(Uint32 flag)
|
|
|
|
{
|
|
|
|
switch (flag) {
|
Date: Fri, 19 Dec 2008 20:17:35 +0100
From: Couriersud
Subject: Re: Aw: Experience using SDL1.3 in sdlmame/Proposal for api additions
> For consistency you'd probably want:
> SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a);
> SDL_SetRenderDrawBlendMode(SDL_BlendMode blendMode);
> SDL_RenderLine(int x1, int y1, int x2, int y2);
> SDL_RenderFill(SDL_Rect *rect);
>
> You probably also want to add API functions query the current state.
>
I have implemented the above api for the opengl, x11, directfb and
software renderers. I have also renamed *TEXTUREBLENDMODE* constants to
BLENDMODE*. The unix build compiles. The windows renderer still needs to
be updated, but I have no windows development machine at hand. Have a
look at the x11 renderer for a sample.
Vector games now run at 90% both on opengl and directfb in comparison to
sdlmame's own opengl renderer. The same applies to raster games.
The diff also includes
a) Changed XDrawRect to XFillRect in x11 renderer
b) A number of changes to fix blending and modulation issues in the
directfb renderer.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403346
2008-12-20 12:00:00 +00:00
|
|
|
case SDL_BLENDMODE_NONE:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "None");
|
|
|
|
break;
|
Date: Fri, 19 Dec 2008 20:17:35 +0100
From: Couriersud
Subject: Re: Aw: Experience using SDL1.3 in sdlmame/Proposal for api additions
> For consistency you'd probably want:
> SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a);
> SDL_SetRenderDrawBlendMode(SDL_BlendMode blendMode);
> SDL_RenderLine(int x1, int y1, int x2, int y2);
> SDL_RenderFill(SDL_Rect *rect);
>
> You probably also want to add API functions query the current state.
>
I have implemented the above api for the opengl, x11, directfb and
software renderers. I have also renamed *TEXTUREBLENDMODE* constants to
BLENDMODE*. The unix build compiles. The windows renderer still needs to
be updated, but I have no windows development machine at hand. Have a
look at the x11 renderer for a sample.
Vector games now run at 90% both on opengl and directfb in comparison to
sdlmame's own opengl renderer. The same applies to raster games.
The diff also includes
a) Changed XDrawRect to XFillRect in x11 renderer
b) A number of changes to fix blending and modulation issues in the
directfb renderer.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403346
2008-12-20 12:00:00 +00:00
|
|
|
case SDL_BLENDMODE_MASK:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Mask");
|
|
|
|
break;
|
Date: Fri, 19 Dec 2008 20:17:35 +0100
From: Couriersud
Subject: Re: Aw: Experience using SDL1.3 in sdlmame/Proposal for api additions
> For consistency you'd probably want:
> SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a);
> SDL_SetRenderDrawBlendMode(SDL_BlendMode blendMode);
> SDL_RenderLine(int x1, int y1, int x2, int y2);
> SDL_RenderFill(SDL_Rect *rect);
>
> You probably also want to add API functions query the current state.
>
I have implemented the above api for the opengl, x11, directfb and
software renderers. I have also renamed *TEXTUREBLENDMODE* constants to
BLENDMODE*. The unix build compiles. The windows renderer still needs to
be updated, but I have no windows development machine at hand. Have a
look at the x11 renderer for a sample.
Vector games now run at 90% both on opengl and directfb in comparison to
sdlmame's own opengl renderer. The same applies to raster games.
The diff also includes
a) Changed XDrawRect to XFillRect in x11 renderer
b) A number of changes to fix blending and modulation issues in the
directfb renderer.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403346
2008-12-20 12:00:00 +00:00
|
|
|
case SDL_BLENDMODE_BLEND:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Blend");
|
|
|
|
break;
|
Date: Fri, 19 Dec 2008 20:17:35 +0100
From: Couriersud
Subject: Re: Aw: Experience using SDL1.3 in sdlmame/Proposal for api additions
> For consistency you'd probably want:
> SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a);
> SDL_SetRenderDrawBlendMode(SDL_BlendMode blendMode);
> SDL_RenderLine(int x1, int y1, int x2, int y2);
> SDL_RenderFill(SDL_Rect *rect);
>
> You probably also want to add API functions query the current state.
>
I have implemented the above api for the opengl, x11, directfb and
software renderers. I have also renamed *TEXTUREBLENDMODE* constants to
BLENDMODE*. The unix build compiles. The windows renderer still needs to
be updated, but I have no windows development machine at hand. Have a
look at the x11 renderer for a sample.
Vector games now run at 90% both on opengl and directfb in comparison to
sdlmame's own opengl renderer. The same applies to raster games.
The diff also includes
a) Changed XDrawRect to XFillRect in x11 renderer
b) A number of changes to fix blending and modulation issues in the
directfb renderer.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403346
2008-12-20 12:00:00 +00:00
|
|
|
case SDL_BLENDMODE_ADD:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Add");
|
|
|
|
break;
|
Date: Fri, 19 Dec 2008 20:17:35 +0100
From: Couriersud
Subject: Re: Aw: Experience using SDL1.3 in sdlmame/Proposal for api additions
> For consistency you'd probably want:
> SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a);
> SDL_SetRenderDrawBlendMode(SDL_BlendMode blendMode);
> SDL_RenderLine(int x1, int y1, int x2, int y2);
> SDL_RenderFill(SDL_Rect *rect);
>
> You probably also want to add API functions query the current state.
>
I have implemented the above api for the opengl, x11, directfb and
software renderers. I have also renamed *TEXTUREBLENDMODE* constants to
BLENDMODE*. The unix build compiles. The windows renderer still needs to
be updated, but I have no windows development machine at hand. Have a
look at the x11 renderer for a sample.
Vector games now run at 90% both on opengl and directfb in comparison to
sdlmame's own opengl renderer. The same applies to raster games.
The diff also includes
a) Changed XDrawRect to XFillRect in x11 renderer
b) A number of changes to fix blending and modulation issues in the
directfb renderer.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403346
2008-12-20 12:00:00 +00:00
|
|
|
case SDL_BLENDMODE_MOD:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Mod");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
fprintf(stderr, "0x%8.8x", flag);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
PrintScaleMode(Uint32 flag)
|
|
|
|
{
|
|
|
|
switch (flag) {
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_TEXTURESCALEMODE_NONE:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "None");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_TEXTURESCALEMODE_FAST:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Fast");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_TEXTURESCALEMODE_SLOW:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Slow");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_TEXTURESCALEMODE_BEST:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Best");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
fprintf(stderr, "0x%8.8x", flag);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
PrintPixelFormat(Uint32 format)
|
|
|
|
{
|
|
|
|
switch (format) {
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_UNKNOWN:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Unknwon");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_INDEX1LSB:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Index1LSB");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_INDEX1MSB:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Index1MSB");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_INDEX4LSB:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Index4LSB");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_INDEX4MSB:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Index4MSB");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_INDEX8:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "Index8");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_RGB332:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "RGB332");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_RGB444:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "RGB444");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_RGB555:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "RGB555");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_ARGB4444:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "ARGB4444");
|
|
|
|
break;
|
2009-06-10 05:56:36 +00:00
|
|
|
case SDL_PIXELFORMAT_ABGR4444:
|
|
|
|
fprintf(stderr, "ABGR4444");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_ARGB1555:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "ARGB1555");
|
|
|
|
break;
|
2009-06-10 05:56:36 +00:00
|
|
|
case SDL_PIXELFORMAT_ABGR1555:
|
|
|
|
fprintf(stderr, "ABGR1555");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_RGB565:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "RGB565");
|
|
|
|
break;
|
2009-06-10 05:56:36 +00:00
|
|
|
case SDL_PIXELFORMAT_BGR565:
|
|
|
|
fprintf(stderr, "BGR565");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_RGB24:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "RGB24");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_BGR24:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "BGR24");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_RGB888:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "RGB888");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_BGR888:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "BGR888");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_ARGB8888:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "ARGB8888");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_RGBA8888:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "RGBA8888");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_ABGR8888:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "ABGR8888");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_BGRA8888:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "BGRA8888");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_ARGB2101010:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "ARGB2101010");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_YV12:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "YV12");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_IYUV:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "IYUV");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_YUY2:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "YUY2");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_UYVY:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "UYVY");
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDL_PIXELFORMAT_YVYU:
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, "YVYU");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
fprintf(stderr, "0x%8.8x", format);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
PrintRenderer(SDL_RendererInfo * info)
|
|
|
|
{
|
|
|
|
int i, count;
|
|
|
|
|
|
|
|
fprintf(stderr, " Renderer %s:\n", info->name);
|
|
|
|
|
|
|
|
fprintf(stderr, " Flags: 0x%8.8X", info->flags);
|
|
|
|
fprintf(stderr, " (");
|
|
|
|
count = 0;
|
|
|
|
for (i = 0; i < sizeof(info->flags) * 8; ++i) {
|
|
|
|
Uint32 flag = (1 << i);
|
|
|
|
if (info->flags & flag) {
|
|
|
|
if (count > 0) {
|
|
|
|
fprintf(stderr, " | ");
|
|
|
|
}
|
|
|
|
PrintRendererFlag(flag);
|
|
|
|
++count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf(stderr, ")\n");
|
|
|
|
|
|
|
|
fprintf(stderr, " Blend: 0x%8.8X", info->blend_modes);
|
|
|
|
fprintf(stderr, " (");
|
|
|
|
count = 0;
|
|
|
|
for (i = 0; i < sizeof(info->blend_modes) * 8; ++i) {
|
|
|
|
Uint32 flag = (1 << i);
|
|
|
|
if (info->blend_modes & flag) {
|
|
|
|
if (count > 0) {
|
|
|
|
fprintf(stderr, " | ");
|
|
|
|
}
|
|
|
|
PrintBlendMode(flag);
|
|
|
|
++count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf(stderr, ")\n");
|
|
|
|
|
|
|
|
fprintf(stderr, " Scale: 0x%8.8X", info->scale_modes);
|
|
|
|
fprintf(stderr, " (");
|
|
|
|
count = 0;
|
|
|
|
for (i = 0; i < sizeof(info->scale_modes) * 8; ++i) {
|
|
|
|
Uint32 flag = (1 << i);
|
|
|
|
if (info->scale_modes & flag) {
|
|
|
|
if (count > 0) {
|
|
|
|
fprintf(stderr, " | ");
|
|
|
|
}
|
|
|
|
PrintScaleMode(flag);
|
|
|
|
++count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf(stderr, ")\n");
|
|
|
|
|
|
|
|
fprintf(stderr, " Texture formats (%d): ", info->num_texture_formats);
|
2007-07-12 20:00:50 +00:00
|
|
|
for (i = 0; i < (int) info->num_texture_formats; ++i) {
|
2006-07-18 07:49:51 +00:00
|
|
|
if (i > 0) {
|
|
|
|
fprintf(stderr, ", ");
|
|
|
|
}
|
|
|
|
PrintPixelFormat(info->texture_formats[i]);
|
|
|
|
}
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
|
|
|
|
if (info->max_texture_width || info->max_texture_height) {
|
|
|
|
fprintf(stderr, " Max Texture Size: %dx%d\n",
|
|
|
|
info->max_texture_width, info->max_texture_height);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SDL_bool
|
|
|
|
CommonInit(CommonState * state)
|
|
|
|
{
|
|
|
|
int i, j, m, n;
|
|
|
|
SDL_DisplayMode fullscreen_mode;
|
|
|
|
|
|
|
|
if (state->flags & SDL_INIT_VIDEO) {
|
|
|
|
if (state->verbose & VERBOSE_VIDEO) {
|
|
|
|
n = SDL_GetNumVideoDrivers();
|
|
|
|
if (n == 0) {
|
|
|
|
fprintf(stderr, "No built-in video drivers\n");
|
|
|
|
} else {
|
|
|
|
fprintf(stderr, "Built-in video drivers:");
|
|
|
|
for (i = 0; i < n; ++i) {
|
|
|
|
if (i > 0) {
|
|
|
|
fprintf(stderr, ",");
|
|
|
|
}
|
|
|
|
fprintf(stderr, " %s", SDL_GetVideoDriver(i));
|
|
|
|
}
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (SDL_VideoInit(state->videodriver, 0) < 0) {
|
|
|
|
fprintf(stderr, "Couldn't initialize video driver: %s\n",
|
|
|
|
SDL_GetError());
|
|
|
|
return SDL_FALSE;
|
|
|
|
}
|
|
|
|
if (state->verbose & VERBOSE_VIDEO) {
|
|
|
|
fprintf(stderr, "Video driver: %s\n",
|
|
|
|
SDL_GetCurrentVideoDriver());
|
|
|
|
}
|
|
|
|
|
2009-10-21 14:51:42 +00:00
|
|
|
/* Upload GL settings */
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, state->gl_red_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, state->gl_green_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, state->gl_blue_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, state->gl_alpha_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, state->gl_double_buffer);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, state->gl_buffer_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, state->gl_depth_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, state->gl_stencil_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, state->gl_accum_red_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, state->gl_accum_green_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, state->gl_accum_blue_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, state->gl_accum_alpha_size);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_STEREO, state->gl_stereo);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, state->gl_multisamplebuffers);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, state->gl_multisamplesamples);
|
2009-12-15 20:53:09 +00:00
|
|
|
if (state->gl_accelerated >= 0) {
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL,
|
|
|
|
state->gl_accelerated);
|
|
|
|
}
|
2009-10-21 14:51:42 +00:00
|
|
|
SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, state->gl_retained_backing);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, state->gl_major_version);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, state->gl_minor_version);
|
|
|
|
|
2006-07-18 07:49:51 +00:00
|
|
|
if (state->verbose & VERBOSE_MODES) {
|
2006-08-05 22:34:23 +00:00
|
|
|
SDL_DisplayMode mode;
|
2006-07-18 07:49:51 +00:00
|
|
|
int bpp;
|
|
|
|
Uint32 Rmask, Gmask, Bmask, Amask;
|
|
|
|
|
|
|
|
n = SDL_GetNumVideoDisplays();
|
|
|
|
fprintf(stderr, "Number of displays: %d\n", n);
|
|
|
|
for (i = 0; i < n; ++i) {
|
|
|
|
fprintf(stderr, "Display %d:\n", i);
|
|
|
|
SDL_SelectVideoDisplay(i);
|
|
|
|
|
2006-08-05 22:34:23 +00:00
|
|
|
SDL_GetDesktopDisplayMode(&mode);
|
|
|
|
SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask,
|
2006-07-18 07:49:51 +00:00
|
|
|
&Bmask, &Amask);
|
|
|
|
fprintf(stderr,
|
2009-06-10 05:56:36 +00:00
|
|
|
" Current mode: %dx%d@%dHz, %d bits-per-pixel (%s)\n",
|
|
|
|
mode.w, mode.h, mode.refresh_rate, bpp,
|
|
|
|
PixelFormatToString(mode.format));
|
2006-07-18 07:49:51 +00:00
|
|
|
if (Rmask || Gmask || Bmask) {
|
2009-06-10 05:56:36 +00:00
|
|
|
fprintf(stderr, " Red Mask = 0x%.8x\n", Rmask);
|
2006-07-18 07:49:51 +00:00
|
|
|
fprintf(stderr, " Green Mask = 0x%.8x\n", Gmask);
|
2009-06-10 05:56:36 +00:00
|
|
|
fprintf(stderr, " Blue Mask = 0x%.8x\n", Bmask);
|
2006-07-18 07:49:51 +00:00
|
|
|
if (Amask)
|
|
|
|
fprintf(stderr, " Alpha Mask = 0x%.8x\n", Amask);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Print available fullscreen video modes */
|
|
|
|
m = SDL_GetNumDisplayModes();
|
|
|
|
if (m == 0) {
|
|
|
|
fprintf(stderr, "No available fullscreen video modes\n");
|
|
|
|
} else {
|
|
|
|
fprintf(stderr, " Fullscreen video modes:\n");
|
|
|
|
for (j = 0; j < m; ++j) {
|
2006-08-05 22:34:23 +00:00
|
|
|
SDL_GetDisplayMode(j, &mode);
|
|
|
|
SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask,
|
2006-07-18 07:49:51 +00:00
|
|
|
&Gmask, &Bmask, &Amask);
|
|
|
|
fprintf(stderr,
|
2009-06-10 05:56:36 +00:00
|
|
|
" Mode %d: %dx%d@%dHz, %d bits-per-pixel (%s)\n",
|
|
|
|
j, mode.w, mode.h, mode.refresh_rate, bpp,
|
|
|
|
PixelFormatToString(mode.format));
|
2006-07-18 07:49:51 +00:00
|
|
|
if (Rmask || Gmask || Bmask) {
|
2009-06-10 05:56:36 +00:00
|
|
|
fprintf(stderr, " Red Mask = 0x%.8x\n",
|
2006-07-18 07:49:51 +00:00
|
|
|
Rmask);
|
|
|
|
fprintf(stderr, " Green Mask = 0x%.8x\n",
|
|
|
|
Gmask);
|
2009-06-10 05:56:36 +00:00
|
|
|
fprintf(stderr, " Blue Mask = 0x%.8x\n",
|
2006-07-18 07:49:51 +00:00
|
|
|
Bmask);
|
|
|
|
if (Amask)
|
|
|
|
fprintf(stderr,
|
|
|
|
" Alpha Mask = 0x%.8x\n",
|
|
|
|
Amask);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SDL_SelectVideoDisplay(state->display);
|
|
|
|
if (state->verbose & VERBOSE_RENDER) {
|
|
|
|
SDL_RendererInfo info;
|
|
|
|
|
2006-08-06 00:09:04 +00:00
|
|
|
n = SDL_GetNumRenderDrivers();
|
2006-07-18 07:49:51 +00:00
|
|
|
if (n == 0) {
|
|
|
|
fprintf(stderr, "No built-in render drivers\n");
|
|
|
|
} else {
|
2006-07-22 19:51:48 +00:00
|
|
|
fprintf(stderr, "Built-in render drivers:\n");
|
2006-07-18 07:49:51 +00:00
|
|
|
for (i = 0; i < n; ++i) {
|
2006-08-06 00:09:04 +00:00
|
|
|
SDL_GetRenderDriverInfo(i, &info);
|
2006-07-18 07:49:51 +00:00
|
|
|
PrintRenderer(&info);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-01 05:57:15 +00:00
|
|
|
SDL_zero(fullscreen_mode);
|
2006-07-18 07:49:51 +00:00
|
|
|
switch (state->depth) {
|
|
|
|
case 8:
|
2006-08-05 17:09:42 +00:00
|
|
|
fullscreen_mode.format = SDL_PIXELFORMAT_INDEX8;
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
case 15:
|
2006-08-05 17:09:42 +00:00
|
|
|
fullscreen_mode.format = SDL_PIXELFORMAT_RGB555;
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
case 16:
|
2006-08-05 17:09:42 +00:00
|
|
|
fullscreen_mode.format = SDL_PIXELFORMAT_RGB565;
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
2009-06-10 05:56:36 +00:00
|
|
|
case 24:
|
|
|
|
fullscreen_mode.format = SDL_PIXELFORMAT_RGB24;
|
|
|
|
break;
|
2006-07-18 07:49:51 +00:00
|
|
|
default:
|
2006-08-05 17:09:42 +00:00
|
|
|
fullscreen_mode.format = SDL_PIXELFORMAT_RGB888;
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
fullscreen_mode.refresh_rate = state->refresh_rate;
|
|
|
|
|
|
|
|
state->windows =
|
2010-01-21 06:21:52 +00:00
|
|
|
(SDL_Window **) SDL_malloc(state->num_windows *
|
2006-07-18 07:49:51 +00:00
|
|
|
sizeof(*state->windows));
|
|
|
|
if (!state->windows) {
|
|
|
|
fprintf(stderr, "Out of memory!\n");
|
|
|
|
return SDL_FALSE;
|
|
|
|
}
|
|
|
|
for (i = 0; i < state->num_windows; ++i) {
|
|
|
|
char title[1024];
|
|
|
|
|
|
|
|
if (state->num_windows > 1) {
|
|
|
|
SDL_snprintf(title, SDL_arraysize(title), "%s %d",
|
|
|
|
state->window_title, i + 1);
|
|
|
|
} else {
|
|
|
|
SDL_strlcpy(title, state->window_title, SDL_arraysize(title));
|
|
|
|
}
|
|
|
|
state->windows[i] =
|
|
|
|
SDL_CreateWindow(title, state->window_x, state->window_y,
|
|
|
|
state->window_w, state->window_h,
|
|
|
|
state->window_flags);
|
|
|
|
if (!state->windows[i]) {
|
|
|
|
fprintf(stderr, "Couldn't create window: %s\n",
|
|
|
|
SDL_GetError());
|
|
|
|
return SDL_FALSE;
|
|
|
|
}
|
|
|
|
|
2009-12-01 05:57:15 +00:00
|
|
|
if (SDL_SetWindowDisplayMode(state->windows[i], &fullscreen_mode) < 0) {
|
|
|
|
fprintf(stderr, "Can't set up fullscreen display mode: %s\n",
|
|
|
|
SDL_GetError());
|
|
|
|
return SDL_FALSE;
|
|
|
|
}
|
|
|
|
SDL_ShowWindow(state->windows[i]);
|
|
|
|
|
2006-07-24 05:03:02 +00:00
|
|
|
if (!state->skip_renderer
|
|
|
|
&& (state->renderdriver
|
|
|
|
|| !(state->window_flags & SDL_WINDOW_OPENGL))) {
|
2006-07-18 07:49:51 +00:00
|
|
|
m = -1;
|
|
|
|
if (state->renderdriver) {
|
|
|
|
SDL_RendererInfo info;
|
2006-08-06 00:09:04 +00:00
|
|
|
n = SDL_GetNumRenderDrivers();
|
2006-07-18 07:49:51 +00:00
|
|
|
for (j = 0; j < n; ++j) {
|
2006-08-06 00:09:04 +00:00
|
|
|
SDL_GetRenderDriverInfo(j, &info);
|
2006-07-18 07:49:51 +00:00
|
|
|
if (SDL_strcasecmp(info.name, state->renderdriver) ==
|
|
|
|
0) {
|
|
|
|
m = j;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (m == n) {
|
|
|
|
fprintf(stderr,
|
|
|
|
"Couldn't find render driver named %s",
|
|
|
|
state->renderdriver);
|
|
|
|
return SDL_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (SDL_CreateRenderer
|
|
|
|
(state->windows[i], m, state->render_flags) < 0) {
|
|
|
|
fprintf(stderr, "Couldn't create renderer: %s\n",
|
|
|
|
SDL_GetError());
|
|
|
|
return SDL_FALSE;
|
|
|
|
}
|
2006-07-22 19:51:48 +00:00
|
|
|
if (state->verbose & VERBOSE_RENDER) {
|
|
|
|
SDL_RendererInfo info;
|
|
|
|
|
|
|
|
fprintf(stderr, "Current renderer:\n");
|
2006-08-06 00:09:04 +00:00
|
|
|
SDL_GetRendererInfo(&info);
|
2006-07-22 19:51:48 +00:00
|
|
|
PrintRenderer(&info);
|
|
|
|
}
|
2006-07-18 07:49:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
SDL_SelectRenderer(state->windows[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (state->flags & SDL_INIT_AUDIO) {
|
|
|
|
if (state->verbose & VERBOSE_AUDIO) {
|
|
|
|
n = SDL_GetNumAudioDrivers();
|
|
|
|
if (n == 0) {
|
|
|
|
fprintf(stderr, "No built-in audio drivers\n");
|
|
|
|
} else {
|
|
|
|
fprintf(stderr, "Built-in audio drivers:");
|
|
|
|
for (i = 0; i < n; ++i) {
|
|
|
|
if (i > 0) {
|
|
|
|
fprintf(stderr, ",");
|
|
|
|
}
|
|
|
|
fprintf(stderr, " %s", SDL_GetAudioDriver(i));
|
|
|
|
}
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (SDL_AudioInit(state->audiodriver) < 0) {
|
|
|
|
fprintf(stderr, "Couldn't initialize audio driver: %s\n",
|
|
|
|
SDL_GetError());
|
|
|
|
return SDL_FALSE;
|
|
|
|
}
|
|
|
|
if (state->verbose & VERBOSE_VIDEO) {
|
|
|
|
fprintf(stderr, "Audio driver: %s\n",
|
|
|
|
SDL_GetCurrentAudioDriver());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SDL_OpenAudio(&state->audiospec, NULL) < 0) {
|
|
|
|
fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
|
|
|
|
return SDL_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return SDL_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
PrintEvent(SDL_Event * event)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "SDL EVENT: ");
|
|
|
|
switch (event->type) {
|
|
|
|
case SDL_WINDOWEVENT:
|
|
|
|
switch (event->window.event) {
|
|
|
|
case SDL_WINDOWEVENT_SHOWN:
|
|
|
|
fprintf(stderr, "Window %d shown", event->window.windowID);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_HIDDEN:
|
|
|
|
fprintf(stderr, "Window %d hidden", event->window.windowID);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_EXPOSED:
|
2006-08-06 04:39:13 +00:00
|
|
|
fprintf(stderr, "Window %d exposed", event->window.windowID);
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_MOVED:
|
2006-08-06 04:39:13 +00:00
|
|
|
fprintf(stderr, "Window %d moved to %d,%d",
|
2006-07-18 07:49:51 +00:00
|
|
|
event->window.windowID, event->window.data1,
|
|
|
|
event->window.data2);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_RESIZED:
|
2006-08-06 04:39:13 +00:00
|
|
|
fprintf(stderr, "Window %d resized to %dx%d",
|
2006-07-18 07:49:51 +00:00
|
|
|
event->window.windowID, event->window.data1,
|
|
|
|
event->window.data2);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_MINIMIZED:
|
|
|
|
fprintf(stderr, "Window %d minimized", event->window.windowID);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_MAXIMIZED:
|
|
|
|
fprintf(stderr, "Window %d maximized", event->window.windowID);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_RESTORED:
|
|
|
|
fprintf(stderr, "Window %d restored", event->window.windowID);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_ENTER:
|
|
|
|
fprintf(stderr, "Mouse entered window %d",
|
|
|
|
event->window.windowID);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_LEAVE:
|
|
|
|
fprintf(stderr, "Mouse left window %d", event->window.windowID);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_FOCUS_GAINED:
|
|
|
|
fprintf(stderr, "Window %d gained keyboard focus",
|
|
|
|
event->window.windowID);
|
|
|
|
break;
|
|
|
|
case SDL_WINDOWEVENT_FOCUS_LOST:
|
|
|
|
fprintf(stderr, "Window %d lost keyboard focus",
|
|
|
|
event->window.windowID);
|
|
|
|
break;
|
2006-07-24 05:03:02 +00:00
|
|
|
case SDL_WINDOWEVENT_CLOSE:
|
|
|
|
fprintf(stderr, "Window %d closed", event->window.windowID);
|
|
|
|
break;
|
2006-07-18 07:49:51 +00:00
|
|
|
default:
|
|
|
|
fprintf(stderr, "Window %d got unknown event %d",
|
|
|
|
event->window.windowID, event->window.event);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SDL_KEYDOWN:
|
Date: Thu, 05 Jul 2007 14:02:33 -0700
From: Sam Lantinga
Subject: SDL 1.3 keyboard plan
After lots of discussion with Christian, this is what we came up with:
> So, to sum up...
> SDLK_* become the physical keys, starting at > (1<<21)
> We create a macro SDLK_INDEX(X)
> We have two functions SDL_GetLayoutKey(SDLKey) and SDL_GetKeyName()
> SDL_GetLayoutKey maps to UCS4 for printable characters, and SDLK* for
non-printable characters
> and does so based on the OS's current keyboard layout
> SDL_GetKeyName() handles both SDLK_* and UCS4, converting UCS4 to UTF-8 and
converting SDLK_* into our names, which are UTF-8 for printable characters.
> WASD folks use SDLK_*, and 'I' folks use SDL_GetLayoutKey(SDLK_*)
Here is the patch he came up with, and his e-mail about it:
Date: Fri, 17 Aug 2007 19:50:28 +0200
From: Christian Walther
Subject: Re: SDL 1.3 keyboard plan
> Sounds great, go ahead and send me a patch.
Here goes! Thanks for having a look. Don't hesitate to comment if
anything does not conform to your ideas.
One caveat: Committing this now may break compilability of some video
drivers - specifically, if they use any of the SDLK_* codes that were
obsoleted and moved into SDL_compat.h. I only tried Cocoa (which did
break, but is already fixed) and X11 (which didn't, but then its key
handling is #iffed out). If that's a problem, it may need to go into
a branch.
-Christian
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402630
2007-08-19 14:52:52 +00:00
|
|
|
fprintf(stderr,
|
2010-05-09 20:47:22 -07:00
|
|
|
"Keyboard: key pressed in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s",
|
|
|
|
event->key.windowID,
|
2008-02-07 16:00:29 +00:00
|
|
|
event->key.keysym.scancode,
|
|
|
|
SDL_GetScancodeName(event->key.keysym.scancode),
|
|
|
|
event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
case SDL_KEYUP:
|
Date: Thu, 05 Jul 2007 14:02:33 -0700
From: Sam Lantinga
Subject: SDL 1.3 keyboard plan
After lots of discussion with Christian, this is what we came up with:
> So, to sum up...
> SDLK_* become the physical keys, starting at > (1<<21)
> We create a macro SDLK_INDEX(X)
> We have two functions SDL_GetLayoutKey(SDLKey) and SDL_GetKeyName()
> SDL_GetLayoutKey maps to UCS4 for printable characters, and SDLK* for
non-printable characters
> and does so based on the OS's current keyboard layout
> SDL_GetKeyName() handles both SDLK_* and UCS4, converting UCS4 to UTF-8 and
converting SDLK_* into our names, which are UTF-8 for printable characters.
> WASD folks use SDLK_*, and 'I' folks use SDL_GetLayoutKey(SDLK_*)
Here is the patch he came up with, and his e-mail about it:
Date: Fri, 17 Aug 2007 19:50:28 +0200
From: Christian Walther
Subject: Re: SDL 1.3 keyboard plan
> Sounds great, go ahead and send me a patch.
Here goes! Thanks for having a look. Don't hesitate to comment if
anything does not conform to your ideas.
One caveat: Committing this now may break compilability of some video
drivers - specifically, if they use any of the SDLK_* codes that were
obsoleted and moved into SDL_compat.h. I only tried Cocoa (which did
break, but is already fixed) and X11 (which didn't, but then its key
handling is #iffed out). If that's a problem, it may need to go into
a branch.
-Christian
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402630
2007-08-19 14:52:52 +00:00
|
|
|
fprintf(stderr,
|
2010-05-09 20:47:22 -07:00
|
|
|
"Keyboard: key released in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s",
|
|
|
|
event->key.windowID,
|
2008-02-07 16:00:29 +00:00
|
|
|
event->key.keysym.scancode,
|
|
|
|
SDL_GetScancodeName(event->key.keysym.scancode),
|
|
|
|
event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
case SDL_TEXTINPUT:
|
2010-05-09 20:47:22 -07:00
|
|
|
fprintf(stderr, "Keyboard: text input \"%s\" in window %d",
|
|
|
|
event->text.text, event->text.windowID);
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
case SDL_MOUSEMOTION:
|
2010-05-09 20:47:22 -07:00
|
|
|
fprintf(stderr, "Mouse: moved to %d,%d (%d,%d) in window %d",
|
|
|
|
event->motion.x, event->motion.y,
|
2006-07-18 07:49:51 +00:00
|
|
|
event->motion.xrel, event->motion.yrel,
|
|
|
|
event->motion.windowID);
|
|
|
|
break;
|
|
|
|
case SDL_MOUSEBUTTONDOWN:
|
2010-05-09 20:47:22 -07:00
|
|
|
fprintf(stderr, "Mouse: button %d pressed at %d,%d in window %d",
|
|
|
|
event->button.button, event->button.x, event->button.y,
|
|
|
|
event->button.windowID);
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
case SDL_MOUSEBUTTONUP:
|
2010-05-09 20:47:22 -07:00
|
|
|
fprintf(stderr, "Mouse: button %d released at %d,%d in window %d",
|
|
|
|
event->button.button, event->button.x, event->button.y,
|
|
|
|
event->button.windowID);
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
case SDL_MOUSEWHEEL:
|
2007-07-11 14:52:13 +00:00
|
|
|
fprintf(stderr,
|
2010-05-09 20:47:22 -07:00
|
|
|
"Mouse: wheel scrolled %d in x and %d in y in window %d",
|
|
|
|
event->wheel.x, event->wheel.y, event->wheel.windowID);
|
2006-07-18 07:49:51 +00:00
|
|
|
break;
|
|
|
|
case SDL_JOYBALLMOTION:
|
|
|
|
fprintf(stderr, "Joystick %d: ball %d moved by %d,%d",
|
|
|
|
event->jball.which, event->jball.ball, event->jball.xrel,
|
|
|
|
event->jball.yrel);
|
|
|
|
break;
|
|
|
|
case SDL_JOYHATMOTION:
|
|
|
|
fprintf(stderr, "Joystick %d: hat %d moved to ", event->jhat.which,
|
|
|
|
event->jhat.hat);
|
|
|
|
switch (event->jhat.value) {
|
|
|
|
case SDL_HAT_CENTERED:
|
|
|
|
fprintf(stderr, "CENTER");
|
|
|
|
break;
|
|
|
|
case SDL_HAT_UP:
|
|
|
|
fprintf(stderr, "UP");
|
|
|
|
break;
|
|
|
|
case SDL_HAT_RIGHTUP:
|
|
|
|
fprintf(stderr, "RIGHTUP");
|
|
|
|
break;
|
|
|
|
case SDL_HAT_RIGHT:
|
|
|
|
fprintf(stderr, "RIGHT");
|
|
|
|
break;
|
|
|
|
case SDL_HAT_RIGHTDOWN:
|
|
|
|
fprintf(stderr, "RIGHTDOWN");
|
|
|
|
break;
|
|
|
|
case SDL_HAT_DOWN:
|
|
|
|
fprintf(stderr, "DOWN");
|
|
|
|
break;
|
|
|
|
case SDL_HAT_LEFTDOWN:
|
|
|
|
fprintf(stderr, "LEFTDOWN");
|
|
|
|
break;
|
|
|
|
case SDL_HAT_LEFT:
|
|
|
|
fprintf(stderr, "LEFT");
|
|
|
|
break;
|
|
|
|
case SDL_HAT_LEFTUP:
|
|
|
|
fprintf(stderr, "LEFTUP");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
fprintf(stderr, "UNKNOWN");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SDL_JOYBUTTONDOWN:
|
|
|
|
fprintf(stderr, "Joystick %d: button %d pressed",
|
|
|
|
event->jbutton.which, event->jbutton.button);
|
|
|
|
break;
|
|
|
|
case SDL_JOYBUTTONUP:
|
|
|
|
fprintf(stderr, "Joystick %d: button %d released",
|
|
|
|
event->jbutton.which, event->jbutton.button);
|
|
|
|
break;
|
|
|
|
case SDL_QUIT:
|
|
|
|
fprintf(stderr, "Quit requested");
|
|
|
|
break;
|
|
|
|
case SDL_USEREVENT:
|
|
|
|
fprintf(stderr, "User event %d", event->user.code);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
fprintf(stderr, "Unknown event %d", event->type);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CommonEvent(CommonState * state, SDL_Event * event, int *done)
|
|
|
|
{
|
2009-12-02 07:56:09 +00:00
|
|
|
int i;
|
|
|
|
|
2006-07-18 07:49:51 +00:00
|
|
|
if (state->verbose & VERBOSE_EVENT) {
|
|
|
|
PrintEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (event->type) {
|
|
|
|
case SDL_WINDOWEVENT:
|
|
|
|
switch (event->window.event) {
|
|
|
|
case SDL_WINDOWEVENT_CLOSE:
|
|
|
|
*done = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SDL_KEYDOWN:
|
|
|
|
switch (event->key.keysym.sym) {
|
|
|
|
/* Add hotkeys here */
|
2010-07-08 00:00:07 -07:00
|
|
|
case SDLK_c:
|
|
|
|
if (event->key.keysym.mod & KMOD_CTRL) {
|
|
|
|
/* Ctrl-C copy awesome text! */
|
|
|
|
SDL_SetClipboardText("SDL rocks!\nYou know it!");
|
|
|
|
printf("Copied text to clipboard\n");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SDLK_v:
|
|
|
|
if (event->key.keysym.mod & KMOD_CTRL) {
|
|
|
|
/* Ctrl-V paste awesome text! */
|
|
|
|
char *text = SDL_GetClipboardText();
|
|
|
|
if (*text) {
|
|
|
|
printf("Clipboard: %s\n", text);
|
|
|
|
} else {
|
|
|
|
printf("Clipboard is empty\n");
|
|
|
|
}
|
|
|
|
SDL_free(text);
|
|
|
|
}
|
|
|
|
break;
|
2006-08-05 17:09:42 +00:00
|
|
|
case SDLK_g:
|
|
|
|
if (event->key.keysym.mod & KMOD_CTRL) {
|
|
|
|
/* Ctrl-G toggle grab */
|
|
|
|
}
|
|
|
|
break;
|
2009-12-02 07:56:09 +00:00
|
|
|
case SDLK_z:
|
|
|
|
if (event->key.keysym.mod & KMOD_CTRL) {
|
|
|
|
/* Ctrl-Z minimize */
|
|
|
|
/* FIXME: Which window has focus for this keyboard? */
|
|
|
|
for (i = 0; i < state->num_windows; ++i) {
|
|
|
|
SDL_MinimizeWindow(state->windows[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2006-07-18 07:49:51 +00:00
|
|
|
case SDLK_ESCAPE:
|
|
|
|
*done = 1;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SDL_QUIT:
|
|
|
|
*done = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CommonQuit(CommonState * state)
|
|
|
|
{
|
|
|
|
if (state->flags & SDL_INIT_VIDEO) {
|
|
|
|
SDL_VideoQuit();
|
|
|
|
}
|
|
|
|
if (state->flags & SDL_INIT_AUDIO) {
|
|
|
|
SDL_AudioQuit();
|
|
|
|
}
|
|
|
|
if (state->windows) {
|
|
|
|
SDL_free(state->windows);
|
|
|
|
}
|
|
|
|
SDL_free(state);
|
|
|
|
}
|
2009-12-02 07:56:09 +00:00
|
|
|
|
|
|
|
/* vi: set ts=4 sw=4 expandtab: */
|