[maemo-commits] [maemo-commits] r19217 - projects/haf/trunk/hildon-input-method-plugins-example/src
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Wed Aug 26 19:57:19 EEST 2009
- Previous message: [maemo-commits] r19216 - projects/haf/trunk/libmatchbox2/debian
- Next message: [maemo-commits] r19218 - in projects/haf/trunk/osso-app-killer: debian src
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: femorandeira Date: 2009-08-26 19:57:16 +0300 (Wed, 26 Aug 2009) New Revision: 19217 Modified: projects/haf/trunk/hildon-input-method-plugins-example/src/hildon-im-example-fkb.c Log: Improved the visual appearance. I added experimental support for changing the layout and using tap&hold. Once I have a clear idea for the user experience, I will begin to work on actually make it write something. As we don't have word completion or text selection, I wonder if I could simply listen to a bunch of signals from the text view and notify the client widget. Modified: projects/haf/trunk/hildon-input-method-plugins-example/src/hildon-im-example-fkb.c =================================================================== --- projects/haf/trunk/hildon-input-method-plugins-example/src/hildon-im-example-fkb.c 2009-08-26 15:55:47 UTC (rev 19216) +++ projects/haf/trunk/hildon-input-method-plugins-example/src/hildon-im-example-fkb.c 2009-08-26 16:57:16 UTC (rev 19217) @@ -19,20 +19,45 @@ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HILDON_IM_EXAMPLE_FKB_TYPE,\ HildonIMExampleFKBPrivate)) -static const gchar* layout_1[] = {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", NULL}; -static const gchar* layout_2[] = {"a", "s", "d", "f", "g", "h", "j", "k", "l", "?", NULL}; -static const gchar* layout_3[] = {"z", "x", "c", "v", "b", "n", "m", ".", ",", "!", NULL}; -static const gchar* layout_4[] = {"↑", "1*?", " ", "Return", "←", "Close", NULL}; -static const gchar** keyboard_layout[] = {layout_1, layout_2, layout_3, layout_4, NULL}; +/* ***** LAYOUTS ***** */ -/* +/* I don't know why this doesn't work: static const gchar* keyboard_layout[][] = {{"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", NULL}, {"a", "s", "d", "f", "g", "h", "j", "k", "l", NULL}, {"z", "x", "c", "v", "b", "n", "m", NULL}, NULL}; */ +static const gchar* alpha_lower_1[] = {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", NULL}; +static const gchar* alpha_lower_2[] = {"a", "s", "d", "f", "g", "h", "j", "k", "l", ":", NULL}; +static const gchar* alpha_lower_3[] = {"z", "x", "c", "v", "b", "n", "m", ".", ",", ";", NULL}; +/* static const gchar* layout_4[] = {"↑", "1*?", " ", "Return", "←", "Close", NULL}; */ +static const gchar** alpha_lower[] = {alpha_lower_1, + alpha_lower_2, + alpha_lower_3, NULL}; +static const gchar* alpha_upper_1[] = {"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", NULL}; +static const gchar* alpha_upper_2[] = {"A", "S", "D", "F", "G", "H", "J", "K", "L", "'", NULL}; +static const gchar* alpha_upper_3[] = {"+", "-", "*", "/", "\\", "%", "#", "¿", "¡", "§", NULL}; +static const gchar** alpha_upper[] = {alpha_upper_1, + alpha_upper_2, + alpha_upper_3, NULL}; + +static const gchar* special_lower_1[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", NULL}; +static const gchar* special_lower_2[] = {"á", "é", "í", "ó", "ú", "ñ", "ç", "ß", "æ", "\"", NULL}; +static const gchar* special_lower_3[] = {"+", "-", "*", "/", "\\", "%", "#", "", "", "", NULL}; +static const gchar** special_lower[] = {special_lower_1, + special_lower_2, + special_lower_3, NULL}; + +static const gchar* special_upper_1[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", NULL}; +static const gchar* special_upper_2[] = {"Á", "É", "Í", "Ó", "Ú", "Ñ", "Ç", "ß", "Æ", "£", NULL}; +static const gchar* special_upper_3[] = {"(", ")", "[", "]", "{", "}", "<", ">", "€", "$", NULL}; +static const gchar** special_upper[] = {special_upper_1, + special_upper_2, + special_upper_3, NULL}; + + typedef struct { GtkContainerClass parent; @@ -51,6 +76,16 @@ HildonIMUI *ui; GtkWidget *window; GtkWidget *text_view; + + GtkWidget *keyboard_vbox; + + GtkWidget *shift_button; + GtkWidget *symbols_button; + GtkWidget *space_button; + GtkWidget *return_button; + GtkWidget *delete_button; + GtkWidget *close_button; + const gchar*** keyboard_layout; } HildonIMExampleFKBPrivate; @@ -127,7 +162,7 @@ /* * Internal functions */ -static GtkWidget* create_window (HildonIMExampleFKB *self); +static void create_window (HildonIMExampleFKB *self); /* @@ -366,7 +401,7 @@ if (priv->window == NULL) { - priv->window = create_window(self); + create_window(self); } /* gtk_window_fullscreen(priv->window); */ @@ -406,6 +441,62 @@ } static void +remove_children_from_container (GtkWidget *widget, gpointer data) +{ + GtkContainer *container; + + if (!widget || !data) + return; + + container = (GtkContainer*)data; + gtk_container_remove (container, widget); +} + +static void +apply_keyboard_layout (HildonIMExampleFKB *self, + const gchar** keyboard_layout[]) +{ + HildonIMExampleFKBPrivate *priv; + gint i, j; + + priv = HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(self); + + gtk_container_forall(GTK_CONTAINER(priv->keyboard_vbox), + remove_children_from_container, + GTK_CONTAINER(priv->keyboard_vbox)); + + for (i = 0; keyboard_layout[i] != NULL; i++) + { + GtkWidget *hbox = gtk_hbox_new(TRUE, 0); + + for (j = 0; keyboard_layout[i][j] != NULL; j++) + { + GtkWidget *button = hildon_button_new_with_text (HILDON_SIZE_FINGER_HEIGHT, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + keyboard_layout[i][j], NULL); + + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); + + g_signal_connect(button, "clicked", G_CALLBACK(text_button_clicked), self); + + GtkWidget *menu = hildon_gtk_menu_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_menu_item_new_with_label("á")); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_menu_item_new_with_label("à")); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_menu_item_new_with_label("â")); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_menu_item_new_with_label("æ")); + gtk_widget_tap_and_hold_setup(button, menu, NULL, 0); /* gtk_widget_tap_and_hold_menu_position_top ? */ + gtk_widget_show_all (menu); + } + + gtk_box_pack_start(GTK_BOX(priv->keyboard_vbox), hbox, FALSE, FALSE, 0); + } + + gtk_container_resize_children (GTK_CONTAINER(priv->keyboard_vbox)); + gtk_container_resize_children (GTK_CONTAINER(priv->window)); + priv->keyboard_layout = keyboard_layout; +} + +static void delete_button_clicked (GtkButton *button, gpointer user_data) { /* @@ -414,24 +505,60 @@ */ } -static GtkWidget* create_window (HildonIMExampleFKB *self) +static void +shift_symbols_buttons_toggled (GtkToggleButton *togglebutton, + gpointer user_data) { + HildonIMExampleFKB *self; HildonIMExampleFKBPrivate *priv; + g_return_if_fail (HILDON_IS_IM_EXAMPLE_FKB (user_data)); + self = HILDON_IM_EXAMPLE_FKB(user_data); priv = HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(self); - GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->symbols_button))) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->shift_button))) + { + apply_keyboard_layout(self, special_upper); + } + else + { + apply_keyboard_layout(self, special_lower); + } + } + else + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->shift_button))) + { + apply_keyboard_layout(self, alpha_upper); + } + else + { + apply_keyboard_layout(self, alpha_lower); + } + } +} + +static void +create_window (HildonIMExampleFKB *self) +{ + HildonIMExampleFKBPrivate *priv; + + priv = HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(self); - gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_window_set_decorated(GTK_WINDOW(window), FALSE); - gtk_window_fullscreen(GTK_WINDOW(window)); + priv->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_type_hint(GTK_WINDOW(priv->window), GDK_WINDOW_TYPE_HINT_DIALOG); + gtk_window_set_decorated(GTK_WINDOW(priv->window), FALSE); + gtk_window_fullscreen(GTK_WINDOW(priv->window)); /* It is always rotated! :-( */ - hildon_gtk_window_set_portrait_flags (GTK_WINDOW(window), + hildon_gtk_window_set_portrait_flags (GTK_WINDOW(priv->window), HILDON_PORTRAIT_MODE_SUPPORT); - GtkWidget *vbox, *parea; + GtkWidget *vbox, *parea, *hbox; vbox = gtk_vbox_new(FALSE, 5); @@ -442,68 +569,79 @@ parea = hildon_pannable_area_new(); g_object_set(G_OBJECT(parea), "mov_mode", HILDON_MOVEMENT_MODE_VERT, NULL); - hildon_pannable_area_add_with_viewport (parea, priv->text_view); + hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA(parea), priv->text_view); gtk_box_pack_start(GTK_BOX(vbox), parea, TRUE, TRUE, 0); - gint i, j; + priv->keyboard_vbox = gtk_vbox_new(TRUE, 5); + gtk_box_pack_start(GTK_BOX(vbox), priv->keyboard_vbox, FALSE, FALSE, 0); + apply_keyboard_layout(self, alpha_lower); - for (i = 0; keyboard_layout[i] != NULL; i++) - { - GtkWidget *hbox = gtk_hbox_new(FALSE, 0); - - for (j = 0; keyboard_layout[i][j] != NULL; j++) - { - GtkWidget *button = hildon_button_new_with_text (HILDON_SIZE_FINGER_HEIGHT, - HILDON_BUTTON_ARRANGEMENT_VERTICAL, - keyboard_layout[i][j], NULL); - - gint screen_width = gdk_screen_width(); - - gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); - if (g_strcmp0(keyboard_layout[i][j], "↑") == 0) - { - /* uppercase/lowercase */ - gtk_widget_set_size_request(button, screen_width*0.15, 70); - } - else if (g_strcmp0(keyboard_layout[i][j], "1*?") == 0) - { - /* symbols */ - gtk_widget_set_size_request(button, screen_width*0.15, 70); - } - else if (g_strcmp0(keyboard_layout[i][j], " ") == 0) - { - /* uppercase/lowercase */ - gtk_widget_set_size_request(button, screen_width*0.4, 70); - g_signal_connect(button, "clicked", G_CALLBACK(text_button_clicked), self); - } - else if (g_strcmp0(keyboard_layout[i][j], "Return") == 0) - { - /* uppercase/lowercase */ - gtk_widget_set_size_request(button, screen_width*0.15, 70); - } - else if (g_strcmp0(keyboard_layout[i][j], "←") == 0) - { - /* delete */ - gtk_widget_set_size_request(button, screen_width*0.2, 70); - g_signal_connect(button, "clicked", G_CALLBACK(delete_button_clicked), self); - } - else if (g_strcmp0(keyboard_layout[i][j], "Close") == 0) - { - /* uppercase/lowercase */ - gtk_widget_set_size_request(button, screen_width*0.1, 70); - } - else - { - /* a regular character button */ - g_signal_connect(button, "clicked", G_CALLBACK(text_button_clicked), self); - } - } - - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - } + gint screen_width = gdk_screen_width(); + + hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add (GTK_CONTAINER(window), vbox); + /* Shif button */ - return window; + priv->shift_button = hildon_gtk_toggle_button_new(HILDON_SIZE_FINGER_HEIGHT); + hildon_button_set_image(HILDON_BUTTON(priv->shift_button), + gtk_image_new_from_icon_name("keyboard_move_up", -1)); + gtk_widget_set_size_request(priv->shift_button, screen_width*0.15, 70); + gtk_box_pack_start(GTK_BOX(hbox), priv->shift_button, TRUE, TRUE, 0); + g_signal_connect(priv->shift_button, "toggled", + G_CALLBACK(shift_symbols_buttons_toggled), self); + + /* Symbols button */ + + priv->symbols_button = hildon_gtk_toggle_button_new (HILDON_SIZE_FINGER_HEIGHT); + gtk_button_set_label(GTK_BUTTON(priv->symbols_button), "1*?"); + gtk_widget_set_size_request(priv->symbols_button, screen_width*0.15, 70); + gtk_box_pack_start(GTK_BOX(hbox), priv->symbols_button, TRUE, TRUE, 0); + g_signal_connect(priv->shift_button, "toggled", + G_CALLBACK(shift_symbols_buttons_toggled), self); + + /* Space button */ + + priv->space_button = hildon_button_new_with_text (HILDON_SIZE_FINGER_HEIGHT, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + " ", NULL); + gtk_widget_set_size_request(priv->space_button, screen_width*0.3, 70); + gtk_box_pack_start(GTK_BOX(hbox), priv->space_button, TRUE, TRUE, 0); + + /* Return button */ + + priv->return_button = hildon_button_new(HILDON_SIZE_FINGER_HEIGHT, + HILDON_BUTTON_ARRANGEMENT_VERTICAL); + hildon_button_set_image(HILDON_BUTTON(priv->return_button), + gtk_image_new_from_icon_name("keyboard_enter", + -1)); + gtk_widget_set_size_request(priv->return_button, screen_width*0.15, 70); + gtk_box_pack_start(GTK_BOX(hbox), priv->return_button, TRUE, TRUE, 0); + + /* Delete button */ + + priv->delete_button = hildon_button_new(HILDON_SIZE_FINGER_HEIGHT, + HILDON_BUTTON_ARRANGEMENT_VERTICAL); + hildon_button_set_image(HILDON_BUTTON(priv->delete_button), + gtk_image_new_from_icon_name("general_backspace", + -1)); + gtk_widget_set_size_request(priv->delete_button, screen_width*0.15, 70); + g_signal_connect(priv->delete_button, "clicked", G_CALLBACK(delete_button_clicked), self); + gtk_box_pack_start(GTK_BOX(hbox), priv->delete_button, TRUE, TRUE, 0); + + /* Close button */ + + priv->close_button = hildon_button_new(HILDON_SIZE_FINGER_HEIGHT, + HILDON_BUTTON_ARRANGEMENT_VERTICAL); + hildon_button_set_image(HILDON_BUTTON(priv->close_button), + gtk_image_new_from_icon_name("keyboard_close", + -1)); + gtk_widget_set_size_request(priv->close_button, screen_width*0.1, 70); + gtk_box_pack_start(GTK_BOX(hbox), priv->close_button, TRUE, TRUE, 0); + + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + gtk_container_add (GTK_CONTAINER(priv->window), vbox); + + gtk_container_resize_children (GTK_CONTAINER(priv->window)); }
- Previous message: [maemo-commits] r19216 - projects/haf/trunk/libmatchbox2/debian
- Next message: [maemo-commits] r19218 - in projects/haf/trunk/osso-app-killer: debian src
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]