Ticket #680: cyr.diff

File cyr.diff, 10.7 KB (added by tryagain, 11 years ago)
Line 
1--- navit/gui/internal/gui_internal.c   2010-10-22 23:31:05.000000000 +0400
2+++ navit/gui/internal/gui_internal.c   2010-10-23 23:52:48.000000000 +0400
3@@ -2905,10 +2905,13 @@
4 {
5        struct menu_data *md=gui_internal_menu_data(this);
6        gui_internal_keypress_do(this, (char *) wm->data);
7-       if (md->keyboard_mode == 2)
8+       // Switch to lowercase after the first key is pressed
9+       if (md->keyboard_mode == 2) // Latin
10                gui_internal_keyboard_do(this, md->keyboard, 10);
11-       if (md->keyboard_mode == 26)
12+       if (md->keyboard_mode == 26) // Umlaut
13                gui_internal_keyboard_do(this, md->keyboard, 34);
14+       if ((md->keyboard_mode & ~7) == 40) // Russian/Ukrainian/Belorussian
15+               gui_internal_keyboard_do(this, md->keyboard, 48);
16 }
17 
18 static void
19@@ -3172,10 +3175,12 @@
20                NULL, gravity_center|orientation_vertical, func, data));
21        wk->data_free=data_free;
22        wk->background=this->background;
23-       wk->bl=w/2;
24+       wk->bl=0;
25        wk->br=0;
26-       wk->bt=h/3;
27+       wk->bt=0;
28        wk->bb=0;
29+       wk->w=w;
30+       wk->h=h;
31        return wk;
32 }
33 
34@@ -3187,10 +3192,35 @@
35 
36 static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data);
37 
38+
39+// A list of availiable keyboard modes.
40+struct gui_internal_keyb_mode {
41+    char title[16]; // Label to be displayed on keys that switch to it
42+    int font; // Font size of label
43+    int case_mode; // Mode to switch to when case CHANGE() key is pressed.
44+    int umlaut_mode;  // Mode to switch to when UMLAUT() key is pressed.
45+} gui_internal_keyb_modes[]= {
46+       /* 0*/ {"ABC", 2,  8, 24},
47+       /* 8*/ {"abc", 2,  0, 32},
48+       /*16*/ {"123", 2,  0, 24},
49+       /*24*/ {"ÄÖÜ", 2, 40, 0},
50+       /*32*/ {"ÀöÌ", 2, 32, 8},
51+       /*40*/ {"АБВ", 2, 48,  0},
52+       /*48*/ {"абв", 2, 40,  8}
53+};
54+
55+
56 // Some macros that make the keyboard layout easier to visualise in
57 // the source code. The macros are #undef'd after this function.
58 #define KEY(x) gui_internal_keyboard_key(this, wkbd, (x), (x), max_w, max_h)
59 #define SPACER() gui_internal_keyboard_key_data(this, wkbd, "", 0, NULL, NULL, NULL,max_w,max_h)
60+#define MODE(x) gui_internal_keyboard_key_data(this, wkbd, \
61+               gui_internal_keyb_modes[(x)/8].title, \
62+               gui_internal_keyb_modes[(x)/8].font, \
63+               gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h) \
64+                       -> datai=(mode&7)+((x)&~7)
65+#define SWCASE() MODE(gui_internal_keyb_modes[mode/8].case_mode)
66+#define UMLAUT() MODE(gui_internal_keyb_modes[mode/8].umlaut_mode)
67 static struct widget *
68 gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode)
69 {
70@@ -3200,16 +3230,6 @@
71        int render=0;
72        char *space="_";
73        char *backspace="←";
74-       char *ucase="ABC";
75-       int ucase_font=2;
76-       char *lcase="abc";
77-       int lcase_font=2;
78-       char *numeric="123";
79-       int numeric_font=2;
80-       char *umlauts_ucase="ÄÖÜ";
81-       int umlauts_ucase_font=2;
82-       char *umlauts_lcase="ÀöÌ";
83-       int umlauts_lcase_font=2;
84        char *hide="â–Œ";
85        char *unhide="▲";
86 
87@@ -3229,10 +3249,16 @@
88        wkbd=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill);
89        wkbd->background=this->background;
90        wkbd->cols=8;
91-       wkbd->spx=3;
92-       wkbd->spy=3;
93-       max_w=max_w/9;
94+       wkbd->spx=0;
95+       wkbd->spy=0;
96+       max_w=max_w/8;
97        max_h=max_h/6;
98+       wkbd->p.y=max_h*2;
99+       if(mode>=40&&mode<56) { // Russian/Ukrainian/Belarussian layout needs more space...
100+               max_h=max_h*4/5;
101+               max_w=max_w*8/9;
102+               wkbd->cols=9;
103+       }
104 
105        if (mode >= 0 && mode < 8) {
106                for (i = 0 ; i < 26 ; i++) {
107@@ -3248,13 +3274,11 @@
108                } else {
109                        wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
110                        wk->datai=mode+1024;
111-                       wk=gui_internal_keyboard_key_data(this, wkbd, lcase, lcase_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
112-                       wk->datai=mode+8;
113-                       wk=gui_internal_keyboard_key_data(this, wkbd, numeric, numeric_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
114-                       wk->datai=mode+16;
115+                       SWCASE();
116+                       MODE(16);
117+                       
118                }
119-               wk=gui_internal_keyboard_key_data(this, wkbd, umlauts_ucase, umlauts_ucase_font, gui_internal_keyboard_change, wkbdb,NULL,max_w,max_h);
120-               wk->datai=mode+24;
121+               UMLAUT();
122                gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
123        }
124        if (mode >= 8 && mode < 16) {
125@@ -3271,13 +3295,11 @@
126                } else {
127                        wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
128                        wk->datai=mode+1024;
129-                       wk=gui_internal_keyboard_key_data(this, wkbd, ucase, ucase_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
130-                       wk->datai=mode-8;
131-                       wk=gui_internal_keyboard_key_data(this, wkbd, numeric, numeric_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
132-                       wk->datai=mode+8;
133+                       SWCASE();
134+                       
135+                       MODE(16);
136                }
137-               wk=gui_internal_keyboard_key_data(this, wkbd, umlauts_lcase, umlauts_lcase_font, gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h);
138-               wk->datai=mode+24;
139+               UMLAUT();
140                gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
141        }
142        if (mode >= 16 && mode < 24) {
143@@ -3288,23 +3310,24 @@
144                KEY("."); KEY("°"); KEY("'"); KEY("\""); KEY("-"); KEY("+");
145                KEY("*"); KEY("/"); KEY("("); KEY(")"); KEY("="); KEY("?");
146 
147-               for (i = 0 ; i < 5 ; i++) SPACER();
148+               
149 
150                if (mode == 16) {
151+                       for (i = 0 ; i < 5 ; i++) SPACER();
152                        KEY("-");
153                        KEY("'");
154                        wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
155                        wk->datai=mode+1024;
156                } else {
157+                       for (i = 0 ; i < 3 ; i++) SPACER();
158+                       MODE(40);
159+                       MODE(48);
160                        wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
161                        wk->datai=mode+1024;
162-                       wk=gui_internal_keyboard_key_data(this, wkbd, ucase, ucase_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
163-                       wk->datai=mode-16;
164-                       wk=gui_internal_keyboard_key_data(this, wkbd, lcase, lcase_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
165-                       wk->datai=mode-8;
166+                       MODE(0);
167+                       MODE(8);
168                }
169-               wk=gui_internal_keyboard_key_data(this, wkbd, umlauts_ucase, umlauts_ucase_font, gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h);
170-               wk->datai=mode+8;
171+               UMLAUT();
172                gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
173        }
174        if (mode >= 24 && mode < 32) {
175@@ -3313,8 +3336,7 @@
176                KEY("À"); KEY("È"); KEY("Ì"); KEY("Ò"); KEY("Ù"); KEY("Ś"); KEY("Ć"); KEY("Ź");
177                KEY("Â"); KEY("Ê"); KEY("Î"); KEY("Ô"); KEY("Û"); SPACER();
178 
179-               wk=gui_internal_keyboard_key_data(this, wkbd, ucase, ucase_font, gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h);
180-               wk->datai=mode-24;
181+               UMLAUT();
182 
183                gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
184        }
185@@ -3324,40 +3346,67 @@
186                KEY("à"); KEY("Ú"); KEY("ì"); KEY("ò"); KEY("ù"); KEY("ś"); KEY("ć"); KEY("ź");
187                KEY("â"); KEY("ê"); KEY("î"); KEY("ÃŽ"); KEY("û"); KEY("ß");
188 
189-               wk=gui_internal_keyboard_key_data(this, wkbd, lcase, lcase_font, gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h);
190-               wk->datai=mode-24;
191+               UMLAUT();
192 
193                gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
194        }
195+       if (mode >= 40 && mode < 48) {
196+               KEY("А"); KEY("Б"); KEY("В"); KEY("Г"); KEY("Д"); KEY("Е"); KEY("Ж"); KEY("З"); KEY("И");
197+               KEY("Й"); KEY("К"); KEY("Л"); KEY("М"); KEY("Н"); KEY("О"); KEY("П"); KEY("Р"); KEY("С");
198+               KEY("Т"); KEY("У"); KEY("Ѐ"); KEY("Ð¥"); KEY("Њ"); KEY("Ч"); KEY("К"); KEY("Щ"); KEY("Ъ");
199+               KEY("Ы"); KEY("Ь"); KEY("Э"); KEY("Ю"); KEY("Я"); KEY("Ё"); KEY("І"); KEY("Ї"); KEY("Ў");
200+               SPACER(); SPACER(); SPACER();
201+               gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
202+
203+               wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
204+               wk->datai=mode+1024;
205+
206+               SWCASE();
207+
208+               MODE(16);
209+
210+               SPACER();
211+
212+               gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
213+       }
214+       if (mode >= 48 && mode < 56) {
215+               KEY("а"); KEY("б"); KEY("в"); KEY("г"); KEY("ÐŽ"); KEY("е"); KEY("ж"); KEY("з"); KEY("О");
216+               KEY("й"); KEY("к"); KEY("л"); KEY("ÐŒ"); KEY("Ðœ"); KEY("П"); KEY("п"); KEY("р"); KEY("с");
217+               KEY("т"); KEY("у"); KEY("ф"); KEY("х"); KEY("ц"); KEY("ч"); KEY("ш"); KEY("щ"); KEY("ъ");
218+               KEY("ы"); KEY("ь"); KEY("э"); KEY("ю"); KEY("я"); KEY("ё"); KEY("і"); KEY("ї"); KEY("ў");
219+               SPACER(); SPACER(); SPACER();
220+               gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
221+               
222+               wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
223+               wk->datai=mode+1024;
224+
225+               SWCASE();
226+
227+               MODE(16);
228+
229+               SPACER();
230+
231+               gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
232+       }
233+       
234+       
235        if (mode >= 1024) {
236                char *text=NULL;
237                int font=0;
238                struct widget *wkl;
239                mode -= 1024;
240-               if (mode >= 0 && mode < 8) {
241-                       text=ucase;
242-                       font=ucase_font;
243-               } else if (mode >= 8 && mode < 16) {
244-                       text=lcase;
245-                       font=lcase_font;
246-               } else if (mode >= 16 && mode < 24) {
247-                       text=numeric;
248-                       font=numeric_font;
249-               } else if (mode >= 24 && mode < 32) {
250-                       text=umlauts_ucase;
251-                       font=umlauts_ucase_font;
252-               } else if (mode >= 32 && mode < 40) {
253-                       text=umlauts_lcase;
254-                       font=umlauts_lcase_font;
255-               }
256+               text=gui_internal_keyb_modes[mode/8].title;
257+               font=gui_internal_keyb_modes[mode/8].font;
258                wk=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_fill);
259                wk->func=gui_internal_keyboard_change;
260                wk->data=wkbdb;
261                wk->background=this->background;
262-               wk->bl=max_w/2;
263+               wk->bl=0;
264                wk->br=0;
265-               wk->bt=max_h/3;
266+               wk->bt=0;
267                wk->bb=0;
268+               wk->w=max_w;
269+               wk->h=max_h;
270                wk->datai=mode;
271                wk->state |= STATE_SENSITIVE;
272                gui_internal_widget_append(wk, wkl=gui_internal_label_new(this, unhide));
273@@ -3380,6 +3429,9 @@
274 }
275 #undef KEY
276 #undef SPACER
277+#undef SWCASE
278+#undef UMLAUT
279+#undef MODE
280 
281 static struct widget *
282 gui_internal_keyboard(struct gui_priv *this, int mode)
283@@ -3417,7 +3469,10 @@
284                        search_attr.u.str=country_name.u.str;
285                        search_list_search(this->sl, &search_attr, 0);
286                        while((res=search_list_get_result(this->sl)));
287-                       g_free(this->country_iso2);
288+                       if(this->country_iso2) {
289+                               g_free(this->country_iso2);
290+                               this->country_iso2=NULL;
291+                       }
292                        if (item_attr_get(item, attr_country_iso2, &country_iso2))
293                                this->country_iso2=g_strdup(country_iso2.u.str);
294                }
295@@ -3468,7 +3523,6 @@
296        gui_internal_widget_append(w, wr);
297        we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill);
298        gui_internal_widget_append(wr, we);
299-
300        if (!strcmp(type,"Country")) {
301                wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_town"));
302                wnext->func=gui_internal_search_town;
303@@ -3573,7 +3627,7 @@
304        slc=search_list_select(this->sl, attr_country_all, widget->selection_id, 1);
305        if (slc) {
306                g_free(this->country_iso2);
307-               this->country_iso2=((struct search_list_country *)slc)->iso2;
308+               this->country_iso2=g_strdup(((struct search_list_country *)slc)->iso2);
309        }
310        gui_internal_search(this,widget->name,"Town",0);
311 }