summaryrefslogtreecommitdiff
path: root/navit/gui/internal/gui_internal_keyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'navit/gui/internal/gui_internal_keyboard.c')
-rw-r--r--navit/gui/internal/gui_internal_keyboard.c1029
1 files changed, 649 insertions, 380 deletions
diff --git a/navit/gui/internal/gui_internal_keyboard.c b/navit/gui/internal/gui_internal_keyboard.c
index 7ef1c3d36..19e48c468 100644
--- a/navit/gui/internal/gui_internal_keyboard.c
+++ b/navit/gui/internal/gui_internal_keyboard.c
@@ -19,22 +19,22 @@
*
* @param this The internal GUI instance
*/
-void
-gui_internal_keyboard_to_upper_case(struct gui_priv *this)
-{
- struct menu_data *md;
-
- if (!this->keyboard)
- return;
-
- md=gui_internal_menu_data(this);
-
- if (md->keyboard_mode == (VKBD_LATIN_LOWER | VKBD_FLAG_2))
- gui_internal_keyboard_do(this, md->keyboard, VKBD_LATIN_UPPER | VKBD_FLAG_2);
- if (md->keyboard_mode == (VKBD_UMLAUT_LOWER | VKBD_FLAG_2))
- gui_internal_keyboard_do(this, md->keyboard, VKBD_UMLAUT_UPPER | VKBD_FLAG_2);
- if (md->keyboard_mode == (VKBD_CYRILLIC_LOWER | VKBD_FLAG_2))
- gui_internal_keyboard_do(this, md->keyboard, VKBD_CYRILLIC_UPPER | VKBD_FLAG_2);
+void gui_internal_keyboard_to_upper_case(struct gui_priv *this) {
+ struct menu_data *md;
+
+ if (!this->keyboard)
+ return;
+
+ md=gui_internal_menu_data(this);
+
+ if (md->keyboard_mode == (VKBD_LATIN_LOWER | VKBD_FLAG_2))
+ gui_internal_keyboard_do(this, md->keyboard, VKBD_LATIN_UPPER | VKBD_FLAG_2);
+ if (md->keyboard_mode == (VKBD_UMLAUT_LOWER | VKBD_FLAG_2))
+ gui_internal_keyboard_do(this, md->keyboard, VKBD_UMLAUT_UPPER | VKBD_FLAG_2);
+ if (md->keyboard_mode == (VKBD_CYRILLIC_LOWER | VKBD_FLAG_2))
+ gui_internal_keyboard_do(this, md->keyboard, VKBD_CYRILLIC_UPPER | VKBD_FLAG_2);
+ if (md->keyboard_mode == (VKBD_GREEK_LOWER | VKBD_FLAG_2))
+ gui_internal_keyboard_do(this, md->keyboard, VKBD_GREEK_UPPER | VKBD_FLAG_2);
}
/**
@@ -44,22 +44,22 @@ gui_internal_keyboard_to_upper_case(struct gui_priv *this)
*
* @param this The internal GUI instance
*/
-void
-gui_internal_keyboard_to_lower_case(struct gui_priv *this)
-{
- struct menu_data *md;
-
- if (!this->keyboard)
- return;
-
- md=gui_internal_menu_data(this);
-
- if (md->keyboard_mode == (VKBD_LATIN_UPPER | VKBD_FLAG_2))
- gui_internal_keyboard_do(this, md->keyboard, VKBD_LATIN_LOWER | VKBD_FLAG_2);
- if (md->keyboard_mode == (VKBD_UMLAUT_UPPER | VKBD_FLAG_2))
- gui_internal_keyboard_do(this, md->keyboard, VKBD_UMLAUT_LOWER | VKBD_FLAG_2);
- if (md->keyboard_mode == (VKBD_CYRILLIC_UPPER | VKBD_FLAG_2))
- gui_internal_keyboard_do(this, md->keyboard, VKBD_CYRILLIC_LOWER | VKBD_FLAG_2);
+void gui_internal_keyboard_to_lower_case(struct gui_priv *this) {
+ struct menu_data *md;
+
+ if (!this->keyboard)
+ return;
+
+ md=gui_internal_menu_data(this);
+
+ if (md->keyboard_mode == (VKBD_LATIN_UPPER | VKBD_FLAG_2))
+ gui_internal_keyboard_do(this, md->keyboard, VKBD_LATIN_LOWER | VKBD_FLAG_2);
+ if (md->keyboard_mode == (VKBD_UMLAUT_UPPER | VKBD_FLAG_2))
+ gui_internal_keyboard_do(this, md->keyboard, VKBD_UMLAUT_LOWER | VKBD_FLAG_2);
+ if (md->keyboard_mode == (VKBD_CYRILLIC_UPPER | VKBD_FLAG_2))
+ gui_internal_keyboard_do(this, md->keyboard, VKBD_CYRILLIC_LOWER | VKBD_FLAG_2);
+ if (md->keyboard_mode == (VKBD_GREEK_UPPER | VKBD_FLAG_2))
+ gui_internal_keyboard_do(this, md->keyboard, VKBD_GREEK_LOWER | VKBD_FLAG_2);
}
/**
@@ -72,33 +72,30 @@ gui_internal_keyboard_to_lower_case(struct gui_priv *this)
* @param wm
* @param data Not used
*/
-static void
-gui_internal_cmd_keypress(struct gui_priv *this, struct widget *wm, void *data)
-{
- gui_internal_keypress_do(this, (char *) wm->data);
+static void gui_internal_cmd_keypress(struct gui_priv *this, struct widget *wm, void *data) {
+ gui_internal_keypress_do(this, (char *) wm->data);
}
-
-static struct widget *
-gui_internal_keyboard_key_data(struct gui_priv *this, struct widget *wkbd, char *text, int font, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data, void (*data_free)(void *data), int w, int h)
-{
- struct widget *wk;
- gui_internal_widget_append(wkbd, wk=gui_internal_button_font_new_with_callback(this, text, font,
- NULL, gravity_center|orientation_vertical, func, data));
- wk->data_free=data_free;
- wk->background=this->background;
- wk->bl=0;
- wk->br=0;
- wk->bt=0;
- wk->bb=0;
- wk->w=w;
- wk->h=h;
- return wk;
+
+static struct widget *gui_internal_keyboard_key_data(struct gui_priv *this, struct widget *wkbd, char *text, int font,
+ void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data, void (*data_free)(void *data), int w,
+ int h) {
+ struct widget *wk;
+ gui_internal_widget_append(wkbd, wk=gui_internal_button_font_new_with_callback(this, text, font,
+ NULL, gravity_center|orientation_vertical, func, data));
+ wk->data_free=data_free;
+ wk->background=this->background;
+ wk->bl=0;
+ wk->br=0;
+ wk->bt=0;
+ wk->bb=0;
+ wk->w=w;
+ wk->h=h;
+ return wk;
}
-static struct widget *
-gui_internal_keyboard_key(struct gui_priv *this, struct widget *wkbd, char *text, char *key, int w, int h)
-{
- return gui_internal_keyboard_key_data(this, wkbd, text, 0, gui_internal_cmd_keypress, g_strdup(key), g_free_func,w,h);
+static struct widget *gui_internal_keyboard_key(struct gui_priv *this, struct widget *wkbd, char *text, char *key,
+ int w, int h) {
+ return gui_internal_keyboard_key_data(this, wkbd, text, 0, gui_internal_cmd_keypress, g_strdup(key), g_free_func,w,h);
}
static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data);
@@ -118,14 +115,16 @@ struct gui_internal_keyb_mode {
int case_mode; /**< Mode to switch to when case CHANGE() key is pressed. */
int umlaut_mode; /**< Mode to switch to when UMLAUT() key is pressed. */
} gui_internal_keyb_modes[]= {
- /* 0: VKBD_LATIN_UPPER */ {"ABC", 2, VKBD_LATIN_LOWER, VKBD_UMLAUT_UPPER},
- /* 8: VKBD_LATIN_LOWER */ {"abc", 2, VKBD_LATIN_UPPER, VKBD_UMLAUT_LOWER},
- /*16: VKBD_NUMERIC */ {"123", 2, VKBD_LATIN_UPPER, VKBD_UMLAUT_UPPER},
- /*24: VKBD_UMLAUT_UPPER */ {"ÄÖÜ", 2, VKBD_UMLAUT_LOWER, VKBD_LATIN_UPPER},
- /*32: VKBD_UMLAUT_LOWER */ {"äöü", 2, VKBD_UMLAUT_UPPER, VKBD_LATIN_LOWER},
- /*40: VKBD_CYRILLIC_UPPER*/ {"АБВ", 2, VKBD_CYRILLIC_LOWER, VKBD_LATIN_UPPER},
- /*48: VKBD_CYRILLIC_LOWER*/ {"абв", 2, VKBD_CYRILLIC_UPPER, VKBD_LATIN_LOWER},
- /*56: VKBD_DEGREE */ {"DEG", 2, VKBD_FLAG_2, VKBD_FLAG_2}
+ /* 0: VKBD_LATIN_UPPER */ {"ABC", 2, VKBD_LATIN_LOWER, VKBD_UMLAUT_UPPER},
+ /* 8: VKBD_LATIN_LOWER */ {"abc", 2, VKBD_LATIN_UPPER, VKBD_UMLAUT_LOWER},
+ /*16: VKBD_NUMERIC */ {"123", 2, VKBD_LATIN_UPPER, VKBD_UMLAUT_UPPER},
+ /*24: VKBD_UMLAUT_UPPER */ {"ÄÖÜ", 2, VKBD_UMLAUT_LOWER, VKBD_LATIN_UPPER},
+ /*32: VKBD_UMLAUT_LOWER */ {"äöü", 2, VKBD_UMLAUT_UPPER, VKBD_LATIN_LOWER},
+ /*40: VKBD_CYRILLIC_UPPER*/ {"АБВ", 2, VKBD_CYRILLIC_LOWER, VKBD_LATIN_UPPER},
+ /*48: VKBD_CYRILLIC_LOWER*/ {"абв", 2, VKBD_CYRILLIC_UPPER, VKBD_LATIN_LOWER},
+ /*56: VKBD_DEGREE */ {"DEG", 2, VKBD_FLAG_2, VKBD_FLAG_2},
+ /*64: VKBD_GREEK_UPPER */ {"ABΓ", 2, VKBD_GREEK_LOWER, VKBD_LATIN_UPPER},
+ /*72: VKBD_GREEK_LOWER */ {"abγ", 2, VKBD_GREEK_UPPER, VKBD_LATIN_LOWER}
};
@@ -140,6 +139,17 @@ struct gui_internal_keyb_mode {
-> datai = (mode & VKBD_MASK_7) | ((x) & VKBD_LAYOUT_MASK)
#define SWCASE() MODE(gui_internal_keyb_modes[mode/8].case_mode)
#define UMLAUT() MODE(gui_internal_keyb_modes[mode/8].umlaut_mode)
+
+
+static void gui_internal_keyboard_topbox_resize(struct gui_priv *this, struct widget *w, void *data,
+ int neww, int newh) {
+ struct menu_data *md=gui_internal_menu_data(this);
+ struct widget *old_wkbdb = md->keyboard;
+
+ dbg(lvl_debug, "resize called for keyboard widget %p with w=%d, h=%d", w, neww, newh);
+ gui_internal_keyboard_do(this, old_wkbdb, md->keyboard_mode);
+}
+
/**
* @brief Creates a new keyboard widget or switches the layout of an existing widget
*
@@ -155,231 +165,493 @@ struct gui_internal_keyb_mode {
* @return {@code wkbdb} if a non-NULL value was passed, else a new keyboard widget will be returned.
*/
struct widget *
-gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode)
-{
- struct widget *wkbd,*wk;
- struct menu_data *md=gui_internal_menu_data(this);
- int i, max_w=this->root.w, max_h=this->root.h;
- int render=0;
- char *space="_";
- char *backspace="←";
- char *hide="▼";
- char *unhide="▲";
-
- if (wkbdb) {
- this->current.x=-1;
- this->current.y=-1;
- gui_internal_highlight(this);
- if (md->keyboard_mode & VKBD_FLAG_1024)
- render=2;
- else
- render=1;
- gui_internal_widget_children_destroy(this, wkbdb);
- } else
- wkbdb=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill);
- md->keyboard=wkbdb;
- md->keyboard_mode=mode;
- wkbd=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill);
- wkbd->background=this->background;
- wkbd->cols=8;
- wkbd->spx=0;
- wkbd->spy=0;
- max_w=max_w/8;
- max_h=max_h/8; // Allows 3 results in the list when searching for Towns
- wkbd->p.y=max_h*2;
- if (((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_UPPER) || ((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_LOWER)) { // Russian/Ukrainian/Belarussian layout needs more space...
- max_h=max_h*4/5;
- max_w=max_w*8/9;
- wkbd->cols=9;
- }
-
- if ((mode & VKBD_LAYOUT_MASK) == VKBD_LATIN_UPPER) {
- for (i = 0 ; i < 26 ; i++) {
- char text[]={'A'+i,'\0'};
- KEY(text);
- }
- gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
- if (!(mode & VKBD_MASK_7)) {
- KEY("-");
- KEY("'");
- wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
- wk->datai = mode | VKBD_FLAG_1024;
- } else {
- wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
- wk->datai = mode | VKBD_FLAG_1024;
- SWCASE();
- MODE(VKBD_NUMERIC);
-
- }
- UMLAUT();
- gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
- }
- if ((mode & VKBD_LAYOUT_MASK) == VKBD_LATIN_LOWER) {
- for (i = 0 ; i < 26 ; i++) {
- char text[]={'a'+i,'\0'};
- KEY(text);
- }
- gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
- if (!(mode & VKBD_MASK_7)) {
- KEY("-");
- KEY("'");
- wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
- wk->datai = mode | VKBD_FLAG_1024;
- } else {
- wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
- wk->datai = mode | VKBD_FLAG_1024;
- SWCASE();
-
- MODE(VKBD_NUMERIC);
- }
- UMLAUT();
- gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
- }
- if ((mode & VKBD_LAYOUT_MASK) == VKBD_NUMERIC) {
- for (i = 0 ; i < 10 ; i++) {
- char text[]={'0'+i,'\0'};
- KEY(text);
- }
- /* ("8") ("9")*/KEY("."); KEY("°"); KEY("'"); KEY("\"");KEY("-"); KEY("+");
- KEY("*"); KEY("/"); KEY("("); KEY(")"); KEY("="); KEY("?"); KEY(":"); SPACER();
-
-
-
- if (!(mode & VKBD_MASK_7)) {
- SPACER();
- KEY("-");
- KEY("'");
- wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
- wk->datai = mode | VKBD_FLAG_1024;
- SPACER();
- SPACER();
- } else {
- SPACER();
- MODE(VKBD_CYRILLIC_UPPER);
- MODE(VKBD_CYRILLIC_LOWER);
- wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
- wk->datai = mode | VKBD_FLAG_1024;
- MODE(VKBD_LATIN_UPPER);
- MODE(VKBD_LATIN_LOWER);
- }
- UMLAUT();
- gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
- }
- if ((mode & VKBD_LAYOUT_MASK) == VKBD_UMLAUT_UPPER) {
- KEY("Ä"); KEY("Ë"); KEY("Ï"); KEY("Ö"); KEY("Ü"); KEY("Æ"); KEY("Ø"); KEY("Å");
- KEY("Á"); KEY("É"); KEY("Í"); KEY("Ó"); KEY("Ú"); KEY("Š"); KEY("Č"); KEY("Ž");
- KEY("À"); KEY("È"); KEY("Ì"); KEY("Ò"); KEY("Ù"); KEY("Ś"); KEY("Ć"); KEY("Ź");
- KEY("Â"); KEY("Ê"); KEY("Î"); KEY("Ô"); KEY("Û"); SPACER();
-
- UMLAUT();
-
- gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
- }
- if ((mode & VKBD_LAYOUT_MASK) == VKBD_UMLAUT_LOWER) {
- KEY("ä"); KEY("ë"); KEY("ï"); KEY("ö"); KEY("ü"); KEY("æ"); KEY("ø"); KEY("å");
- KEY("á"); KEY("é"); KEY("í"); KEY("ó"); KEY("ú"); KEY("š"); KEY("č"); KEY("ž");
- KEY("à"); KEY("è"); KEY("ì"); KEY("ò"); KEY("ù"); KEY("ś"); KEY("ć"); KEY("ź");
- KEY("â"); KEY("ê"); KEY("î"); KEY("ô"); KEY("û"); KEY("ß");
-
- UMLAUT();
-
- gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
- }
- if ((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_UPPER) {
- KEY("А"); KEY("Б"); KEY("В"); KEY("Г"); KEY("Д"); KEY("Е"); KEY("Ж"); KEY("З"); KEY("И");
- KEY("Й"); KEY("К"); KEY("Л"); KEY("М"); KEY("Н"); KEY("О"); KEY("П"); KEY("Р"); KEY("С");
- KEY("Т"); KEY("У"); KEY("Ф"); KEY("Х"); KEY("Ц"); KEY("Ч"); KEY("Ш"); KEY("Щ"); KEY("Ъ");
- KEY("Ы"); KEY("Ь"); KEY("Э"); KEY("Ю"); KEY("Я"); KEY("Ё"); KEY("І"); KEY("Ї"); KEY("Ў");
- SPACER(); SPACER(); SPACER();
- gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
-
- wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
- wk->datai = mode | VKBD_FLAG_1024;
-
- SWCASE();
-
- MODE(VKBD_NUMERIC);
-
- SPACER();
-
- gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
- }
- if ((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_LOWER) {
- KEY("а"); KEY("б"); KEY("в"); KEY("г"); KEY("д"); KEY("е"); KEY("ж"); KEY("з"); KEY("и");
- KEY("й"); KEY("к"); KEY("л"); KEY("м"); KEY("н"); KEY("о"); KEY("п"); KEY("р"); KEY("с");
- KEY("т"); KEY("у"); KEY("ф"); KEY("х"); KEY("ц"); KEY("ч"); KEY("ш"); KEY("щ"); KEY("ъ");
- KEY("ы"); KEY("ь"); KEY("э"); KEY("ю"); KEY("я"); KEY("ё"); KEY("і"); KEY("ї"); KEY("ў");
- SPACER(); SPACER(); SPACER();
- gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
-
- wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
- wk->datai = mode | VKBD_FLAG_1024;
-
- SWCASE();
-
- MODE(VKBD_NUMERIC);
-
- SPACER();
-
- gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
- }
-
-
- if(md->search_list && md->search_list->type==widget_table) {
- struct table_data *td=(struct table_data*)(md->search_list->data);
- td->scroll_buttons.button_box_hide = !(mode & VKBD_FLAG_1024);
- }
-
- if ((mode & VKBD_LAYOUT_MASK) == VKBD_DEGREE) { /* special case for coordinates input screen (enter_coord) */
- KEY("0"); KEY("1"); KEY("2"); KEY("3"); KEY("4"); SPACER(); KEY("N"); KEY("S");
- KEY("5"); KEY("6"); KEY("7"); KEY("8"); KEY("9"); SPACER(); KEY("E"); KEY("W");
- KEY("°"); KEY("."); KEY("'");
- gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
- SPACER();
-
- wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
- wk->datai = mode | VKBD_FLAG_1024;
-
- SPACER();
- gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
- }
-
- if (mode & VKBD_FLAG_1024) {
- char *text=NULL;
- int font=0;
- struct widget *wkl;
- mode &= ~VKBD_FLAG_1024;
- text=gui_internal_keyb_modes[mode/8].title;
- font=gui_internal_keyb_modes[mode/8].font;
- wk=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_fill);
- wk->func=gui_internal_keyboard_change;
- wk->data=wkbdb;
- wk->background=this->background;
- wk->bl=0;
- wk->br=0;
- wk->bt=0;
- wk->bb=0;
- wk->w=max_w;
- wk->h=max_h;
- wk->datai=mode;
- wk->state |= STATE_SENSITIVE;
- gui_internal_widget_append(wk, wkl=gui_internal_label_new(this, unhide));
- wkl->background=NULL;
- gui_internal_widget_append(wk, wkl=gui_internal_label_font_new(this, text, font));
- wkl->background=NULL;
- gui_internal_widget_append(wkbd, wk);
- if (render)
- render=2;
- }
- gui_internal_widget_append(wkbdb, wkbd);
- if (render == 1) {
- gui_internal_widget_pack(this, wkbdb);
- gui_internal_widget_render(this, wkbdb);
- } else if (render == 2) {
- gui_internal_menu_reset_pack(this);
- gui_internal_menu_render(this);
- }
- return wkbdb;
+gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) {
+ struct widget *wkbd,*wk;
+ struct menu_data *md=gui_internal_menu_data(this);
+ int i, max_w=this->root.w, max_h=this->root.h;
+ int render=0;
+ char *space="_";
+ char *backspace="←";
+ char *hide="▼";
+ char *unhide="▲";
+
+ if (wkbdb) {
+ this->current.x=-1;
+ this->current.y=-1;
+ gui_internal_highlight(this);
+ if (md->keyboard_mode & VKBD_FLAG_1024)
+ render=2;
+ else
+ render=1;
+ gui_internal_widget_children_destroy(this, wkbdb);
+ gui_internal_widget_reset_pack(this, wkbdb);
+ gui_internal_widget_pack(this, wkbdb);
+ } else
+ wkbdb=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill);
+ md->keyboard=wkbdb;
+ md->keyboard_mode=mode;
+ wkbd=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill);
+ wkbd->background=this->background;
+ wkbd->cols=8;
+ wkbd->spx=0;
+ wkbd->spy=0;
+ wkbd->on_resize=gui_internal_keyboard_topbox_resize;
+ max_w=max_w/8;
+ max_h=max_h/8; // Allows 3 results in the list when searching for Towns
+ wkbd->p.y=max_h*2;
+ if (((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_UPPER)
+ || ((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_LOWER)
+ || ((mode & VKBD_LAYOUT_MASK) == VKBD_GREEK_UPPER)
+ || ((mode & VKBD_LAYOUT_MASK) == VKBD_GREEK_LOWER)) { // Russian/Ukrainian/Belarussian/Greek layout needs more space...
+ max_h=max_h*4/5;
+ max_w=max_w*8/9;
+ wkbd->cols=9;
+ }
+
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_LATIN_UPPER) {
+ for (i = 0 ; i < 26 ; i++) {
+ char text[]= {'A'+i,'\0'};
+ KEY(text);
+ }
+ gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
+ if (!(mode & VKBD_MASK_7)) {
+ KEY("-");
+ KEY("'");
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+ } else {
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+ SWCASE();
+ MODE(VKBD_NUMERIC);
+
+ }
+ UMLAUT();
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_LATIN_LOWER) {
+ for (i = 0 ; i < 26 ; i++) {
+ char text[]= {'a'+i,'\0'};
+ KEY(text);
+ }
+ gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
+ if (!(mode & VKBD_MASK_7)) {
+ KEY("-");
+ KEY("'");
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+ } else {
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+ SWCASE();
+
+ MODE(VKBD_NUMERIC);
+ }
+ UMLAUT();
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_NUMERIC) {
+ for (i = 0 ; i < 10 ; i++) {
+ char text[]= {'0'+i,'\0'};
+ KEY(text);
+ }
+ /* ("8") ("9")*/KEY(".");
+ KEY("°");
+ KEY("'");
+ KEY("\"");
+ KEY("-");
+ KEY("+");
+ KEY("*");
+ KEY("/");
+ KEY("(");
+ KEY(")");
+ KEY("=");
+ KEY("?");
+ KEY(":");
+ KEY("_");
+
+
+
+ if (!(mode & VKBD_MASK_7)) {
+ MODE(VKBD_GREEK_UPPER);
+ KEY("-");
+ KEY("'");
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+ SPACER();
+ SPACER();
+ } else {
+ if (mode == VKBD_GREEK_UPPER)
+ MODE(VKBD_GREEK_LOWER);
+ else
+ MODE(VKBD_GREEK_UPPER);
+ MODE(VKBD_CYRILLIC_UPPER);
+ MODE(VKBD_CYRILLIC_LOWER);
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+ MODE(VKBD_LATIN_UPPER);
+ MODE(VKBD_LATIN_LOWER);
+ }
+ UMLAUT();
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_UMLAUT_UPPER) {
+ KEY("Ä");
+ KEY("Ë");
+ KEY("Ï");
+ KEY("Ö");
+ KEY("Ü");
+ KEY("Æ");
+ KEY("Ø");
+ KEY("Å");
+ KEY("Á");
+ KEY("É");
+ KEY("Í");
+ KEY("Ó");
+ KEY("Ú");
+ KEY("Š");
+ KEY("Č");
+ KEY("Ž");
+ KEY("À");
+ KEY("È");
+ KEY("Ì");
+ KEY("Ò");
+ KEY("Ù");
+ KEY("Ś");
+ KEY("Ć");
+ KEY("Ź");
+ KEY("Â");
+ KEY("Ê");
+ KEY("Î");
+ KEY("Ô");
+ KEY("Û");
+ SPACER();
+
+ UMLAUT();
+
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_UMLAUT_LOWER) {
+ KEY("ä");
+ KEY("ë");
+ KEY("ï");
+ KEY("ö");
+ KEY("ü");
+ KEY("æ");
+ KEY("ø");
+ KEY("å");
+ KEY("á");
+ KEY("é");
+ KEY("í");
+ KEY("ó");
+ KEY("ú");
+ KEY("š");
+ KEY("č");
+ KEY("ž");
+ KEY("à");
+ KEY("è");
+ KEY("ì");
+ KEY("ò");
+ KEY("ù");
+ KEY("ś");
+ KEY("ć");
+ KEY("ź");
+ KEY("â");
+ KEY("ê");
+ KEY("î");
+ KEY("ô");
+ KEY("û");
+ KEY("ß");
+
+ UMLAUT();
+
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_UPPER) {
+ KEY("А");
+ KEY("Б");
+ KEY("В");
+ KEY("Г");
+ KEY("Д");
+ KEY("Е");
+ KEY("Ж");
+ KEY("З");
+ KEY("И");
+ KEY("Й");
+ KEY("К");
+ KEY("Л");
+ KEY("М");
+ KEY("Н");
+ KEY("О");
+ KEY("П");
+ KEY("Р");
+ KEY("С");
+ KEY("Т");
+ KEY("У");
+ KEY("Ф");
+ KEY("Х");
+ KEY("Ц");
+ KEY("Ч");
+ KEY("Ш");
+ KEY("Щ");
+ KEY("Ъ");
+ KEY("Ы");
+ KEY("Ь");
+ KEY("Э");
+ KEY("Ю");
+ KEY("Я");
+ KEY("Ё");
+ KEY("І");
+ KEY("Ї");
+ KEY("Ў");
+ SPACER();
+ SPACER();
+ SPACER();
+ gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
+
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+
+ SWCASE();
+
+ MODE(VKBD_NUMERIC);
+
+ SPACER();
+
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_LOWER) {
+ KEY("а");
+ KEY("б");
+ KEY("в");
+ KEY("г");
+ KEY("д");
+ KEY("е");
+ KEY("ж");
+ KEY("з");
+ KEY("и");
+ KEY("й");
+ KEY("к");
+ KEY("л");
+ KEY("м");
+ KEY("н");
+ KEY("о");
+ KEY("п");
+ KEY("р");
+ KEY("с");
+ KEY("т");
+ KEY("у");
+ KEY("ф");
+ KEY("х");
+ KEY("ц");
+ KEY("ч");
+ KEY("ш");
+ KEY("щ");
+ KEY("ъ");
+ KEY("ы");
+ KEY("ь");
+ KEY("э");
+ KEY("ю");
+ KEY("я");
+ KEY("ё");
+ KEY("і");
+ KEY("ї");
+ KEY("ў");
+ SPACER();
+ SPACER();
+ SPACER();
+ gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
+
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+
+ SWCASE();
+
+ MODE(VKBD_NUMERIC);
+
+ SPACER();
+
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_GREEK_UPPER) {
+ KEY("Α");
+ KEY("Β");
+ KEY("Γ");
+ KEY("Δ");
+ KEY("Ε");
+ KEY("Ζ");
+ KEY("Η");
+ KEY("Θ");
+ KEY("Ι");
+ KEY("Κ");
+ KEY("Λ");
+ KEY("Μ");
+ KEY("Ν");
+ KEY("Ξ");
+ KEY("Ο");
+ KEY("Π");
+ KEY("Ρ");
+ KEY("Σ");
+ KEY("Τ");
+ KEY("Υ");
+ KEY("Φ");
+ KEY("Χ");
+ KEY("Ψ");
+ KEY("Ω");
+ KEY("Ή");
+ KEY("Ά");
+ KEY("Ό");
+ KEY("Ί");
+ KEY("Ώ");
+ KEY("Έ");
+ KEY("Ύ");
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
+
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+
+ SWCASE();
+
+ MODE(VKBD_NUMERIC);
+
+ SPACER();
+
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_GREEK_LOWER) {
+ KEY("α");
+ KEY("β");
+ KEY("γ");
+ KEY("δ");
+ KEY("ε");
+ KEY("ζ");
+ KEY("η");
+ KEY("θ");
+ KEY("ι");
+ KEY("κ");
+ KEY("λ");
+ KEY("μ");
+ KEY("ν");
+ KEY("ξ");
+ KEY("ο");
+ KEY("π");
+ KEY("ρ");
+ KEY("σ");
+ KEY("τ");
+ KEY("υ");
+ KEY("φ");
+ KEY("χ");
+ KEY("ψ");
+ KEY("ω");
+ KEY("ή");
+ KEY("ά");
+ KEY("ό");
+ KEY("ί");
+ KEY("ώ");
+ KEY("έ");
+ KEY("ύ");
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ SPACER();
+ gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
+
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+
+ SWCASE();
+
+ MODE(VKBD_NUMERIC);
+
+ SPACER();
+
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+
+
+ if(md->search_list && md->search_list->type==widget_table) {
+ struct table_data *td=(struct table_data*)(md->search_list->data);
+ td->scroll_buttons.button_box_hide = !(mode & VKBD_FLAG_1024);
+ }
+
+ if ((mode & VKBD_LAYOUT_MASK) == VKBD_DEGREE) { /* special case for coordinates input screen (enter_coord) */
+ KEY("0");
+ KEY("1");
+ KEY("2");
+ KEY("3");
+ KEY("4");
+ SPACER();
+ KEY("N");
+ KEY("S");
+ KEY("5");
+ KEY("6");
+ KEY("7");
+ KEY("8");
+ KEY("9");
+ SPACER();
+ KEY("E");
+ KEY("W");
+ KEY("°");
+ KEY(".");
+ KEY("'");
+ gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h);
+ SPACER();
+
+ wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h);
+ wk->datai = mode | VKBD_FLAG_1024;
+
+ SPACER();
+ gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h);
+ }
+
+ if (mode & VKBD_FLAG_1024) {
+ char *text=NULL;
+ int font=0;
+ struct widget *wkl;
+ mode &= ~VKBD_FLAG_1024;
+ text=gui_internal_keyb_modes[mode/8].title;
+ font=gui_internal_keyb_modes[mode/8].font;
+ wk=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_fill);
+ wk->func=gui_internal_keyboard_change;
+ wk->data=wkbdb;
+ wk->background=this->background;
+ wk->bl=0;
+ wk->br=0;
+ wk->bt=0;
+ wk->bb=0;
+ wk->w=max_w;
+ wk->h=max_h;
+ wk->datai=mode;
+ wk->state |= STATE_SENSITIVE;
+ gui_internal_widget_append(wk, wkl=gui_internal_label_new(this, unhide));
+ wkl->background=NULL;
+ gui_internal_widget_append(wk, wkl=gui_internal_label_font_new(this, text, font));
+ wkl->background=NULL;
+ gui_internal_widget_append(wkbd, wk);
+ if (render)
+ render=2;
+ }
+ gui_internal_widget_append(wkbdb, wkbd);
+ if (render == 1) {
+ gui_internal_widget_pack(this, wkbdb);
+ gui_internal_widget_render(this, wkbdb);
+ } else if (render == 2) {
+ gui_internal_menu_reset_pack(this);
+ gui_internal_menu_render(this);
+ }
+ return wkbdb;
}
#undef KEY
#undef SPACER
@@ -401,17 +673,14 @@ gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode)
* @return A new keyboard widget
*/
struct widget *
-gui_internal_keyboard(struct gui_priv *this, int mode)
-{
- if (! this->keyboard)
- return NULL;
- return gui_internal_keyboard_do(this, NULL, mode);
+gui_internal_keyboard(struct gui_priv *this, int mode) {
+ if (! this->keyboard)
+ return NULL;
+ return gui_internal_keyboard_do(this, NULL, mode);
}
-static void
-gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data)
-{
- gui_internal_keyboard_do(this, key->data, key->datai);
+static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data) {
+ gui_internal_keyboard_do(this, key->data, key->datai);
}
/**
@@ -425,41 +694,41 @@ gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *da
* @return {@code VKBD_CYRILLIC_UPPER} for countries using the Cyrillic alphabet,
* {@code VKBD_LATIN_UPPER} otherwise
*/
-int
-gui_internal_keyboard_init_mode(char *lang)
-{
- int ret=0;
- /* do not crash if lang is NULL, which may be returned by getenv*/
- if(lang == NULL)
- return VKBD_LATIN_UPPER;
-
- /* Converting to upper case here is required for Android */
- lang=g_ascii_strup(lang,-1);
- /*
- * Set cyrillic keyboard for countries using Cyrillic alphabet
- */
- if (strstr(lang,"RU"))
- ret = VKBD_CYRILLIC_UPPER;
- else if (strstr(lang,"UA"))
- ret = VKBD_CYRILLIC_UPPER;
- else if (strstr(lang,"BY"))
- ret = VKBD_CYRILLIC_UPPER;
- else if (strstr(lang,"RS"))
- ret = VKBD_CYRILLIC_UPPER;
- else if (strstr(lang,"BG"))
- ret = VKBD_CYRILLIC_UPPER;
- else if (strstr(lang,"MK"))
- ret = VKBD_CYRILLIC_UPPER;
- else if (strstr(lang,"KZ"))
- ret = VKBD_CYRILLIC_UPPER;
- else if (strstr(lang,"KG"))
- ret = VKBD_CYRILLIC_UPPER;
- else if (strstr(lang,"TJ"))
- ret = VKBD_CYRILLIC_UPPER;
- else if (strstr(lang,"MN"))
- ret = VKBD_CYRILLIC_UPPER;
- g_free(lang);
- return ret;
+int gui_internal_keyboard_init_mode(char *lang) {
+ int ret=0;
+ /* do not crash if lang is NULL, which may be returned by getenv*/
+ if(lang == NULL)
+ return VKBD_LATIN_UPPER;
+
+ /* Converting to upper case here is required for Android */
+ lang=g_ascii_strup(lang,-1);
+ /*
+ * Set cyrillic keyboard for countries using Cyrillic alphabet
+ */
+ if (strstr(lang,"RU"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"UA"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"BY"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"RS"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"BG"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"MK"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"KZ"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"KG"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"TJ"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"MN"))
+ ret = VKBD_CYRILLIC_UPPER;
+ else if (strstr(lang,"GR"))
+ ret = VKBD_GREEK_UPPER;
+ g_free(lang);
+ return ret;
}
@@ -481,15 +750,15 @@ gui_internal_keyboard_init_mode(char *lang)
* @param w The placeholder widget
*/
static void gui_internal_keyboard_hide_native(struct gui_priv *this_, struct widget *w) {
- struct graphics_keyboard *kbd = (struct graphics_keyboard *) w->data;
-
- if (kbd) {
- graphics_hide_native_keyboard(this_->gra, kbd);
- g_free(kbd->lang);
- g_free(kbd->gui_priv);
- } else
- dbg(lvl_warning, "no graphics_keyboard found, cleanup failed\n");
- g_free(w);
+ struct graphics_keyboard *kbd = (struct graphics_keyboard *) w->data;
+
+ if (kbd) {
+ graphics_hide_native_keyboard(this_->gra, kbd);
+ g_free(kbd->lang);
+ g_free(kbd->gui_priv);
+ } else
+ dbg(lvl_warning, "no graphics_keyboard found, cleanup failed");
+ g_free(w);
}
@@ -519,42 +788,42 @@ static void gui_internal_keyboard_hide_native(struct gui_priv *this_, struct wid
* @return The placeholder widget for the on-screen keyboard, may be {@code NULL}
*/
struct widget * gui_internal_keyboard_show_native(struct gui_priv *this, struct widget *w, int mode, char *lang) {
- struct widget *ret = NULL;
- struct menu_data *md = gui_internal_menu_data(this);
- struct graphics_keyboard *kbd = g_new0(struct graphics_keyboard, 1);
- int res;
-
- kbd->mode = mode;
- if (lang)
- kbd->lang = g_strdup(lang);
- res = graphics_show_native_keyboard(this->gra, kbd);
-
- switch(res) {
- case -1:
- dbg(lvl_error, "graphics has no show_native_keyboard method, cannot display keyboard\n");
- /* no break */
- case 0:
- g_free(kbd);
- return NULL;
- }
-
- ret = gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill);
- md->keyboard = ret;
- md->keyboard_mode=mode;
- ret->wfree = gui_internal_keyboard_hide_native;
- if (kbd->h < 0) {
- ret->h = w->h;
- ret->hmin = w->hmin;
- } else
- ret->h = kbd->h;
- if (kbd->w < 0) {
- ret->w = w->w;
- ret->wmin = w->wmin;
- } else
- ret->w = kbd->w;
- dbg(lvl_error, "ret->w=%d, ret->h=%d\n", ret->w, ret->h);
- ret->data = (void *) kbd;
- gui_internal_widget_append(w, ret);
- dbg(lvl_error, "return\n");
- return ret;
+ struct widget *ret = NULL;
+ struct menu_data *md = gui_internal_menu_data(this);
+ struct graphics_keyboard *kbd = g_new0(struct graphics_keyboard, 1);
+ int res;
+
+ kbd->mode = mode;
+ if (lang)
+ kbd->lang = g_strdup(lang);
+ res = graphics_show_native_keyboard(this->gra, kbd);
+
+ switch(res) {
+ case -1:
+ dbg(lvl_error, "graphics has no show_native_keyboard method, cannot display keyboard");
+ /* no break */
+ case 0:
+ g_free(kbd);
+ return NULL;
+ }
+
+ ret = gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill);
+ md->keyboard = ret;
+ md->keyboard_mode=mode;
+ ret->wfree = gui_internal_keyboard_hide_native;
+ if (kbd->h < 0) {
+ ret->h = w->h;
+ ret->hmin = w->hmin;
+ } else
+ ret->h = kbd->h;
+ if (kbd->w < 0) {
+ ret->w = w->w;
+ ret->wmin = w->wmin;
+ } else
+ ret->w = kbd->w;
+ dbg(lvl_error, "ret->w=%d, ret->h=%d", ret->w, ret->h);
+ ret->data = (void *) kbd;
+ gui_internal_widget_append(w, ret);
+ dbg(lvl_error, "return");
+ return ret;
}