master
steffen 13 years ago
parent 4d21bcae1d
commit 60d26e354a

@ -1,6 +1,14 @@
Version 0.0.2: name changed to spOSMroute, since on there had been another Version 0.0.2: name changed to spOSMroute, since on there had been another
OSMroute already. 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): (2013-06-06):
- fixed: utf8 will be displayed on OpenGL and OpenGLES devices correctly. - fixed: utf8 will be displayed on OpenGL and OpenGLES devices correctly.

@ -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 /* utf8.c
* Copyright (C) Steffen Pohle 2013 <steffen@gulpe.de> * Copyright (C) Steffen Pohle 2013 <steffen@gulpe.de>
* *
@ -22,6 +22,67 @@
#include "system.h" #include "system.h"
#include "utf8.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 u8_decode (char *str, int *charsize) {
uint32_t chr = 0; uint32_t chr = 0;
int block = 0; int block = 0;
@ -55,11 +116,11 @@ uint32_t u8_decode (char *str, int *charsize) {
} }
else { else {
/* error: no valid code */ /* error: no valid code */
*charsize = 0; if (charsize != NULL) *charsize = 0;
return 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++; str++;
for (;block > 0; block--) { for (;block > 0; block--) {
@ -84,7 +145,10 @@ int u8_strlen (char *str) {
int bytelen = strlen (str); int bytelen = strlen (str);
for (cnt = 0, i = 0; i < bytelen;) { 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++; cnt++;
i += j; 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;
}
};

@ -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 /* utf8.h
* Copyright (C) Steffen Pohle 2013 <steffen@gulpe.de> * Copyright (C) Steffen Pohle 2013 <steffen@gulpe.de>
* *
@ -22,8 +22,13 @@
#include <stdint.h> #include <stdint.h>
uint32_t u8_decode (char *str, int *size); uint32_t u8_decode (char *str, int *size);
void u8_encode (char *dest, uint32_t key);
int u8_strlen (char *str); 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 #endif

@ -61,9 +61,16 @@ enum {
#define WGUI_S_MODAL 0x0100 #define WGUI_S_MODAL 0x0100
#define GUIKEY_UP 0x0111
#define GUIKEY_DOWN 0x0112
#define GUIKEY_RIGHT 0x0113
#define GUIKEY_LEFT 0x0114
struct _GUIEvent_ { struct _GUIEvent_ {
int event; 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 scr_mpos; // mousepos on screen
iPoint guiwin_mpos; // mousepos on gui (setup from gui_event) iPoint guiwin_mpos; // mousepos on gui (setup from gui_event)
int mousebtn; int mousebtn;
@ -155,7 +162,7 @@ struct _GUISoftkeyboard_ {
struct image *screen; struct image *screen;
int last_col; int last_col;
int last_line; 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; } typedef GUISoftkeyboard;
extern GUIWindow *currentwin; extern GUIWindow *currentwin;

@ -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 * gui_entry.c
* *
@ -27,6 +27,7 @@
#include "draw.h" #include "draw.h"
#include "gui.h" #include "gui.h"
#include "system.h" #include "system.h"
#include "utf8.h"
/**************************************************************************** /****************************************************************************
* entry * entry
@ -61,9 +62,12 @@ void gui_entry_draw (GUIItem *item) {
snprintf (text1, GUI_TEXTLEN, "|%s", entry->text); snprintf (text1, GUI_TEXTLEN, "|%s", entry->text);
} }
else { else {
strncpy (text2, entry->text, entry->curpos); u8_strcpy (text1, entry->text, 0, entry->curpos);
text2[entry->curpos] = '\0'; u8_strcpy (text2, "|", 0, 1);
snprintf (text1, GUI_TEXTLEN, "%s|%s", text2, entry->text+entry->curpos); 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]); gfx_draw_text (currentwin->screen, item->x+2, item->y, text1, &color[COLOR_white][3]);
}; };
@ -73,75 +77,49 @@ void gui_entry_draw (GUIItem *item) {
* event handling * event handling
*/ */
int gui_entry_event (GUIItem *item, GUIEvent *event) { int gui_entry_event (GUIItem *item, GUIEvent *event) {
char text[GUI_TEXTLEN]; char u8chr[12] = {0};
char text2[GUI_TEXTLEN];
GUIEntry *entry = NULL; GUIEntry *entry = NULL;
if (item) entry = (GUIEntry *) item->data; if (item) entry = (GUIEntry *) item->data;
// d_printf ("gui_entry curpos:%d keyval:%lx", entry->curpos, event->keyval);
if (event->event == EGUI_MOUSEPRESSED) { if (event->event == EGUI_MOUSEPRESSED) {
gui_set_focus (item); gui_set_focus (item);
gui_softkeyb_show (TRUE); gui_softkeyb_show (TRUE);
} }
else if (event->event == EGUI_KEYCHAR) { 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"); d_printf ("gui_entry:backspace");
if (entry->curpos > 0 && entry->curpos < strlen (entry->text)) { if (entry->curpos > 0) {
memset (text, 0x0, GUI_TEXTLEN); u8_strdel (entry->text, entry->curpos-1, 1);
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--; 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);
entry->curpos--;
}
else {
entry->text[0] = 0;
entry->curpos = 0;
} }
} else if (event->key == 0x1b) { // esc
else if (event->keyval == 0x1b) { // esc
gui_close (); gui_close ();
} }
else if (event->keyval == 0x0d) { // enter else if (event->key == 0x0d) { // enter
d_printf ("gui_entry:enter"); d_printf ("gui_entry:enter");
if (entry->callback_enter) entry->callback_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--"); 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++"); 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) { else if (event->keychar != 0) {
strncpy (text, entry->text, GUI_TEXTLEN ); u8_encode (u8chr, event->keychar);
snprintf (entry->text, GUI_TEXTLEN, "%c%s", event->keyval, text); u8_strninsert (entry->text, GUI_TEXTLEN, u8chr, entry->curpos);
entry->curpos++; 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++;
}
}
} }
currentwin->screen_changed = 1; currentwin->screen_changed = 1;
draw (); draw ();

