Anzeige:
Ergebnis 1 bis 4 von 4

Thema: SDL 2.0 - Texteingabe

  1. #1
    Registrierter Benutzer
    Registriert seit
    20.03.2006
    Beiträge
    54

    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;
    "... der Großteil hier hat einfach keine Lust, jede Pore einer Brotscheibe mit Butter auszuschmieren." - Susu

  2. #2
    Registrierter Benutzer
    Registriert seit
    21.04.2012
    Beiträge
    1
    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;
            }

  3. #3
    Registrierter Benutzer
    Registriert seit
    20.03.2006
    Beiträge
    54
    Danke!
    Werde ich mal probieren.
    "... der Großteil hier hat einfach keine Lust, jede Pore einer Brotscheibe mit Butter auszuschmieren." - Susu

  4. #4
    Registrierter Benutzer
    Registriert seit
    20.03.2006
    Beiträge
    54
    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);
    }
    "... der Großteil hier hat einfach keine Lust, jede Pore einer Brotscheibe mit Butter auszuschmieren." - Susu

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •