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

◆ SDL_GetDefaultKeymap()

void SDL_GetDefaultKeymap ( SDL_Keycode keymap)

Definition at line 588 of file SDL_keyboard.c.

References SDL_default_keymap, and SDL_memcpy.

589 {
591 }
#define SDL_memcpy
static const SDL_Keycode SDL_default_keymap[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:49

◆ SDL_KeyboardInit()

int SDL_KeyboardInit ( void  )

Definition at line 562 of file SDL_keyboard.c.

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

Referenced by SDL_VideoInit().

563 {
564  SDL_Keyboard *keyboard = &SDL_keyboard;
565 
566  /* Set the default keymap */
568  return (0);
569 }
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

◆ SDL_KeyboardQuit()

void SDL_KeyboardQuit ( void  )

Definition at line 832 of file SDL_keyboard.c.

Referenced by SDL_VideoQuit().

833 {
834 }

◆ SDL_ResetKeyboard()

void SDL_ResetKeyboard ( void  )

Definition at line 572 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().

573 {
574  SDL_Keyboard *keyboard = &SDL_keyboard;
575  SDL_Scancode scancode;
576 
577 #ifdef DEBUG_KEYBOARD
578  printf("Resetting keyboard\n");
579 #endif
580  for (scancode = (SDL_Scancode) 0; scancode < SDL_NUM_SCANCODES; ++scancode) {
581  if (keyboard->keystate[scancode] == SDL_PRESSED) {
583  }
584  }
585 }
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
Definition: SDL_keyboard.c:679
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

◆ SDL_SendEditingText()

int SDL_SendEditingText ( const char *  text,
int  start,
int  end 
)

Definition at line 812 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.

813 {
814  SDL_Keyboard *keyboard = &SDL_keyboard;
815  int posted;
816 
817  /* Post the event, if desired */
818  posted = 0;
821  event.edit.type = SDL_TEXTEDITING;
822  event.edit.windowID = keyboard->focus ? keyboard->focus->id : 0;
823  event.edit.start = start;
824  event.edit.length = length;
826  posted = (SDL_PushEvent(&event) > 0);
827  }
828  return (posted);
829 }
#define SDL_utf8strlcpy
#define SDL_ENABLE
Definition: SDL_events.h:722
GLuint start
Definition: SDL_opengl.h:1571
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
struct _cl_event * event
#define SDL_PushEvent
char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]
Definition: SDL_events.h:211
SDL_TextEditingEvent edit
Definition: SDL_events.h:531
static char text[MAX_TEXT_LENGTH]
Definition: testime.c:47
SDL_Window * focus
Definition: SDL_keyboard.c:41
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
Uint32 id
Definition: SDL_sysvideo.h:76
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
General event structure.
Definition: SDL_events.h:525
GLuint GLsizei GLsizei * length

◆ SDL_SendKeyboardKey()

int SDL_SendKeyboardKey ( Uint8  state,
SDL_Scancode  scancode 
)

Definition at line 679 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(), handleKeyboardEvent(), SDL_ResetKeyboard(), and WINRT_OnBackButtonPressed().