@ -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 * 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) { void gui_softkeyb_show (int enable) {
/* keys which are displayed.. */ /* 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\\", { "qwertzuiop\\",
"asdfghjkl/:", "asdfghjkl/:",
"yxcvbnm,.-_" }, "yxcvbnm,.-_" },
@ -172,7 +172,7 @@ int gui_softkeyb_event (GUIEvent *event) {
if (event->event == EGUI_MOUSEPRESSED) { if (event->event == EGUI_MOUSEPRESSED) {
softkeyb->last_line = j; softkeyb->last_line = j;
softkeyb->last_col = i; 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.event = EGUI_KEYCHAR;
newevent.guiwin_mpos.x = newevent.scr_mpos.x = -1; newevent.guiwin_mpos.x = newevent.scr_mpos.x = -1;
newevent.guiwin_mpos.y = newevent.scr_mpos.y = -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; softkeyb->mode = (softkeyb->mode == GUI_SOFTKEYB_MODE_SHIFT) ? 0 : GUI_SOFTKEYB_MODE_SHIFT;
break; break;
case (2): case (2):
newevent.keyval = ' '; // newevent.keyval = ' ';
newevent.event = EGUI_KEYCHAR; newevent.event = EGUI_KEYCHAR;
newevent.guiwin_mpos.x = newevent.scr_mpos.x = -1; newevent.guiwin_mpos.x = newevent.scr_mpos.x = -1;
newevent.guiwin_mpos.y = newevent.scr_mpos.y = -1; newevent.guiwin_mpos.y = newevent.scr_mpos.y = -1;
@ -210,7 +210,7 @@ int gui_softkeyb_event (GUIEvent *event) {
return 1; return 1;
break; break;
case (3): case (3):
newevent.keyval = 0x08; // newevent.keyval = 0x08;
newevent.event = EGUI_KEYCHAR; newevent.event = EGUI_KEYCHAR;
newevent.guiwin_mpos.x = newevent.scr_mpos.x = -1; newevent.guiwin_mpos.x = newevent.scr_mpos.x = -1;
newevent.guiwin_mpos.y = newevent.scr_mpos.y = -1; newevent.guiwin_mpos.y = newevent.scr_mpos.y = -1;

@ -125,6 +125,9 @@ void gui_config_close () {
strncpy (cfg.gps_device, GUI_ENTRY_T(gps_device)->text, LEN_FILENAME); strncpy (cfg.gps_device, GUI_ENTRY_T(gps_device)->text, LEN_FILENAME);
gui_config_checkbox_changed (); gui_config_checkbox_changed ();
gui_close (); gui_close ();
map_clear ();
map_init ();
draw_redrawmap ();
}; };

@ -418,9 +418,12 @@ int map_webload (char *remotefn, char *localfn, char *statustext) {
if (file_exist (tmpfn)) unlink (tmpfn); if (file_exist (tmpfn)) unlink (tmpfn);
} }
map_clear ();
app.status = APPSTATUS_nothing; app.status = APPSTATUS_nothing;
app_status(NULL, -1); app_status(NULL, -1);
map_clear ();
map_init ();
draw_redrawmap ();
draw ();
return 0; return 0;
}; };

@ -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); 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) { if (oldkey != event.key.keysym.sym) {
keyu = oldkey = event.key.keysym.unicode; 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.event = EGUI_KEYCHAR;
gevent.scr_mpos.x = -1; gevent.scr_mpos.x = -1;
gevent.scr_mpos.y = -1; gevent.scr_mpos.y = -1;

Loading…
Cancel
Save