test/checkkeys.c
author Alex Baines <alex@abaines.me.uk>
Tue, 19 Aug 2014 23:31:50 +0100
changeset 9097 56d712662a82
parent 8149 681eb46b8ac4
child 9278 8900afb78a19
permissions -rw-r--r--
Add a SDL_IM_INTERNAL_EDITING event to make IMs like iBus render editing text in its own UI instead of sending TEXTEDITING events.
This is useful for applications that handle TEXTINPUT events but not TEXTEDITING events.
slouken@5535
     1
/*
slouken@8149
     2
  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
slouken@5535
     3
slouken@5535
     4
  This software is provided 'as-is', without any express or implied
slouken@5535
     5
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     6
  arising from the use of this software.
slouken@5535
     7
slouken@5535
     8
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
     9
  including commercial applications, and to alter it and redistribute it
slouken@5535
    10
  freely.
slouken@5535
    11
*/
slouken@0
    12
slouken@0
    13
/* Simple program:  Loop, watching keystrokes
slouken@7191
    14
   Note that you need to call SDL_PollEvent() or SDL_WaitEvent() to
slouken@0
    15
   pump the event loop and catch keystrokes.
slouken@0
    16
*/
slouken@0
    17
slouken@0
    18
#include <stdio.h>
slouken@0
    19
#include <stdlib.h>
slouken@0
    20
#include <string.h>
slouken@0
    21
slouken@0
    22
#include "SDL.h"
slouken@0
    23
icculus@1151
    24
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
slouken@1895
    25
static void
slouken@1895
    26
quit(int rc)
icculus@1151
    27
{
slouken@1895
    28
    SDL_Quit();
slouken@1895
    29
    exit(rc);
icculus@1151
    30
}
icculus@1151
    31
slouken@1895
    32
static void
slouken@5461
    33
print_string(char **text, size_t *maxlen, const char *fmt, ...)
slouken@5461
    34
{
slouken@5461
    35
    int len;
slouken@5461
    36
    va_list ap;
slouken@5461
    37
slouken@5461
    38
    va_start(ap, fmt);
slouken@5461
    39
    len = SDL_vsnprintf(*text, *maxlen, fmt, ap);
slouken@5461
    40
    if (len > 0) {
slouken@5461
    41
        *text += len;
icculus@5879
    42
        if ( ((size_t) len) < *maxlen ) {
icculus@5879
    43
            *maxlen -= (size_t) len;
slouken@5461
    44
        } else {
slouken@5461
    45
            *maxlen = 0;
slouken@5461
    46
        }
slouken@5461
    47
    }
slouken@5461
    48
    va_end(ap);
slouken@5461
    49
}
slouken@5461
    50
slouken@5461
    51
static void
slouken@5461
    52
print_modifiers(char **text, size_t *maxlen)
slouken@0
    53
{
slouken@1895
    54
    int mod;
slouken@5461
    55
    print_string(text, maxlen, " modifiers:");
slouken@1895
    56
    mod = SDL_GetModState();
slouken@1895
    57
    if (!mod) {
slouken@5461
    58
        print_string(text, maxlen, " (none)");
slouken@1895
    59
        return;
slouken@1895
    60
    }
slouken@1895
    61
    if (mod & KMOD_LSHIFT)
slouken@5461
    62
        print_string(text, maxlen, " LSHIFT");
slouken@1895
    63
    if (mod & KMOD_RSHIFT)
slouken@5461
    64
        print_string(text, maxlen, " RSHIFT");
slouken@1895
    65
    if (mod & KMOD_LCTRL)
slouken@5461
    66
        print_string(text, maxlen, " LCTRL");
slouken@1895
    67
    if (mod & KMOD_RCTRL)
slouken@5461
    68
        print_string(text, maxlen, " RCTRL");
slouken@1895
    69
    if (mod & KMOD_LALT)
slouken@5461
    70
        print_string(text, maxlen, " LALT");
slouken@1895
    71
    if (mod & KMOD_RALT)
slouken@5461
    72
        print_string(text, maxlen, " RALT");
slouken@2303
    73
    if (mod & KMOD_LGUI)
slouken@5461
    74
        print_string(text, maxlen, " LGUI");
slouken@2303
    75
    if (mod & KMOD_RGUI)
slouken@5461
    76
        print_string(text, maxlen, " RGUI");
slouken@1895
    77
    if (mod & KMOD_NUM)
slouken@5461
    78
        print_string(text, maxlen, " NUM");
slouken@1895
    79
    if (mod & KMOD_CAPS)
slouken@5461
    80
        print_string(text, maxlen, " CAPS");
slouken@1895
    81
    if (mod & KMOD_MODE)
slouken@5461
    82
        print_string(text, maxlen, " MODE");
slouken@0
    83
}
slouken@0
    84
slouken@1895
    85
static void
slouken@5218
    86
