-
SDL 2.0 - Texteingabe
Ich möchte in meiner einfachem GUI in Textfelder eine Texteingabe haben.
Bei SDL 2.0 geht das ja mit dem Textevent: event.key.keysym.sym hat die Taste AFAIK als Unicode gespeichert.
Wie bekomme ich jetzt da ein ASCII Zeichen raus?
Beispiel wenn jemand "A" drückt soll "a" erscheinen.
Bei SHIFT und "A" ein großes "A".
Wie kann ich das machen?
Die Backspacetaste hat ja z.B, SDLK_BACKSPACE als Definition und kann ja auch richtig abgefragt werden.
Nur normale Zeichen kommen bei meinem Code nicht richtig an.
Code:
if (! SDL_WaitEvent (&event))
{
printf ("event_gadget_string: error can't wait for event!\n");
free (string_buf);
return FALSE;
}
value_len = strlen (string->value);
switch (event.type)
{
case SDL_KEYDOWN:
key = event.key.keysym.sym;
switch (key)
{
case SDLK_BACKSPACE:
printf ("event_gadget_string: BACKSPACE\n");
if (string->insert_pos > 0)
{
strremoveleft (string_buf, string->value, string->insert_pos);
strcpy (string->value, string_buf);
string->cursor_pos--;
string->insert_pos--;
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
}
break;
case SDLK_DELETE:
printf ("event_gadget_string: DELETE\n");
strremoveright (string_buf, string->value, string->insert_pos);
strcpy (string->value, string_buf);
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
break;
break;
case SDLK_LEFT:
printf ("event_gadget_string: CURSOR LEFT\n");
if (string->cursor_pos > 0)
{
string->cursor_pos--;
string->insert_pos--;
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
}
break;
case SDLK_RIGHT:
printf ("event_gadget_string: CURSOR RIGHT\n");
if (string->cursor_pos < value_len)
{
string->cursor_pos++;
string->insert_pos++;
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
}
break;
case SDLK_RETURN:
printf ("event_gadget_string: RETURN\n");
wait = FALSE;
break;
default:
printf ("event_gadget_string: char: %s\n", SDL_GetKeyName (key));
/* UCS-4 (ASCII) */
if (value_len < string->string_len && (SDL_iconv_string ("ASCII", "UTF-8", event.text.text, SDL_strlen (event.text.text)) != 0))
{
strinsertchar (string_buf, string->value, SDL_iconv_string ("ASCII", "UTF-8", event.text.text, SDL_strlen (event.text.text)), string->insert_pos);
strcpy (string->value, string_buf);
if (string->cursor_pos < string->visible_len)
{
string->cursor_pos++;
}
string->insert_pos++;
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
}
break;
}
break;
-
Ich habe dazu im Konstruktor meines TextFields
Code:
SDL_EnableUNICODE( SDL_ENABLE );
und im handleInput
Code:
switch(ev->key.keysym.sym)
{
// ...
default:
char c;
if((ev->key.keysym.unicode & 0xff80) == 0)
c = ev->key.keysym.unicode & 0x7f;
else
c = 127;
printf("c:%c \n", c);
// ++m_editpos;
break;
}
-
Danke!
Werde ich mal probieren.
-
Ich habe es hinbekommen, da war im Web ein Tutorial bei der SDL Seite.
Ich musste nur noch etwas abändern:
Code:
/* wait for event */
SDL_EnableUNICODE (SDL_ENABLE);
SDL_StartTextInput ();
wait = TRUE;
while (wait)
{
if (! SDL_WaitEvent (&event))
{
printf ("event_gadget_string: error can't wait for event!\n");
free (string_buf);
return FALSE;
}
value_len = strlen (string->value);
switch (event.type)
{
case SDL_KEYDOWN:
key = event.key.keysym.sym;
switch (key)
{
case SDLK_BACKSPACE:
printf ("event_gadget_string: BACKSPACE\n");
if (string->insert_pos > 0)
{
strremoveleft (string_buf, string->value, string->insert_pos);
strcpy (string->value, string_buf);
string->cursor_pos--;
string->insert_pos--;
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
}
break;
case SDLK_DELETE:
printf ("event_gadget_string: DELETE\n");
strremoveright (string_buf, string->value, string->insert_pos);
strcpy (string->value, string_buf);
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
break;
break;
case SDLK_LEFT:
printf ("event_gadget_string: CURSOR LEFT\n");
if (string->cursor_pos > 0)
{
string->cursor_pos--;
string->insert_pos--;
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
}
break;
case SDLK_RIGHT:
printf ("event_gadget_string: CURSOR RIGHT\n");
if (string->cursor_pos < value_len)
{
string->cursor_pos++;
string->insert_pos++;
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
}
break;
case SDLK_RETURN:
printf ("event_gadget_string: RETURN\n");
wait = FALSE;
break;
}
break;
case SDL_TEXTINPUT:
/* update the composition text */
printf ("DEBUG: SDL_TEXTINPUT\n");
i = 0; insert_pos = string->insert_pos;
while (event.text.text[i] != '\0')
{
if (value_len < string->string_len)
{
strinsertchar (string_buf, string->value, event.text.text[i], insert_pos);
strcpy (string->value, string_buf);
i = i + 1;
insert_pos = insert_pos + 1;
value_len = value_len + 1;
string->cursor_pos++;
string->insert_pos++;
}
else
{
printf ("event_gadget_string: textinput = full\n");
wait = FALSE;
break;
}
}
if (! draw_gadget_string (client, screennum, gadget_index, GADGET_SELECTED))
{
free (string_buf);
return (FALSE);
}
break;
}
}
SDL_StopTextInput();
free (string_buf);
return (TRUE);
}