Files
Michael Martin 6dff21ef52 Update keyjam.exe to use SDL2
KeyJam is only used on Windows, so SDL1 support has been dropped.
Build this tool from the v0.7.0 branch if you need an SDL1-compatible
version of KeyJam.
2020-09-05 15:52:10 -07:00

218 lines
4.2 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL.h>
#include <SDL2_gfxPrimitives.h>
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define BUFFERSIZE 1024
#define MAX_KEYS 32
static SDL_Keycode keystate[MAX_KEYS];
static char held_keys[BUFFERSIZE];
static char videoname[BUFFERSIZE];
static void
InitHeldKeys (void)
{
int i;
for (i = 0; i < MAX_KEYS; ++i)
{
keystate[i] = 0;
}
}
static void
AddHeldKey (SDL_Keycode key)
{
int i;
for (i = 0; i < MAX_KEYS; ++i)
{
if (keystate[i] == key)
{
return;
}
if (keystate[i] == 0)
{
keystate[i] = key;
return;
}
}
}
static void
RemoveHeldKey (SDL_Keycode key)
{
int i;
for (i = 0; i < MAX_KEYS; ++i)
{
if (keystate[i] == key)
{
int j;
for (j = i + 1; j < MAX_KEYS; ++j)
{
keystate[j - 1] = keystate[j];
}
keystate[MAX_KEYS - 1] = 0;
}
}
}
static void
DrawCenteredText (SDL_Renderer *r, int y, const char *c)
{
int w = strlen (c) * 8;
stringRGBA (r, (SCREEN_WIDTH - w) / 2, y, c, 0xc0, 0xc0, 0xc0, 0xff);
}
static void
DrawScreen (SDL_Renderer *s)
{
int y;
SDL_SetRenderDrawColor (s, 0, 0, 0x80, 0xFF);
SDL_RenderClear (s);
DrawCenteredText (s, 8, "Key Jamming");
y = 32;
DrawCenteredText (s, y, "Many keyboards have hardware that does not permit them to send");
y += 8;
DrawCenteredText (s, y, "arbitrary keychords to the computer. This can complicate games");
y += 8;
DrawCenteredText (s, y, "with keyboard control, as activating certain controls may lock out");
y += 8;
DrawCenteredText (s, y, "others. This application lets you pre-test control combinations so");
y += 8;
DrawCenteredText (s, y, "as to avoid such conflicts.");
y += 16;
DrawCenteredText (s, y, "Test your keyboard by pressing key combinations. The keyboard's");
y += 8;
DrawCenteredText (s, y, "status will be reported in the bottom half of the screen. When");
y += 8;
DrawCenteredText (s, y, "configuring keys for a game, do not select keys that do not all");
y += 8;
DrawCenteredText (s, y, "register when simultaneously pressed.");
y += 16;
DrawCenteredText (s, y, "You are using the following SDL2 rendering engine:");
y += 8;
DrawCenteredText (s, y, videoname);
y += 16;
DrawCenteredText (s, y, "Press ESCAPE to exit.");
DrawCenteredText (s, 300, held_keys);
SDL_RenderPresent (s);
}
int
main (int argc, char *argv[])
{
SDL_Event event;
SDL_Window *window;
SDL_Renderer *screen;
SDL_RendererInfo renderer_info;
int quit = 0;
int i, changed;
/* Initialise SDL */
if (SDL_Init (SDL_INIT_VIDEO) < 0)
{
fprintf (stderr, "Could not initialise SDL: %s\n", SDL_GetError ());
exit (-1);
}
/* Set a video mode */
if (SDL_CreateWindowAndRenderer (SCREEN_WIDTH, SCREEN_HEIGHT, 0, &window, &screen))
{
fprintf (stderr, "Could not set create window/renderer: %s\n", SDL_GetError ());
SDL_Quit ();
exit (-1);
}
SDL_SetWindowTitle (window, "Key Jammer");
if (!SDL_GetRendererInfo (screen, &renderer_info))
{
strncpy (videoname, renderer_info.name, BUFFERSIZE);
}
else
{
strncpy (videoname, "<unknown>", BUFFERSIZE);
}
videoname[BUFFERSIZE-1] = 0;
InitHeldKeys ();
DrawScreen (screen);
/* Loop until an SDL_QUIT event is found */
while (!quit)
{
changed = 0;
/* Poll for events */
while (SDL_PollEvent (&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
AddHeldKey (event.key.keysym.sym);
if (event.key.keysym.sym == SDLK_ESCAPE)
{
quit = 1;
}
changed = 1;
break;
case SDL_KEYUP:
RemoveHeldKey (event.key.keysym.sym);
changed = 1;
break;
case SDL_QUIT:
quit = 1;
break;
default:
break;
}
}
if (changed)
{
held_keys[0] = '\0';
for (i = 0; i < MAX_KEYS; i++)
{
if (keystate[i])
{
if (held_keys[0])
{
strcat (held_keys, " | ");
}
strcat (held_keys, SDL_GetKeyName (keystate[i]));
}
if (strlen (held_keys) > 200)
{
break;
}
}
for (i = 0; i < BUFFERSIZE; i++)
{
if (!held_keys[i])
{
break;
}
held_keys[i] = toupper (held_keys[i]);
}
DrawScreen (screen);
}
SDL_Delay (20);
}
/* Clean up */
SDL_DestroyRenderer (screen);
SDL_DestroyWindow (window);
SDL_Quit ();
exit (0);
}