PrintKey(SDL_Keysym * sym, SDL_bool pressed, SDL_bool repeat)
slouken@0
    87
{
slouken@5461
    88
    char message[512];
slouken@5461
    89
    char *spot;
slouken@5461
    90
    size_t left;
slouken@5461
    91
slouken@5461
    92
    spot = message;
slouken@5461
    93
    left = sizeof(message);
slouken@5461
    94
slouken@1895
    95
    /* Print the keycode, name and state */
slouken@1895
    96
    if (sym->sym) {
slouken@5461
    97
        print_string(&spot, &left,
slouken@5461
    98
                "Key %s:  scancode %d = %s, keycode 0x%08X = %s ",
slouken@5461
    99
                pressed ? "pressed " : "released",
slouken@5461
   100
                sym->scancode,
slouken@5461
   101
                SDL_GetScancodeName(sym->scancode),
slouken@5461
   102
                sym->sym, SDL_GetKeyName(sym->sym));
slouken@1895
   103
    } else {
slouken@5461
   104
        print_string(&spot, &left,
slouken@5461
   105
                "Unknown Key (scancode %d = %s) %s ",
slouken@5461
   106
                sym->scancode,
slouken@5461
   107
                SDL_GetScancodeName(sym->scancode),
jorgen@6922
   108
                pressed ? "pressed " : "released");
slouken@1895
   109
    }
slouken@5461
   110
    print_modifiers(&spot, &left);
slouken@4560
   111
    if (repeat) {
slouken@5461
   112
        print_string(&spot, &left, " (repeat)");
slouken@4560
   113
    }
jorgen@6922
   114
    SDL_Log("%s\n", message);
slouken@0
   115
}
slouken@0
   116
bob@2300
   117
static void
bob@2300
   118
PrintText(char *text)
bob@2300
   119
{
aschiffler@7639
   120
    char *spot, expanded[1024];
slouken@7317
   121
slouken@7317
   122
    expanded[0] = '\0';
slouken@7317
   123
    for ( spot = text; *spot; ++spot )
slouken@7317
   124
    {
slouken@7317
   125
        size_t length = SDL_strlen(expanded);
aschiffler@7639
   126
        SDL_snprintf(expanded + length, sizeof(expanded) - length, "\\x%.2x", (unsigned char)*spot);
slouken@7317
   127
    }
slouken@7317
   128
    SDL_Log("Text (%s): \"%s%s\"\n", expanded, *text == '"' ? "\\" : "", text);
bob@2300
   129
}
bob@2300
   130
slouken@1895
   131
int
slouken@1895
   132
main(int argc, char *argv[])
slouken@0
   133
{
slouken@5461
   134
    SDL_Window *window;
slouken@1895
   135
    SDL_Event event;
slouken@1895
   136
    int done;
aschiffler@7639
   137
	
aschiffler@7639
   138
	/* Enable standard application logging */
aschiffler@7639
   139
	SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
slouken@0
   140
slouken@1895
   141
    /* Initialize SDL */
slouken@1895
   142
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
aschiffler@7639
   143
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
slouken@1895
   144
        return (1);
slouken@1895
   145
    }
slouken@0
   146
slouken@1895
   147
    /* Set 640x480 video mode */
slouken@5461
   148
    window = SDL_CreateWindow("CheckKeys Test",
slouken@5461
   149
                              SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
slouken@5461
   150
                              640, 480, 0);
slouken@5461
   151
    if (!window) {
aschiffler@7639
   152
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create 640x480 window: %s\n",
slouken@1895
   153
                SDL_GetError());
slouken@1895
   154
        quit(2);
slouken@1895
   155
    }
slouken@0
   156
slouken@5461
   157
#if __IPHONEOS__
slouken@5461
   158
    /* Creating the context creates the view, which we need to show keyboard */
slouken@5461
   159
    SDL_GL_CreateContext(window);
slouken@5461
   160
#endif
slouken@6392
   161
slouken@6654
   162
    SDL_StartTextInput();
slouken@5461
   163
slouken@1895
   164
    /* Watch keystrokes */
slouken@1895
   165
    done = 0;
slouken@1895
   166
    while (!done) {
slouken@1895
   167
        /* Check for events */
slouken@1895
   168
        SDL_WaitEvent(&event);
slouken@1895
   169
        switch (event.type) {
slouken@1895
   170
        case SDL_KEYDOWN:
slouken@1895
   171
        case SDL_KEYUP:
aschiffler@7639
   172
			PrintKey(&event.key.keysym, (event.key.state == SDL_PRESSED) ? SDL_TRUE : SDL_FALSE, (event.key.repeat) ? SDL_TRUE : SDL_FALSE);
slouken@1895
   173
            break;
bob@2300
   174
        case SDL_TEXTINPUT:
bob@2300
   175
            PrintText(event.text.text);
bob@2300
   176
            break;
slouken@1895
   177
        case SDL_MOUSEBUTTONDOWN:
slouken@1895
   178
            /* Any button press quits the app... */
slouken@1895
   179
        case SDL_QUIT:
slouken@1895
   180
            done = 1;
slouken@1895
   181
            break;
slouken@1895
   182
        default:
slouken@1895
   183
            break;
slouken@1895
   184
        }
slouken@1895
   185
    }
icculus@1151
   186
slouken@1895
   187
    SDL_Quit();
slouken@1895
   188
    return (0);
slouken@0
   189
}
slouken@5461
   190
slouken@5461
   191
/* vi: set ts=4 sw=4 expandtab: */