/* * Copyright 2010 Vincent Sanders * * Framebuffer windowing toolkit on screen keyboard. * * This file is part of NetSurf, http://www.netsurf-browser.org/ * * NetSurf 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; version 2 of the License. * * NetSurf 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, see . */ #include #include #include #include #include #include #include "utils/log.h" #include "desktop/browser.h" #include "framebuffer/gui.h" #include "framebuffer/fbtk.h" #include "framebuffer/image_data.h" #include "widget.h" struct kbd_button_s { int x; int y; int w; int h; const char *t; enum nsfb_key_code_e keycode; }; #define KEYCOUNT 58 static struct kbd_button_s kbdbase[KEYCOUNT] = { { 0, 0, 20, 15, "`", NSFB_KEY_BACKQUOTE}, { 20, 0, 20, 15, "1", NSFB_KEY_1}, { 40, 0, 20, 15, "2", NSFB_KEY_2}, { 60, 0, 20, 15, "3", NSFB_KEY_3}, { 80, 0, 20, 15, "4", NSFB_KEY_4}, { 100, 0, 20, 15, "5", NSFB_KEY_5}, { 120, 0, 20, 15, "6", NSFB_KEY_6}, { 140, 0, 20, 15, "7", NSFB_KEY_7}, { 160, 0, 20, 15, "8", NSFB_KEY_8}, { 180, 0, 20, 15, "9", NSFB_KEY_9}, { 200, 0, 20, 15, "0", NSFB_KEY_0}, { 220, 0, 20, 15, "-", NSFB_KEY_MINUS}, { 240, 0, 20, 15, "=", NSFB_KEY_EQUALS}, { 260, 0, 40, 15, "\xe2\x8c\xab", NSFB_KEY_BACKSPACE}, { 0, 15, 30, 15, "\xe2\x86\xb9", NSFB_KEY_TAB}, { 30, 15, 20, 15, "q", NSFB_KEY_q}, { 50, 15, 20, 15, "w", NSFB_KEY_w}, { 70, 15, 20, 15, "e", NSFB_KEY_e}, { 90, 15, 20, 15, "r", NSFB_KEY_r}, { 110, 15, 20, 15, "t", NSFB_KEY_t}, { 130, 15, 20, 15, "y", NSFB_KEY_y}, { 150, 15, 20, 15, "u", NSFB_KEY_u}, { 170, 15, 20, 15, "i", NSFB_KEY_i}, { 190, 15, 20, 15, "o", NSFB_KEY_o}, { 210, 15, 20, 15, "p", NSFB_KEY_p}, { 230, 15, 20, 15, "[", NSFB_KEY_LEFTBRACKET}, { 250, 15, 20, 15, "]", NSFB_KEY_RIGHTBRACKET}, { 275, 15, 25, 30, "\xe2\x8f\x8e", NSFB_KEY_RETURN}, { 35, 30, 20, 15, "a", NSFB_KEY_a}, { 55, 30, 20, 15, "s", NSFB_KEY_s}, { 75, 30, 20, 15, "d", NSFB_KEY_d}, { 95, 30, 20, 15, "f", NSFB_KEY_f}, { 115, 30, 20, 15, "g", NSFB_KEY_g}, { 135, 30, 20, 15, "h", NSFB_KEY_h}, { 155, 30, 20, 15, "j", NSFB_KEY_j}, { 175, 30, 20, 15, "k", NSFB_KEY_k}, { 195, 30, 20, 15, "l", NSFB_KEY_l}, { 215, 30, 20, 15, ";", NSFB_KEY_SEMICOLON}, { 235, 30, 20, 15, "'", NSFB_KEY_l}, { 255, 30, 20, 15, "#", NSFB_KEY_HASH}, { 0, 45, 25, 15, "\xe2\x87\xa7", NSFB_KEY_LSHIFT}, { 25, 45, 20, 15, "\\", NSFB_KEY_SLASH}, { 45, 45, 20, 15, "z", NSFB_KEY_z}, { 65, 45, 20, 15, "x", NSFB_KEY_x}, { 85, 45, 20, 15, "c", NSFB_KEY_c}, { 105, 45, 20, 15, "v", NSFB_KEY_v}, { 125, 45, 20, 15, "b", NSFB_KEY_b}, { 145, 45, 20, 15, "n", NSFB_KEY_n}, { 165, 45, 20, 15, "m", NSFB_KEY_m}, { 185, 45, 20, 15, ",", NSFB_KEY_COMMA}, { 205, 45, 20, 15, ".", NSFB_KEY_PERIOD}, { 225, 45, 20, 15, "/", NSFB_KEY_BACKSLASH}, { 245, 45, 55, 15, "\xe2\x87\xa7", NSFB_KEY_RSHIFT}, { 40, 67, 185, 15, "", NSFB_KEY_SPACE}, { 250, 60, 20, 15, "\xe2\x96\xb2", NSFB_KEY_UP}, { 230, 67, 20, 15, "\xe2\x97\x80", NSFB_KEY_LEFT}, { 270, 67, 20, 15, "\xe2\x96\xb6", NSFB_KEY_RIGHT}, { 250, 75, 20, 15, "\xe2\x96\xbc", NSFB_KEY_DOWN}, }; static fbtk_widget_t *osk; static int osk_close(fbtk_widget_t *widget, fbtk_callback_info *cbi) { if (cbi->event->type != NSFB_EVENT_KEY_UP) return 0; fbtk_set_mapping(osk, false); return 0; } static int osk_click(fbtk_widget_t *widget, fbtk_callback_info *cbi) { nsfb_event_t event; struct kbd_button_s *kbd_button = cbi->context; event.type = cbi->event->type; event.value.keycode = kbd_button->keycode; fbtk_input(widget, &event); return 0; } /* exported function documented in fbtk.h */ void fbtk_enable_oskb(fbtk_widget_t *fbtk) { fbtk_widget_t *widget; int kloop; int maxx = 0; int maxy = 0; int ww; int wh; fbtk_widget_t *root = fbtk_get_root_widget(fbtk); int furniture_width = 18; for (kloop=0; kloop < KEYCOUNT; kloop++) { if ((kbdbase[kloop].x + kbdbase[kloop].w) > maxx) maxx=kbdbase[kloop].x + kbdbase[kloop].w; if ((kbdbase[kloop].y + kbdbase[kloop].h) > maxy) maxy=kbdbase[kloop].y + kbdbase[kloop].h; } ww = fbtk_get_width(root); /* scale window height apropriately */ wh = (maxy * ww) / maxx; osk = fbtk_create_window(root, 0, fbtk_get_height(root) - wh, 0, wh, 0xff202020); for (kloop=0; kloop < KEYCOUNT; kloop++) { widget = fbtk_create_text_button(osk, (kbdbase[kloop].x * ww) / maxx, (kbdbase[kloop].y * ww) / maxx, (kbdbase[kloop].w * ww) / maxx, (kbdbase[kloop].h *ww) / maxx, FB_FRAME_COLOUR, FB_COLOUR_BLACK, osk_click, &kbdbase[kloop]); fbtk_set_text(widget, kbdbase[kloop].t); } widget = fbtk_create_button(osk, fbtk_get_width(osk) - furniture_width, fbtk_get_height(osk) - furniture_width, furniture_width, furniture_width, FB_FRAME_COLOUR, &osk_image, osk_close, NULL); } /* exported function documented in fbtk.h */ void map_osk(void) { fbtk_set_zorder(osk, INT_MIN); fbtk_set_mapping(osk, true); } /* * Local Variables: * c-basic-offset:8 * End: */