PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SDL 2.0 - Texteingabe



jay-t
17-04-2012, 16:48
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.



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;

pce
21-04-2012, 15:26
Ich habe dazu im Konstruktor meines TextFields


SDL_EnableUNICODE( SDL_ENABLE );

und im handleInput



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;
}

jay-t
22-04-2012, 08:02
Danke!
Werde ich mal probieren.

jay-t
29-05-2012, 11:22
Ich habe es hinbekommen, da war im Web ein Tutorial bei der SDL Seite.
Ich musste nur noch etwas abändern:



/* 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);
}