SDL  2.0
SDL_keyboard_c.h File Reference
#include "../SDL_internal.h"
#include "SDL_keycode.h"
#include "SDL_events.h"
+ Include dependency graph for SDL_keyboard_c.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int SDL_KeyboardInit (void)
 
void SDL_ResetKeyboard (void)
 
void SDL_GetDefaultKeymap (SDL_Keycode *keymap)
 
void SDL_SetKeymap (int start, SDL_Keycode *keys, int length)
 
void SDL_SetScancodeName (SDL_Scancode scancode, const char *name)
 
void SDL_SetKeyboardFocus (SDL_Window *window)
 
int SDL_SendKeyboardKey (Uint8 state, SDL_Scancode scancode)
 
int SDL_SendKeyboardText (const char *text)
 
int SDL_SendEditingText (const char *text, int start, int end)
 
void SDL_KeyboardQuit (void)
 
char * SDL_UCS4ToUTF8 (Uint32 ch, char *dst)
 
void SDL_ToggleModState (const SDL_Keymod modstate, const SDL_bool toggle)
 

Function Documentation

void SDL_GetDefaultKeymap ( SDL_Keycode keymap)

Definition at line 580 of file SDL_keyboard.c.

References SDL_default_keymap, and SDL_memcpy.

581 {
583 }
#define SDL_memcpy
static const SDL_Keycode SDL_default_keymap[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:49
int SDL_KeyboardInit ( void  )

Definition at line 554 of file SDL_keyboard.c.

References SDL_Keyboard::keymap, SDL_default_keymap, SDL_keyboard, and SDL_memcpy.

Referenced by SDL_VideoInit().

555 {
556  SDL_Keyboard *keyboard = &SDL_keyboard;
557 
558  /* Set the default keymap */
560  return (0);
561 }
SDL_Keycode keymap[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:44
#define SDL_memcpy
static const SDL_Keycode SDL_default_keymap[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:49
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
void SDL_KeyboardQuit ( void  )

Definition at line 817 of file SDL_keyboard.c.

Referenced by SDL_VideoQuit().

818 {
819 }
void SDL_ResetKeyboard ( void  )

Definition at line 564 of file SDL_keyboard.c.

References SDL_Keyboard::keystate, SDL_keyboard, SDL_NUM_SCANCODES, SDL_PRESSED, SDL_RELEASED, and SDL_SendKeyboardKey().

Referenced by SDL_SetKeyboardFocus(), and SDL_ShowMessageBox().

565 {
566  SDL_Keyboard *keyboard = &SDL_keyboard;
567  SDL_Scancode scancode;
568 
569 #ifdef DEBUG_KEYBOARD
570  printf("Resetting keyboard\n");
571 #endif
572  for (scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) {
573  if (keyboard->keystate[scancode] == SDL_PRESSED) {
575  }
576  }
577 }
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
Definition: SDL_keyboard.c:661
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
#define SDL_PRESSED
Definition: SDL_events.h:50
Uint8 keystate[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:43
#define SDL_RELEASED
Definition: SDL_events.h:49
SDL_Scancode
The SDL keyboard scancode representation.
Definition: SDL_scancode.h:43
int SDL_SendEditingText ( const char *  text,
int  start,
int  end 
)

Definition at line 797 of file SDL_keyboard.c.

References SDL_Event::edit, SDL_Keyboard::focus, SDL_Window::id, SDL_arraysize, SDL_ENABLE, SDL_GetEventState, SDL_keyboard, SDL_PushEvent, SDL_TEXTEDITING, SDL_utf8strlcpy, and SDL_TextEditingEvent::text.

798 {
799  SDL_Keyboard *keyboard = &SDL_keyboard;
800  int posted;
801 
802  /* Post the event, if desired */
803  posted = 0;
806  event.edit.type = SDL_TEXTEDITING;
807  event.edit.windowID = keyboard->focus ? keyboard->focus->id : 0;
808  event.edit.start = start;
809  event.edit.length = length;
811  posted = (SDL_PushEvent(&event) > 0);
812  }
813  return (posted);
814 }
#define SDL_utf8strlcpy
#define SDL_ENABLE
Definition: SDL_events.h:718
GLuint start
Definition: SDL_opengl.h:1564
#define SDL_GetEventState(type)
Definition: SDL_events.h:731
struct _cl_event * event
#define SDL_PushEvent
char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]
Definition: SDL_events.h:208
SDL_TextEditingEvent edit
Definition: SDL_events.h:527
static char text[MAX_TEXT_LENGTH]
Definition: testime.c:34
SDL_Window * focus
Definition: SDL_keyboard.c:41
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
Uint32 id
Definition: SDL_sysvideo.h:74
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
General event structure.
Definition: SDL_events.h:521
GLuint GLsizei GLsizei * length
int SDL_SendKeyboardKey ( Uint8  state,
SDL_Scancode  scancode 
)

Definition at line 661 of file SDL_keyboard.c.

References SDL_Keyboard::focus, SDL_Window::id, SDL_Keyboard::keymap, SDL_Keyboard::keystate, KMOD_CAPS, KMOD_LALT, KMOD_LCTRL, KMOD_LGUI, KMOD_LSHIFT, KMOD_MODE, KMOD_NONE, KMOD_NUM, KMOD_RALT, KMOD_RCTRL, KMOD_RGUI, KMOD_RSHIFT, SDL_Keyboard::modstate, SDL_ENABLE, SDL_GetEventState, SDL_GetScancodeName(), SDL_keyboard, SDL_KEYDOWN, SDL_KEYUP, SDL_PRESSED, SDL_PushEvent, SDL_RELEASED, SDLK_CAPSLOCK, SDLK_LALT, SDLK_LCTRL, SDLK_LGUI, SDLK_LSHIFT, SDLK_MODE, SDLK_NUMLOCKCLEAR, SDLK_RALT, SDLK_RCTRL, SDLK_RGUI, SDLK_RSHIFT, and state.

Referenced by SDL_BApp::_HandleKey(), SDL_ResetKeyboard(), and WINRT_OnBackButtonPressed().

662 {
663  SDL_Keyboard *keyboard = &SDL_keyboard;
664  int posted;
665  SDL_Keymod modifier;
666  SDL_Keycode keycode;
667  Uint16 modstate;
668  Uint32 type;
669  Uint8 repeat;
670 
671  if (!scancode) {
672  return 0;
673  }
674 #ifdef DEBUG_KEYBOARD
675  printf("The '%s' key has been %s\n", SDL_GetScancodeName(scancode),
676  state == SDL_PRESSED ? "pressed" : "released");
677 #endif
678 
679  /* Figure out what type of event this is */
680  switch (state) {
681  case SDL_PRESSED:
682  type = SDL_KEYDOWN;
683  break;
684  case SDL_RELEASED:
685  type = SDL_KEYUP;
686  break;
687  default:
688  /* Invalid state -- bail */
689  return 0;
690  }
691 
692  /* Drop events that don't change state */
693  repeat = (state && keyboard->keystate[scancode]);
694  if (keyboard->keystate[scancode] == state && !repeat) {
695 #if 0
696  printf("Keyboard event didn't change state - dropped!\n");
697 #endif
698  return 0;
699  }
700 
701  /* Update internal keyboard state */
702  keyboard->keystate[scancode] = state;
703 
704  keycode = keyboard->keymap[scancode];
705 
706  /* Update modifiers state if applicable */
707  switch (keycode) {
708  case SDLK_LCTRL:
709  modifier = KMOD_LCTRL;
710  break;
711  case SDLK_RCTRL:
712  modifier = KMOD_RCTRL;
713  break;
714  case SDLK_LSHIFT:
715  modifier = KMOD_LSHIFT;
716  break;
717  case SDLK_RSHIFT:
718  modifier = KMOD_RSHIFT;
719  break;
720  case SDLK_LALT:
721  modifier = KMOD_LALT;
722  break;
723  case SDLK_RALT:
724  modifier = KMOD_RALT;
725  break;
726  case SDLK_LGUI:
727  modifier = KMOD_LGUI;
728  break;
729  case SDLK_RGUI:
730  modifier = KMOD_RGUI;
731  break;
732  case SDLK_MODE:
733  modifier = KMOD_MODE;
734  break;
735  default:
736  modifier = KMOD_NONE;
737  break;
738  }
739  if (SDL_KEYDOWN == type) {
740  modstate = keyboard->modstate;
741  switch (keycode) {
742  case SDLK_NUMLOCKCLEAR:
743  keyboard->modstate ^= KMOD_NUM;
744  break;
745  case SDLK_CAPSLOCK:
746  keyboard->modstate ^= KMOD_CAPS;
747  break;
748  default:
749  keyboard->modstate |= modifier;
750  break;
751  }
752  } else {
753  keyboard->modstate &= ~modifier;
754  modstate = keyboard->modstate;
755  }
756 
757  /* Post the event, if desired */
758  posted = 0;
759  if (SDL_GetEventState(type) == SDL_ENABLE) {
761  event.key.type = type;
762  event.key.state = state;
763  event.key.repeat = repeat;
764  event.key.keysym.scancode = scancode;
765  event.key.keysym.sym = keycode;
766  event.key.keysym.mod = modstate;
767  event.key.windowID = keyboard->focus ? keyboard->focus->id : 0;
768  posted = (SDL_PushEvent(&event) > 0);
769  }
770  return (posted);
771 }
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:155
struct xkb_state * state
#define SDL_ENABLE
Definition: SDL_events.h:718
SDL_Keycode keymap[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:44
Sint32 SDL_Keycode
The SDL virtual key representation.
Definition: SDL_keycode.h:42
Uint16 modstate
Definition: SDL_keyboard.c:42
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1564
#define SDL_GetEventState(type)
Definition: SDL_events.h:731
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
struct _cl_event * event
#define SDL_PushEvent
const char * SDL_GetScancodeName(SDL_Scancode scancode)
Get a human-readable name for a scancode.
Definition: SDL_keyboard.c:890
SDL_Keymod
Enumeration of valid key mods (possibly OR&#39;d together).
Definition: SDL_keycode.h:317
SDL_Window * focus
Definition: SDL_keyboard.c:41
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
Uint32 id
Definition: SDL_sysvideo.h:74
uint16_t Uint16
An unsigned 16-bit integer type.
Definition: SDL_stdinc.h:147
General event structure.
Definition: SDL_events.h:521
#define SDL_PRESSED
Definition: SDL_events.h:50
Uint8 keystate[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:43
#define SDL_RELEASED
Definition: SDL_events.h:49
int SDL_SendKeyboardText ( const char *  text)

Definition at line 774 of file SDL_keyboard.c.

References SDL_Keyboard::focus, SDL_Window::id, SDL_arraysize, SDL_ENABLE, SDL_GetEventState, SDL_keyboard, SDL_PushEvent, SDL_TEXTINPUT, SDL_utf8strlcpy, SDL_TextInputEvent::text, and SDL_Event::text.

775 {
776  SDL_Keyboard *keyboard = &SDL_keyboard;
777  int posted;
778 
779  /* Don't post text events for unprintable characters */
780  if ((unsigned char)*text < ' ' || *text == 127) {
781  return 0;
782  }
783 
784  /* Post the event, if desired */
785  posted = 0;
788  event.text.type = SDL_TEXTINPUT;
789  event.text.windowID = keyboard->focus ? keyboard->focus->id : 0;
791  posted = (SDL_PushEvent(&event) > 0);
792  }
793  return (posted);
794 }
#define SDL_utf8strlcpy
#define SDL_ENABLE
Definition: SDL_events.h:718
SDL_TextInputEvent text
Definition: SDL_events.h:528
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]
Definition: SDL_events.h:223
#define SDL_GetEventState(type)
Definition: SDL_events.h:731
struct _cl_event * event
#define SDL_PushEvent
static char text[MAX_TEXT_LENGTH]
Definition: testime.c:34
SDL_Window * focus
Definition: SDL_keyboard.c:41
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
Uint32 id
Definition: SDL_sysvideo.h:74
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
General event structure.
Definition: SDL_events.h:521
void SDL_SetKeyboardFocus ( SDL_Window window)

Definition at line 612 of file SDL_keyboard.c.

References SDL_Window::flags, SDL_Keyboard::focus, SDL_assert, SDL_CaptureMouse, SDL_EventState, SDL_FALSE, SDL_GetVideoDevice(), SDL_keyboard, SDL_QUERY, SDL_ResetKeyboard(), SDL_SendWindowEvent(), SDL_TEXTINPUT, SDL_WINDOW_MOUSE_CAPTURE, SDL_WINDOWEVENT_FOCUS_GAINED, SDL_WINDOWEVENT_FOCUS_LOST, SDL_VideoDevice::StartTextInput, SDL_VideoDevice::StopTextInput, and window.

Referenced by SDL_BApp::_HandleKeyboardFocus(), IsSDLWindowEventPending(), and SDL_DestroyWindow().

613 {
614  SDL_Keyboard *keyboard = &SDL_keyboard;
615 
616  if (keyboard->focus && !window) {
617  /* We won't get anymore keyboard messages, so reset keyboard state */
619  }
620 
621  /* See if the current window has lost focus */
622  if (keyboard->focus && keyboard->focus != window) {
623 
624  /* new window shouldn't think it has mouse captured. */
625  SDL_assert(!window || !(window->flags & SDL_WINDOW_MOUSE_CAPTURE));
626 
627  /* old window must lose an existing mouse capture. */
628  if (keyboard->focus->flags & SDL_WINDOW_MOUSE_CAPTURE) {
629  SDL_CaptureMouse(SDL_FALSE); /* drop the capture. */
631  }
632 
634  0, 0);
635 
636  /* Ensures IME compositions are committed */
639  if (video && video->StopTextInput) {
640  video->StopTextInput(video);
641  }
642  }
643  }
644 
645  keyboard->focus = window;
646 
647  if (keyboard->focus) {
649  0, 0);
650 
653  if (video && video->StartTextInput) {
654  video->StartTextInput(video);
655  }
656  }
657  }
658 }
SDL_Window * window
void(* StartTextInput)(_THIS)
Definition: SDL_sysvideo.h:255
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
void(* StopTextInput)(_THIS)
Definition: SDL_sysvideo.h:256
#define SDL_assert(condition)
Definition: SDL_assert.h:167
SDL_Window * focus
Definition: SDL_keyboard.c:41
#define SDL_EventState
void SDL_ResetKeyboard(void)
Definition: SDL_keyboard.c:564
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
#define SDL_CaptureMouse
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:573
#define SDL_QUERY
Definition: SDL_events.h:715
Uint32 flags
Definition: SDL_sysvideo.h:81
void SDL_SetKeymap ( int  start,
SDL_Keycode keys,
int  length 
)

