| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976 |
- /*
- Simple DirectMedia Layer
- Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
- /* Ported from original test/common.c file. */
- #include "SDL_config.h"
- #include "SDL_test.h"
- #include <stdio.h>
- static const char *video_usage[] = {
- "[--video driver]", "[--renderer driver]", "[--gldebug]",
- "[--info all|video|modes|render|event]",
- "[--log all|error|system|audio|video|render|input]", "[--display N]",
- "[--metal-window | --opengl-window | --vulkan-window]",
- "[--fullscreen | --fullscreen-desktop | --windows N]", "[--title title]",
- "[--icon icon.bmp]", "[--center | --position X,Y]", "[--geometry WxH]",
- "[--min-geometry WxH]", "[--max-geometry WxH]", "[--logical WxH]",
- "[--scale N]", "[--depth N]", "[--refresh R]", "[--vsync]", "[--noframe]",
- "[--resize]", "[--minimize]", "[--maximize]", "[--grab]", "[--keyboard-grab]",
- "[--allow-highdpi]", "[--usable-bounds]"
- };
- static const char *audio_usage[] = {
- "[--rate N]", "[--format U8|S8|U16|U16LE|U16BE|S16|S16LE|S16BE]",
- "[--channels N]", "[--samples N]"
- };
- static void SDL_snprintfcat(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ... )
- {
- size_t length = SDL_strlen(text);
- va_list ap;
- va_start(ap, fmt);
- text += length;
- maxlen -= length;
- SDL_vsnprintf(text, maxlen, fmt, ap);
- va_end(ap);
- }
- SDLTest_CommonState *
- SDLTest_CommonCreateState(char **argv, Uint32 flags)
- {
- int i;
- SDLTest_CommonState *state;
- /* Do this first so we catch all allocations */
- for (i = 1; argv[i]; ++i) {
- if (SDL_strcasecmp(argv[i], "--trackmem") == 0) {
- SDLTest_TrackAllocations();
- break;
- }
- }
- state = (SDLTest_CommonState *)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];
- state->window_flags = 0;
- state->window_x = SDL_WINDOWPOS_UNDEFINED;
- state->window_y = SDL_WINDOWPOS_UNDEFINED;
- state->window_w = DEFAULT_WINDOW_WIDTH;
- state->window_h = DEFAULT_WINDOW_HEIGHT;
- state->num_windows = 1;
- state->audiospec.freq = 22050;
- state->audiospec.format = AUDIO_S16;
- state->audiospec.channels = 2;
- state->audiospec.samples = 2048;
- /* 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;
- state->gl_accelerated = -1;
- state->gl_debug = 0;
- return state;
- }
- int
- SDLTest_CommonArg(SDLTest_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], "--gldebug") == 0) {
- state->gl_debug = 1;
- return 1;
- }
- 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], "--log") == 0) {
- ++index;
- if (!argv[index]) {
- return -1;
- }
- if (SDL_strcasecmp(argv[index], "all") == 0) {
- SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "error") == 0) {
- SDL_LogSetPriority(SDL_LOG_CATEGORY_ERROR, SDL_LOG_PRIORITY_VERBOSE);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "system") == 0) {
- SDL_LogSetPriority(SDL_LOG_CATEGORY_SYSTEM, SDL_LOG_PRIORITY_VERBOSE);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "audio") == 0) {
- SDL_LogSetPriority(SDL_LOG_CATEGORY_AUDIO, SDL_LOG_PRIORITY_VERBOSE);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "video") == 0) {
- SDL_LogSetPriority(SDL_LOG_CATEGORY_VIDEO, SDL_LOG_PRIORITY_VERBOSE);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "render") == 0) {
- SDL_LogSetPriority(SDL_LOG_CATEGORY_RENDER, SDL_LOG_PRIORITY_VERBOSE);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "input") == 0) {
- SDL_LogSetPriority(SDL_LOG_CATEGORY_INPUT, SDL_LOG_PRIORITY_VERBOSE);
- return 2;
- }
- return -1;
- }
- if (SDL_strcasecmp(argv[index], "--display") == 0) {
- ++index;
- if (!argv[index]) {
- return -1;
- }
- state->display = SDL_atoi(argv[index]);
- if (SDL_WINDOWPOS_ISUNDEFINED(state->window_x)) {
- state->window_x = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
- state->window_y = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
- }
- if (SDL_WINDOWPOS_ISCENTERED(state->window_x)) {
- state->window_x = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
- state->window_y = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
- }
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "--metal-window") == 0) {
- state->window_flags |= SDL_WINDOW_METAL;
- return 1;
- }
- if (SDL_strcasecmp(argv[index], "--opengl-window") == 0) {
- state->window_flags |= SDL_WINDOW_OPENGL;
- return 1;
- }
- if (SDL_strcasecmp(argv[index], "--vulkan-window") == 0) {
- state->window_flags |= SDL_WINDOW_VULKAN;
- return 1;
- }
- if (SDL_strcasecmp(argv[index], "--fullscreen") == 0) {
- state->window_flags |= SDL_WINDOW_FULLSCREEN;
- state->num_windows = 1;
- return 1;
- }
- if (SDL_strcasecmp(argv[index], "--fullscreen-desktop") == 0) {
- state->window_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
- state->num_windows = 1;
- return 1;
- }
- if (SDL_strcasecmp(argv[index], "--allow-highdpi") == 0) {
- state->window_flags |= SDL_WINDOW_ALLOW_HIGHDPI;
- return 1;
- }
- if (SDL_strcasecmp(argv[index], "--windows") == 0) {
- ++index;
- if (!argv[index] || !SDL_isdigit(*argv[index])) {
- 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], "--icon") == 0) {
- ++index;
- if (!argv[index]) {
- return -1;
- }
- state->window_icon = 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], "--usable-bounds") == 0) {
- /* !!! FIXME: this is a bit of a hack, but I don't want to add a
- !!! FIXME: flag to the public structure in 2.0.x */
- state->window_x = -1;
- state->window_y = -1;
- state->window_w = -1;
- state->window_h = -1;
- return 1;
- }
- 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;
- }
- if (SDL_strcasecmp(argv[index], "--min-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_minW = SDL_atoi(w);
- state->window_minH = SDL_atoi(h);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "--max-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_maxW = SDL_atoi(w);
- state->window_maxH = SDL_atoi(h);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "--logical") == 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->logical_w = SDL_atoi(w);
- state->logical_h = SDL_atoi(h);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "--scale") == 0) {
- ++index;
- if (!argv[index]) {
- return -1;
- }
- state->scale = (float)SDL_atof(argv[index]);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "--depth") == 0) {
- ++index;
- if (!argv[index]) {
- return -1;
- }
- state->depth = SDL_atoi(argv[index]);
- return 2;
- }
- 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) {
- state->render_flags |= SDL_RENDERER_PRESENTVSYNC;
- return 1;
- }
- 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_MOUSE_GRABBED;
- return 1;
- }
- if (SDL_strcasecmp(argv[index], "--keyboard-grab") == 0) {
- state->window_flags |= SDL_WINDOW_KEYBOARD_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;
- }
- state->audiospec.channels = (Uint8) SDL_atoi(argv[index]);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "--samples") == 0) {
- ++index;
- if (!argv[index]) {
- return -1;
- }
- state->audiospec.samples = (Uint16) SDL_atoi(argv[index]);
- return 2;
- }
- if (SDL_strcasecmp(argv[index], "--trackmem") == 0) {
- /* Already handled in SDLTest_CommonCreateState() */
- return 1;
- }
- if ((SDL_strcasecmp(argv[index], "-h") == 0)
- || (SDL_strcasecmp(argv[index], "--help") == 0)) {
- /* Print the usage message */
- return -1;
- }
- if (SDL_strcmp(argv[index], "-NSDocumentRevisionsDebugMode") == 0) {
- /* Debug flag sent by Xcode */
- return 2;
- }
- return 0;
- }
- void
- SDLTest_CommonLogUsage(SDLTest_CommonState * state, const char *argv0, const char **options)
- {
- int i;
- SDL_Log("USAGE: %s", argv0);
- SDL_Log(" %s", "[--trackmem]");
- if (state->flags & SDL_INIT_VIDEO) {
- for (i = 0; i < SDL_arraysize(video_usage); i++) {
- SDL_Log(" %s", video_usage[i]);
- }
- }
- if (state->flags & SDL_INIT_AUDIO) {
- for (i = 0; i < SDL_arraysize(audio_usage); i++) {
- SDL_Log(" %s", audio_usage[i]);
- }
- }
- if (options) {
- for (i = 0; options[i] != NULL; i++) {
- SDL_Log(" %s", options[i]);
- }
- }
- }
- static const char *
- BuildCommonUsageString(char **pstr, const char **strlist, const int numitems, const char **strlist2, const int numitems2)
- {
- char *str = *pstr;
- if (!str) {
- size_t len = SDL_strlen("[--trackmem]") + 2;
- int i;
- for (i = 0; i < numitems; i++) {
- len += SDL_strlen(strlist[i]) + 1;
- }
- if (strlist2) {
- for (i = 0; i < numitems2; i++) {
- len += SDL_strlen(strlist2[i]) + 1;
- }
- }
- str = (char *) SDL_calloc(1, len);
- if (!str) {
- return ""; /* oh well. */
- }
- SDL_strlcat(str, "[--trackmem] ", len);
- for (i = 0; i < numitems-1; i++) {
- SDL_strlcat(str, strlist[i], len);
- SDL_strlcat(str, " ", len);
- }
- SDL_strlcat(str, strlist[i], len);
- if (strlist2) {
- SDL_strlcat(str, " ", len);
- for (i = 0; i < numitems2-1; i++) {
- SDL_strlcat(str, strlist2[i], len);
- SDL_strlcat(str, " ", len);
- }
- SDL_strlcat(str, strlist2[i], len);
- }
- *pstr = str;
- }
- return str;
- }
- static char *common_usage_video = NULL;
- static char *common_usage_audio = NULL;
- static char *common_usage_videoaudio = NULL;
- const char *
- SDLTest_CommonUsage(SDLTest_CommonState * state)
- {
- switch (state->flags & (SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {
- case SDL_INIT_VIDEO:
- return BuildCommonUsageString(&common_usage_video, video_usage, SDL_arraysize(video_usage), NULL, 0);
- case SDL_INIT_AUDIO:
- return BuildCommonUsageString(&common_usage_audio, audio_usage, SDL_arraysize(audio_usage), NULL, 0);
- case (SDL_INIT_VIDEO | SDL_INIT_AUDIO):
- return BuildCommonUsageString(&common_usage_videoaudio, video_usage, SDL_arraysize(video_usage), audio_usage, SDL_arraysize(audio_usage));
- default:
- return "[--trackmem]";
- }
- }
- SDL_bool
- SDLTest_CommonDefaultArgs(SDLTest_CommonState *state, const int argc, char **argv)
- {
- int i = 1;
- while (i < argc) {
- const int consumed = SDLTest_CommonArg(state, i);
- if (consumed == 0) {
- SDLTest_CommonLogUsage(state, argv[0], NULL);
- return SDL_FALSE;
- }
- i += consumed;
- }
- return SDL_TRUE;
- }
- static void
- SDLTest_PrintRendererFlag(char *text, size_t maxlen, Uint32 flag)
- {
- switch (flag) {
- case SDL_RENDERER_SOFTWARE:
- SDL_snprintfcat(text, maxlen, "Software");
- break;
- case SDL_RENDERER_ACCELERATED:
- SDL_snprintfcat(text, maxlen, "Accelerated");
- break;
- case SDL_RENDERER_PRESENTVSYNC:
- SDL_snprintfcat(text, maxlen, "PresentVSync");
- break;
- case SDL_RENDERER_TARGETTEXTURE:
- SDL_snprintfcat(text, maxlen, "TargetTexturesSupported");
- break;
- default:
- SDL_snprintfcat(text, maxlen, "0x%8.8x", flag);
- break;
- }
- }
- static void
- SDLTest_PrintPixelFormat(char *text, size_t maxlen, Uint32 format)
- {
- switch (format) {
- case SDL_PIXELFORMAT_UNKNOWN:
- SDL_snprintfcat(text, maxlen, "Unknown");
- break;
- case SDL_PIXELFORMAT_INDEX1LSB:
- SDL_snprintfcat(text, maxlen, "Index1LSB");
- break;
- case SDL_PIXELFORMAT_INDEX1MSB:
- SDL_snprintfcat(text, maxlen, "Index1MSB");
- break;
- case SDL_PIXELFORMAT_INDEX4LSB:
- SDL_snprintfcat(text, maxlen, "Index4LSB");
- break;
- case SDL_PIXELFORMAT_INDEX4MSB:
- SDL_snprintfcat(text, maxlen, "Index4MSB");
- break;
- case SDL_PIXELFORMAT_INDEX8:
- SDL_snprintfcat(text, maxlen, "Index8");
- break;
- case SDL_PIXELFORMAT_RGB332:
- SDL_snprintfcat(text, maxlen, "RGB332");
- break;
- case SDL_PIXELFORMAT_RGB444:
- SDL_snprintfcat(text, maxlen, "RGB444");
- break;
- case SDL_PIXELFORMAT_BGR444:
- SDL_snprintfcat(text, maxlen, "BGR444");
- break;
- case SDL_PIXELFORMAT_RGB555:
- SDL_snprintfcat(text, maxlen, "RGB555");
- break;
- case SDL_PIXELFORMAT_BGR555:
- SDL_snprintfcat(text, maxlen, "BGR555");
- break;
- case SDL_PIXELFORMAT_ARGB4444:
- SDL_snprintfcat(text, maxlen, "ARGB4444");
- break;
- case SDL_PIXELFORMAT_ABGR4444:
- SDL_snprintfcat(text, maxlen, "ABGR4444");
- break;
- case SDL_PIXELFORMAT_ARGB1555:
- SDL_snprintfcat(text, maxlen, "ARGB1555");
- break;
- case SDL_PIXELFORMAT_ABGR1555:
- SDL_snprintfcat(text, maxlen, "ABGR1555");
- break;
- case SDL_PIXELFORMAT_RGB565:
- SDL_snprintfcat(text, maxlen, "RGB565");
- break;
- case SDL_PIXELFORMAT_BGR565:
- SDL_snprintfcat(text, maxlen, "BGR565");
- break;
- case SDL_PIXELFORMAT_RGB24:
- SDL_snprintfcat(text, maxlen, "RGB24");
- break;
- case SDL_PIXELFORMAT_BGR24:
- SDL_snprintfcat(text, maxlen, "BGR24");
- break;
- case SDL_PIXELFORMAT_RGB888:
- SDL_snprintfcat(text, maxlen, "RGB888");
- break;
- case SDL_PIXELFORMAT_BGR888:
- SDL_snprintfcat(text, maxlen, "BGR888");
- break;
- case SDL_PIXELFORMAT_ARGB8888:
- SDL_snprintfcat(text, maxlen, "ARGB8888");
- break;
- case SDL_PIXELFORMAT_RGBA8888:
- SDL_snprintfcat(text, maxlen, "RGBA8888");
- break;
- case SDL_PIXELFORMAT_ABGR8888:
- SDL_snprintfcat(text, maxlen, "ABGR8888");
- break;
- case SDL_PIXELFORMAT_BGRA8888:
- SDL_snprintfcat(text, maxlen, "BGRA8888");
- break;
- case SDL_PIXELFORMAT_ARGB2101010:
- SDL_snprintfcat(text, maxlen, "ARGB2101010");
- break;
- case SDL_PIXELFORMAT_YV12:
- SDL_snprintfcat(text, maxlen, "YV12");
- break;
- case SDL_PIXELFORMAT_IYUV:
- SDL_snprintfcat(text, maxlen, "IYUV");
- break;
- case SDL_PIXELFORMAT_YUY2:
- SDL_snprintfcat(text, maxlen, "YUY2");
- break;
- case SDL_PIXELFORMAT_UYVY:
- SDL_snprintfcat(text, maxlen, "UYVY");
- break;
- case SDL_PIXELFORMAT_YVYU:
- SDL_snprintfcat(text, maxlen, "YVYU");
- break;
- case SDL_PIXELFORMAT_NV12:
- SDL_snprintfcat(text, maxlen, "NV12");
- break;
- case SDL_PIXELFORMAT_NV21:
- SDL_snprintfcat(text, maxlen, "NV21");
- break;
- default:
- SDL_snprintfcat(text, maxlen, "0x%8.8x", format);
- break;
- }
- }
- static void
- SDLTest_PrintRenderer(SDL_RendererInfo * info)
- {
- int i, count;
- char text[1024];
- SDL_Log(" Renderer %s:\n", info->name);
- SDL_snprintf(text, sizeof(text), " Flags: 0x%8.8" SDL_PRIX32, info->flags);
- SDL_snprintfcat(text, sizeof(text), " (");
- count = 0;
- for (i = 0; i < sizeof(info->flags) * 8; ++i) {
- Uint32 flag = (1 << i);
- if (info->flags & flag) {
- if (count > 0) {
- SDL_snprintfcat(text, sizeof(text), " | ");
- }
- SDLTest_PrintRendererFlag(text, sizeof(text), flag);
- ++count;
- }
- }
- SDL_snprintfcat(text, sizeof(text), ")");
- SDL_Log("%s\n", text);
- SDL_snprintf(text, sizeof(text), " Texture formats (%" SDL_PRIu32 "): ", info->num_texture_formats);
- for (i = 0; i < (int) info->num_texture_formats; ++i) {
- if (i > 0) {
- SDL_snprintfcat(text, sizeof(text), ", ");
- }
- SDLTest_PrintPixelFormat(text, sizeof(text), info->texture_formats[i]);
- }
- SDL_Log("%s\n", text);
- if (info->max_texture_width || info->max_texture_height) {
- SDL_Log(" Max Texture Size: %dx%d\n",
- info->max_texture_width, info->max_texture_height);
- }
- }
- static SDL_Surface *
- SDLTest_LoadIcon(const char *file)
- {
- SDL_Surface *icon;
- /* Load the icon surface */
- icon = SDL_LoadBMP(file);
- if (icon == NULL) {
- SDL_Log("Couldn't load %s: %s\n", file, SDL_GetError());
- return (NULL);
- }
- if (icon->format->palette) {
- /* Set the colorkey */
- SDL_SetColorKey(icon, 1, *((Uint8 *) icon->pixels));
- }
- return (icon);
- }
- static SDL_HitTestResult SDLCALL
- SDLTest_ExampleHitTestCallback(SDL_Window *win, const SDL_Point *area, void *data)
- {
- int w, h;
- const int RESIZE_BORDER = 8;
- const int DRAGGABLE_TITLE = 32;
- /*SDL_Log("Hit test point %d,%d\n", area->x, area->y);*/
- SDL_GetWindowSize(win, &w, &h);
- if (area->x < RESIZE_BORDER) {
- if (area->y < RESIZE_BORDER) {
- SDL_Log("SDL_HITTEST_RESIZE_TOPLEFT\n");
- return SDL_HITTEST_RESIZE_TOPLEFT;
- } else if (area->y >= (h-RESIZE_BORDER)) {
- SDL_Log("SDL_HITTEST_RESIZE_BOTTOMLEFT\n");
- return SDL_HITTEST_RESIZE_BOTTOMLEFT;
- } else {
- SDL_Log("SDL_HITTEST_RESIZE_LEFT\n");
- return SDL_HITTEST_RESIZE_LEFT;
- }
- } else if (area->x >= (w-RESIZE_BORDER)) {
- if (area->y < RESIZE_BORDER) {
- SDL_Log("SDL_HITTEST_RESIZE_TOPRIGHT\n");
- return SDL_HITTEST_RESIZE_TOPRIGHT;
- } else if (area->y >= (h-RESIZE_BORDER)) {
- SDL_Log("SDL_HITTEST_RESIZE_BOTTOMRIGHT\n");
- return SDL_HITTEST_RESIZE_BOTTOMRIGHT;
- } else {
- SDL_Log("SDL_HITTEST_RESIZE_RIGHT\n");
- return SDL_HITTEST_RESIZE_RIGHT;
- }
- } else if (area->y >= (h-RESIZE_BORDER)) {
- SDL_Log("SDL_HITTEST_RESIZE_BOTTOM\n");
- return SDL_HITTEST_RESIZE_BOTTOM;
- } else if (area->y < RESIZE_BORDER) {
- SDL_Log("SDL_HITTEST_RESIZE_TOP\n");
- return SDL_HITTEST_RESIZE_TOP;
- } else if (area->y < DRAGGABLE_TITLE) {
- SDL_Log("SDL_HITTEST_DRAGGABLE\n");
- return SDL_HITTEST_DRAGGABLE;
- }
- return SDL_HITTEST_NORMAL;
- }
- SDL_bool
- SDLTest_CommonInit(SDLTest_CommonState * state)
- {
- int i, j, m, n, w, h;
- SDL_DisplayMode fullscreen_mode;
- char text[1024];
- if (state->flags & SDL_INIT_VIDEO) {
- if (state->verbose & VERBOSE_VIDEO) {
- n = SDL_GetNumVideoDrivers();
- if (n == 0) {
- SDL_Log("No built-in video drivers\n");
- } else {
- SDL_snprintf(text, sizeof(text), "Built-in video drivers:");
- for (i = 0; i < n; ++i) {
- if (i > 0) {
- SDL_snprintfcat(text, sizeof(text), ",");
- }
- SDL_snprintfcat(text, sizeof(text), " %s", SDL_GetVideoDriver(i));
- }
- SDL_Log("%s\n", text);
- }
- }
- if (SDL_VideoInit(state->videodriver) < 0) {
- SDL_Log("Couldn't initialize video driver: %s\n",
- SDL_GetError());
- return SDL_FALSE;
- }
- if (state->verbose & VERBOSE_VIDEO) {
- SDL_Log("Video driver: %s\n",
- SDL_GetCurrentVideoDriver());
- }
- /* 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);
- if (state->gl_accelerated >= 0) {
- SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL,
- state->gl_accelerated);
- }
- SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, state->gl_retained_backing);
- if (state->gl_major_version) {
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, state->gl_major_version);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, state->gl_minor_version);
- }
- if (state->gl_debug) {
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);
- }
- if (state->gl_profile_mask) {
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, state->gl_profile_mask);
- }
- if (state->verbose & VERBOSE_MODES) {
- SDL_Rect bounds, usablebounds;
- float hdpi = 0;
- float vdpi = 0;
- SDL_DisplayMode mode;
- int bpp;
- Uint32 Rmask, Gmask, Bmask, Amask;
- #if SDL_VIDEO_DRIVER_WINDOWS
- int adapterIndex = 0;
- int outputIndex = 0;
- #endif
- n = SDL_GetNumVideoDisplays();
- SDL_Log("Number of displays: %d\n", n);
- for (i = 0; i < n; ++i) {
- SDL_Log("Display %d: %s\n", i, SDL_GetDisplayName(i));
- SDL_zero(bounds);
- SDL_GetDisplayBounds(i, &bounds);
- SDL_zero(usablebounds);
- SDL_GetDisplayUsableBounds(i, &usablebounds);
- SDL_GetDisplayDPI(i, NULL, &hdpi, &vdpi);
- SDL_Log("Bounds: %dx%d at %d,%d\n", bounds.w, bounds.h, bounds.x, bounds.y);
- SDL_Log("Usable bounds: %dx%d at %d,%d\n", usablebounds.w, usablebounds.h, usablebounds.x, usablebounds.y);
- SDL_Log("DPI: %fx%f\n", hdpi, vdpi);
- SDL_GetDesktopDisplayMode(i, &mode);
- SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask,
- &Bmask, &Amask);
- SDL_Log(" Current mode: %dx%d@%dHz, %d bits-per-pixel (%s)\n",
- mode.w, mode.h, mode.refresh_rate, bpp,
- SDL_GetPixelFormatName(mode.format));
- if (Rmask || Gmask || Bmask) {
- SDL_Log(" Red Mask = 0x%.8" SDL_PRIx32 "\n", Rmask);
- SDL_Log(" Green Mask = 0x%.8" SDL_PRIx32 "\n", Gmask);
- SDL_Log(" Blue Mask = 0x%.8" SDL_PRIx32 "\n", Bmask);
- if (Amask)
- SDL_Log(" Alpha Mask = 0x%.8" SDL_PRIx32 "\n", Amask);
- }
- /* Print available fullscreen video modes */
- m = SDL_GetNumDisplayModes(i);
- if (m == 0) {
- SDL_Log("No available fullscreen video modes\n");
- } else {
- SDL_Log(" Fullscreen video modes:\n");
- for (j = 0; j < m; ++j) {
- SDL_GetDisplayMode(i, j, &mode);
- SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask,
- &Gmask, &Bmask, &Amask);
- SDL_Log(" Mode %d: %dx%d@%dHz, %d bits-per-pixel (%s)\n",
- j, mode.w, mode.h, mode.refresh_rate, bpp,
- SDL_GetPixelFormatName(mode.format));
- if (Rmask || Gmask || Bmask) {
- SDL_Log(" Red Mask = 0x%.8" SDL_PRIx32 "\n",
- Rmask);
- SDL_Log(" Green Mask = 0x%.8" SDL_PRIx32 "\n",
- Gmask);
- SDL_Log(" Blue Mask = 0x%.8" SDL_PRIx32 "\n",
- Bmask);
- if (Amask)
- SDL_Log(" Alpha Mask = 0x%.8" SDL_PRIx32 "\n",
- Amask);
- }
- }
- }
- #if SDL_VIDEO_DRIVER_WINDOWS
- /* Print the D3D9 adapter index */
- adapterIndex = SDL_Direct3D9GetAdapterIndex( i );
- SDL_Log("D3D9 Adapter Index: %d", adapterIndex);
- /* Print the DXGI adapter and output indices */
- SDL_DXGIGetOutputInfo(i, &adapterIndex, &outputIndex);
- SDL_Log("DXGI Adapter Index: %d Output Index: %d", adapterIndex, outputIndex);
- #endif
- }
- }
- if (state->verbose & VERBOSE_RENDER) {
- SDL_RendererInfo info;
- n = SDL_GetNumRenderDrivers();
- if (n == 0) {
- SDL_Log("No built-in render drivers\n");
- } else {
- SDL_Log("Built-in render drivers:\n");
- for (i = 0; i < n; ++i) {
- SDL_GetRenderDriverInfo(i, &info);
- SDLTest_PrintRenderer(&info);
- }
- }
- }
- SDL_zero(fullscreen_mode);
- switch (state->depth) {
- case 8:
- fullscreen_mode.format = SDL_PIXELFORMAT_INDEX8;
- break;
- case 15:
- fullscreen_mode.format = SDL_PIXELFORMAT_RGB555;
- break;
- case 16:
- fullscreen_mode.format = SDL_PIXELFORMAT_RGB565;
- break;
- case 24:
- fullscreen_mode.format = SDL_PIXELFORMAT_RGB24;
- break;
- default:
- fullscreen_mode.format = SDL_PIXELFORMAT_RGB888;
- break;
- }
- fullscreen_mode.refresh_rate = state->refresh_rate;
- state->windows =
- (SDL_Window **) SDL_calloc(state->num_windows,
- sizeof(*state->windows));
- state->renderers =
- (SDL_Renderer **) SDL_calloc(state->num_windows,
- sizeof(*state->renderers));
- state->targets =
- (SDL_Texture **) SDL_calloc(state->num_windows,
- sizeof(*state->targets));
- if (!state->windows || !state->renderers) {
- SDL_Log("Out of memory!\n");
- return SDL_FALSE;
- }
- for (i = 0; i < state->num_windows; ++i) {
- char title[1024];
- SDL_Rect r;
- r.x = state->window_x;
- r.y = state->window_y;
- r.w = state->window_w;
- r.h = state->window_h;
- /* !!! FIXME: hack to make --usable-bounds work for now. */
- if ((r.x == -1) && (r.y == -1) && (r.w == -1) && (r.h == -1)) {
- SDL_GetDisplayUsableBounds(state->display, &r);
- }
- 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, r.x, r.y, r.w, r.h, state->window_flags);
- if (!state->windows[i]) {
- SDL_Log("Couldn't create window: %s\n",
- SDL_GetError());
- return SDL_FALSE;
- }
- if (state->window_minW || state->window_minH) {
- SDL_SetWindowMinimumSize(state->windows[i], state->window_minW, state->window_minH);
- }
- if (state->window_maxW || state->window_maxH) {
- SDL_SetWindowMaximumSize(state->windows[i], state->window_maxW, state->window_maxH);
- }
- SDL_GetWindowSize(state->windows[i], &w, &h);
- if (!(state->window_flags & SDL_WINDOW_RESIZABLE) &&
- (w != state->window_w || h != state->window_h)) {
- printf("Window requested size %dx%d, got %dx%d\n", state->window_w, state->window_h, w, h);
- state->window_w = w;
- state->window_h = h;
- }
- if (SDL_SetWindowDisplayMode(state->windows[i], &fullscreen_mode) < 0) {
- SDL_Log("Can't set up fullscreen display mode: %s\n",
- SDL_GetError());
- return SDL_FALSE;
- }
- /* Add resize/drag areas for windows that are borderless and resizable */
- if ((state->window_flags & (SDL_WINDOW_RESIZABLE|SDL_WINDOW_BORDERLESS)) ==
- (SDL_WINDOW_RESIZABLE|SDL_WINDOW_BORDERLESS)) {
- SDL_SetWindowHitTest(state->windows[i], SDLTest_ExampleHitTestCallback, NULL);
- }
- if (state->window_icon) {
- SDL_Surface *icon = SDLTest_LoadIcon(state->window_icon);
- if (icon) {
- SDL_SetWindowIcon(state->windows[i], icon);
- SDL_FreeSurface(icon);
- }
- }
- SDL_ShowWindow(state->windows[i]);
- if (!state->skip_renderer
- && (state->renderdriver
- || !(state->window_flags & (SDL_WINDOW_OPENGL | SDL_WINDOW_VULKAN)))) {
- m = -1;
- if (state->renderdriver) {
- SDL_RendererInfo info;
- n = SDL_GetNumRenderDrivers();
- for (j = 0; j < n; ++j) {
- SDL_GetRenderDriverInfo(j, &info);
- if (SDL_strcasecmp(info.name, state->renderdriver) ==
- 0) {
- m = j;
- break;
- }
- }
- if (m == -1) {
- SDL_Log("Couldn't find render driver named %s",
- state->renderdriver);
- return SDL_FALSE;
- }
- }
- state->renderers[i] = SDL_CreateRenderer(state->windows[i],
- m, state->render_flags);
- if (!state->renderers[i]) {
- SDL_Log("Couldn't create renderer: %s\n",
- SDL_GetError());
- return SDL_FALSE;
- }
- if (state->logical_w && state->logical_h) {
- SDL_RenderSetLogicalSize(state->renderers[i], state->logical_w, state->logical_h);
- } else if (state->scale != 0.) {
- SDL_RenderSetScale(state->renderers[i], state->scale, state->scale);
- }
- if (state->verbose & VERBOSE_RENDER) {
- SDL_RendererInfo info;
- SDL_Log("Current renderer:\n");
- SDL_GetRendererInfo(state->renderers[i], &info);
- SDLTest_PrintRenderer(&info);
- }
- }
- }
- }
- if (state->flags & SDL_INIT_AUDIO) {
- if (state->verbose & VERBOSE_AUDIO) {
- n = SDL_GetNumAudioDrivers();
- if (n == 0) {
- SDL_Log("No built-in audio drivers\n");
- } else {
- SDL_snprintf(text, sizeof(text), "Built-in audio drivers:");
- for (i = 0; i < n; ++i) {
- if (i > 0) {
- SDL_snprintfcat(text, sizeof(text), ",");
- }
- SDL_snprintfcat(text, sizeof(text), " %s", SDL_GetAudioDriver(i));
- }
- SDL_Log("%s\n", text);
- }
- }
- if (SDL_AudioInit(state->audiodriver) < 0) {
- SDL_Log("Couldn't initialize audio driver: %s\n",
- SDL_GetError());
- return SDL_FALSE;
- }
- if (state->verbose & VERBOSE_AUDIO) {
- SDL_Log("Audio driver: %s\n",
- SDL_GetCurrentAudioDriver());
- }
- if (SDL_OpenAudio(&state->audiospec, NULL) < 0) {
- SDL_Log("Couldn't open audio: %s\n", SDL_GetError());
- return SDL_FALSE;
- }
- }
- return SDL_TRUE;
- }
- static const char *
- DisplayOrientationName(int orientation)
- {
- switch (orientation)
- {
- #define CASE(X) case SDL_ORIENTATION_##X: return #X
- CASE(UNKNOWN);
- CASE(LANDSCAPE);
- CASE(LANDSCAPE_FLIPPED);
- CASE(PORTRAIT);
- CASE(PORTRAIT_FLIPPED);
- #undef CASE
- default: return "???";
- }
- }
- static const char *
- ControllerAxisName(const SDL_GameControllerAxis axis)
- {
- switch (axis)
- {
- #define AXIS_CASE(ax) case SDL_CONTROLLER_AXIS_##ax: return #ax
- AXIS_CASE(INVALID);
- AXIS_CASE(LEFTX);
- AXIS_CASE(LEFTY);
- AXIS_CASE(RIGHTX);
- AXIS_CASE(RIGHTY);
- AXIS_CASE(TRIGGERLEFT);
- AXIS_CASE(TRIGGERRIGHT);
- #undef AXIS_CASE
- default: return "???";
- }
- }
- static const char *
- ControllerButtonName(const SDL_GameControllerButton button)
- {
- switch (button)
- {
- #define BUTTON_CASE(btn) case SDL_CONTROLLER_BUTTON_##btn: return #btn
- BUTTON_CASE(INVALID);
- BUTTON_CASE(A);
- BUTTON_CASE(B);
- BUTTON_CASE(X);
- BUTTON_CASE(Y);
- BUTTON_CASE(BACK);
- BUTTON_CASE(GUIDE);
- BUTTON_CASE(START);
- BUTTON_CASE(LEFTSTICK);
- BUTTON_CASE(RIGHTSTICK);
- BUTTON_CASE(LEFTSHOULDER);
- BUTTON_CASE(RIGHTSHOULDER);
- BUTTON_CASE(DPAD_UP);
- BUTTON_CASE(DPAD_DOWN);
- BUTTON_CASE(DPAD_LEFT);
- BUTTON_CASE(DPAD_RIGHT);
- #undef BUTTON_CASE
- default: return "???";
- }
- }
- static void
- SDLTest_PrintEvent(SDL_Event * event)
- {
- if ((event->type == SDL_MOUSEMOTION) || (event->type == SDL_FINGERMOTION)) {
- /* Mouse and finger motion are really spammy */
- return;
- }
- switch (event->type) {
- case SDL_DISPLAYEVENT:
- switch (event->display.event) {
- case SDL_DISPLAYEVENT_ORIENTATION:
- SDL_Log("SDL EVENT: Display %" SDL_PRIu32 " changed orientation to %s",
- event->display.display, DisplayOrientationName(event->display.data1));
- break;
- default:
- SDL_Log("SDL EVENT: Display %" SDL_PRIu32 " got unknown event 0x%4.4x",
- event->display.display, event->display.event);
- break;
- }
- break;
- case SDL_WINDOWEVENT:
- switch (event->window.event) {
- case SDL_WINDOWEVENT_SHOWN:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " shown", event->window.windowID);
- break;
- case SDL_WINDOWEVENT_HIDDEN:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " hidden", event->window.windowID);
- break;
- case SDL_WINDOWEVENT_EXPOSED:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " exposed", event->window.windowID);
- break;
- case SDL_WINDOWEVENT_MOVED:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " moved to %" SDL_PRIs32 ",%" SDL_PRIs32,
- event->window.windowID, event->window.data1, event->window.data2);
- break;
- case SDL_WINDOWEVENT_RESIZED:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " resized to %" SDL_PRIs32 "x%" SDL_PRIs32,
- event->window.windowID, event->window.data1, event->window.data2);
- break;
- case SDL_WINDOWEVENT_SIZE_CHANGED:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " changed size to %" SDL_PRIs32 "x%" SDL_PRIs32,
- event->window.windowID, event->window.data1, event->window.data2);
- break;
- case SDL_WINDOWEVENT_MINIMIZED:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " minimized", event->window.windowID);
- break;
- case SDL_WINDOWEVENT_MAXIMIZED:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " maximized", event->window.windowID);
- break;
- case SDL_WINDOWEVENT_RESTORED:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " restored", event->window.windowID);
- break;
- case SDL_WINDOWEVENT_ENTER:
- SDL_Log("SDL EVENT: Mouse entered window %" SDL_PRIu32 "",
- event->window.windowID);
- break;
- case SDL_WINDOWEVENT_LEAVE:
- SDL_Log("SDL EVENT: Mouse left window %" SDL_PRIu32 "", event->window.windowID);
- break;
- case SDL_WINDOWEVENT_FOCUS_GAINED:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " gained keyboard focus",
- event->window.windowID);
- break;
- case SDL_WINDOWEVENT_FOCUS_LOST:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " lost keyboard focus",
- event->window.windowID);
- break;
- case SDL_WINDOWEVENT_CLOSE:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " closed", event->window.windowID);
- break;
- case SDL_WINDOWEVENT_TAKE_FOCUS:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " take focus", event->window.windowID);
- break;
- case SDL_WINDOWEVENT_HIT_TEST:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " hit test", event->window.windowID);
- break;
- default:
- SDL_Log("SDL EVENT: Window %" SDL_PRIu32 " got unknown event 0x%4.4x",
- event->window.windowID, event->window.event);
- break;
- }
- break;
- case SDL_KEYDOWN:
- SDL_Log("SDL EVENT: Keyboard: key pressed in window %" SDL_PRIu32 ": scancode 0x%08X = %s, keycode 0x%08" SDL_PRIX32 " = %s",
- event->key.windowID,
- event->key.keysym.scancode,
- SDL_GetScancodeName(event->key.keysym.scancode),
- event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));
- break;
- case SDL_KEYUP:
- SDL_Log("SDL EVENT: Keyboard: key released in window %" SDL_PRIu32 ": scancode 0x%08X = %s, keycode 0x%08" SDL_PRIX32 " = %s",
- event->key.windowID,
- event->key.keysym.scancode,
- SDL_GetScancodeName(event->key.keysym.scancode),
- event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));
- break;
- case SDL_TEXTEDITING:
- SDL_Log("SDL EVENT: Keyboard: text editing \"%s\" in window %" SDL_PRIu32,
- event->edit.text, event->edit.windowID);
- break;
- case SDL_TEXTINPUT:
- SDL_Log("SDL EVENT: Keyboard: text input \"%s\" in window %" SDL_PRIu32,
- event->text.text, event->text.windowID);
- break;
- case SDL_KEYMAPCHANGED:
- SDL_Log("SDL EVENT: Keymap changed");
- break;
- case SDL_MOUSEMOTION:
- SDL_Log("SDL EVENT: Mouse: moved to %" SDL_PRIs32 ",%" SDL_PRIs32 " (%" SDL_PRIs32 ",%" SDL_PRIs32 ") in window %" SDL_PRIu32,
- event->motion.x, event->motion.y,
- event->motion.xrel, event->motion.yrel,
- event->motion.windowID);
- break;
- case SDL_MOUSEBUTTONDOWN:
- SDL_Log("SDL EVENT: Mouse: button %d pressed at %" SDL_PRIs32 ",%" SDL_PRIs32 " with click count %d in window %" SDL_PRIu32,
- event->button.button, event->button.x, event->button.y, event->button.clicks,
- event->button.windowID);
- break;
- case SDL_MOUSEBUTTONUP:
- SDL_Log("SDL EVENT: Mouse: button %d released at %" SDL_PRIs32 ",%" SDL_PRIs32 " with click count %d in window %" SDL_PRIu32,
- event->button.button, event->button.x, event->button.y, event->button.clicks,
- event->button.windowID);
- break;
- case SDL_MOUSEWHEEL:
- SDL_Log("SDL EVENT: Mouse: wheel scrolled %" SDL_PRIs32 " in x and %" SDL_PRIs32 " in y (reversed: %" SDL_PRIu32 ") in window %" SDL_PRIu32,
- event->wheel.x, event->wheel.y, event->wheel.direction, event->wheel.windowID);
- break;
- case SDL_JOYDEVICEADDED:
- SDL_Log("SDL EVENT: Joystick index %" SDL_PRIs32 " attached",
- event->jdevice.which);
- break;
- case SDL_JOYDEVICEREMOVED:
- SDL_Log("SDL EVENT: Joystick %" SDL_PRIs32 " removed",
- event->jdevice.which);
- break;
- case SDL_JOYBALLMOTION:
- SDL_Log("SDL EVENT: Joystick %" SDL_PRIs32 ": ball %d moved by %d,%d",
- event->jball.which, event->jball.ball, event->jball.xrel,
- event->jball.yrel);
- break;
- case SDL_JOYHATMOTION:
- {
- const char *position = "UNKNOWN";
- switch (event->jhat.value) {
- case SDL_HAT_CENTERED:
- position = "CENTER";
- break;
- case SDL_HAT_UP:
- position = "UP";
- break;
- case SDL_HAT_RIGHTUP:
- position = "RIGHTUP";
- break;
- case SDL_HAT_RIGHT:
- position = "RIGHT";
- break;
- case SDL_HAT_RIGHTDOWN:
- position = "RIGHTDOWN";
- break;
- case SDL_HAT_DOWN:
- position = "DOWN";
- break;
- case SDL_HAT_LEFTDOWN:
- position = "LEFTDOWN";
- break;
- case SDL_HAT_LEFT:
- position = "LEFT";
- break;
- case SDL_HAT_LEFTUP:
- position = "LEFTUP";
- break;
- }
- SDL_Log("SDL EVENT: Joystick %" SDL_PRIs32 ": hat %d moved to %s",
- event->jhat.which, event->jhat.hat, position);
- }
- break;
- case SDL_JOYBUTTONDOWN:
- SDL_Log("SDL EVENT: Joystick %" SDL_PRIs32 ": button %d pressed",
- event->jbutton.which, event->jbutton.button);
- break;
- case SDL_JOYBUTTONUP:
- SDL_Log("SDL EVENT: Joystick %" SDL_PRIs32 ": button %d released",
- event->jbutton.which, event->jbutton.button);
- break;
- case SDL_CONTROLLERDEVICEADDED:
- SDL_Log("SDL EVENT: Controller index %" SDL_PRIs32 " attached",
- event->cdevice.which);
- break;
- case SDL_CONTROLLERDEVICEREMOVED:
- SDL_Log("SDL EVENT: Controller %" SDL_PRIs32 " removed",
- event->cdevice.which);
- break;
- case SDL_CONTROLLERAXISMOTION:
- SDL_Log("SDL EVENT: Controller %" SDL_PRIs32 " axis %d ('%s') value: %d",
- event->caxis.which,
- event->caxis.axis,
- ControllerAxisName((SDL_GameControllerAxis)event->caxis.axis),
- event->caxis.value);
- break;
- case SDL_CONTROLLERBUTTONDOWN:
- SDL_Log("SDL EVENT: Controller %" SDL_PRIs32 "button %d ('%s') down",
- event->cbutton.which, event->cbutton.button,
- ControllerButtonName((SDL_GameControllerButton)event->cbutton.button));
- break;
- case SDL_CONTROLLERBUTTONUP:
- SDL_Log("SDL EVENT: Controller %" SDL_PRIs32 " button %d ('%s') up",
- event->cbutton.which, event->cbutton.button,
- ControllerButtonName((SDL_GameControllerButton)event->cbutton.button));
- break;
- case SDL_CLIPBOARDUPDATE:
- SDL_Log("SDL EVENT: Clipboard updated");
- break;
- case SDL_FINGERMOTION:
- SDL_Log("SDL EVENT: Finger: motion touch=%ld, finger=%ld, x=%f, y=%f, dx=%f, dy=%f, pressure=%f",
- (long) event->tfinger.touchId,
- (long) event->tfinger.fingerId,
- event->tfinger.x, event->tfinger.y,
- event->tfinger.dx, event->tfinger.dy, event->tfinger.pressure);
- break;
- case SDL_FINGERDOWN:
- case SDL_FINGERUP:
- SDL_Log("SDL EVENT: Finger: %s touch=%ld, finger=%ld, x=%f, y=%f, dx=%f, dy=%f, pressure=%f",
- (event->type == SDL_FINGERDOWN) ? "down" : "up",
- (long) event->tfinger.touchId,
- (long) event->tfinger.fingerId,
- event->tfinger.x, event->tfinger.y,
- event->tfinger.dx, event->tfinger.dy, event->tfinger.pressure);
- break;
- case SDL_DOLLARGESTURE:
- SDL_Log("SDL_EVENT: Dollar gesture detect: %ld", (long) event->dgesture.gestureId);
- break;
- case SDL_DOLLARRECORD:
- SDL_Log("SDL_EVENT: Dollar gesture record: %ld", (long) event->dgesture.gestureId);
- break;
- case SDL_MULTIGESTURE:
- SDL_Log("SDL_EVENT: Multi gesture fingers: %d", event->mgesture.numFingers);
- break;
- case SDL_RENDER_DEVICE_RESET:
- SDL_Log("SDL EVENT: render device reset");
- break;
- case SDL_RENDER_TARGETS_RESET:
- SDL_Log("SDL EVENT: render targets reset");
- break;
- case SDL_APP_TERMINATING:
- SDL_Log("SDL EVENT: App terminating");
- break;
- case SDL_APP_LOWMEMORY:
- SDL_Log("SDL EVENT: App running low on memory");
- break;
- case SDL_APP_WILLENTERBACKGROUND:
- SDL_Log("SDL EVENT: App will enter the background");
- break;
- case SDL_APP_DIDENTERBACKGROUND:
- SDL_Log("SDL EVENT: App entered the background");
- break;
- case SDL_APP_WILLENTERFOREGROUND:
- SDL_Log("SDL EVENT: App will enter the foreground");
- break;
- case SDL_APP_DIDENTERFOREGROUND:
- SDL_Log("SDL EVENT: App entered the foreground");
- break;
- case SDL_DROPBEGIN:
- SDL_Log("SDL EVENT: Drag and drop beginning");
- break;
- case SDL_DROPFILE:
- SDL_Log("SDL EVENT: Drag and drop file: '%s'", event->drop.file);
- break;
- case SDL_DROPTEXT:
- SDL_Log("SDL EVENT: Drag and drop text: '%s'", event->drop.file);
- break;
- case SDL_DROPCOMPLETE:
- SDL_Log("SDL EVENT: Drag and drop ending");
- break;
- case SDL_QUIT:
- SDL_Log("SDL EVENT: Quit requested");
- break;
- case SDL_USEREVENT:
- SDL_Log("SDL EVENT: User event %" SDL_PRIs32, event->user.code);
- break;
- default:
- SDL_Log("Unknown event 0x%4.4" SDL_PRIu32, event->type);
- break;
- }
- }
- static void
- SDLTest_ScreenShot(SDL_Renderer *renderer)
- {
- SDL_Rect viewport;
- SDL_Surface *surface;
- if (!renderer) {
- return;
- }
- SDL_RenderGetViewport(renderer, &viewport);
- surface = SDL_CreateRGBSurface(0, viewport.w, viewport.h, 24,
- #if SDL_BYTEORDER == SDL_LIL_ENDIAN
- 0x00FF0000, 0x0000FF00, 0x000000FF,
- #else
- 0x000000FF, 0x0000FF00, 0x00FF0000,
- #endif
- 0x00000000);
- if (!surface) {
- SDL_Log("Couldn't create surface: %s\n", SDL_GetError());
- return;
- }
- if (SDL_RenderReadPixels(renderer, NULL, surface->format->format,
- surface->pixels, surface->pitch) < 0) {
- SDL_Log("Couldn't read screen: %s\n", SDL_GetError());
- SDL_free(surface);
- return;
- }
- if (SDL_SaveBMP(surface, "screenshot.bmp") < 0) {
- SDL_Log("Couldn't save screenshot.bmp: %s\n", SDL_GetError());
- SDL_free(surface);
- return;
- }
- }
- static void
- FullscreenTo(int index, int windowId)
- {
- Uint32 flags;
- struct SDL_Rect rect = { 0, 0, 0, 0 };
- SDL_Window *window = SDL_GetWindowFromID(windowId);
- if (!window) {
- return;
- }
- SDL_GetDisplayBounds( index, &rect );
- flags = SDL_GetWindowFlags(window);
- if (flags & SDL_WINDOW_FULLSCREEN) {
- SDL_SetWindowFullscreen( window, SDL_FALSE );
- SDL_Delay( 15 );
- }
- SDL_SetWindowPosition( window, rect.x, rect.y );
- SDL_SetWindowFullscreen( window, SDL_TRUE );
- }
- void
- SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done)
- {
- int i;
- static SDL_MouseMotionEvent lastEvent;
- if (state->verbose & VERBOSE_EVENT) {
- SDLTest_PrintEvent(event);
- }
- switch (event->type) {
- case SDL_WINDOWEVENT:
- switch (event->window.event) {
- case SDL_WINDOWEVENT_CLOSE:
- {
- SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);
- if (window) {
- for (i = 0; i < state->num_windows; ++i) {
- if (window == state->windows[i]) {
- if (state->targets[i]) {
- SDL_DestroyTexture(state->targets[i]);
- state->targets[i] = NULL;
- }
- if (state->renderers[i]) {
- SDL_DestroyRenderer(state->renderers[i]);
- state->renderers[i] = NULL;
- }
- SDL_DestroyWindow(state->windows[i]);
- state->windows[i] = NULL;
- break;
- }
- }
- }
- }
- break;
- }
- break;
- case SDL_KEYDOWN: {
- SDL_bool withControl = !!(event->key.keysym.mod & KMOD_CTRL);
- SDL_bool withShift = !!(event->key.keysym.mod & KMOD_SHIFT);
- SDL_bool withAlt = !!(event->key.keysym.mod & KMOD_ALT);
- switch (event->key.keysym.sym) {
- /* Add hotkeys here */
- case SDLK_PRINTSCREEN: {
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- for (i = 0; i < state->num_windows; ++i) {
- if (window == state->windows[i]) {
- SDLTest_ScreenShot(state->renderers[i]);
- }
- }
- }
- }
- break;
- case SDLK_EQUALS:
- if (withControl) {
- /* Ctrl-+ double the size of the window */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- int w, h;
- SDL_GetWindowSize(window, &w, &h);
- SDL_SetWindowSize(window, w*2, h*2);
- }
- }
- break;
- case SDLK_MINUS:
- if (withControl) {
- /* Ctrl-- half the size of the window */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- int w, h;
- SDL_GetWindowSize(window, &w, &h);
- SDL_SetWindowSize(window, w/2, h/2);
- }
- }
- break;
- case SDLK_UP:
- case SDLK_DOWN:
- case SDLK_LEFT:
- case SDLK_RIGHT:
- if (withAlt) {
- /* Alt-Up/Down/Left/Right switches between displays */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- int currentIndex = SDL_GetWindowDisplayIndex(window);
- int numDisplays = SDL_GetNumVideoDisplays();
- if (currentIndex >= 0 && numDisplays >= 1) {
- int dest;
- if (event->key.keysym.sym == SDLK_UP || event->key.keysym.sym == SDLK_LEFT) {
- dest = (currentIndex + numDisplays - 1) % numDisplays;
- } else {
- dest = (currentIndex + numDisplays + 1) % numDisplays;
- }
- SDL_Log("Centering on display %d\n", dest);
- SDL_SetWindowPosition(window,
- SDL_WINDOWPOS_CENTERED_DISPLAY(dest),
- SDL_WINDOWPOS_CENTERED_DISPLAY(dest));
- }
- }
- }
- if (withShift) {
- /* Shift-Up/Down/Left/Right shift the window by 100px */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- const int delta = 100;
- int x, y;
- SDL_GetWindowPosition(window, &x, &y);
-
- if (event->key.keysym.sym == SDLK_UP) y -= delta;
- if (event->key.keysym.sym == SDLK_DOWN) y += delta;
- if (event->key.keysym.sym == SDLK_LEFT) x -= delta;
- if (event->key.keysym.sym == SDLK_RIGHT) x += delta;
- SDL_Log("Setting position to (%d, %d)\n", x, y);
- SDL_SetWindowPosition(window, x, y);
- }
- }
- break;
- case SDLK_o:
- if (withControl) {
- /* Ctrl-O (or Ctrl-Shift-O) changes window opacity. */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- float opacity;
- if (SDL_GetWindowOpacity(window, &opacity) == 0) {
- if (withShift) {
- opacity += 0.20f;
- } else {
- opacity -= 0.20f;
- }
- SDL_SetWindowOpacity(window, opacity);
- }
- }
- }
- break;
- case SDLK_c:
- if (withControl) {
- /* Ctrl-C copy awesome text! */
- SDL_SetClipboardText("SDL rocks!\nYou know it!");
- printf("Copied text to clipboard\n");
- }
- if (withAlt) {
- /* Alt-C toggle a render clip rectangle */
- for (i = 0; i < state->num_windows; ++i) {
- int w, h;
- if (state->renderers[i]) {
- SDL_Rect clip;
- SDL_GetWindowSize(state->windows[i], &w, &h);
- SDL_RenderGetClipRect(state->renderers[i], &clip);
- if (SDL_RectEmpty(&clip)) {
- clip.x = w/4;
- clip.y = h/4;
- clip.w = w/2;
- clip.h = h/2;
- SDL_RenderSetClipRect(state->renderers[i], &clip);
- } else {
- SDL_RenderSetClipRect(state->renderers[i], NULL);
- }
- }
- }
- }
- if (withShift) {
- SDL_Window *current_win = SDL_GetKeyboardFocus();
- if (current_win) {
- const SDL_bool shouldCapture = (SDL_GetWindowFlags(current_win) & SDL_WINDOW_MOUSE_CAPTURE) == 0;
- const int rc = SDL_CaptureMouse(shouldCapture);
- SDL_Log("%sapturing mouse %s!\n", shouldCapture ? "C" : "Unc", (rc == 0) ? "succeeded" : "failed");
- }
- }
- break;
- case SDLK_v:
- if (withControl) {
- /* 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;
- case SDLK_g:
- if (withControl) {
- /* Ctrl-G toggle mouse grab */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- SDL_SetWindowGrab(window, !SDL_GetWindowGrab(window) ? SDL_TRUE : SDL_FALSE);
- }
- }
- break;
- case SDLK_k:
- if (withControl) {
- /* Ctrl-K toggle keyboard grab */
- SDL_Window* window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- SDL_SetWindowKeyboardGrab(window, !SDL_GetWindowKeyboardGrab(window) ? SDL_TRUE : SDL_FALSE);
- }
- }
- break;
- case SDLK_m:
- if (withControl) {
- /* Ctrl-M maximize */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- Uint32 flags = SDL_GetWindowFlags(window);
- if (flags & SDL_WINDOW_MAXIMIZED) {
- SDL_RestoreWindow(window);
- } else {
- SDL_MaximizeWindow(window);
- }
- }
- }
- break;
- case SDLK_r:
- if (withControl) {
- /* Ctrl-R toggle mouse relative mode */
- SDL_SetRelativeMouseMode(!SDL_GetRelativeMouseMode() ? SDL_TRUE : SDL_FALSE);
- }
- break;
- case SDLK_z:
- if (withControl) {
- /* Ctrl-Z minimize */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- SDL_MinimizeWindow(window);
- }
- }
- break;
- case SDLK_RETURN:
- if (withControl) {
- /* Ctrl-Enter toggle fullscreen */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- Uint32 flags = SDL_GetWindowFlags(window);
- if (flags & SDL_WINDOW_FULLSCREEN) {
- SDL_SetWindowFullscreen(window, SDL_FALSE);
- } else {
- SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN);
- }
- }
- } else if (withAlt) {
- /* Alt-Enter toggle fullscreen desktop */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- Uint32 flags = SDL_GetWindowFlags(window);
- if (flags & SDL_WINDOW_FULLSCREEN) {
- SDL_SetWindowFullscreen(window, SDL_FALSE);
- } else {
- SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);
- }
- }
- } else if (withShift) {
- /* Shift-Enter toggle fullscreen desktop / fullscreen */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- Uint32 flags = SDL_GetWindowFlags(window);
- if ((flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) {
- SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN);
- } else {
- SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);
- }
- }
- }
- break;
- case SDLK_b:
- if (withControl) {
- /* Ctrl-B toggle window border */
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- if (window) {
- const Uint32 flags = SDL_GetWindowFlags(window);
- const SDL_bool b = ((flags & SDL_WINDOW_BORDERLESS) != 0) ? SDL_TRUE : SDL_FALSE;
- SDL_SetWindowBordered(window, b);
- }
- }
- break;
- case SDLK_a:
- if (withControl) {
- /* Ctrl-A reports absolute mouse position. */
- int x, y;
- const Uint32 mask = SDL_GetGlobalMouseState(&x, &y);
- SDL_Log("ABSOLUTE MOUSE: (%d, %d)%s%s%s%s%s\n", x, y,
- (mask & SDL_BUTTON_LMASK) ? " [LBUTTON]" : "",
- (mask & SDL_BUTTON_MMASK) ? " [MBUTTON]" : "",
- (mask & SDL_BUTTON_RMASK) ? " [RBUTTON]" : "",
- (mask & SDL_BUTTON_X1MASK) ? " [X2BUTTON]" : "",
- (mask & SDL_BUTTON_X2MASK) ? " [X2BUTTON]" : "");
- }
- break;
- case SDLK_0:
- if (withControl) {
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Test Message", "You're awesome!", window);
- }
- break;
- case SDLK_1:
- if (withControl) {
- FullscreenTo(0, event->key.windowID);
- }
- break;
- case SDLK_2:
- if (withControl) {
- FullscreenTo(1, event->key.windowID);
- }
- break;
- case SDLK_ESCAPE:
- *done = 1;
- break;
- case SDLK_SPACE:
- {
- char message[256];
- SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
- SDL_snprintf(message, sizeof(message), "(%" SDL_PRIs32 ", %" SDL_PRIs32 "), rel (%" SDL_PRIs32 ", %" SDL_PRIs32 ")\n",
- lastEvent.x, lastEvent.y, lastEvent.xrel, lastEvent.yrel);
- SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Last mouse position", message, window);
- break;
- }
- default:
- break;
- }
- break;
- }
- case SDL_QUIT:
- *done = 1;
- break;
- case SDL_MOUSEMOTION:
- lastEvent = event->motion;
- break;
- case SDL_DROPFILE:
- case SDL_DROPTEXT:
- SDL_free(event->drop.file);
- break;
- }
- }
- void
- SDLTest_CommonQuit(SDLTest_CommonState * state)
- {
- int i;
- SDL_free(common_usage_video);
- SDL_free(common_usage_audio);
- SDL_free(common_usage_videoaudio);
- common_usage_video = NULL;
- common_usage_audio = NULL;
- common_usage_videoaudio = NULL;
- SDL_free(state->windows);
- if (state->targets) {
- for (i = 0; i < state->num_windows; ++i) {
- if (state->targets[i]) {
- SDL_DestroyTexture(state->targets[i]);
- }
- }
- SDL_free(state->targets);
- }
- if (state->renderers) {
- for (i = 0; i < state->num_windows; ++i) {
- if (state->renderers[i]) {
- SDL_DestroyRenderer(state->renderers[i]);
- }
- }
- SDL_free(state->renderers);
- }
- if (state->flags & SDL_INIT_VIDEO) {
- SDL_VideoQuit();
- }
- if (state->flags & SDL_INIT_AUDIO) {
- SDL_AudioQuit();
- }
- SDL_free(state);
- SDL_Quit();
- SDLTest_LogAllocations();
- }
- /* vi: set ts=4 sw=4 expandtab: */
|