680 {
681  SDL_Keyboard *keyboard = &SDL_keyboard;
682  int posted;
683  SDL_Keymod modifier;
684  SDL_Keycode keycode;
685  Uint32 type;
686  Uint8 repeat;
687 
688  if (!scancode) {
689  return 0;
690  }
691 #ifdef DEBUG_KEYBOARD
692  printf("The '%s' key has been %s\n", SDL_GetScancodeName(scancode),
693  state == SDL_PRESSED ? "pressed" : "released");
694 #endif
695 
696  /* Figure out what type of event this is */
697  switch (state) {
698  case SDL_PRESSED:
699  type = SDL_KEYDOWN;
700  break;
701  case SDL_RELEASED:
702  type = SDL_KEYUP;
703  break;
704  default:
705  /* Invalid state -- bail */
706  return 0;
707  }
708 
709  /* Drop events that don't change state */
710  repeat = (state && keyboard->keystate[scancode]);
711  if (keyboard->keystate[scancode] == state && !repeat) {
712 #if 0
713  printf("Keyboard event didn't change state - dropped!\n");
714 #endif
715  return 0;
716  }
717 
718  /* Update internal keyboard state */
719  keyboard->keystate[scancode] = state;
720 
721  keycode = keyboard->keymap[scancode];
722 
723  /* Update modifiers state if applicable */
724  switch (keycode) {
725  case SDLK_LCTRL:
726  modifier = KMOD_LCTRL;
727  break;
728  case SDLK_RCTRL:
729  modifier = KMOD_RCTRL;
730  break;
731  case SDLK_LSHIFT:
732  modifier = KMOD_LSHIFT;
733  break;
734  case SDLK_RSHIFT:
735  modifier = KMOD_RSHIFT;
736  break;
737  case SDLK_LALT:
738  modifier = KMOD_LALT;
739  break;
740  case SDLK_RALT:
741  modifier = KMOD_RALT;
742  break;
743  case SDLK_LGUI:
744  modifier = KMOD_LGUI;
745  break;
746  case SDLK_RGUI:
747  modifier = KMOD_RGUI;
748  break;
749  case SDLK_MODE:
750  modifier = KMOD_MODE;
751  break;
752  default:
753  modifier = KMOD_NONE;
754  break;
755  }
756  if (SDL_KEYDOWN == type) {
757  switch (keycode) {
758  case SDLK_NUMLOCKCLEAR:
759  keyboard->modstate ^= KMOD_NUM;
760  break;
761  case SDLK_CAPSLOCK:
762  keyboard->modstate ^= KMOD_CAPS;
763  break;
764  default:
765  keyboard->modstate |= modifier;
766  break;
767  }
768  } else {
769  keyboard->modstate &= ~modifier;
770  }
771 
772  /* Post the event, if desired */
773  posted = 0;
774  if (SDL_GetEventState(type) == SDL_ENABLE) {
776  event.key.type = type;
777  event.key.state = state;
778  event.key.repeat = repeat;
779  event.key.keysym.scancode = scancode;
780  event.key.keysym.sym = keycode;
781  event.key.keysym.mod = keyboard->modstate;
782  event.key.windowID = keyboard->focus ? keyboard->focus->id : 0;
783  posted = (SDL_PushEvent(&event) > 0);
784  }
785  return (posted);
786 }
struct xkb_state * state
#define SDL_ENABLE
Definition: SDL_events.h:722
SDL_Keycode keymap[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:44
uint32_t Uint32
Definition: SDL_stdinc.h:181
Sint32 SDL_Keycode
The SDL virtual key representation.
Definition: SDL_keycode.h:45
Uint16 modstate
Definition: SDL_keyboard.c:42
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
uint8_t Uint8
Definition: SDL_stdinc.h:157
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:905
SDL_Keymod
Enumeration of valid key mods (possibly OR&#39;d together).
Definition: SDL_keycode.h:325
SDL_Window * focus
Definition: SDL_keyboard.c:41
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
Uint32 id
Definition: SDL_sysvideo.h:76
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
General event structure.
Definition: SDL_events.h:525
#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_SendKeyboardText()

int SDL_SendKeyboardText ( const char *  text)

Definition at line 789 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.

Referenced by SDL_BApp::_HandleKey().

790 {
791  SDL_Keyboard *keyboard = &SDL_keyboard;
792  int posted;
793 
794  /* Don't post text events for unprintable characters */
795  if ((unsigned char)*text < ' ' || *text == 127) {
796  return 0;
797  }
798 
799  /* Post the event, if desired */
800  posted = 0;
803  event.text.type = SDL_TEXTINPUT;
804  event.text.windowID = keyboard->focus ? keyboard->focus->id : 0;
806  posted = (SDL_PushEvent(&event) > 0);
807  }
808  return (posted);
809 }
#define SDL_utf8strlcpy
#define SDL_ENABLE
Definition: SDL_events.h:722
SDL_TextInputEvent text
Definition: SDL_events.h:532
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]
Definition: SDL_events.h:226
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
struct _cl_event * event
#define SDL_PushEvent
static char text[MAX_TEXT_LENGTH]
Definition: testime.c:47
SDL_Window * focus
Definition: SDL_keyboard.c:41
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
Uint32 id
Definition: SDL_sysvideo.h:76
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
General event structure.
Definition: SDL_events.h:525

◆ SDL_SetKeyboardFocus()

void SDL_SetKeyboardFocus ( SDL_Window window)

Definition at line 630 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, and SDL_VideoDevice::StopTextInput.

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

631 {
632  SDL_Keyboard *keyboard = &SDL_keyboard;
633 
634  if (keyboard->focus && !window) {
635  /* We won't get anymore keyboard messages, so reset keyboard state */
637  }
638 
639  /* See if the current window has lost focus */
640  if (keyboard->focus && keyboard->focus != window) {
641 
642  /* new window shouldn't think it has mouse captured. */
643  SDL_assert(!window || !(window->flags & SDL_WINDOW_MOUSE_CAPTURE));
644 
645  /* old window must lose an existing mouse capture. */
646  if (keyboard->focus->flags & SDL_WINDOW_MOUSE_CAPTURE) {
647  SDL_CaptureMouse(SDL_FALSE); /* drop the capture. */
649  }
650 
652  0, 0);
653 
654  /* Ensures IME compositions are committed */
657  if (video && video->StopTextInput) {
658  video->StopTextInput(video);
659  }
660  }
661  }
662 
663  keyboard->focus = window;
664 
665  if (keyboard->focus) {
667  0, 0);
668 
671  if (video && video->StartTextInput) {
672  video->StartTextInput(video);
673  }
674  }
675  }
676 }
void(* StartTextInput)(_THIS)
Definition: SDL_sysvideo.h:286
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
void(* StopTextInput)(_THIS)
Definition: SDL_sysvideo.h:287
#define SDL_assert(condition)
Definition: SDL_assert.h:169
SDL_Window * focus
Definition: SDL_keyboard.c:41
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
#define SDL_EventState
void SDL_ResetKeyboard(void)
Definition: SDL_keyboard.c:572
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47
#define SDL_CaptureMouse
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:586
#define SDL_QUERY
Definition: SDL_events.h:719
Uint32 flags
Definition: SDL_sysvideo.h:83

