* Corrected some onscreenkeyboard.c malloc()s that didn't account for the size

of the objects being malloc'd; caused crashes with default layout!
* Wrapped some onscreenkeyboard.c printf()'s in #ifdef DEBUG
* Tweaked some formatting of onscreenkeyboard.c
This commit is contained in:
William Kendrick 2014-03-30 20:18:36 +00:00
parent 0b27bec2e8
commit ff020525ef

View file

@ -45,7 +45,6 @@ static void mtw(wchar_t * wtok, char * tok)
{ {
/* workaround using iconv to get a functionallity somewhat approximate as mbstowcs() */ /* workaround using iconv to get a functionallity somewhat approximate as mbstowcs() */
Uint16 *ui16; Uint16 *ui16;
ui16 = malloc(255);
char *wrptr = (char *) ui16; char *wrptr = (char *) ui16;
size_t n, in, out; size_t n, in, out;
iconv_t trans; iconv_t trans;
@ -54,7 +53,8 @@ static void mtw(wchar_t * wtok, char * tok)
n = 255; n = 255;
in = 250; in = 250;
out = 250; out = 250;
wch =malloc(255); wch = malloc(sizeof(wchar_t) * 255);
ui16 = malloc(sizeof(Uint16) * 255);
trans = iconv_open("WCHAR_T", "UTF-8"); trans = iconv_open("WCHAR_T", "UTF-8");
iconv(trans, (const char **) &tok, &in, &wrptr, &out); iconv(trans, (const char **) &tok, &in, &wrptr, &out);
@ -88,7 +88,9 @@ struct osk_keyboard *osk_create(char *layout_name, SDL_Surface *canvas, SDL_Surf
printf("Loaded the default layout instead.\n"); printf("Loaded the default layout instead.\n");
} }
#ifdef DEBUG
printf("w %i, h %i\n", layout->width, layout->height); printf("w %i, h %i\n", layout->width, layout->height);
#endif
surface = SDL_CreateRGBSurface(canvas->flags, surface = SDL_CreateRGBSurface(canvas->flags,
layout->width * button_up->w, layout->width * button_up->w,
@ -150,8 +152,10 @@ static struct osk_layout *load_layout(on_screen_keyboard *keyboard, char *layout
layout = malloc(sizeof(osk_layout)); layout = malloc(sizeof(osk_layout));
hlayout_loaded = 0; hlayout_loaded = 0;
#ifdef DEBUG
printf("load_layout %s\n", layout_name); printf("load_layout %s\n", layout_name);
filename = malloc(255); #endif
filename = malloc(sizeof(char) * 255);
if (layout_name != NULL) if (layout_name != NULL)
{ {
keyboard->name = strdup(layout_name); keyboard->name = strdup(layout_name);
@ -188,9 +192,9 @@ static struct osk_layout *load_layout(on_screen_keyboard *keyboard, char *layout
} }
line = malloc(1024); line = malloc(sizeof(char) * 1024);
key = malloc(255); key = malloc(sizeof(char) * 255);
value = malloc(255); value = malloc(sizeof(char) * 255);
while (!feof(fi)) while (!feof(fi))
{ {
@ -202,31 +206,40 @@ static struct osk_layout *load_layout(on_screen_keyboard *keyboard, char *layout
sscanf(line, "%s %s", key, value); sscanf(line, "%s %s", key, value);
if (strcmp("layout", key) == 0 && !hlayout_loaded) if (strcmp("layout", key) == 0 && !hlayout_loaded)
{ {
#ifdef DEBUG
printf("layout found: %s\n", value); printf("layout found: %s\n", value);
#endif
load_hlayout(layout, value); load_hlayout(layout, value);
hlayout_loaded = 1; hlayout_loaded = 1;
} }
else if (strncmp("keymap", key, 6) == 0) else if (strncmp("keymap", key, 6) == 0)
{ {
#ifdef DEBUG
printf("keymap found: %s\n", value); printf("keymap found: %s\n", value);
#endif
load_keymap(layout, value); load_keymap(layout, value);
} }
else if (strncmp("composemap", key, 10) == 0) else if (strncmp("composemap", key, 10) == 0)
{ {
#ifdef DEBUG
printf("composemap found: %s\n", value); printf("composemap found: %s\n", value);
#endif
load_composemap(layout, value); load_composemap(layout, value);
} }
else if (strncmp("keysymdefs", key, 10) == 0) else if (strncmp("keysymdefs", key, 10) == 0)
load_keysymdefs(layout, value); {
load_keysymdefs(layout, value);
}
else if (strncmp("keyboardlist", key, 12) == 0) else if (strncmp("keyboardlist", key, 12) == 0)
{ {
strcpy(value, &line[13]); strcpy(value, &line[13]);
keyboard->keyboard_list = strdup(value); keyboard->keyboard_list = strdup(value);
} }
#ifdef DEBUG
printf("key %s, value %s\n", key, value); printf("key %s, value %s\n", key, value);
#endif
key[0] = '\0'; key[0] = '\0';
value[0] = '\0'; value[0] = '\0';
} }
@ -263,7 +276,7 @@ void load_hlayout(osk_layout *layout, char * hlayout_name)
allocated = 0; allocated = 0;
have_fontpath = 0; have_fontpath = 0;
filename = malloc(255); filename = malloc(sizeof(char) * 255);
/* Try full path */ /* Try full path */
fi = fopen(hlayout_name, "r"); fi = fopen(hlayout_name, "r");
@ -284,9 +297,9 @@ void load_hlayout(osk_layout *layout, char * hlayout_name)
free(filename); free(filename);
line = malloc(1024); line = malloc(sizeof(char) * 1024);
key = malloc(255); key = malloc(sizeof(char) * 255);
fontpath = malloc(255); fontpath = malloc(sizeof(char) * 255);
r = g = b = 256; r = g = b = 256;
layout->fgcolor.r = def_fgcolor.r; layout->fgcolor.r = def_fgcolor.r;
@ -316,7 +329,9 @@ void load_hlayout(osk_layout *layout, char * hlayout_name)
layout->width = width; layout->width = width;
layout->height = height; layout->height = height;
#ifdef DEBUG
printf("w %i, h %i\n" , layout->width, layout->height); printf("w %i, h %i\n" , layout->width, layout->height);
#endif
allocated = 1; allocated = 1;
} }
@ -333,14 +348,18 @@ void load_hlayout(osk_layout *layout, char * hlayout_name)
else if (strncmp(line, "FONTPATH", 8) == 0) else if (strncmp(line, "FONTPATH", 8) == 0)
{ {
#ifdef DEBUG
printf("linefont %s\n", line); printf("linefont %s\n", line);
#endif
sscanf(line, "%s %s", key, fontpath); sscanf(line, "%s %s", key, fontpath);
if (!is_blank_or_comment(fontpath)) if (!is_blank_or_comment(fontpath))
have_fontpath = 1; have_fontpath = 1;
} }
else if (strncmp(line, "FGCOLOR", 5) == 0) else if (strncmp(line, "FGCOLOR", 5) == 0)
{ {
#ifdef DEBUG
printf("linefont %s\n", line); printf("linefont %s\n", line);
#endif
sscanf(line, "%s %i %i %i", key, &r, &g, &b); sscanf(line, "%s %i %i %i", key, &r, &g, &b);
if (r > 0 && r< 256 && g > 0 && g< 256 && b > 0 && b< 256) if (r > 0 && r< 256 && g > 0 && g< 256 && b > 0 && b< 256)
{ {
@ -352,7 +371,9 @@ void load_hlayout(osk_layout *layout, char * hlayout_name)
} }
else if (strncmp(line, "BGCOLOR", 5) == 0) else if (strncmp(line, "BGCOLOR", 5) == 0)
{ {
#ifdef DEBUG
printf("linefont %s\n", line); printf("linefont %s\n", line);
#endif
sscanf(line, "%s %i %i %i", key, &r, &g, &b); sscanf(line, "%s %i %i %i", key, &r, &g, &b);
if (r > 0 && r< 256 && g > 0 && g< 256 && b > 0 && b< 256) if (r > 0 && r< 256 && g > 0 && g< 256 && b > 0 && b< 256)
{ {
@ -376,14 +397,12 @@ void load_hlayout(osk_layout *layout, char * hlayout_name)
layout->keys[ line_number][i].shift_altgr_label=NULL; layout->keys[ line_number][i].shift_altgr_label=NULL;
} }
} }
else if (width && height && allocated && strncmp(line, "KEY ", 4) == 0 && key_number < width) else if (width && height && allocated && strncmp(line, "KEY ", 4) == 0 && key_number < width)
{ {
plain_label = malloc(64); plain_label = malloc(sizeof(char) * 64);
top_label = malloc(64); top_label = malloc(sizeof(char) * 64);
altgr_label = malloc(64); altgr_label = malloc(sizeof(char) * 64);
shift_altgr_label = malloc(64); shift_altgr_label = malloc(sizeof(char) * 64);
sscanf(line, sscanf(line,
"%s %i %i.%i %s %s %s %s %i", "%s %i %i.%i %s %s %s %s %i",
@ -445,7 +464,7 @@ void load_keymap(osk_layout *layout, char * keymap_name)
char *line; char *line;
FILE * fi; FILE * fi;
filename = malloc(255); filename = malloc(sizeof(char) * 255);
/* Try full path */ /* Try full path */
fi = fopen(keymap_name, "r"); fi = fopen(keymap_name, "r");
@ -466,7 +485,7 @@ void load_keymap(osk_layout *layout, char * keymap_name)
free(filename); free(filename);
line = malloc(1024); line = malloc(sizeof(char) * 1024);
layout->keymap = malloc(256 * sizeof(osk_keymap)); layout->keymap = malloc(256 * sizeof(osk_keymap));
for (i = 0;i < 256; i++) for (i = 0;i < 256; i++)
@ -480,16 +499,15 @@ void load_keymap(osk_layout *layout, char * keymap_name)
while (!feof(fi)) while (!feof(fi))
{ {
fgets(line, 1023, fi); fgets(line, 1023, fi);
if (is_blank_or_comment(line)) if (is_blank_or_comment(line))
continue; continue;
ksname1 = malloc(64); ksname1 = malloc(sizeof(char) * 64);
ksname2 = malloc(64); ksname2 = malloc(sizeof(char) * 64);
ksname3 = malloc(64); ksname3 = malloc(sizeof(char) * 64);
ksname4 = malloc(64); ksname4 = malloc(sizeof(char) * 64);
ksname1[0] = '\0'; ksname1[0] = '\0';
ksname2[0] = '\0'; ksname2[0] = '\0';
ksname3[0] = '\0'; ksname3[0] = '\0';
@ -543,17 +561,20 @@ static void gettokens(char * line, char * delim, char ** pointer, osk_composenod
char *tok; char *tok;
wchar_t *result, *wtok; wchar_t *result, *wtok;
osk_composenode *auxnode; osk_composenode *auxnode;
wtok=malloc(255);
wtok = malloc(sizeof(wchar_t) * 255);
tok = strdup(strtok_r(line, delim, pointer)); tok = strdup(strtok_r(line, delim, pointer));
if(!tok) if(!tok)
return; return;
if (tok[0] == ':') /* End of precompose keysyms, next will be the result in UTF-8. */ if (tok[0] == ':') /* End of precompose keysyms, next will be the result in UTF-8. */
{ {
tok = strdup(strtok_r(line, ": \"\t", pointer)); tok = strdup(strtok_r(line, ": \"\t", pointer));
mbstowcs(wtok, tok, 255); mbstowcs(wtok, tok, 255);
result = wcsdup(wtok); result = wcsdup(wtok);
/* printf("->%ls<-\n", wtok); */ /* printf("->%ls<-\n", wtok); */
free(wtok); free(wtok);
@ -569,7 +590,7 @@ static void gettokens(char * line, char * delim, char ** pointer, osk_composenod
auxnode = malloc(sizeof(osk_composenode)); auxnode = malloc(sizeof(osk_composenode));
composenode->childs = malloc(sizeof(osk_composenode *)); composenode->childs = malloc(sizeof(osk_composenode *));
composenode->childs[0] = auxnode; composenode->childs[0] = auxnode;
mbstowcs(wtok, tok, 255); mbstowcs(wtok, tok, 254); /* <<< CRASH */
composenode->childs[0]->keysym = wcsdup(wtok); composenode->childs[0]->keysym = wcsdup(wtok);
composenode->childs[0]->result = NULL; composenode->childs[0]->result = NULL;
composenode->childs[0]->size = 0; composenode->childs[0]->size = 0;
@ -583,7 +604,6 @@ static void gettokens(char * line, char * delim, char ** pointer, osk_composenod
} }
else else
{ {
for (i = 0; i < composenode->size; i++) for (i = 0; i < composenode->size; i++)
{ {
mbstowcs(wtok, tok, 255); mbstowcs(wtok, tok, 255);
@ -629,7 +649,7 @@ static void load_composemap(osk_layout *layout, char * composemap_name)
FILE * fi; FILE * fi;
pointer = malloc(sizeof(wchar_t *)); pointer = malloc(sizeof(wchar_t *));
filename = malloc(255); filename = malloc(sizeof(char) * 255);
/* Try full path */ /* Try full path */
fi = fopen(composemap_name, "r"); fi = fopen(composemap_name, "r");
@ -655,7 +675,7 @@ static void load_composemap(osk_layout *layout, char * composemap_name)
layout->composemap[0].result = NULL; layout->composemap[0].result = NULL;
layout->composemap->size = 0; layout->composemap->size = 0;
line = malloc(1024*sizeof(char)); line = malloc(1024 * sizeof(char));
while (!feof(fi)) while (!feof(fi))
{ {
@ -680,22 +700,31 @@ static void print_composemap(osk_composenode *composemap, char * sp)
{ {
int i; int i;
char * space; char * space;
space = malloc(255);
space = malloc(sizeof(char) * 255);
#ifdef DEBUG
printf("%ls, ", composemap->keysym); printf("%ls, ", composemap->keysym);
printf("%d ==> ", composemap->size); printf("%d ==> ", composemap->size);
if (composemap->size == 0) #endif
{ printf("result %ls\n", composemap->result); if (composemap->size == 0)
return;} {
#ifdef DEBUG
printf("result %ls\n", composemap->result);
#endif
return;
}
if (sp) if (sp)
{ {
sprintf(space, "%s\t", sp); sprintf(space, "%s\t", sp);
} }
else else
{
sprintf(space, " "); sprintf(space, " ");
}
#ifdef DEBUG
printf("%s", space); printf("%s", space);
#endif
for (i = 0; i < composemap->size; i++) for (i = 0; i < composemap->size; i++)
{ {
@ -727,7 +756,7 @@ static void load_keysymdefs(osk_layout *layout, char * keysymdefs_name)
char *line; char *line;
FILE * fi; FILE * fi;
filename = malloc(255); filename = malloc(sizeof(char) * 255);
/* Try full path */ /* Try full path */
fi = fopen(keysymdefs_name, "r"); fi = fopen(keysymdefs_name, "r");
@ -764,7 +793,7 @@ static void load_keysymdefs(osk_layout *layout, char * keysymdefs_name)
/* Some keysyms doesn't correspond to any unicode value, ej. BackSpace */ /* Some keysyms doesn't correspond to any unicode value, ej. BackSpace */
layout->keysymdefs[i].unicode = 0; layout->keysymdefs[i].unicode = 0;
layout->keysymdefs[i].mnemo = malloc(128); layout->keysymdefs[i].mnemo = malloc(sizeof(char) * 128);
sscanf(line, "#define XK_%s %x /* U+%x", sscanf(line, "#define XK_%s %x /* U+%x",
layout->keysymdefs[i].mnemo, layout->keysymdefs[i].mnemo,
&layout->keysymdefs[i].keysym, &layout->keysymdefs[i].keysym,
@ -953,7 +982,8 @@ static int is_blank_or_comment(char *line)
static void keybd_prepare(on_screen_keyboard *keyboard) static void keybd_prepare(on_screen_keyboard *keyboard)
{ {
char * fontname; char * fontname;
fontname = malloc(255);
fontname = malloc(sizeof(char) * 255);
if (keyboard->layout->fontpath) if (keyboard->layout->fontpath)
{ {
@ -1143,12 +1173,13 @@ static void draw_key(osk_key key, on_screen_keyboard * keyboard, int hot)
{ {
char *text; char *text;
SDL_Surface *skey; SDL_Surface *skey;
if (!key.width) if (!key.width)
return; return;
text = malloc(255);
snprintf(text, 6,"%s", key.plain_label);
text = malloc(sizeof(char) * 255);
snprintf(text, 6,"%s", key.plain_label);
if( strncmp("NULL", text, 4) != 0 && key.keycode != 0) if( strncmp("NULL", text, 4) != 0 && key.keycode != 0)
{ {
@ -1539,7 +1570,9 @@ struct osk_keyboard * osk_clicked(on_screen_keyboard *keyboard, int x, int y)
wchar_t *ks; wchar_t *ks;
on_screen_keyboard * new_keyboard; on_screen_keyboard * new_keyboard;
#ifdef DEBUG
printf("list: %s\n", keyboard->keyboard_list); printf("list: %s\n", keyboard->keyboard_list);
#endif
event.key.keysym.mod = KMOD_NONE; event.key.keysym.mod = KMOD_NONE;
event.key.keysym.sym = 0; event.key.keysym.sym = 0;
@ -1561,8 +1594,12 @@ struct osk_keyboard * osk_clicked(on_screen_keyboard *keyboard, int x, int y)
aux_list = strdup(keyboard->keyboard_list); aux_list = strdup(keyboard->keyboard_list);
aux_list_ptr = aux_list; aux_list_ptr = aux_list;
printf("auxlist: %s\n", aux_list);
printf("kn %s\n", keyboard->name); #ifdef DEBUG
printf("auxlist: %s\n", aux_list);
printf("kn %s\n", keyboard->name);
#endif
if (key->keycode == 1) if (key->keycode == 1)
{ {
for (i = 0;;i++, aux_list = NULL) for (i = 0;;i++, aux_list = NULL)
@ -1645,7 +1682,9 @@ struct osk_keyboard * osk_clicked(on_screen_keyboard *keyboard, int x, int y)
strlen(keysym)+1, strlen(keysym)+1,
NULL); NULL);
#ifdef DEBUG
printf("wkeysym %ls %i\n\n", wkeysym, (int)wcslen(wkeysym)); printf("wkeysym %ls %i\n\n", wkeysym, (int)wcslen(wkeysym));
#endif
get_composed_keysym(keyboard, keyboard->composing, wkeysym); get_composed_keysym(keyboard, keyboard->composing, wkeysym);
@ -1655,9 +1694,12 @@ struct osk_keyboard * osk_clicked(on_screen_keyboard *keyboard, int x, int y)
keyboard->last_key_pressed = key; keyboard->last_key_pressed = key;
set_key(NULL, &keyboard->keymodifiers.compose, 0); set_key(NULL, &keyboard->keymodifiers.compose, 0);
ks = keyboard->composed; ks = keyboard->composed;
printf("keysym found %ls\n", ks);
mnemo = malloc(32); #ifdef DEBUG
printf("keysym found %ls\n", ks);
#endif
mnemo = malloc(sizeof(char) * 32);
snprintf(mnemo, 31, "%ls", ks); snprintf(mnemo, 31, "%ls", ks);
if (wcsncmp(L"Return", ks, 6) == 0) if (wcsncmp(L"Return", ks, 6) == 0)
@ -1694,7 +1736,9 @@ struct osk_keyboard * osk_clicked(on_screen_keyboard *keyboard, int x, int y)
{ {
if (keyboard->composing == keyboard->layout->composemap) if (keyboard->composing == keyboard->layout->composemap)
{ {
#ifdef DEBUG
printf("compose sequence resetted\n"); printf("compose sequence resetted\n");
#endif
set_key(NULL, &keyboard->keymodifiers.compose, 0); set_key(NULL, &keyboard->keymodifiers.compose, 0);
keyboard->last_key_pressed = key; keyboard->last_key_pressed = key;
clear_dead_sticks(keyboard); clear_dead_sticks(keyboard);
@ -1702,7 +1746,9 @@ struct osk_keyboard * osk_clicked(on_screen_keyboard *keyboard, int x, int y)
else else
{ {
set_key(key, &keyboard->keymodifiers.compose, 0); set_key(key, &keyboard->keymodifiers.compose, 0);
#ifdef DEBUG
printf("still composing\n"); printf("still composing\n");
#endif
set_dead_sticks(key, keyboard); set_dead_sticks(key, keyboard);
/* Fixme: Would be nice if we can highlight next available-to-compose keys, but how? */ /* Fixme: Would be nice if we can highlight next available-to-compose keys, but how? */
} }