[Tux4kids-commits] r903 - in tuxtype/trunk: doc src
dbruce-guest at alioth.debian.org
dbruce-guest at alioth.debian.org
Mon Feb 23 01:19:59 UTC 2009
Author: dbruce-guest
Date: 2009-02-23 01:19:59 +0000 (Mon, 23 Feb 2009)
New Revision: 903
Modified:
tuxtype/trunk/doc/ChangeLog
tuxtype/trunk/src/alphabet.c
Log:
cleanup/audit of alphabet.c for potential ptr-related segfaults.
fix of error in drawing of fourth row of keyboard in practice activity
Modified: tuxtype/trunk/doc/ChangeLog
===================================================================
--- tuxtype/trunk/doc/ChangeLog 2009-02-20 19:46:47 UTC (rev 902)
+++ tuxtype/trunk/doc/ChangeLog 2009-02-23 01:19:59 UTC (rev 903)
@@ -1,3 +1,13 @@
+22 Feb 2009 svn revision 903
+[ David Bruce <davidstuartbruce at gmail.com> ]
+ - lots of general code cleanup to eliminate most of the compiler warnings,
+ including removal of remaining incorrect uses of "unsigned char".
+ - addition of "make dist_with_fonts_bzip2" target to help support OpenSUSE
+ build service integration.
+ - beginning of VERSIOM "1.7.4.preview"
+ - cleanup of alphabet.c with addition of pointer safety checks and fix of
+ "off-by-one" drawing error in fourth row of keyboard hints graphic.
+
08 Feb 2009
[ David Bruce <davidstuartbruce at gmail.com> ]
- cleanup of wchar_t <--> UTF-8 conversion wrapper functions. These are now
Modified: tuxtype/trunk/src/alphabet.c
===================================================================
--- tuxtype/trunk/src/alphabet.c 2009-02-20 19:46:47 UTC (rev 902)
+++ tuxtype/trunk/src/alphabet.c 2009-02-23 01:19:59 UTC (rev 903)
@@ -7,6 +7,8 @@
email : jdandr2 at tux4kids.net
Revised extensively: 2008
Sreyas Kurumanghat <k.sreyas at gmail.com>
+and
+David Bruce <davidstuartbruce at gmail.com>
***************************************************************************/
/***************************************************************************
@@ -20,9 +22,7 @@
-/* Needed to convert UTF-8 under Windows because we don't have glibc: */
#include "convert_utf.h"
-
#include "globals.h"
#include "funcs.h"
#include "SDL_extras.h"
@@ -49,27 +49,22 @@
typedef struct kbd_char {
wchar_t unicode_value;
char finger;
- //keymap key;
- char keyname[5];
- int shift;
- char latin_char;
+ //keymap key;
+ char keyname[5];
+ int shift;
+ char latin_char;
} kbd_char;
/* List with one entry for each typable character in keyboard setup - has the */
/* Unicode value of the key and the associated fingering. */
static kbd_char keyboard_list[MAX_UNICODES] = {{0, -1, {0}, 0, -1}};
-
-
-
/* Used for word list functions (see below): */
static int num_words;
static wchar_t word_list[MAX_NUM_WORDS][MAX_WORD_SIZE + 1];
static wchar_t char_list[MAX_UNICODES]; // List of distinct letters in word list
static int num_chars_used = 0; // Number of different letters in word list
-
-
/* Local function prototypes: */
static void gen_char_list(void);
static int add_char(wchar_t uc);
@@ -172,56 +167,54 @@
{
fprintf(stderr, "Adding key: Unicode char = '%C'\tUnicode value = %d\tfinger = %ld\n",
wide_str[2], wide_str[2], wcstol(&wide_str[0], NULL, 0));
- }
+ }
/* Just plug values into array: */
keyboard_list[k].unicode_value = wide_str[2];
keyboard_list[k].finger = wcstol(&wide_str[0], NULL, 0);
- if (wcslen(wide_str) <5)
- {
- if(!settings.use_english)
- {
- map_keys(-1,&keyboard_list[k]);
- keyboard_list[k].latin_char=-1;
- keyboard_list[k].finger = wcstol(&wide_str[0], NULL, 0);
- }
- else
- {
- map_keys(wide_str[2],&keyboard_list[k]);
- keyboard_list[k].latin_char=wide_str[2];
- }
- }
- else
- {
- map_keys(wide_str[4],&keyboard_list[k]);
- keyboard_list[k].latin_char=wide_str[4];
- }
+
+ if (wcslen(wide_str) <5)
+ {
+ if(!settings.use_english)
+ {
+ map_keys(-1,&keyboard_list[k]);
+ keyboard_list[k].latin_char=-1;
+ keyboard_list[k].finger = wcstol(&wide_str[0], NULL, 0);
+ }
+ else
+ {
+ map_keys(wide_str[2],&keyboard_list[k]);
+ keyboard_list[k].latin_char=wide_str[2];
+ }
+ }
+ else
+ {
+ map_keys(wide_str[4],&keyboard_list[k]);
+ keyboard_list[k].latin_char=wide_str[4];
+ }
k++;
}
- else
- {
- if(wcslen(wide_str)==1)
- {
- if(!settings.use_english)
- {
- keyboard_list[k].unicode_value = wide_str[0];
- map_keys(-1,&keyboard_list[k]);
- keyboard_list[k].latin_char=-1;
- }
- else
- {
- keyboard_list[k].unicode_value = wide_str[0];
- map_keys(-1,&keyboard_list[k]);
- keyboard_list[k].latin_char=wide_str[0];
- }
- k++;
- }
-
- }
-
+ else
+ {
+ if(wcslen(wide_str) == 1)
+ {
+ if(!settings.use_english)
+ {
+ keyboard_list[k].unicode_value = wide_str[0];
+ map_keys(-1,&keyboard_list[k]);
+ keyboard_list[k].latin_char=-1;
+ }
+ else
+ {
+ keyboard_list[k].unicode_value = wide_str[0];
+ map_keys(-1, &keyboard_list[k]);
+ keyboard_list[k].latin_char = wide_str[0];
+ }
+ k++;
+ }
+ }
} while (!feof(f));
-
fclose(f);
LOG("Leaving LoadKeyboard()\n");
return 1;
@@ -233,18 +226,25 @@
/* Returns -1 if somehow no finger associated with a Unicode value */
/* in the list (shouldn't happen). */
/* Returns -2 if Unicode value not in list. */
+/* Returns -3 if argument outside of array. */
int GetFinger(int i)
{
+ if (i < -1 || i >= MAX_UNICODES)
+ {
+ fprintf(stderr, "GetFinger() - requested index i = %d outside of array\n", i);
+ return -3;
+ }
+
if (i == -1)
{
- fprintf(stderr, "GetFinger() - Unicode char '%C' not found in list.\n",i);
+ fprintf(stderr, "GetFinger() - Unicode char '%C' not found in list.\n", i);
return -2;
}
if ((keyboard_list[i].finger < 0)
|| (keyboard_list[i].finger > 9))
{
- fprintf(stderr, "GetFinger() - Unicode char '%C' has no valid finger.\n",i);
+ fprintf(stderr, "GetFinger() - Unicode char '%C' has no valid finger.\n", i);
return -1;
}
@@ -253,7 +253,12 @@
int GetShift(int i)
{
- return keyboard_list[i].shift;
+ if (i < 0 || i >= MAX_UNICODES)
+ {
+ fprintf(stderr, "GetShift() - requested index i = %d outside of array\n", i);
+ return -1;
+ }
+ return keyboard_list[i].shift;
}
int GetIndex(wchar_t uni_char)
@@ -320,7 +325,10 @@
wchar_t GetLastKey()
{
- if(!num_chars_used)
+ //Avoid segfault if num_chars_used has gotten a bad value:
+ if(!num_chars_used
+ || num_chars_used < 0
+ || num_chars_used >= MAX_UNICODES)
return -1;
else
return keyboard_list[num_chars_used - 1].unicode_value;
@@ -432,7 +440,9 @@
void ClearWordList(void)
{
int i;
- for (i = 0; i < num_words; i++)
+// for (i = 0; i < num_words; i++)
+ //more robust if we just zero entire list - takes neglible time
+ for (i = 0; i < MAX_NUM_WORDS; i++)
{
word_list[i][0] = '\0';
}
@@ -446,50 +456,37 @@
*/
wchar_t* GetWord(void)
{
- static int last_choice = -1;
- int choice;
+ static int last_choice = -1;
+ int choice;
- LOG("Entering GetWord()\n");
- DEBUGCODE { fprintf(stderr, "num_words is: %d\n", num_words); }
+ LOG("Entering GetWord()\n");
- /* Now count list to make sure num_words is correct: */
+ /* Safety/sanity checks: */
+ /* Count list to make sure num_words is correct: */
+ num_words = 0;
+ while (word_list[num_words][0] != '\0')
+ {
+ num_words++;
+ }
- num_words = 0;
- while (word_list[num_words][0] != '\0')
- {
- num_words++;
- }
+ if (0 == num_words)
+ {
+ LOG("No words in list\n");
+ return NULL;
+ }
- DEBUGCODE { fprintf(stderr, "After count, num_words is: %d\n", num_words); }
+ /* Now pick one: */
+ do
+ {
+ choice = (rand() % num_words);
+ } while ((choice == last_choice) || (num_words < 2));
- if (0 == num_words)
- {
- LOG("No words in list\n");
- return NULL;
- }
+ last_choice = choice;
- if (num_words > MAX_NUM_WORDS)
- {
- LOG("Error: num_words greater than array size\n");
- return NULL;
- }
+ /* NOTE need %S rather than %s because of wide characters */
+ DEBUGCODE { fprintf(stderr, "Selected word is: %S\n", word_list[choice]); }
- if (num_words < 0)
- {
- LOG("Error: num_words negative\n");
- return NULL;
- }
-
- do {
- choice = (rand() % num_words);
- } while ((choice == last_choice) || (num_words < 2));
-
- last_choice = choice;
-
- /* NOTE need %S rather than %s because of wide characters */
- DEBUGCODE { fprintf(stderr, "Selected word is: %S\n", word_list[choice]); }
-
- return word_list[choice];
+ return word_list[choice];
}
@@ -509,28 +506,23 @@
wchar_t temp_wide_word[FNLEN];
size_t length;
- FILE* wordFile=NULL;
+ FILE* wordFile = NULL;
DEBUGCODE { fprintf(stderr, "Entering GenerateWordList() for file: %s\n", wordFn); }
num_words = 0;
/* --- open the file --- */
-
wordFile = fopen( wordFn, "r" );
-
if ( wordFile == NULL )
{
fprintf(stderr, "ERROR: could not load wordlist: %s\n", wordFn );
-// UseAlphabet( );
return 0;
}
-
/* --- load words from file named as argument: */
+ DEBUGCODE { fprintf(stderr, "Loading words from file: %s\n", wordFn); }
- DEBUGCODE { fprintf(stderr, "WORD FILE OPENNED @ %s\n", wordFn); }
-
/* ignore the title (i.e. first line) */
/* (compiler complains unless we inspect return value) */
ret = fscanf( wordFile, "%[^\n]\n", temp_word);
@@ -540,6 +532,10 @@
ret = fscanf( wordFile, "%[^\n]\n", temp_word);
DEBUGCODE {fprintf(stderr, "temp_word = %s\n", temp_word);}
+ /* Ignore comment lines - starting with '#' */
+ if (temp_word[0] == '#')
+ continue;
+
for (j = 0; j < strlen(temp_word); j++)
{
if (temp_word[j] == '\n' || temp_word[j] == '\r')
@@ -616,10 +612,6 @@
}
-
-
-
-
/* This version creates the letters using TTF_RenderUNICODE_Blended */
int RenderLetters(const TTF_Font* letter_font)
{
@@ -666,10 +658,18 @@
{
int i;
- for (i = 0; i < num_chars_used; i++)
+ for (i = 0; i < MAX_UNICODES; i++)
{
- SDL_FreeSurface(char_glyphs[i].white_glyph);
- SDL_FreeSurface(char_glyphs[i].red_glyph);
+ if (char_glyphs[i].white_glyph)
+ {
+ SDL_FreeSurface(char_glyphs[i].white_glyph);
+ char_glyphs[i].white_glyph = NULL;
+ }
+ if (char_glyphs[i].red_glyph)
+ {
+ SDL_FreeSurface(char_glyphs[i].red_glyph);
+ char_glyphs[i].red_glyph = NULL;
+ }
char_glyphs[i].unicode_value = 0;
char_glyphs[i].white_glyph = NULL;
char_glyphs[i].red_glyph = NULL;
@@ -741,7 +741,8 @@
{
fprintf(stderr, "\nCheckNeededGlyphs() - needed char '%C' (Unicode value = %d) not found.\n",
char_list[i], char_list[i]);
- fprintf(stderr, "This probably means that the theme's 'keyboard.lst' file is incorrect or incomplete.\n");
+ fprintf(stderr, "This probably means that the theme's 'keyboard.lst' file is incorrect or incomplete.\n"
+ "It could also mean that the available font lacks needed characters\n");
return 0;
}
i++;
@@ -754,9 +755,14 @@
{
int i = 0;
- while ((i < MAX_WORD_SIZE)
- && (s[i] != '\0'))
+ if (!s)
{
+ fprintf(stderr, "check_needed_unicodes_str() - null ptr passed as arg");
+ return 0;
+ }
+
+ while (i < MAX_WORD_SIZE && i < wcslen(s))
+ {
if (!unicode_in_key_list(s[i]))
{
fprintf(stderr, "\ncheck_needed_unicodes_str() - needed char '%C' (Unicode value = %d) not found.\n",
@@ -774,454 +780,483 @@
/******************************************************************/
int map_keys(wchar_t wide_char, kbd_char* keyboard_entry)
{
- switch(wide_char)
- {
- case '`':strcpy(keyboard_entry->keyname,"A00");
- keyboard_entry->shift=0;
- keyboard_entry->finger=0;
- break;
- case '~':strcpy(keyboard_entry->keyname,"A00");
- keyboard_entry->shift=2;
- keyboard_entry->finger=0;
- break;
- case '1':strcpy(keyboard_entry->keyname,"A01");
- keyboard_entry->shift=0;
- keyboard_entry->finger=0;
- break;
- case '!':strcpy(keyboard_entry->keyname,"A01");
- keyboard_entry->shift=2;
- keyboard_entry->finger=0;
- break;
- case '2':strcpy(keyboard_entry->keyname,"A02");
- keyboard_entry->shift=0;
- keyboard_entry->finger=1;
- break;
- case '@':strcpy(keyboard_entry->keyname,"A02");
- keyboard_entry->shift=2;
- keyboard_entry->finger=1;
- break;
- case '3':strcpy(keyboard_entry->keyname,"A03");
- keyboard_entry->shift=0;
- keyboard_entry->finger=2;
- break;
- case '#':strcpy(keyboard_entry->keyname,"A03");
- keyboard_entry->shift=2;
- keyboard_entry->finger=2;
- break;
- case '4':strcpy(keyboard_entry->keyname,"A04");
- keyboard_entry->shift=0;
- keyboard_entry->finger=3;
- break;
- case '$':strcpy(keyboard_entry->keyname,"A04");
- keyboard_entry->shift=2;
- keyboard_entry->finger=3;
- break;
- case '5':strcpy(keyboard_entry->keyname,"A05");
- keyboard_entry->shift=0;
- keyboard_entry->finger=3;
- break;
- case '%':strcpy(keyboard_entry->keyname,"A05");
- keyboard_entry->shift=2;
- keyboard_entry->finger=3;
- break;
- case '6':strcpy(keyboard_entry->keyname,"A06");
- keyboard_entry->shift=0;
- keyboard_entry->finger=6;
- break;
- case '^':strcpy(keyboard_entry->keyname,"A06");
- keyboard_entry->shift=1;
- keyboard_entry->finger=6;
- break;
- case '7':strcpy(keyboard_entry->keyname,"A07");
- keyboard_entry->shift=0;
- keyboard_entry->finger=6;
- break;
- case '&':strcpy(keyboard_entry->keyname,"A07");
- keyboard_entry->shift=1;
- keyboard_entry->finger=6;
- break;
- case '8':strcpy(keyboard_entry->keyname,"A08");
- keyboard_entry->shift=0;
- keyboard_entry->finger=7;
- break;
- case '*':strcpy(keyboard_entry->keyname,"A08");
- keyboard_entry->shift=1;
- keyboard_entry->finger=7;
- break;
- case '9':strcpy(keyboard_entry->keyname,"A09");
- keyboard_entry->shift=0;
- keyboard_entry->finger=8;
- break;
- case '(':strcpy(keyboard_entry->keyname,"A09");
- keyboard_entry->shift=1;
- keyboard_entry->finger=8;
- break;
- case '0':strcpy(keyboard_entry->keyname,"A10");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case ')':strcpy(keyboard_entry->keyname,"A10");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case '-':strcpy(keyboard_entry->keyname,"A11");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case '_':strcpy(keyboard_entry->keyname,"A11");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case '=':strcpy(keyboard_entry->keyname,"A12");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case '+':strcpy(keyboard_entry->keyname,"A12");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case '\\':strcpy(keyboard_entry->keyname,"A13");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case '|':strcpy(keyboard_entry->keyname,"A13");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case 'q':strcpy(keyboard_entry->keyname,"B01");
- keyboard_entry->shift=0;
- keyboard_entry->finger=0;
- break;
- case 'Q':strcpy(keyboard_entry->keyname,"B01");
- keyboard_entry->shift=2;
- keyboard_entry->finger=0;
- break;
- case 'w':strcpy(keyboard_entry->keyname,"B02");
- keyboard_entry->shift=0;
- keyboard_entry->finger=1;
- break;
- case 'W':strcpy(keyboard_entry->keyname,"B02");
- keyboard_entry->shift=2;
- keyboard_entry->finger=1;
- break;
- case 'e':strcpy(keyboard_entry->keyname,"B03");
- keyboard_entry->shift=0;
- keyboard_entry->finger=2;
- break;
- case 'E':strcpy(keyboard_entry->keyname,"B03");
- keyboard_entry->shift=2;
- keyboard_entry->finger=3;
- break;
- case 'r':strcpy(keyboard_entry->keyname,"B04");
- keyboard_entry->shift=0;
- keyboard_entry->finger=3;
- break;
- case 'R':strcpy(keyboard_entry->keyname,"B04");
- keyboard_entry->shift=2;
- keyboard_entry->finger=3;
- break;
- case 't':strcpy(keyboard_entry->keyname,"B05");
- keyboard_entry->shift=0;
- keyboard_entry->finger=3;
- break;
- case 'T':strcpy(keyboard_entry->keyname,"B05");
- keyboard_entry->shift=2;
- keyboard_entry->finger=3;
- break;
- case 'y':strcpy(keyboard_entry->keyname,"B06");
- keyboard_entry->shift=0;
- keyboard_entry->finger=6;
- break;
- case 'Y':strcpy(keyboard_entry->keyname,"B06");
- keyboard_entry->shift=1;
- keyboard_entry->finger=6;
- break;
- case 'u':strcpy(keyboard_entry->keyname,"B07");
- keyboard_entry->shift=0;
- keyboard_entry->finger=6;
- break;
- case 'U':strcpy(keyboard_entry->keyname,"B07");
- keyboard_entry->shift=1;
- keyboard_entry->finger=6;
- break;
- case 'i':strcpy(keyboard_entry->keyname,"B08");
- keyboard_entry->shift=0;
- keyboard_entry->finger=7;
- break;
- case 'I':strcpy(keyboard_entry->keyname,"B08");
- keyboard_entry->shift=1;
- keyboard_entry->finger=7;
- break;
- case 'o':strcpy(keyboard_entry->keyname,"B09");
- keyboard_entry->shift=0;
- keyboard_entry->finger=8;
- break;
- case 'O':strcpy(keyboard_entry->keyname,"B09");
- keyboard_entry->shift=1;
- keyboard_entry->finger=8;
- break;
- case 'p':strcpy(keyboard_entry->keyname,"B10");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case 'P':strcpy(keyboard_entry->keyname,"B10");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case '[':strcpy(keyboard_entry->keyname,"B11");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case '{':strcpy(keyboard_entry->keyname,"B11");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case ']':strcpy(keyboard_entry->keyname,"B12");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case '}':strcpy(keyboard_entry->keyname,"B12");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case 'a':strcpy(keyboard_entry->keyname,"C01");
- keyboard_entry->shift=0;
- keyboard_entry->finger=0;
- break;
- case 'A':strcpy(keyboard_entry->keyname,"C01");
- keyboard_entry->shift=2;
- keyboard_entry->finger=0;
- break;
- case 's':strcpy(keyboard_entry->keyname,"C02");
- keyboard_entry->shift=0;
- keyboard_entry->finger=1;
- break;
- case 'S':strcpy(keyboard_entry->keyname,"C02");
- keyboard_entry->shift=2;
- keyboard_entry->finger=1;
- break;
- case 'd':strcpy(keyboard_entry->keyname,"C03");
- keyboard_entry->shift=0;
- keyboard_entry->finger=2;
- break;
- case 'D':strcpy(keyboard_entry->keyname,"C03");
- keyboard_entry->shift=2;
- keyboard_entry->finger=2;
- break;
- case 'f':strcpy(keyboard_entry->keyname,"C04");
- keyboard_entry->shift=0;
- keyboard_entry->finger=3;
- break;
- case 'F':strcpy(keyboard_entry->keyname,"C04");
- keyboard_entry->shift=2;
- keyboard_entry->finger=3;
- break;
- case 'g':strcpy(keyboard_entry->keyname,"C05");
- keyboard_entry->shift=0;
- keyboard_entry->finger=3;
- break;
- case 'G':strcpy(keyboard_entry->keyname,"C05");
- keyboard_entry->shift=1;
- keyboard_entry->finger=3;
- break;
- case 'h':strcpy(keyboard_entry->keyname,"C06");
- keyboard_entry->shift=0;
- keyboard_entry->finger=6;
- break;
- case 'H':strcpy(keyboard_entry->keyname,"C06");
- keyboard_entry->shift=1;
- keyboard_entry->finger=6;
- break;
- case 'j':strcpy(keyboard_entry->keyname,"C07");
- keyboard_entry->shift=0;
- keyboard_entry->finger=6;
- break;
- case 'J':strcpy(keyboard_entry->keyname,"C07");
- keyboard_entry->shift=1;
- keyboard_entry->finger=6;
- break;
- case 'k':strcpy(keyboard_entry->keyname,"C08");
- keyboard_entry->shift=0;
- keyboard_entry->finger=7;
- break;
- case 'K':strcpy(keyboard_entry->keyname,"C08");
- keyboard_entry->shift=1;
- keyboard_entry->finger=7;
- break;
- case 'l':strcpy(keyboard_entry->keyname,"C09");
- keyboard_entry->shift=0;
- keyboard_entry->finger=8;
- break;
- case 'L':strcpy(keyboard_entry->keyname,"C09");
- keyboard_entry->shift=1;
- keyboard_entry->finger=8;
- break;
- case ';':strcpy(keyboard_entry->keyname,"C10");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case ':':strcpy(keyboard_entry->keyname,"C10");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case '\'':strcpy(keyboard_entry->keyname,"C11");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case '"':strcpy(keyboard_entry->keyname,"C11");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case 'z':strcpy(keyboard_entry->keyname,"D01");
- keyboard_entry->shift=0;
- keyboard_entry->finger=0;
- break;
- case 'Z':strcpy(keyboard_entry->keyname,"D01");
- keyboard_entry->shift=2;
- keyboard_entry->finger=0;
- break;
- case 'x':strcpy(keyboard_entry->keyname,"D02");
- keyboard_entry->shift=0;
- keyboard_entry->finger=1;
- break;
- case 'X':strcpy(keyboard_entry->keyname,"D02");
- keyboard_entry->shift=2;
- keyboard_entry->finger=1;
- break;
- case 'c':strcpy(keyboard_entry->keyname,"D03");
- keyboard_entry->shift=0;
- keyboard_entry->finger=2;
- break;
- case 'C':strcpy(keyboard_entry->keyname,"D03");
- keyboard_entry->shift=2;
- keyboard_entry->finger=2;
- break;
- case 'v':strcpy(keyboard_entry->keyname,"D04");
- keyboard_entry->shift=0;
- keyboard_entry->finger=3;
- break;
- case 'V':strcpy(keyboard_entry->keyname,"D04");
- keyboard_entry->shift=2;
- keyboard_entry->finger=3;
- break;
- case 'b':strcpy(keyboard_entry->keyname,"D05");
- keyboard_entry->shift=0;
- keyboard_entry->finger=3;
- break;
- case 'B':strcpy(keyboard_entry->keyname,"D05");
- keyboard_entry->shift=2;
- keyboard_entry->finger=3;
- break;
- case 'n':strcpy(keyboard_entry->keyname,"D06");
- keyboard_entry->shift=0;
- keyboard_entry->finger=6;
- break;
- case 'N':strcpy(keyboard_entry->keyname,"D06");
- keyboard_entry->shift=1;
- keyboard_entry->finger=6;
- break;
- case 'm':strcpy(keyboard_entry->keyname,"D07");
- keyboard_entry->shift=0;
- keyboard_entry->finger=6;
- break;
- case 'M':strcpy(keyboard_entry->keyname,"D07");
- keyboard_entry->shift=1;
- keyboard_entry->finger=6;
- break;
- case ',':strcpy(keyboard_entry->keyname,"D08");
- keyboard_entry->shift=0;
- keyboard_entry->finger=7;
- break;
- case '<':strcpy(keyboard_entry->keyname,"D08");
- keyboard_entry->shift=1;
- keyboard_entry->finger=7;
- break;
- case '.':strcpy(keyboard_entry->keyname,"D09");
- keyboard_entry->shift=0;
- keyboard_entry->finger=8;
- break;
- case '>':strcpy(keyboard_entry->keyname,"D09");
- keyboard_entry->shift=1;
- keyboard_entry->finger=8;
- break;
- case '/':strcpy(keyboard_entry->keyname,"D10");
- keyboard_entry->shift=0;
- keyboard_entry->finger=9;
- break;
- case '?':strcpy(keyboard_entry->keyname,"D10");
- keyboard_entry->shift=1;
- keyboard_entry->finger=9;
- break;
- case ' ':strcpy(keyboard_entry->keyname,"E03");
- keyboard_entry->shift=0;
- keyboard_entry->finger=5;
- break;
- default:strcpy(keyboard_entry->keyname,"None");
- keyboard_entry->shift=0;
- keyboard_entry->finger=-1;
- break;
- }
+ if (!keyboard_entry)
+ {
+ fprintf(stderr, "Error: map_keys() - keyboard_entry arg is NULL\n");
+ return -1;
+ }
+
+ switch(wide_char)
+ {
+ case '`':strcpy(keyboard_entry->keyname,"A00");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=0;
+ break;
+ case '~':strcpy(keyboard_entry->keyname,"A00");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=0;
+ break;
+ case '1':strcpy(keyboard_entry->keyname,"A01");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=0;
+ break;
+ case '!':strcpy(keyboard_entry->keyname,"A01");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=0;
+ break;
+ case '2':strcpy(keyboard_entry->keyname,"A02");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=1;
+ break;
+ case '@':strcpy(keyboard_entry->keyname,"A02");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=1;
+ break;
+ case '3':strcpy(keyboard_entry->keyname,"A03");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=2;
+ break;
+ case '#':strcpy(keyboard_entry->keyname,"A03");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=2;
+ break;
+ case '4':strcpy(keyboard_entry->keyname,"A04");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=3;
+ break;
+ case '$':strcpy(keyboard_entry->keyname,"A04");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=3;
+ break;
+ case '5':strcpy(keyboard_entry->keyname,"A05");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=3;
+ break;
+ case '%':strcpy(keyboard_entry->keyname,"A05");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=3;
+ break;
+ case '6':strcpy(keyboard_entry->keyname,"A06");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=6;
+ break;
+ case '^':strcpy(keyboard_entry->keyname,"A06");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=6;
+ break;
+ case '7':strcpy(keyboard_entry->keyname,"A07");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=6;
+ break;
+ case '&':strcpy(keyboard_entry->keyname,"A07");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=6;
+ break;
+ case '8':strcpy(keyboard_entry->keyname,"A08");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=7;
+ break;
+ case '*':strcpy(keyboard_entry->keyname,"A08");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=7;
+ break;
+ case '9':strcpy(keyboard_entry->keyname,"A09");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=8;
+ break;
+ case '(':strcpy(keyboard_entry->keyname,"A09");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=8;
+ break;
+ case '0':strcpy(keyboard_entry->keyname,"A10");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case ')':strcpy(keyboard_entry->keyname,"A10");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case '-':strcpy(keyboard_entry->keyname,"A11");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case '_':strcpy(keyboard_entry->keyname,"A11");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case '=':strcpy(keyboard_entry->keyname,"A12");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case '+':strcpy(keyboard_entry->keyname,"A12");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case '\\':strcpy(keyboard_entry->keyname,"A13");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case '|':strcpy(keyboard_entry->keyname,"A13");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case 'q':strcpy(keyboard_entry->keyname,"B01");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=0;
+ break;
+ case 'Q':strcpy(keyboard_entry->keyname,"B01");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=0;
+ break;
+ case 'w':strcpy(keyboard_entry->keyname,"B02");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=1;
+ break;
+ case 'W':strcpy(keyboard_entry->keyname,"B02");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=1;
+ break;
+ case 'e':strcpy(keyboard_entry->keyname,"B03");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=2;
+ break;
+ case 'E':strcpy(keyboard_entry->keyname,"B03");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=3;
+ break;
+ case 'r':strcpy(keyboard_entry->keyname,"B04");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=3;
+ break;
+ case 'R':strcpy(keyboard_entry->keyname,"B04");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=3;
+ break;
+ case 't':strcpy(keyboard_entry->keyname,"B05");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=3;
+ break;
+ case 'T':strcpy(keyboard_entry->keyname,"B05");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=3;
+ break;
+ case 'y':strcpy(keyboard_entry->keyname,"B06");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=6;
+ break;
+ case 'Y':strcpy(keyboard_entry->keyname,"B06");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=6;
+ break;
+ case 'u':strcpy(keyboard_entry->keyname,"B07");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=6;
+ break;
+ case 'U':strcpy(keyboard_entry->keyname,"B07");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=6;
+ break;
+ case 'i':strcpy(keyboard_entry->keyname,"B08");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=7;
+ break;
+ case 'I':strcpy(keyboard_entry->keyname,"B08");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=7;
+ break;
+ case 'o':strcpy(keyboard_entry->keyname,"B09");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=8;
+ break;
+ case 'O':strcpy(keyboard_entry->keyname,"B09");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=8;
+ break;
+ case 'p':strcpy(keyboard_entry->keyname,"B10");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case 'P':strcpy(keyboard_entry->keyname,"B10");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case '[':strcpy(keyboard_entry->keyname,"B11");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case '{':strcpy(keyboard_entry->keyname,"B11");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case ']':strcpy(keyboard_entry->keyname,"B12");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case '}':strcpy(keyboard_entry->keyname,"B12");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case 'a':strcpy(keyboard_entry->keyname,"C01");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=0;
+ break;
+ case 'A':strcpy(keyboard_entry->keyname,"C01");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=0;
+ break;
+ case 's':strcpy(keyboard_entry->keyname,"C02");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=1;
+ break;
+ case 'S':strcpy(keyboard_entry->keyname,"C02");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=1;
+ break;
+ case 'd':strcpy(keyboard_entry->keyname,"C03");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=2;
+ break;
+ case 'D':strcpy(keyboard_entry->keyname,"C03");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=2;
+ break;
+ case 'f':strcpy(keyboard_entry->keyname,"C04");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=3;
+ break;
+ case 'F':strcpy(keyboard_entry->keyname,"C04");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=3;
+ break;
+ case 'g':strcpy(keyboard_entry->keyname,"C05");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=3;
+ break;
+ case 'G':strcpy(keyboard_entry->keyname,"C05");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=3;
+ break;
+ case 'h':strcpy(keyboard_entry->keyname,"C06");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=6;
+ break;
+ case 'H':strcpy(keyboard_entry->keyname,"C06");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=6;
+ break;
+ case 'j':strcpy(keyboard_entry->keyname,"C07");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=6;
+ break;
+ case 'J':strcpy(keyboard_entry->keyname,"C07");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=6;
+ break;
+ case 'k':strcpy(keyboard_entry->keyname,"C08");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=7;
+ break;
+ case 'K':strcpy(keyboard_entry->keyname,"C08");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=7;
+ break;
+ case 'l':strcpy(keyboard_entry->keyname,"C09");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=8;
+ break;
+ case 'L':strcpy(keyboard_entry->keyname,"C09");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=8;
+ break;
+ case ';':strcpy(keyboard_entry->keyname,"C10");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case ':':strcpy(keyboard_entry->keyname,"C10");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case '\'':strcpy(keyboard_entry->keyname,"C11");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case '"':strcpy(keyboard_entry->keyname,"C11");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case 'z':strcpy(keyboard_entry->keyname,"D01");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=0;
+ break;
+ case 'Z':strcpy(keyboard_entry->keyname,"D01");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=0;
+ break;
+ case 'x':strcpy(keyboard_entry->keyname,"D02");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=1;
+ break;
+ case 'X':strcpy(keyboard_entry->keyname,"D02");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=1;
+ break;
+ case 'c':strcpy(keyboard_entry->keyname,"D03");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=2;
+ break;
+ case 'C':strcpy(keyboard_entry->keyname,"D03");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=2;
+ break;
+ case 'v':strcpy(keyboard_entry->keyname,"D04");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=3;
+ break;
+ case 'V':strcpy(keyboard_entry->keyname,"D04");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=3;
+ break;
+ case 'b':strcpy(keyboard_entry->keyname,"D05");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=3;
+ break;
+ case 'B':strcpy(keyboard_entry->keyname,"D05");
+ keyboard_entry->shift=2;
+ keyboard_entry->finger=3;
+ break;
+ case 'n':strcpy(keyboard_entry->keyname,"D06");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=6;
+ break;
+ case 'N':strcpy(keyboard_entry->keyname,"D06");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=6;
+ break;
+ case 'm':strcpy(keyboard_entry->keyname,"D07");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=6;
+ break;
+ case 'M':strcpy(keyboard_entry->keyname,"D07");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=6;
+ break;
+ case ',':strcpy(keyboard_entry->keyname,"D08");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=7;
+ break;
+ case '<':strcpy(keyboard_entry->keyname,"D08");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=7;
+ break;
+ case '.':strcpy(keyboard_entry->keyname,"D09");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=8;
+ break;
+ case '>':strcpy(keyboard_entry->keyname,"D09");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=8;
+ break;
+ case '/':strcpy(keyboard_entry->keyname,"D10");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=9;
+ break;
+ case '?':strcpy(keyboard_entry->keyname,"D10");
+ keyboard_entry->shift=1;
+ keyboard_entry->finger=9;
+ break;
+ case ' ':strcpy(keyboard_entry->keyname,"E03");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=5;
+ break;
+ default:strcpy(keyboard_entry->keyname,"None");
+ keyboard_entry->shift=0;
+ keyboard_entry->finger=-1;
+ break;
+ }
return 0;
}
void GenerateKeyboard(SDL_Surface* keyboard)
{
- SDL_Surface* tmp = NULL;
- SDL_Rect new;
- int i;
- int col;
- char row;
- int render=1;
- Uint16 t[2];
- TTF_Font* smallfont = NULL;
- DEBUGCODE { printf("Entering GenerateKeyboard\n"); }
- t[1] = '\0';
- smallfont = LoadFont(settings.theme_font_name, 15);
- if(!smallfont)
- {
- DEBUGCODE { printf("Error loading font\n"); }
- return;
- }
- for(i=0;i < num_chars_used;i++)
- {
- render=1;
- new.x=0;
- new.y=0;
- new.w=5;
- new.h=5;
- t[0]=keyboard_list[i].unicode_value;
- sscanf(keyboard_list[i].keyname,"%c%d",&row,&col);
- switch(row)
- {
- case 'A':new.y+=6;new.x+=13;break;
- case 'B':new.y+=36;new.x+=23;break;
- case 'C':new.y+=66;new.x+=33;break;
- case 'D':new.y+=96;new.x+=23;break;
- case 'E':new.y+=126; break;
- default: render=0;break;
- }
- if(!render)
- continue;
- new.x+=31*col;
- if(keyboard_list[i].shift>0)
- {
- new.x-=9;
- if(new.y<9)
- new.y-=5;
- else
- new.y-=9;
- }
- DEBUGCODE { printf("Making %d : %C\n",i,keyboard_list[i].unicode_value); }
- //tmp=BlackOutline_Unicode(t, smallfont, &black);
- tmp=TTF_RenderUNICODE_Blended((TTF_Font*)smallfont, t, black);
- if(tmp==NULL)
- {
- DEBUGCODE { printf("Error Making %d : %C\n",i,keyboard_list[i].unicode_value); }
- }
- SDL_BlitSurface(tmp, NULL, keyboard, &new);
- }
- TTF_CloseFont(smallfont);
- DEBUGCODE { printf("Leaving GenerateKeyboard\n"); }
+ SDL_Surface* tmp = NULL;
+ SDL_Rect new;
+ int i;
+ int col;
+ char row;
+ int render = 1;
+ Uint16 t[2];
+ TTF_Font* smallfont = NULL;
+
+ DEBUGCODE { printf("Entering GenerateKeyboard\n"); }
+
+ if(!keyboard)
+ {
+ DEBUGCODE { printf("Error - keyboard SDL_Surface ptr null\n"); }
+ return;
+ }
+
+ smallfont = LoadFont(settings.theme_font_name, 15);
+ if(!smallfont)
+ {
+ DEBUGCODE { printf("Error loading font\n"); }
+ return;
+ }
+
+ /* to give us a null-terminated string: */
+ t[1] = '\0';
+ /* Draw the unshifted and shifted chars overlying the corresponding key */
+ /* for every entry in keyboard_list[]: */
+ for(i = 0; i < num_chars_used; i++)
+ {
+ render = 1;
+ new.x = 0;
+ new.y = 0;
+ new.w = 5;
+ new.h = 5;
+
+ t[0] = keyboard_list[i].unicode_value;
+ sscanf(keyboard_list[i].keyname,"%c%d",&row,&col);
+
+ switch(row)
+ {
+ case 'A': new.y += 6; new.x += 13; break;
+ case 'B': new.y += 36; new.x += 23; break;
+ case 'C': new.y += 66; new.x += 33; break;
+// case 'D': new.y += 96; new.x += 23; break;
+ case 'D': new.y += 96; new.x += 54; break;
+ case 'E': new.y += 126; break;
+ default: render = 0; break;
+ }
+
+ if(!render)
+ continue;
+
+ new.x += (31 * col);
+
+ if(keyboard_list[i].shift > 0)
+ {
+ new.x -= 9;
+ if(new.y < 9)
+ new.y -= 5;
+ else
+ new.y -= 9;
+ }
+
+ DEBUGCODE { printf("Making %d : %C\n",i,keyboard_list[i].unicode_value); }
+
+ //tmp=BlackOutline_Unicode(t, smallfont, &black);
+ tmp = TTF_RenderUNICODE_Blended((TTF_Font*)smallfont, t, black);
+ if(tmp == NULL)
+ {
+ fprintf(stderr, "Error Making %d : %C\n", i, keyboard_list[i].unicode_value);
+ }
+ else
+ SDL_BlitSurface(tmp, NULL, keyboard, &new);
+ }
+ //Know this is safe - if NULL would have returned above:
+ TTF_CloseFont(smallfont);
+
+ DEBUGCODE { printf("Leaving GenerateKeyboard\n"); }
}
@@ -1356,25 +1391,6 @@
-// /* FIXME this function is currently dead code */
-// /* --- setup the alphabet --- */
-// static void set_letters(char *t)
-// {
-// int i;
-//
-// ALPHABET_SIZE = 0;
-// for (i=0; i<256; i++)
-// ALPHABET[i]=0;
-//
-// for (i=0; i<strlen(t); i++)
-// if (t[i]!=' ') {
-// ALPHABET[(int)t[i]]=1;
-// ALPHABET_SIZE++;
-// }
-// }
-
-
-
/* Checks to see if the argument is already in the list and adds */
/* it if necessary. Returns 1 if char added, 0 if already in list, */
/* -1 if list already up to maximum size: */
More information about the Tux4kids-commits
mailing list