Added application-level Input Method support.

This commit is contained in:
Mark K. Kim 2007-04-22 04:05:23 +00:00
parent 092fd95579
commit f043a733e6
10 changed files with 12902 additions and 85 deletions

View file

@ -73,6 +73,11 @@ LOCALE_PREFIX=$(PKG_ROOT)$(PREFIX)/share/locale
# LOCALE_PREFIX=/usr/share/locale # LOCALE_PREFIX=/usr/share/locale
# IM files
IM_PREFIX=$(PKG_ROOT)$(PREFIX)/share/im
# Built with sound by default (override with "make nosound") # Built with sound by default (override with "make nosound")
NOSOUNDFLAG=__SOUND NOSOUNDFLAG=__SOUND
@ -82,10 +87,12 @@ NOSOUNDFLAG=__SOUND
NOSVGFLAG=__SVG NOSVGFLAG=__SVG
# Maemo flag # Maemo flag
MAEMOFLAG=NO_MAEMOFLAG MAEMOFLAG=NO_MAEMOFLAG
# Where to find cursor shape XBMs # Where to find cursor shape XBMs
MOUSEDIR=mouse MOUSEDIR=mouse
@ -117,7 +124,8 @@ CFLAGS=$(OPTFLAGS) -W -Wall -fno-common -ffloat-store \
DEFS=-DDATA_PREFIX=\"$(DATA_PREFIX)/\" \ DEFS=-DDATA_PREFIX=\"$(DATA_PREFIX)/\" \
-D$(NOSOUNDFLAG) -D$(NOSVGFLAG) -DDOC_PREFIX=\"$(DOC_PREFIX)/\" \ -D$(NOSOUNDFLAG) -D$(NOSVGFLAG) -DDOC_PREFIX=\"$(DOC_PREFIX)/\" \
-DLOCALEDIR=\"$(LOCALE_PREFIX)/\" -DCONFDIR=\"$(CONFDIR)/\" \ -DLOCALEDIR=\"$(LOCALE_PREFIX)/\" -DIMDIR=\"$(IM_PREFIX)/\" \
-DCONFDIR=\"$(CONFDIR)/\" \
-DVER_VERSION=\"$(VER_VERSION)\" \ -DVER_VERSION=\"$(VER_VERSION)\" \
-DVER_DATE=\"$(VER_DATE)\" \ -DVER_DATE=\"$(VER_DATE)\" \
-D$(MAEMOFLAG) -D$(MAEMOFLAG)
@ -211,6 +219,7 @@ beos:
ICON_PREFIX=. \ ICON_PREFIX=. \
X11_ICON_PREFIX=. \ X11_ICON_PREFIX=. \
LOCALE_PREFIX=/boot/home/config/share/locale \ LOCALE_PREFIX=/boot/home/config/share/locale \
IM_PREFIX=./src \
CFLAGS="-O1 -funroll-loops -fomit-frame-pointer -pipe -Wall" \ CFLAGS="-O1 -funroll-loops -fomit-frame-pointer -pipe -Wall" \
RSRC_CMD="xres -o tuxpaint tuxpaint.rsrc" \ RSRC_CMD="xres -o tuxpaint tuxpaint.rsrc" \
MIMESET_CMD="mimeset -f tuxpaint" \ MIMESET_CMD="mimeset -f tuxpaint" \
@ -232,6 +241,7 @@ win32:
ICON_PREFIX=. \ ICON_PREFIX=. \
X11_ICON_PREFIX=. \ X11_ICON_PREFIX=. \
LOCALE_PREFIX=$(PREFIX)/share/locale \ LOCALE_PREFIX=$(PREFIX)/share/locale \
IM_PREFIX=$(PREFIX)/share/tuxpaint/im \
CONFDIR=$(PREFIX)/etc/tuxpaint \ CONFDIR=$(PREFIX)/etc/tuxpaint \
ARCH_LINKS="-lintl -lpng12 -lwinspool -lshlwapi" \ ARCH_LINKS="-lintl -lpng12 -lwinspool -lshlwapi" \
ARCH_HEADERS="src/win32_print.h" \ ARCH_HEADERS="src/win32_print.h" \
@ -253,7 +263,7 @@ nokia770:
# to do this as superuser ("root")) # to do this as superuser ("root"))
install: install-bin install-data install-man install-doc \ install: install-bin install-data install-man install-doc \
install-icon install-gettext install-importscript \ install-icon install-gettext install-im install-importscript \
install-default-config install-example-stamps \ install-default-config install-example-stamps \
install-example-starters \ install-example-starters \
install-gnome install-kde install-kde-icons install-gnome install-kde install-kde-icons
@ -278,7 +288,7 @@ install: install-bin install-data install-man install-doc \
# Installs the various parts for the MinGW/MSYS development/testing environment. # Installs the various parts for the MinGW/MSYS development/testing environment.
install-private-win32: install-bin install-data install-man install-doc \ install-private-win32: install-bin install-data install-man install-doc \
install-gettext install-importscript \ install-gettext install-im install-importscript \
install-default-config install-example-stamps \ install-default-config install-example-stamps \
install-example-starters install-example-starters
@echo @echo
@ -302,7 +312,7 @@ install-private-win32: install-bin install-data install-man install-doc \
# Installs the various parts for the MinGW/MSYS development/testing environment. # Installs the various parts for the MinGW/MSYS development/testing environment.
bdist-private-win32: install-bin install-data install-doc \ bdist-private-win32: install-bin install-data install-doc \
install-gettext install-dlls\ install-gettext install-im install-dlls\
install-example-stamps install-example-starters install-example-stamps install-example-starters
@echo @echo
@echo "--------------------------------------------------------------" @echo "--------------------------------------------------------------"
@ -327,6 +337,7 @@ install-beos:
ICON_PREFIX=. \ ICON_PREFIX=. \
X11_ICON_PREFIX=. \ X11_ICON_PREFIX=. \
LOCALE_PREFIX=/boot/home/config/share/locale \ LOCALE_PREFIX=/boot/home/config/share/locale \
IM_PREFIX=./src \
CFLAGS="-O1 -funroll-loops -fomit-frame-pointer -pipe -Wall" \ CFLAGS="-O1 -funroll-loops -fomit-frame-pointer -pipe -Wall" \
RSRC_CMD="xres -o tuxpaint tuxpaint.rsrc" \ RSRC_CMD="xres -o tuxpaint tuxpaint.rsrc" \
MIMESET_CMD="mimeset -f tuxpaint" \ MIMESET_CMD="mimeset -f tuxpaint" \
@ -348,6 +359,7 @@ install-win32:
ICON_PREFIX=. \ ICON_PREFIX=. \
X11_ICON_PREFIX=. \ X11_ICON_PREFIX=. \
LOCALE_PREFIX=$(PREFIX)/share/locale \ LOCALE_PREFIX=$(PREFIX)/share/locale \
IM_PREFIX=$(PREFIX)/share/tuxpaint/im \
CONFDIR=$(PREFIX)/etc/tuxpaint \ CONFDIR=$(PREFIX)/etc/tuxpaint \
# "make bdist-win32" recompiles Tux Paint to work with executable-relative # "make bdist-win32" recompiles Tux Paint to work with executable-relative
@ -363,6 +375,7 @@ bdist-win32:
DATA_PREFIX=data \ DATA_PREFIX=data \
DOC_PREFIX=docs \ DOC_PREFIX=docs \
LOCALE_PREFIX=locale \ LOCALE_PREFIX=locale \
IM_PREFIX=im \
ARCH_LINKS="-lintl -lpng12 -lwinspool -lshlwapi" \ ARCH_LINKS="-lintl -lpng12 -lwinspool -lshlwapi" \
ARCH_HEADERS="src/win32_print.h" \ ARCH_HEADERS="src/win32_print.h" \
ARCH_LIBS="obj/win32_print.o obj/resource.o" ARCH_LIBS="obj/win32_print.o obj/resource.o"
@ -374,6 +387,7 @@ bdist-win32:
DATA_PREFIX=./visualc/bdist/data \ DATA_PREFIX=./visualc/bdist/data \
DOC_PREFIX=./visualc/bdist/docs \ DOC_PREFIX=./visualc/bdist/docs \
LOCALE_PREFIX=./visualc/bdist/locale \ LOCALE_PREFIX=./visualc/bdist/locale \
IM_PREFIX=./visualc/bdist/im \
# "make bdist-clean" deletes the 'bdist' directory # "make bdist-clean" deletes the 'bdist' directory
bdist-clean: bdist-clean:
@ -495,6 +509,8 @@ uninstall:
-rm $(LOCALE_PREFIX)/xh/LC_MESSAGES/tuxpaint.mo -rm $(LOCALE_PREFIX)/xh/LC_MESSAGES/tuxpaint.mo
-rm $(LOCALE_PREFIX)/zh_CN/LC_MESSAGES/tuxpaint.mo -rm $(LOCALE_PREFIX)/zh_CN/LC_MESSAGES/tuxpaint.mo
-rm $(LOCALE_PREFIX)/zh_TW/LC_MESSAGES/tuxpaint.mo -rm $(LOCALE_PREFIX)/zh_TW/LC_MESSAGES/tuxpaint.mo
-rm $(IM_PREFIX)/ja.im
-rm $(IM_PREFIX)/ko.im
-rm -f -r $(CONFDIR) -rm -f -r $(CONFDIR)
@ -1037,6 +1053,29 @@ install-gettext:
@chmod 644 $(LOCALE_PREFIX)/xh/LC_MESSAGES/tuxpaint.mo @chmod 644 $(LOCALE_PREFIX)/xh/LC_MESSAGES/tuxpaint.mo
# Install the Input Method files:
ifneq ($(IM_PREFIX),)
install-im:
@echo
@echo "...Installing Input Method files..."
@#
@install -d $(IM_PREFIX)
@#
@echo " ja ...Japanese..."
@cp im/ja.im $(IM_PREFIX)/ja.im
@chmod 644 $(IM_PREFIX)/ja.im
@#
@echo " ko ...Korean..."
@cp im/ko.im $(IM_PREFIX)/ko.im
@chmod 644 $(IM_PREFIX)/ko.im
else
install-im:
@echo
@echo "...Not Installing Input Method files (no IM_PREFIX defined)..."
endif
# Install the text documentation: # Install the text documentation:
install-doc: install-doc:
@ -1073,7 +1112,7 @@ install-man:
# Build the program! # Build the program!
tuxpaint: obj/tuxpaint.o obj/i18n.o obj/cursor.o obj/pixels.o \ tuxpaint: obj/tuxpaint.o obj/i18n.o obj/im.o obj/cursor.o obj/pixels.o \
obj/floodfill.o obj/rgblinear.o obj/playsound.o obj/fonts.o \ obj/floodfill.o obj/rgblinear.o obj/playsound.o obj/fonts.o \
obj/progressbar.o obj/dirwalk.o obj/get_fname.o \ obj/progressbar.o obj/dirwalk.o obj/get_fname.o \
$(HQXX_O) $(ARCH_LIBS) $(HQXX_O) $(ARCH_LIBS)
@ -1093,7 +1132,7 @@ tuxpaint: obj/tuxpaint.o obj/i18n.o obj/cursor.o obj/pixels.o \
# Build the object for the program! # Build the object for the program!
obj/tuxpaint.o: src/tuxpaint.c \ obj/tuxpaint.o: src/tuxpaint.c \
src/i18n.h src/cursor.h src/pixels.h \ src/i18n.h src/im.h src/cursor.h src/pixels.h \
src/floodfill.h src/rgblinear.h src/playsound.h src/fonts.h \ src/floodfill.h src/rgblinear.h src/playsound.h src/fonts.h \
src/progressbar.h src/dirwalk.h src/get_fname.h \ src/progressbar.h src/dirwalk.h src/get_fname.h \
src/compiler.h src/debug.h \ src/compiler.h src/debug.h \
@ -1125,6 +1164,12 @@ obj/i18n.o: src/i18n.c src/i18n.h src/debug.h
@$(CC) $(CFLAGS) $(DEBUG_FLAGS) $(DEFS) \ @$(CC) $(CFLAGS) $(DEBUG_FLAGS) $(DEFS) \
-c src/i18n.c -o obj/i18n.o -c src/i18n.c -o obj/i18n.o
obj/im.o: src/im.c src/im.h src/debug.h
@echo
@echo "...Compiling IM support..."
@$(CC) $(CFLAGS) $(DEBUG_FLAGS) $(SDL_CFLAGS) $(DEFS) \
-c src/im.c -o obj/im.o
obj/get_fname.o: src/get_fname.c src/get_fname.h src/debug.h obj/get_fname.o: src/get_fname.c src/get_fname.h src/debug.h
@echo @echo
@echo "...Compiling filename support..." @echo "...Compiling filename support..."

