[maemo-commits] [maemo-commits] r19205 - projects/haf/trunk/hildon-input-method-plugins-example/src
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Wed Aug 26 12:29:40 EEST 2009
- Previous message: [maemo-commits] r19204 - projects/haf/tags/gtk+/2.14.7-1maemo9/debian
- Next message: [maemo-commits] r19206 - in projects/haf/branches/libmatchbox2: . bug.134557/matchbox/core
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: femorandeira Date: 2009-08-26 12:28:19 +0300 (Wed, 26 Aug 2009) New Revision: 19205 Added: projects/haf/trunk/hildon-input-method-plugins-example/src/hildon-im-example-fkb.c Log: First initial version of the HIM Example FKB. It still doesn't do much, but it will in the future :-) Added: 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-25 14:30:27 UTC (rev 19204) +++ projects/haf/trunk/hildon-input-method-plugins-example/src/hildon-im-example-fkb.c 2009-08-26 09:28:19 UTC (rev 19205) @@ -0,0 +1,509 @@ +#include "hildon-im-plugin.h" +#include "hildon-im-ui.h" + +#include <string.h> +#include <glib.h> +#include <gdk/gdk.h> +#include <gdk/gdkx.h> +#include <gtk/gtk.h> +#include <hildon/hildon.h> + +#define HILDON_IM_EXAMPLE_FKB_TYPE hildon_im_example_fkb_get_type() +#define HILDON_IM_EXAMPLE_FKB(obj) GTK_CHECK_CAST(obj, hildon_im_example_fkb_get_type(), HildonIMExampleFKB) +#define HILDON_IM_EXAMPLE_FKB_CLASS(klass) \ + GTK_CHECK_CLASS_CAST(klass, hildon_im_example_fkb_get_type, \ + HildonIMExampleFKBClass) +#define HILDON_IS_IM_EXAMPLE_FKB(obj) \ + GTK_CHECK_TYPE(obj, hildon_im_example_fkb_get_type()) +#define HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(obj) \ + (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}; + +/* +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}; +*/ + + +typedef struct +{ + GtkContainerClass parent; +} +HildonIMExampleFKBClass; + +typedef struct +{ + GtkContainer parent; + +} +HildonIMExampleFKB; + +typedef struct +{ + HildonIMUI *ui; + GtkWidget *window; + GtkWidget *text_view; +} +HildonIMExampleFKBPrivate; + +static GType hildon_im_example_fkb_type = 0; +static GtkWidgetClass *parent_class = NULL; + +GType hildon_im_example_fkb_get_type (void); +GtkWidget *hildon_im_example_fkb_new (HildonIMUI *kbd); + +/* + * HildonIMPlugin interface + */ + +static void hildon_im_example_fkb_iface_init (HildonIMPluginIface *iface); + +static void hildon_im_example_fkb_enable (HildonIMPlugin *plugin, gboolean init); +static void hildon_im_example_fkb_disable (HildonIMPlugin *plugin); +/* +static void hildon_im_example_fkb_settings_changed (HildonIMPlugin *plugin, + const gchar *key, + const GConfValue *value); +static void hildon_im_example_fkb_language_settings_changed (HildonIMPlugin *plugin, + gint index); +static void hildon_im_example_fkb_input_mode_changed (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_keyboard_state_changed (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_client_widget_changed (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_character_autocase (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_clear (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_save_data (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_mode_a (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_mode_b (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_language (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_backspace (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_enter (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_tab (HildonIMPlugin *plugin); +static void hildon_im_example_fkb_fullscreen (HildonIMPlugin *plugin, + gboolean fullscreen); +static void hildon_im_example_fkb_select_region (HildonIMPlugin *plugin, + gint start, + gint end); +static void hildon_im_example_fkb_key_event (HildonIMPlugin *plugin, + GdkEventType type, + guint state, + guint keyval, + guint hardware_keycode); +static void hildon_im_example_fkb_transition (HildonIMPlugin *plugin, + gboolean from); +static void hildon_im_example_fkb_surrounding_received (HildonIMPlugin *plugin, + const gchar *surrounding, + gint offset); +static void hildon_im_example_fkb_button_activated (HildonIMPlugin *plugin, + HildonIMButton button, + gboolean long_press); +static void hildon_im_example_fkb_preedit_committed (HildonIMPlugin *plugin, + const gchar *committed_preedit); +*/ + +/* + * GObject functions + */ +static void hildon_im_example_fkb_finalize (GObject *obj); +static void hildon_im_example_fkb_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void hildon_im_example_fkb_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static void hildon_im_example_fkb_class_init (HildonIMExampleFKBClass *klass); +static void hildon_im_example_fkb_init (HildonIMExampleFKB *self); + +/* + * Internal functions + */ +static GtkWidget* create_window (HildonIMExampleFKB *self); + + +/* + * Module functions + */ + +HildonIMPlugin* +module_create (HildonIMUI *keyboard) +{ + return HILDON_IM_PLUGIN (hildon_im_example_fkb_new (keyboard)); +} + +void +module_exit(void) +{ + /* empty */ +} + +void +module_init(GTypeModule *module) +{ + static const GTypeInfo type_info = { + sizeof(HildonIMExampleFKBClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) hildon_im_example_fkb_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(HildonIMExampleFKB), + 0, /* n_preallocs */ + (GInstanceInitFunc) hildon_im_example_fkb_init, + }; + + static const GInterfaceInfo plugin_info = { + (GInterfaceInitFunc) hildon_im_example_fkb_iface_init, + NULL, /* interface_finalize */ + NULL, /* interface_data */ + }; + + hildon_im_example_fkb_type = + g_type_module_register_type(module, + GTK_TYPE_CONTAINER, "HildonIMExampleFKB", + &type_info, + 0); + + g_type_module_add_interface(module, + HILDON_IM_EXAMPLE_FKB_TYPE, + HILDON_IM_TYPE_PLUGIN, + &plugin_info); +} + +/* + * This is used to know the plugin's information when loading the module + */ +const HildonIMPluginInfo * +hildon_im_plugin_get_info(void) +{ + static const HildonIMPluginInfo info = + { + "HIM Example FKB", /* description */ + "hildon_im_example_fkb", /* name */ + NULL, /* menu title */ + NULL, /* gettext domain */ + TRUE, /* visible in menu */ + FALSE, /* cached */ + HILDON_IM_TYPE_FULLSCREEN, /* UI type */ + HILDON_IM_GROUP_LATIN, /* group */ + HILDON_IM_DEFAULT_PLUGIN_PRIORITY, /* priority */ + NULL, /* special character plugin */ + NULL, /* help page */ + TRUE, /* disable common UI buttons */ + 0, /* plugin height */ + HILDON_IM_TRIGGER_FINGER /* trigger */ + }; + + return &info; +} + +/* + * This function returns the list of available languages supported + * by the plugin. + */ +gchar ** +hildon_im_plugin_get_available_languages (gboolean *free) +{ + static gchar *list[] = { "en_GB", NULL }; + *free = FALSE; + + return list; +} + +GType +hildon_im_example_fkb_get_type (void) +{ + return hildon_im_example_fkb_type; +} + +/* + * Implement the interface. + */ +static void +hildon_im_example_fkb_iface_init (HildonIMPluginIface *iface) +{ + iface->enable = hildon_im_example_fkb_enable; + iface->disable = hildon_im_example_fkb_disable; + /* + iface->settings_changed = hildon_im_example_fkb_settings_changed; + iface->language_settings_changed = hildon_im_example_fkb_language_settings_changed; + iface->input_mode_changed = hildon_im_example_fkb_input_mode_changed; + iface->keyboard_state_changed = hildon_im_example_fkb_keyboard_state_changed; + iface->client_widget_changed = hildon_im_example_fkb_client_widget_changed; + + iface->character_autocase = hildon_im_example_fkb_character_autocase; + iface->clear = hildon_im_example_fkb_clear; + iface->save_data = hildon_im_example_fkb_save_data; + iface->mode_a = hildon_im_example_fkb_mode_a; + iface->mode_b = hildon_im_example_fkb_mode_b; + iface->language = hildon_im_example_fkb_language; + iface->backspace = hildon_im_example_fkb_backspace; + iface->enter = hildon_im_example_fkb_enter; + iface->tab = hildon_im_example_fkb_tab; + iface->fullscreen = hildon_im_example_fkb_fullscreen; + iface->select_region = hildon_im_example_fkb_select_region; + iface->key_event = hildon_im_example_fkb_key_event; + iface->transition = hildon_im_example_fkb_transition; + iface->surrounding_received = hildon_im_example_fkb_surrounding_received; + iface->button_activated = hildon_im_example_fkb_button_activated; + iface->preedit_committed = hildon_im_example_fkb_preedit_committed; + */ +} + +static void +hildon_im_example_fkb_class_init (HildonIMExampleFKBClass *klass) +{ + GObjectClass *object_class; + GtkObjectClass *gtk_object_class; + GtkWidgetClass *widget_class; + GtkContainerClass *container_class; + + parent_class = g_type_class_peek_parent(klass); + g_type_class_add_private(klass, sizeof(HildonIMExampleFKBPrivate)); + + object_class = G_OBJECT_CLASS(klass); + gtk_object_class = GTK_OBJECT_CLASS(klass); + widget_class = GTK_WIDGET_CLASS(klass); + container_class = GTK_CONTAINER_CLASS(klass); + + object_class->set_property = hildon_im_example_fkb_set_property; + object_class->get_property = hildon_im_example_fkb_get_property; + object_class->finalize = hildon_im_example_fkb_finalize; + + /* install properties and signals as needed */ +} + +static void +hildon_im_example_fkb_init (HildonIMExampleFKB *self) +{ + HildonIMExampleFKBPrivate *priv; + + g_return_if_fail (HILDON_IS_IM_EXAMPLE_FKB (self)); + priv = HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(self); + + priv->window = NULL; +} + +static void +hildon_im_example_fkb_finalize(GObject *obj) +{ + if (G_OBJECT_CLASS(parent_class)->finalize) + { + G_OBJECT_CLASS(parent_class)->finalize(obj); + } +} + +GtkWidget * +hildon_im_example_fkb_new (HildonIMUI *kbd) +{ + return g_object_new (HILDON_IM_EXAMPLE_FKB_TYPE, + HILDON_IM_PROP_UI_DESCRIPTION, kbd, NULL); +} + +static void +hildon_im_example_fkb_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + HildonIMExampleFKBPrivate *priv; + + g_return_if_fail (HILDON_IS_IM_EXAMPLE_FKB(object)); + priv = HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(object); + + switch (prop_id) + { + case HILDON_IM_PROP_UI: + g_value_set_object(value, priv->ui); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void +hildon_im_example_fkb_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + HildonIMExampleFKBPrivate *priv; + + g_return_if_fail (HILDON_IS_IM_EXAMPLE_FKB (object)); + priv = HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(object); + + switch (prop_id) + { + case HILDON_IM_PROP_UI: + priv->ui = g_value_get_object(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void +hildon_im_example_fkb_enable (HildonIMPlugin *plugin, gboolean init) +{ + HildonIMExampleFKB *self; + HildonIMExampleFKBPrivate *priv; + + g_return_if_fail (HILDON_IS_IM_EXAMPLE_FKB (plugin)); + self = HILDON_IM_EXAMPLE_FKB(plugin); + priv = HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(self); + + if (priv->window == NULL) + { + priv->window = create_window(self); + } + +/* gtk_window_fullscreen(priv->window); */ + gtk_widget_show_all(GTK_WIDGET(priv->window)); + + gdk_window_set_transient_for(GTK_WIDGET(priv->window)->window, + gtk_widget_get_root_window(GTK_WIDGET(priv->window))); +} + +static void +hildon_im_example_fkb_disable (HildonIMPlugin *plugin) +{ + HildonIMExampleFKB *self; + HildonIMExampleFKBPrivate *priv; + + g_return_if_fail (HILDON_IS_IM_EXAMPLE_FKB (plugin)); + self = HILDON_IM_EXAMPLE_FKB(plugin); + priv = HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(self); + + gtk_widget_hide(GTK_WIDGET(priv->window)); + hildon_im_ui_restore_previous_mode(priv->ui); +} + +static void +text_button_clicked (GtkButton *button, 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); + + gtk_text_buffer_insert_at_cursor(gtk_text_view_get_buffer(GTK_TEXT_VIEW(priv->text_view)), + hildon_button_get_title(HILDON_BUTTON(button)), + strlen(hildon_button_get_title(HILDON_BUTTON(button)))); +} + +static void +delete_button_clicked (GtkButton *button, gpointer user_data) +{ + /* + * +gtk_text_buffer_delete + */ +} + +static GtkWidget* create_window (HildonIMExampleFKB *self) +{ + HildonIMExampleFKBPrivate *priv; + + priv = HILDON_IM_EXAMPLE_FKB_GET_PRIVATE(self); + + GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + 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)); + /* + It is always rotated! :-( + */ + hildon_gtk_window_set_portrait_flags (GTK_WINDOW(window), + HILDON_PORTRAIT_MODE_SUPPORT); + + GtkWidget *vbox, *parea; + + vbox = gtk_vbox_new(FALSE, 5); + + priv->text_view = hildon_text_view_new(); + gtk_widget_set_name(priv->text_view, "him-textview"); + gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(priv->text_view), GTK_WRAP_WORD_CHAR); + gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(priv->text_view), TRUE); + + 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); + + gtk_box_pack_start(GTK_BOX(vbox), parea, TRUE, TRUE, 0); + + gint i, j; + + 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); + } + + gtk_container_add (GTK_CONTAINER(window), vbox); + + return window; +}
- Previous message: [maemo-commits] r19204 - projects/haf/tags/gtk+/2.14.7-1maemo9/debian
- Next message: [maemo-commits] r19206 - in projects/haf/branches/libmatchbox2: . bug.134557/matchbox/core
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]