Definition at line 586 of file SDL_keyboard.c.

References SDL_Keyboard::keymap, SDL_keyboard, SDL_memcpy, and SDL_NUM_SCANCODES.

587 {
588  SDL_Keyboard *keyboard = &SDL_keyboard;
589 
591  return;
592  }
593 
594  SDL_memcpy(&keyboard->keymap[start], keys, sizeof(*keys) * length);
595 }
GLuint start
Definition: SDL_opengl.h:1564
SDL_Keycode keymap[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:44
#define SDL_memcpy
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
GLuint GLsizei GLsizei * length
void SDL_SetScancodeName ( SDL_Scancode  scancode,
const char *  name 
)

Definition at line 598 of file SDL_keyboard.c.

References SDL_scancode_names.

599 {
600  SDL_scancode_names[scancode] = name;
601 }
GLuint const GLchar * name
static const char * SDL_scancode_names[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:278
void SDL_ToggleModState ( const SDL_Keymod  modstate,
const SDL_bool  toggle 
)

Definition at line 850 of file SDL_keyboard.c.

References SDL_Keyboard::modstate, and SDL_keyboard.

851 {
852  SDL_Keyboard *keyboard = &SDL_keyboard;
853  if (toggle) {
854  keyboard->modstate |= modstate;
855  } else {
856  keyboard->modstate &= ~modstate;
857  }
858 }
Uint16 modstate
Definition: SDL_keyboard.c:42
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
char* SDL_UCS4ToUTF8 ( Uint32  ch,
char *  dst 
)

Definition at line 512 of file SDL_keyboard.c.

Referenced by SDL_GetKeyName().

513 {
514  Uint8 *p = (Uint8 *) dst;
515  if (ch <= 0x7F) {
516  *p = (Uint8) ch;
517  ++dst;
518  } else if (ch <= 0x7FF) {
519  p[0] = 0xC0 | (Uint8) ((ch >> 6) & 0x1F);
520  p[1] = 0x80 | (Uint8) (ch & 0x3F);
521  dst += 2;
522  } else if (ch <= 0xFFFF) {
523  p[0] = 0xE0 | (Uint8) ((ch >> 12) & 0x0F);
524  p[1] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
525  p[2] = 0x80 | (Uint8) (ch & 0x3F);
526  dst += 3;
527  } else if (ch <= 0x1FFFFF) {
528  p[0] = 0xF0 | (Uint8) ((ch >> 18) & 0x07);
529  p[1] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);
530  p[2] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
531  p[3] = 0x80 | (Uint8) (ch & 0x3F);
532  dst += 4;
533  } else if (ch <= 0x3FFFFFF) {
534  p[0] = 0xF8 | (Uint8) ((ch >> 24) & 0x03);
535  p[1] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);
536  p[2] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);
537  p[3] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
538  p[4] = 0x80 | (Uint8) (ch & 0x3F);
539  dst += 5;
540  } else {
541  p[0] = 0xFC | (Uint8) ((ch >> 30) & 0x01);
542  p[1] = 0x80 | (Uint8) ((ch >> 24) & 0x3F);
543  p[2] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);
544  p[3] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);
545  p[4] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
546  p[5] = 0x80 | (Uint8) (ch & 0x3F);
547  dst += 6;
548  }
549  return dst;
550 }
GLenum GLenum dst
GLfloat GLfloat p
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139