View file

@ -32,6 +32,9 @@ $Id$
Bilinear interpolation code based on an example by Christian Graus Bilinear interpolation code based on an example by Christian Graus
( http://www.codeproject.com/cs/media/imageprocessing4.asp ). ( http://www.codeproject.com/cs/media/imageprocessing4.asp ).
Input Method (IM) Framework and Korean/Japanese IM implemented by:
Mark K. Kim <mkkim214@gmail.com>
* Graphics * Graphics

View file

@ -9,10 +9,15 @@ http://www.newbreedsoftware.com/tuxpaint/
$Id$ $Id$
2007.April.6 (0.9.17) 2007.April.21 (0.9.17)
* Tool Improvements: * Tool Improvements:
------------------ ------------------
* Input Method Framework, with implementations of Korean (Hangul 2-Bul)
and Japanese (Romanized Hiragana and Katakana) input methods. Should
be extensible to other languages.
Mark K. Kim <mkkim214@gmail.com>
* Stamps now supports SVG vector-based graphics! (Via Cairo library) * Stamps now supports SVG vector-based graphics! (Via Cairo library)
(Only SVG versions of stamps are loaded, when both PNG and SVG (Only SVG versions of stamps are loaded, when both PNG and SVG
variations are found.) variations are found.)
@ -412,7 +417,7 @@ $Id$
* Source files and documentation files tagged with CVS Id tags * Source files and documentation files tagged with CVS Id tags
for easier version tracking. for easier version tracking.
Mark K. Kim <tuxNO_SOLICITATIONpaint-dev@cbreak.org> Mark K. Kim <mkkim214@gmail.com>
* Locale update: * Locale update:
-------------- --------------
@ -867,7 +872,7 @@ $Id$
TOYAMA Shin-ichi <shin1@wmail.plala.or.jp> TOYAMA Shin-ichi <shin1@wmail.plala.or.jp>
* Korean * Korean
Mark K. Kim <tuxNO_SOLICITATIONpaint-dev@cbreak.org> Mark K. Kim <mkkim214@gmail.com>
* Lithuanian * Lithuanian
Gintaras Go?tautas <gintaras@nes.lt> Gintaras Go?tautas <gintaras@nes.lt>
@ -994,7 +999,7 @@ $Id$
Bill Kendrick <bill@newbreedsoftware.com> Bill Kendrick <bill@newbreedsoftware.com>
* Korean README.txt documentation added, in both EUC-KR and UTF-8 formats. * Korean README.txt documentation added, in both EUC-KR and UTF-8 formats.
Mark K. Kim <tuxNO_SOLICITATIONpaint-dev@cbreak.org> Mark K. Kim <mkkim214@gmail.com>
* Serbian translation created. * Serbian translation created.
Aleksandar Jelenak <jelenak@netlinkplus.net> Aleksandar Jelenak <jelenak@netlinkplus.net>
@ -1062,7 +1067,7 @@ $Id$
TOYAMA Shin-ichi <shin1@wmail.plala.or.jp> TOYAMA Shin-ichi <shin1@wmail.plala.or.jp>
* Updated Korean translation. * Updated Korean translation.
Mark K. Kim <tuxNO_SOLICITATIONpaint-dev@cbreak.org> Mark K. Kim <mkkim214@gmail.com>
* Updated Malay translation. * Updated Malay translation.
Muhammad Najmi Ahmad Zabidi <mnajem@linuxmail.org> Muhammad Najmi Ahmad Zabidi <mnajem@linuxmail.org>
@ -1144,7 +1149,7 @@ $Id$
John Popplewell <john@johnnypops.demon.co.uk> John Popplewell <john@johnnypops.demon.co.uk>
* Updated Makefile for easier install. * Updated Makefile for easier install.
Mark K. Kim <tuxNO_SOLICITATIONpaint-dev@cbreak.org> Mark K. Kim <mkkim214@gmail.com>
* Cleaned up desktop entry file. * Cleaned up desktop entry file.
Karl Ove Hufthammer <karl@huftis.org> Karl Ove Hufthammer <karl@huftis.org>
@ -1176,7 +1181,7 @@ $Id$
Mark K. Kim & John Popplewell Mark K. Kim & John Popplewell
* Fixed security issue with permissions to Tux Paint docs directory. * Fixed security issue with permissions to Tux Paint docs directory.
Mark K. Kim <tuxNO_SOLICITATIONpaint-dev@cbreak.org> Mark K. Kim <mkkim214@gmail.com>
* Fixed 'savedir' bug. (Was dropping filenames) * Fixed 'savedir' bug. (Was dropping filenames)
@ -1357,7 +1362,7 @@ $Id$
* Right-to-left language support (for Hebrew, for example). * Right-to-left language support (for Hebrew, for example).
* Updated Korean translations. * Updated Korean translations.
Mark K. Kim <tuxNO_SOLICITATIONpaint-dev@cbreak.org> Mark K. Kim <mkkim214@gmail.com>
* UTF-8 support in the Text Tool! * UTF-8 support in the Text Tool!
Robert Glowczynski <robertg@software.com.pl>, Robert Glowczynski <robertg@software.com.pl>,
@ -1636,7 +1641,7 @@ $Id$
* UTF-8 support working. * UTF-8 support working.
* Korean translation completed! * Korean translation completed!
Mark K. Kim <tuxNO_SOLICITATIONpaint-dev@cbreak.org> Mark K. Kim <mkkim214@gmail.com>
* Fixed errors in 'uninstall' target in Makefile * Fixed errors in 'uninstall' target in Makefile
@ -1694,7 +1699,7 @@ $Id$
Török Gábor <gabo@linuxmania.hu> Török Gábor <gabo@linuxmania.hu>
* Partly translated to Korean. PO file in an unusable charset, though... * Partly translated to Korean. PO file in an unusable charset, though...
Mark K. Kim <tuxNO_SOLICITATIONpaint-dev@cbreak.org> Mark K. Kim <mkkim214@gmail.com>
* Supports locale-specific fonts for languages that need Unicode. * Supports locale-specific fonts for languages that need Unicode.
e.g., Korean will use "ko.ttf", if found, for translated strings. e.g., Korean will use "ko.ttf", if found, for translated strings.

188
im/ja.im Normal file
View file

@ -0,0 +1,188 @@
##############################################################################
# Japanese IM Character Map
#
# $Id$
# Hiragana
section
3041 xa -
3042 a -
3043 xi -
3044 i -
3045 xu -
3046 u -
3047 xe -
3048 e -
3049 xo -
304A o -
304B ka -
304C ga -
304D ki -
304E gi -
304F ku -
3050 gu -
3051 ke -
3052 ge -
3053 ko -
3054 go -
3055 sa -
3056 za -
3057 si -
3058 zi -
3059 su -
305A zu -
305B se -
305C ze -
305D so -
305E zo -
305F ta -
3060 da -
3061 ti -
3062 di -
3063 xtu -
3064 tu -
3065 du -
3066 te -
3067 de -
3068 to -
3069 do -
306A na -
306B ni -
306C nu -
306D ne -
306E no -
306F ha -
3070 ba -
3071 pa -
3072 hi -
3073 bi -
3074 pi -
3075 hu -
3076 bu -
3077 pu -
3078 he -
3079 be -
307A pe -
307B ho -
307C bo -
307D po -
307E ma -
307F mi -
3080 mu -
3081 me -
3082 mo -
3083 xya -
3084 ya -
3085 xyu -
3086 yu -
3087 xyo -
3088 yo -
3089 ra -
308A ri -
308B ru -
308C re -
308D ro -
308E xwa -
308F wa -
3090 wi -
3091 we -
3092 wo -
3093 n -
# Katakana
section
30A1 xa -
30A2 a -
30A3 xi -
30A4 i -
30A5 xu -
30A6 u -
30A7 xe -
30A8 e -
30A9 xo -
30AA o -
30AB ka -
30AC ga -
30AD ki -
30AE gi -
30AF ku -
30B0 gu -
30B1 ke -
30B2 ge -
30B3 ko -
30B4 go -
30B5 sa -
30B6 za -
30B7 si -
30B8 zi -
30B9 su -
30BA zu -
30BB se -
30BC ze -
30BD so -
30BE zo -
30BF ta -
30C0 da -
30C1 ti -
30C2 di -
30C3 xtu -
30C4 tu -
30C5 du -
30C6 te -
30C7 de -
30C8 to -
30C9 do -
30CA na -
30CB ni -
30CC nu -
30CD ne -
30CE no -
30CF ha -
30D0 ba -
30D1 pa -
30D2 hi -
30D3 bi -
30D4 pi -
30D5 hu -
30D6 bu -
30D7 pu -
30D8 he -
30D9 be -
30DA pe -
30DB ho -
30DC bo -
30DD po -
30DE ma -
30DF mi -
30E0 mu -
30E1 me -
30E2 mo -
30E3 xya -
30E4 ya -
30E5 xyu -
30E6 yu -
30E7 xyo -
30E8 yo -
30E9 ra -
30EA ri -
30EB ru -
30EC re -
30ED ro -
30EE xwa -
30EF wa -
30F0 wi -
30F1 we -
30F2 wo -
30F3 n -
30F4 vu -
30F5 xka -
30F6 xke -
30F7 va -
30F8 vi -
30F9 ve -
30FA vo -
30FB . -
30FC - -

11222
im/ko.im Normal file

File diff suppressed because it is too large Load diff

View file

@ -35,12 +35,33 @@
#include "i18n.h" #include "i18n.h"
#include "debug.h" #include "debug.h"
#ifdef WIN32 #ifdef WIN32
#include <sys/types.h> #include <sys/types.h>
#endif #endif
/* (Trouble building this for 10.2.8 target; bjk & mf 2006.01.14) */
#ifndef __APPLE_10_2_8__
#include <wchar.h>
#else
#undef FORKED_FONTS
#define wchar_t char
#define wcslen strlen
#define towupper toupper
#define iswprint isprint
#define OLD_UPPERCASE_CODE
#endif
#ifndef OLD_UPPERCASE_CODE
#include <wctype.h>
#endif
/* Globals: */ /* Globals: */
static int langint = LANG_EN;
const char *lang_prefixes[NUM_LANGS] = { const char *lang_prefixes[NUM_LANGS] = {
"af", "af",
"ar", "ar",
@ -279,9 +300,9 @@ void set_langstr(const char *s)
void ctype_utf8(void) void ctype_utf8(void)
{ {
#ifndef _WIN32 #ifndef _WIN32
char *names[] = {"en_US.UTF8","en_US.UTF-8","UTF8","UTF-8",}; const char *names[] = {"en_US.UTF8","en_US.UTF-8","UTF8","UTF-8",};
int i = sizeof(names)/sizeof(names[0]); int i = sizeof(names)/sizeof(names[0]);
while(i-- && !iswprint((wchar_t)0xf7) && !setlocale(LC_CTYPE,names[i])) while(i && !iswprint((wchar_t)0xf7) && !setlocale(LC_CTYPE,names[--i]))
; ;
#endif #endif
} }
@ -291,7 +312,7 @@ void ctype_utf8(void)
void set_current_language(void) void set_current_language(void)
{ {
char *loc; char *loc;
int lang, i, found; int i, found;
bindtextdomain("tuxpaint", LOCALEDIR); bindtextdomain("tuxpaint", LOCALEDIR);
/* Old version of glibc does not have bind_textdomain_codeset() */ /* Old version of glibc does not have bind_textdomain_codeset() */
@ -302,7 +323,7 @@ void set_current_language(void)
/* Default... */ /* Default... */
lang = LANG_EN; langint = LANG_EN;
#ifndef WIN32 #ifndef WIN32
@ -343,24 +364,30 @@ void set_current_language(void)
// Case-insensitive (both "pt_BR" and "pt_br" work, etc.) // Case-insensitive (both "pt_BR" and "pt_br" work, etc.)
if (strncasecmp(loc, lang_prefixes[i], strlen(lang_prefixes[i])) == 0) if (strncasecmp(loc, lang_prefixes[i], strlen(lang_prefixes[i])) == 0)
{ {
lang = i; langint = i;
found = 1; found = 1;
} }
} }
} }
lang_prefix = lang_prefixes[lang]; lang_prefix = lang_prefixes[langint];
need_own_font = search_int_array(lang, lang_use_own_font); need_own_font = search_int_array(langint, lang_use_own_font);
need_right_to_left = search_int_array(lang, lang_use_right_to_left); need_right_to_left = search_int_array(langint, lang_use_right_to_left);
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: Language is %s (%d)\n", lang_prefix, lang); fprintf(stderr, "DEBUG: Language is %s (%d)\n", lang_prefix, langint);
fflush(stderr); fflush(stderr);
#endif #endif
} }
int get_current_language(void)
{
return langint;
}
/* FIXME: All this should REALLY be array-based!!! */ /* FIXME: All this should REALLY be array-based!!! */
/* Show available languages: */ /* Show available languages: */
void show_lang_usage(FILE * f, const char *const prg) void show_lang_usage(FILE * f, const char *const prg)
@ -586,6 +613,7 @@ void setup_language(const char *const prg)
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
ctype_utf8(); ctype_utf8();
free(langstr); free(langstr);
langstr = NULL;
} }
set_current_language(); set_current_language();

