On-screen keyboard (visible when the feature is enabled, while using the "Text" and "Label" tools) now appears with larger (48x48 pixel, vs 24x24 pixel) buttons, when Tux Paint's window (or fullscreen) size is large enough to fit them with the chosen layout. (h/t Anat & Aviv, who suggested it to help with users of eye-tracking systems) Also, on-screen keyboard buttons use a slightly larger font (16pt vs 12pt, previously seen on the small keyboard; 32pt on the large keyboard).
182 lines
6.8 KiB
C
182 lines
6.8 KiB
C
#include "wchar.h"
|
|
#include "stdio.h"
|
|
#include "SDL.h"
|
|
#include "SDL_ttf.h"
|
|
/* after file:///usr/share/doc/libsdl1.2-dev/docs/html/sdlkey.html
|
|
|
|
Table 8-2. SDL modifier definitions
|
|
|
|
SDL Modifier Meaning
|
|
KMOD_NONE No modifiers applicable
|
|
KMOD_NUM Numlock is down
|
|
KMOD_CAPS Capslock is down
|
|
KMOD_LCTRL Left Control is down
|
|
KMOD_RCTRL Right Control is down
|
|
KMOD_RSHIFT Right Shift is down
|
|
KMOD_LSHIFT Left Shift is down
|
|
KMOD_RALT Right Alt is down
|
|
KMOD_LALT Left Alt is down
|
|
KMOD_CTRL A Control key is down
|
|
KMOD_SHIFT A Shift key is down
|
|
KMOD_ALT An Alt key is down
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct osk_keymap
|
|
{
|
|
int keycode;
|
|
int disable_caps; /* If caps lock should affect this key */
|
|
char *plain; /* The default Xkeysym for the keycode */
|
|
char *caps; /* If CapsLock or Shift + key */
|
|
char *altgr; /* If AltGr + key */
|
|
char *shiftaltgr; /* If AltGr + Shift + key */
|
|
} osk_keymap;
|
|
|
|
typedef struct osk_key
|
|
{
|
|
int keycode; /* The code associated to this key. If 0, then it is an empty key. */
|
|
int row;
|
|
int x;
|
|
int y;
|
|
float width; /* The width in buttons */
|
|
char *plain_label; /* The text that will show the key */
|
|
char *top_label; /* The text that will show the key above the plain label. */
|
|
char *altgr_label; /* The text that will show the key at the right of the plain label */
|
|
char *shift_altgr_label; /* The text that will show the key when shift and altgr are activated */
|
|
int shiftcaps; /* If the value of the key should be shifted when capslock is active */
|
|
int stick; /* If the key currently affects the others */
|
|
} osk_key;
|
|
|
|
typedef struct osk_composenode
|
|
{
|
|
wchar_t *keysym;
|
|
wchar_t *result;
|
|
int size; /* How many childs are there. */
|
|
struct osk_composenode **childs;
|
|
// struct osk_composenode **parent;
|
|
} osk_composenode;
|
|
|
|
typedef struct keysymdefs
|
|
{
|
|
char *mnemo;
|
|
int keysym;
|
|
int unicode;
|
|
} keysymdefs;
|
|
|
|
typedef struct osk_layout
|
|
{
|
|
char *name;
|
|
int *rows;
|
|
int width;
|
|
int height;
|
|
char *fontpath;
|
|
osk_key **keys;
|
|
osk_keymap *keymap;
|
|
osk_composenode *composemap;
|
|
keysymdefs *keysymdefs;
|
|
unsigned int sizeofkeysymdefs;
|
|
SDL_Color bgcolor;
|
|
SDL_Color fgcolor;
|
|
} osk_layout;
|
|
|
|
typedef struct osk_keymodifiers
|
|
{
|
|
osk_key shift;
|
|
osk_key altgr;
|
|
osk_key compose;
|
|
osk_key dead;
|
|
} osk_keymodifiers;
|
|
|
|
typedef struct osk_kmdf
|
|
{
|
|
osk_key *shift;
|
|
osk_key *altgr;
|
|
osk_key *compose;
|
|
osk_key *dead;
|
|
osk_key *dead2;
|
|
osk_key *dead3;
|
|
osk_key *dead4;
|
|
} osk_kmdf;
|
|
|
|
typedef struct osk_keyboard
|
|
{
|
|
char *name; /* The name of the keyboard */
|
|
char *keyboard_list; /* The names of the keyboards allowed from this one */
|
|
SDL_Surface *surface; /* The surface containing the current layout's keyboard */
|
|
/* The surfaces containing the current layout's button backgrounds*/
|
|
SDL_Surface *button_up;
|
|
SDL_Surface *button_down;
|
|
SDL_Surface *button_off;
|
|
SDL_Surface *button_nav;
|
|
SDL_Surface *button_hold;
|
|
/* The surfaces containing some symbols for the current layout's buttons */
|
|
SDL_Surface *oskdel; /* delete arrow */
|
|
SDL_Surface *osktab; /* Tab arrows */
|
|
SDL_Surface *oskenter; /* Return hook/arrow */
|
|
SDL_Surface *oskcapslock; /* CapsLock */
|
|
SDL_Surface *oskshift; /* Shift */
|
|
int changed; /* If the surface has been modified (painted) */
|
|
SDL_Rect rect; /* The rectangle that has changed */
|
|
int recreated; /* If the surface has been deleted and newly created */
|
|
int modifiers; /* The state of Alt, CTRL, Shift, CapsLock, AltGr keys */
|
|
osk_keymodifiers keymodifiers; /* A shortcurt to find the place of the pressed modifiers */
|
|
osk_kmdf kmdf;
|
|
osk_layout *layout; /* The layout struct */
|
|
char *layout_name[256]; /* The layout name */
|
|
TTF_Font *osk_fonty; /* Font */
|
|
int disable_change; /* If true, stay with the first layout found */
|
|
wchar_t *key[256]; /* The text of the key */
|
|
int keycode; /* The unicode code corresponding to the key */
|
|
wchar_t *composed; /* The unicode char found after a sequence of key presses */
|
|
int composed_type; /* 1 if the value stored in composed is yet the unicode value */
|
|
osk_composenode *composing; /* The node in the middle of a compose sequence */
|
|
osk_key *last_key_pressed; /* The last key pressed */
|
|
SDL_Surface * canvas_ptr; /* Canvas drawing surface, for bpp and sizing needs when cycling through keyboard layouts */
|
|
/* Large and small buttons, to pass back to osk_create() when cycling through keyboard layouts */
|
|
SDL_Surface *LG_button_up;
|
|
SDL_Surface *LG_button_down;
|
|
SDL_Surface *LG_button_off;
|
|
SDL_Surface *LG_button_nav;
|
|
SDL_Surface *LG_button_hold;
|
|
SDL_Surface *LG_oskdel;
|
|
SDL_Surface *LG_osktab;
|
|
SDL_Surface *LG_oskenter;
|
|
SDL_Surface *LG_oskcapslock;
|
|
SDL_Surface *LG_oskshift;
|
|
SDL_Surface *SM_button_up;
|
|
SDL_Surface *SM_button_down;
|
|
SDL_Surface *SM_button_off;
|
|
SDL_Surface *SM_button_nav;
|
|
SDL_Surface *SM_button_hold;
|
|
SDL_Surface *SM_oskdel;
|
|
SDL_Surface *SM_osktab;
|
|
SDL_Surface *SM_oskenter;
|
|
SDL_Surface *SM_oskcapslock;
|
|
SDL_Surface *SM_oskshift;
|
|
} on_screen_keyboard;
|
|
|
|
struct osk_keyboard *osk_create(char * layout_name, SDL_Surface * canvas,
|
|
SDL_Surface * LG_button_up, SDL_Surface * LG_button_down,
|
|
SDL_Surface * LG_button_off, SDL_Surface * LG_button_nav,
|
|
SDL_Surface * LG_button_hold,
|
|
SDL_Surface * LG_oskdel, SDL_Surface * LG_osktab, SDL_Surface * LG_oskenter,
|
|
SDL_Surface * LG_oskcapslock, SDL_Surface * LG_oskshift,
|
|
SDL_Surface * SM_button_up, SDL_Surface * SM_button_down,
|
|
SDL_Surface * SM_button_off, SDL_Surface * SM_button_nav,
|
|
SDL_Surface * SM_button_hold,
|
|
SDL_Surface * SM_oskdel, SDL_Surface * SM_osktab, SDL_Surface * SM_oskenter,
|
|
SDL_Surface * SM_oskcapslock, SDL_Surface * SM_oskshift,
|
|
int disable_change);
|
|
|
|
struct osk_layout *osk_load_layout(char *layout_name);
|
|
|
|
void osk_get_layout_data(char *layout_name, int *layout_w, int *layout_h, char *layout_buttons, char *layout_labels,
|
|
char *layout_keycodes);
|
|
void osk_reset(on_screen_keyboard * osk);
|
|
struct osk_keyboard *osk_clicked(on_screen_keyboard * keyboard, int x, int y);
|
|
void osk_released(on_screen_keyboard * osk);
|
|
void osk_hover(on_screen_keyboard * keyboard, int x, int y);
|
|
void osk_free(on_screen_keyboard * osk);
|
|
void osk_change_layout(on_screen_keyboard * osk);
|