[maemo-commits] [maemo-commits] r19205 - projects/haf/trunk/hildon-input-method-plugins-example/src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Wed Aug 26 12:29:40 EEST 2009
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;
+}

More information about the maemo-commits mailing list