View file

@ -15,6 +15,10 @@
#ifndef I18N_H #ifndef I18N_H
#define I18N_H
#include <stdio.h>
/* Possible languages: */ /* Possible languages: */
@ -118,6 +122,7 @@ extern const language_to_locale_struct language_to_locale_array[];
void set_langstr(const char *s); void set_langstr(const char *s);
void set_current_language(void); void set_current_language(void);
int get_current_language(void);
void show_lang_usage(FILE * f, const char *const prg); void show_lang_usage(FILE * f, const char *const prg);
void show_locale_usage(FILE * f, const char *const prg); void show_locale_usage(FILE * f, const char *const prg);
void setup_language(const char *const prg); void setup_language(const char *const prg);

1230
src/im.c Normal file

File diff suppressed because it is too large Load diff

63
src/im.h Normal file
View file

@ -0,0 +1,63 @@
/*
im.h
Input method handling
Copyright (c) 2007 by Mark K. Kim and others
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
$Id$
*/
#ifndef TUXPAINT_IM_H
#define TUXPAINT_IM_H
#include "SDL.h"
#include "i18n.h"
/* ***************************************************************************
* TYPES
*/
typedef struct IM_DATA {
int lang; /* Language used in sequence translation */
wchar_t s[8]; /* Characters that should be displayed */
const char* tip_text; /* Tip text, read-only please */
/* For use by language-specific im_event_<lang> calls. PRIVATE! */
wchar_t buf[8]; /* Buffered characters */
int discard; /* Discard parameter */
int request; /* Event request */
} IM_DATA;
/* ***************************************************************************
* FUNCTIONS
*/
void im_init(IM_DATA* im, int lang); /* Initialize IM */
void im_fullreset(IM_DATA* im); /* Full Reset IM */
void im_softreset(IM_DATA* im); /* Soft Reset IM */
void im_free(IM_DATA* im); /* Free IM resources */
int im_read(IM_DATA* im, SDL_keysym ks);
#endif /* TUXPAINT_IM_H */
/* vim:ts=8
*/

