diff --git a/ChangeLog b/ChangeLog index c2f8e4b..fd5920f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,14 @@ Version 0.0.2: name changed to spOSMroute, since on there had been another OSMroute already. ============================================================================= +(2013-06-09): +- fixed: utf8 will now also work in gui entry, delete and cursor movement + is also working now. + +- fixed: changing map data location is working fine. + +- fixed: on reloading the map, no need to change scale to draw the map. + (2013-06-06): - fixed: utf8 will be displayed on OpenGL and OpenGLES devices correctly. diff --git a/base/utf8.c b/base/utf8.c index 26a54ed..3ff99de 100644 --- a/base/utf8.c +++ b/base/utf8.c @@ -1,4 +1,4 @@ -/* $Id: utf8.c,v 1.2 2013/06/06 21:53:06 steffen Exp $ */ +/* $Id: utf8.c,v 1.3 2013/06/09 20:11:30 steffen Exp $ */ /* utf8.c * Copyright (C) Steffen Pohle 2013 * @@ -22,6 +22,67 @@ #include "system.h" #include "utf8.h" + +/* + * 84218421 84218421 84218421 84218421 + * ----------------------------------- + * 00000000 00000000 00000000 0aaaaaaa = FF FF FF 80 > 0 + * 00000000 00000000 00000bbb bbaaaaaa = FF FF F8 00 > 1 + * 00000000 00000000 ccccbbbb bbaaaaaa = FF FF 00 00 > 2 + * 00000000 000dddcc ccccbbbb bbaaaaaa = FF E0 00 00 > 3 + * 000000ee ddddddcc ccccbbbb bbaaaaaa = FC 00 00 00 > 4 + * 0feeeeee ddddddcc ccccbbbb bbaaaaaa > 5 + */ + + +void u8_encode (char *dest, uint32_t key) { + uint8_t maskor = 0; + uint8_t maskand = 0; + int blocks = 0; + + if ((key & 0xFFFFFF80) == 0) { + blocks = 0; + maskand = 0x7F; + maskor = 0x00; + } + else if ((key & 0xFFFFF800) == 0) { + blocks = 1; + maskand = 0x1F; + maskor = 0xC0; + } + else if ((key & 0xFFFF0000) == 0) { + blocks = 2; + maskand = 0x0F; + maskor = 0xE0; + } + else if ((key & 0xFFE00000) == 0) { + blocks = 3; + maskand = 0x07; + maskor = 0xF0; + } + else if ((key & 0xFC000000) == 0) { + blocks = 4; + maskand = 0x03; + maskor = 0xF8; + } + else { + blocks = 5; + maskand = 0x01; + maskor = 0xFC; + } + + dest[blocks+1] = 0; + while (blocks>0) { + dest[blocks] = (uint8_t)((key & 0x3F) | 0x80); + key = key >> 6; + blocks--; + } + + *dest = (key & maskand) | maskor; +}; + + + uint32_t u8_decode (char *str, int *charsize) { uint32_t chr = 0; int block = 0; @@ -55,11 +116,11 @@ uint32_t u8_decode (char *str, int *charsize) { } else { /* error: no valid code */ - *charsize = 0; + if (charsize != NULL) *charsize = 0; return 0; } - *charsize = block+1; /* return size in bytes for utf8 char */ + if (charsize != NULL) *charsize = block+1; /* return size in bytes for utf8 char */ str++; for (;block > 0; block--) { @@ -84,7 +145,10 @@ int u8_strlen (char *str) { int bytelen = strlen (str); for (cnt = 0, i = 0; i < bytelen;) { - u8_decode (str+i, &j); + if (u8_decode (str+i, &j) == 0) { + d_printf ("u8_strlen: something went wrong. str:%s i:%d str+i:%s", str, i, str+i); + return 0; + } cnt++; i += j; } @@ -93,4 +157,82 @@ int u8_strlen (char *str) { }; -void u8_strcpy (char *dest, char *src, int pos, int size); +void u8_strcpy (char *dest, char *src, int pos, int len) { + int curpos = 0; + int size = 0; + + while (*src != 0 && curpos < pos+len) { + u8_decode (src, &size); + if (curpos >= pos) { + memcpy (dest, src, size); + dest += size; + } + curpos++; + src += size; + } + *dest = 0; +}; + + +void u8_strncat (char *dest, int size, char *src) { + int len; + len = strlen (src)+1; + + if (len + strlen(dest) > size) + len = size - strlen(dest) - 1; + memcpy (dest+strlen(dest), src, len); + dest[size-1] = 0; +}; + + +void u8_strdel (char *str, int start, int len) { + int curpos = 0; + char *nstr = str; + int slen = u8_strlen (str); + int size = 0; + int clen = strlen (str); + + while (*nstr != 0 && curpos < slen) { + u8_decode (nstr, &size); + if (curpos >= start && curpos < start+len) memmove (nstr, nstr+size, clen-(nstr-str)); + else nstr += size; + curpos++; + } + *nstr = 0; +}; + + +void u8_strninsert (char *str, int size, char *text, int pos) { + char *nstr = str; + int curpos = 0; + int chrsize = 0; + int len = u8_strlen (str); + int clen = strlen (str); + + while (curpos <= len && curpos <= pos) { // no need to move + if (curpos == pos) { + int cnt = strlen (text); + + if (nstr-str + cnt >= size) { + memcpy (nstr, text, size-(nstr-str)-1); + str[size-1] = 0; + break; + } + else if (clen + strlen(text) >= size) { // need to move only part + memmove (nstr+cnt, nstr, size-(nstr-str)-strlen(text)); + str[size-1] = 0; + } + else { // no overrun + memmove (nstr+cnt, nstr, clen-(nstr-str)); + str[clen+cnt] = 0; + } + memcpy (nstr, text, strlen(text)); + + break; + } + u8_decode (nstr, &chrsize); + curpos++; + nstr += chrsize; + } +}; + diff --git a/base/utf8.h b/base/utf8.h index 73ea22f..64064a6 100644 --- a/base/utf8.h +++ b/base/utf8.h @@ -1,4 +1,4 @@ -/* $Id: utf8.h,v 1.2 2013/06/06 21:53:07 steffen Exp $ */ +/* $Id: utf8.h,v 1.3 2013/06/09 20:11:30 steffen Exp $ */ /* utf8.h * Copyright (C) Steffen Pohle 2013 * @@ -22,8 +22,13 @@ #include uint32_t u8_decode (char *str, int *size); +void u8_encode (char *dest, uint32_t key); + int u8_strlen (char *str); -void u8_strcpy (char *dest, char *src, int pos, int size); +void u8_strcpy (char *dest, char *src, int pos, int len); +void u8_strncat (char *dest, int size, char *src); +void u8_strdel (char *str, int start, int len); +void u8_strninsert (char *str, int size, char *text, int pos); #endif diff --git a/gui/gui.h b/gui/gui.h index 54d9b1f..a8a3305 100644 --- a/gui/gui.h +++ b/gui/gui.h @@ -61,9 +61,16 @@ enum { #define WGUI_S_MODAL 0x0100 +#define GUIKEY_UP 0x0111 +#define GUIKEY_DOWN 0x0112 +#define GUIKEY_RIGHT 0x0113 +#define GUIKEY_LEFT 0x0114 + + struct _GUIEvent_ { int event; - uint32_t keyval; // needed for utf8 (max was 32bit?) + uint16_t key; // the key which was pressed + uint32_t keychar; // the utf char for this key iPoint scr_mpos; // mousepos on screen iPoint guiwin_mpos; // mousepos on gui (setup from gui_event) int mousebtn; @@ -155,7 +162,7 @@ struct _GUISoftkeyboard_ { struct image *screen; int last_col; int last_line; - char keys[GUI_SOFTKEYB_MODE_MAX][GUI_SOFTKEYB_Y][GUI_SOFTKEYB_X]; + uint32_t keys[GUI_SOFTKEYB_MODE_MAX][GUI_SOFTKEYB_Y][GUI_SOFTKEYB_X]; } typedef GUISoftkeyboard; extern GUIWindow *currentwin; diff --git a/gui/gui_entry.c b/gui/gui_entry.c index 6a0700c..3af995f 100644 --- a/gui/gui_entry.c +++ b/gui/gui_entry.c @@ -1,4 +1,4 @@ -/* $Id: gui_entry.c,v 1.15 2013/04/21 23:02:23 steffen Exp $ */ +/* $Id: gui_entry.c,v 1.16 2013/06/09 20:11:30 steffen Exp $ */ /*************************************************************************** * gui_entry.c * @@ -27,6 +27,7 @@ #include "draw.h" #include "gui.h" #include "system.h" +#include "utf8.h" /**************************************************************************** * entry @@ -61,9 +62,12 @@ void gui_entry_draw (GUIItem *item) { snprintf (text1, GUI_TEXTLEN, "|%s", entry->text); } else { - strncpy (text2, entry->text, entry->curpos); - text2[entry->curpos] = '\0'; - snprintf (text1, GUI_TEXTLEN, "%s|%s", text2, entry->text+entry->curpos); + u8_strcpy (text1, entry->text, 0, entry->curpos); + u8_strcpy (text2, "|", 0, 1); + u8_strncat (text1, GUI_TEXTLEN, text2); + + u8_strcpy (text2, entry->text, entry->curpos, u8_strlen (entry->text)-entry->curpos); + u8_strncat (text1, GUI_TEXTLEN, text2); } gfx_draw_text (currentwin->screen, item->x+2, item->y, text1, &color[COLOR_white][3]); }; @@ -73,74 +77,48 @@ void gui_entry_draw (GUIItem *item) { * event handling */ int gui_entry_event (GUIItem *item, GUIEvent *event) { - char text[GUI_TEXTLEN]; - char text2[GUI_TEXTLEN]; + char u8chr[12] = {0}; GUIEntry *entry = NULL; if (item) entry = (GUIEntry *) item->data; -// d_printf ("gui_entry curpos:%d keyval:%lx", entry->curpos, event->keyval); - if (event->event == EGUI_MOUSEPRESSED) { gui_set_focus (item); gui_softkeyb_show (TRUE); } else if (event->event == EGUI_KEYCHAR) { - if (event->keyval == 0x08) { // backspace + d_printf ("gui_entry curpos:%d key:%lx keychar:%lx", entry->curpos, event->key, event->keychar); + + if (entry->curpos < 0) entry->curpos = 0; + if (entry->curpos > u8_strlen (entry->text)) entry->curpos = u8_strlen (entry->text); + + if (event->key == 0x08) { // backspace d_printf ("gui_entry:backspace"); - if (entry->curpos > 0 && entry->curpos < strlen (entry->text)) { - memset (text, 0x0, GUI_TEXTLEN); - strncpy (text, entry->text, entry->curpos-1); - text[entry->curpos] = '\0'; - snprintf (entry->text, GUI_TEXTLEN, "%s%s", text, entry->text+entry->curpos); - entry->curpos--; - } - else if (entry->curpos >= strlen (entry->text)) { - memset (text, 0x0, GUI_TEXTLEN); - strncpy (text, entry->text, entry->curpos-1); - strncpy (entry->text, text, GUI_TEXTLEN); + if (entry->curpos > 0) { + u8_strdel (entry->text, entry->curpos-1, 1); entry->curpos--; } - else { - entry->text[0] = 0; - entry->curpos = 0; - } } - else if (event->keyval == 0x1b) { // esc + else if (event->key == 0x1b) { // esc gui_close (); } - else if (event->keyval == 0x0d) { // enter + else if (event->key == 0x0d) { // enter d_printf ("gui_entry:enter"); if (entry->callback_enter) entry->callback_enter (); } - else if (event->keyval == 0x51) { // left + else if (event->key == GUIKEY_LEFT) { // left d_printf ("gui_entry:curpos--"); - entry->curpos--; + if (entry->curpos > 0) entry->curpos--; } - else if (event->keyval == 0x53) { // right + else if (event->key == GUIKEY_RIGHT) { // right d_printf ("gui_entry:curpos++"); - entry->curpos++; + if (entry->curpos < u8_strlen (entry->text)) entry->curpos++; } - else if (event->keyval != 0) { - d_printf ("gui_entry:new text"); - if (entry->curpos == strlen (entry->text)) { - strncpy (text, entry->text, GUI_TEXTLEN ); - snprintf (entry->text, GUI_TEXTLEN, "%s%c", text, event->keyval); - entry->curpos++; - } - else if (entry->curpos == 0) { - strncpy (text, entry->text, GUI_TEXTLEN ); - snprintf (entry->text, GUI_TEXTLEN, "%c%s", event->keyval, text); - entry->curpos++; - } - else { - strncpy (text, entry->text, entry->curpos); - text[entry->curpos] = '\0'; - snprintf (text2, GUI_TEXTLEN, "%s%c%s", text, event->keyval, entry->text+entry->curpos); - strncpy (entry->text, text2, GUI_TEXTLEN); - entry->curpos++; - } + else if (event->keychar != 0) { + u8_encode (u8chr, event->keychar); + u8_strninsert (entry->text, GUI_TEXTLEN, u8chr, entry->curpos); + entry->curpos++; } } currentwin->screen_changed = 1; diff --git a/gui/gui_softkeyboard.c b/gui/gui_softkeyboard.c index 29bea28..444b4d3 100644 --- a/gui/gui_softkeyboard.c +++ b/gui/gui_softkeyboard.c @@ -1,4 +1,4 @@ -/* $Id: gui_softkeyboard.c,v 1.6 2013/04/03 21:52:27 steffen Exp $ */ +/* $Id: gui_softkeyboard.c,v 1.7 2013/06/09 20:11:31 steffen Exp $ */ /*************************************************************************** * gui_softkeyboard.c * @@ -36,7 +36,7 @@ void gui_softkeyb_getpos (int row, int btnnr, int *x1, int *x2, int *y1, int *y2 void gui_softkeyb_show (int enable) { /* keys which are displayed.. */ - char line[GUI_SOFTKEYB_MODE_MAX][GUI_SOFTKEYB_X][GUI_SOFTKEYB_X] = { + char line[GUI_SOFTKEYB_MODE_MAX][GUI_SOFTKEYB_Y][GUI_SOFTKEYB_X] = { { "qwertzuiop\\", "asdfghjkl/:", "yxcvbnm,.-_" }, @@ -172,7 +172,7 @@ int gui_softkeyb_event (GUIEvent *event) { if (event->event == EGUI_MOUSEPRESSED) { softkeyb->last_line = j; softkeyb->last_col = i; - newevent.keyval = softkeyb->keys[softkeyb->mode][j][i]; +// newevent.key = softkeyb->keys[softkeyb->mode][j][i]; newevent.event = EGUI_KEYCHAR; newevent.guiwin_mpos.x = newevent.scr_mpos.x = -1; newevent.guiwin_mpos.y = newevent.scr_mpos.y = -1; @@ -202,7 +202,7 @@ int gui_softkeyb_event (GUIEvent *event) { softkeyb->mode = (softkeyb->mode == GUI_SOFTKEYB_MODE_SHIFT) ? 0 : GUI_SOFTKEYB_MODE_SHIFT; break; case (2): - newevent.keyval = ' '; +// newevent.keyval = ' '; newevent.event = EGUI_KEYCHAR; newevent.guiwin_mpos.x = newevent.scr_mpos.x = -1; newevent.guiwin_mpos.y = newevent.scr_mpos.y = -1; @@ -210,7 +210,7 @@ int gui_softkeyb_event (GUIEvent *event) { return 1; break; case (3): - newevent.keyval = 0x08; +// newevent.keyval = 0x08; newevent.event = EGUI_KEYCHAR; newevent.guiwin_mpos.x = newevent.scr_mpos.x = -1; newevent.guiwin_mpos.y = newevent.scr_mpos.y = -1; diff --git a/main/gui_config.c b/main/gui_config.c index 33c0c50..f902e9d 100644 --- a/main/gui_config.c +++ b/main/gui_config.c @@ -125,6 +125,9 @@ void gui_config_close () { strncpy (cfg.gps_device, GUI_ENTRY_T(gps_device)->text, LEN_FILENAME); gui_config_checkbox_changed (); gui_close (); + map_clear (); + map_init (); + draw_redrawmap (); }; diff --git a/mapsys/map_webload.c b/mapsys/map_webload.c index 59a6d64..7a0b66f 100644 --- a/mapsys/map_webload.c +++ b/mapsys/map_webload.c @@ -418,9 +418,12 @@ int map_webload (char *remotefn, char *localfn, char *statustext) { if (file_exist (tmpfn)) unlink (tmpfn); } - map_clear (); app.status = APPSTATUS_nothing; app_status(NULL, -1); + map_clear (); + map_init (); + draw_redrawmap (); + draw (); return 0; }; diff --git a/sdlgl/sdl_main.c b/sdlgl/sdl_main.c index d15727f..9771397 100644 --- a/sdlgl/sdl_main.c +++ b/sdlgl/sdl_main.c @@ -170,7 +170,12 @@ int msdl_eventloop () { d_printf ("keydown. old_key:%d keysym:%d ukey:%d", oldkey, event.key.keysym.sym, event.key.keysym.unicode); if (oldkey != event.key.keysym.sym) { keyu = oldkey = event.key.keysym.unicode; - gevent.keyval = keyu; + gevent.keychar = keyu; + if (event.key.keysym.sym == SDLK_UP) gevent.key = GUIKEY_UP; + else if (event.key.keysym.sym == SDLK_DOWN) gevent.key = GUIKEY_DOWN; + else if (event.key.keysym.sym == SDLK_LEFT) gevent.key = GUIKEY_LEFT; + else if (event.key.keysym.sym == SDLK_RIGHT) gevent.key = GUIKEY_RIGHT; + else gevent.key = event.key.keysym.sym; gevent.event = EGUI_KEYCHAR; gevent.scr_mpos.x = -1; gevent.scr_mpos.y = -1;