◆ SDL_SetKeymap()

void SDL_SetKeymap ( int  start,
SDL_Keycode keys,
int  length 
)

Definition at line 594 of file SDL_keyboard.c.

References SDL_Keyboard::keymap, SDL_keyboard, SDL_memcpy, SDL_NUM_SCANCODES, SDL_SCANCODE_0, SDL_SCANCODE_1, SDL_SCANCODE_9, SDLK_0, and SDLK_1.

595 {
596  SDL_Keyboard *keyboard = &SDL_keyboard;
597  SDL_Scancode scancode;
598 
600  return;
601  }
602 
603  SDL_memcpy(&keyboard->keymap[start], keys, sizeof(*keys) * length);
604 
605  /* The number key scancodes always map to the number key keycodes.
606  * On AZERTY layouts these technically are symbols, but users (and games)
607  * always think of them and view them in UI as number keys.
608  */
609  keyboard->keymap[SDL_SCANCODE_0] = SDLK_0;
610  for (scancode = SDL_SCANCODE_1; scancode <= SDL_SCANCODE_9; ++scancode) {
611  keyboard->keymap[scancode] = SDLK_1 + (scancode - SDL_SCANCODE_1);
612  }
613 }
GLuint start
Definition: SDL_opengl.h:1571
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
SDL_Scancode
The SDL keyboard scancode representation.
Definition: SDL_scancode.h:43

◆ SDL_SetScancodeName()

void SDL_SetScancodeName ( SDL_Scancode  scancode,
const char *  name 
)

Definition at line 616 of file SDL_keyboard.c.

References SDL_scancode_names.

617 {
618  SDL_scancode_names[scancode] = name;
619 }
GLuint const GLchar * name
static const char * SDL_scancode_names[SDL_NUM_SCANCODES]
Definition: SDL_keyboard.c:282

◆ SDL_ToggleModState()

void SDL_ToggleModState ( const SDL_Keymod  modstate,
const SDL_bool  toggle 
)

Definition at line 865 of file SDL_keyboard.c.

References SDL_Keyboard::modstate, and SDL_keyboard.

866 {
867  SDL_Keyboard *keyboard = &SDL_keyboard;
868  if (toggle) {
869  keyboard->modstate |= modstate;
870  } else {
871  keyboard->modstate &= ~modstate;
872  }
873 }
Uint16 modstate
Definition: SDL_keyboard.c:42
static SDL_Keyboard SDL_keyboard
Definition: SDL_keyboard.c:47

◆ SDL_UCS4ToUTF8()

char* SDL_UCS4ToUTF8 ( Uint32  ch,
char *  dst 
)

Definition at line 520 of file SDL_keyboard.c.

Referenced by SDL_GetKeyName().

521 {
522  Uint8 *p = (Uint8 *) dst;
523  if (ch <= 0x7F) {
524  *p = (Uint8) ch;
525  ++dst;
526  } else if (ch <= 0x7FF) {
527  p[0] = 0xC0 | (Uint8) ((ch >> 6) & 0x1F);
528  p[1] = 0x80 | (Uint8) (ch & 0x3F);
529  dst += 2;
530  } else if (ch <= 0xFFFF) {
531  p[0] = 0xE0 | (Uint8) ((ch >> 12) & 0x0F);
532  p[1] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
533  p[2] = 0x80 | (Uint8) (ch & 0x3F);
534  dst += 3;
535  } else if (ch <= 0x1FFFFF) {
536  p[0] = 0xF0 | (Uint8) ((ch >> 18) & 0x07);
537  p[1] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);
538  p[2] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
539  p[3] = 0x80 | (Uint8) (ch & 0x3F);
540  dst += 4;
541  } else if (ch <= 0x3FFFFFF) {
542  p[0] = 0xF8 | (Uint8) ((ch >> 24) & 0x03);
543  p[1] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);
544  p[2] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);
545  p[3] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
546  p[4] = 0x80 | (Uint8) (ch & 0x3F);
547  dst += 5;
548  } else {
549  p[0] = 0xFC | (Uint8) ((ch >> 30) & 0x01);
550  p[1] = 0x80 | (Uint8) ((ch >> 24) & 0x3F);
551  p[2] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);
552  p[3] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);
553  p[4] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
554  p[5] = 0x80 | (Uint8) (ch & 0x3F);
555  dst += 6;
556  }
557  return dst;
558 }
GLenum GLenum dst
GLfloat GLfloat p
uint8_t Uint8
Definition: SDL_stdinc.h:157