View file

@ -391,6 +391,8 @@ typedef struct safer_dirent
#include "tip_tux.h" #include "tip_tux.h"
#include "great.h" #include "great.h"
#include "im.h"
#ifdef DEBUG_MALLOC #ifdef DEBUG_MALLOC
#include "malloc.c" #include "malloc.c"
@ -1045,6 +1047,7 @@ static int eraser_scroll, shape_scroll; // dummy variables for now
static int eraser_sound; static int eraser_sound;
static IM_DATA im_data;
static wchar_t texttool_str[256]; static wchar_t texttool_str[256];
static unsigned int texttool_len; static unsigned int texttool_len;
@ -1802,6 +1805,9 @@ static void mainloop(void)
if (cur_tool == TOOL_TEXT && cursor_x != -1 && cursor_y != -1) if (cur_tool == TOOL_TEXT && cursor_x != -1 && cursor_y != -1)
{ {
static int discard = 0;
wchar_t* im_cp = im_data.s;
key_down = key; key_down = key;
key_unicode = event.key.keysym.unicode; key_unicode = event.key.keysym.unicode;
@ -1829,81 +1835,102 @@ static void mainloop(void)
#endif #endif
#endif #endif
if (key_down == SDLK_BACKSPACE) /* Discard previous # of instructed characters */
{ if((int)texttool_len <= discard) texttool_len = 0;
hide_blinking_cursor(); else texttool_len -= discard;
if (texttool_len > 0) texttool_str[texttool_len] = L'\0';
{
texttool_len--;
texttool_str[texttool_len] = 0;
playsound(screen, 0, SND_KEYCLICK, 0, SNDPOS_CENTER,
SNDDIST_NEAR);
do_render_cur_text(0); /* Read IM, remember how many to discard next iteration */
discard = im_read(&im_data, event.key.keysym);
/* Queue each character to be displayed */
while(*im_cp) {
if (*im_cp == L'\b')
{
hide_blinking_cursor();
if (texttool_len > 0)
{
texttool_len--;
texttool_str[texttool_len] = 0;
playsound(screen, 0, SND_KEYCLICK, 0, SNDPOS_CENTER,
SNDDIST_NEAR);
do_render_cur_text(0);
}
} }
} else if (*im_cp == L'\r')
else if (key_down == SDLK_RETURN)
{
int font_height;
hide_blinking_cursor();
if (texttool_len > 0)
{ {
rec_undo_buffer(); int font_height;
do_render_cur_text(1);
texttool_len = 0; hide_blinking_cursor();
cursor_textwidth = 0; if (texttool_len > 0)
{
rec_undo_buffer();
do_render_cur_text(1);
texttool_len = 0;
cursor_textwidth = 0;
}
font_height = TTF_FontHeight(getfonthandle(cur_font));
cursor_x = cursor_left;
cursor_y = min(cursor_y + font_height, canvas->h - font_height);
playsound(screen, 0, SND_RETURN, 1, SNDPOS_RIGHT, SNDDIST_NEAR);
im_softreset(&im_data);
} }
font_height = TTF_FontHeight(getfonthandle(cur_font)); else if (*im_cp == L'\t')
cursor_x = cursor_left;
cursor_y = min(cursor_y + font_height, canvas->h - font_height);
playsound(screen, 0, SND_RETURN, 1, SNDPOS_RIGHT, SNDDIST_NEAR);
}
else if (key_down == SDLK_TAB)
{
if (texttool_len > 0)
{ {
rec_undo_buffer(); if (texttool_len > 0)
do_render_cur_text(1); {
cursor_x = min(cursor_x + cursor_textwidth, canvas->w); rec_undo_buffer();
texttool_len = 0; do_render_cur_text(1);
cursor_textwidth = 0; cursor_x = min(cursor_x + cursor_textwidth, canvas->w);
texttool_len = 0;
cursor_textwidth = 0;
}
im_softreset(&im_data);
} }
} else if (iswprint(*im_cp))
else if (iswprint(key_unicode))
{
if (texttool_len < (sizeof(texttool_str) / sizeof(wchar_t)) - 1)
{ {
int old_cursor_textwidth = cursor_textwidth; if (texttool_len < (sizeof(texttool_str) / sizeof(wchar_t)) - 1)
{
int old_cursor_textwidth = cursor_textwidth;
#ifdef DEBUG #ifdef DEBUG
wprintf(L" key = <%c>\nunicode = <%lc> 0x%04x %d\n\n", wprintf(L" key = <%c>\nunicode = <%lc> 0x%04x %d\n\n",
key_down, key_unicode, key_unicode, key_unicode); key_down, key_unicode, key_unicode, key_unicode);
#endif #endif
texttool_str[texttool_len++] = key_unicode; texttool_str[texttool_len++] = *im_cp;
texttool_str[texttool_len] = 0; texttool_str[texttool_len] = 0;
do_render_cur_text(0); do_render_cur_text(0);
if (cursor_x + old_cursor_textwidth <= canvas->w - 50 && if (cursor_x + old_cursor_textwidth <= canvas->w - 50 &&
cursor_x + cursor_textwidth > canvas->w - 50) cursor_x + cursor_textwidth > canvas->w - 50)
{ {
playsound(screen, 0, SND_KEYCLICKRING, 1, SNDPOS_RIGHT, playsound(screen, 0, SND_KEYCLICKRING, 1, SNDPOS_RIGHT,
SNDDIST_NEAR); SNDDIST_NEAR);
} }
else else
{ {
/* FIXME: Might be fun to position the /* FIXME: Might be fun to position the
sound based on keyboard layout...? */ sound based on keyboard layout...? */
playsound(screen, 0, SND_KEYCLICK, 0, SNDPOS_CENTER, playsound(screen, 0, SND_KEYCLICK, 0, SNDPOS_CENTER,
SNDDIST_NEAR); SNDDIST_NEAR);
} }
}
} }
im_cp++;
} /* while(*im_cp) */
/* Show IM tip text */
if(im_data.tip_text) {
draw_tux_text(TUX_DEFAULT, im_data.tip_text, 1);
} }
} }
} }
} }
@ -6461,6 +6488,7 @@ static void setup(int argc, char *argv[])
setup_language(getfilename(argv[0])); setup_language(getfilename(argv[0]));
im_init(&im_data, get_current_language());
#ifndef WIN32 #ifndef WIN32