注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

GTK 输入法实现相关 GTK input method  

2011-09-22 18:41:48|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

linux上面的输入法实现除了XIM 接口外,这个GTK input method应该也是一种方法了。

看到网上有人问,简单的看了一下实现代码,还是挺简单的。

http://git.gnome.org/browse/gtk+/tree/gtk
http://git.gnome.org/browse/gtk+/tree/gtk/gtkimcontext.c
http://git.gnome.org/browse/gtk+/tree/gtk/gtkimcontext.c
http://developer.gnome.org/gtk/2.24/GtkIMContext.html


Gtk 自己管理 所有的输入模块, 保存输入法模块加载后的类指针,到一个hashtable里面?

GtkEntry有个属性保存关联的输入法,

struct _GtkEntryPrivate
{
  EntryIconInfo         *icons[MAX_ICONS];

  GtkEntryBuffer        *buffer;
  GtkIMContext          *im_context;    ///保存输入法的的实现的指针,GtkEntry建立的时候初始化。



按键事件来的时候,调用输入法的回调函数

static gint
gtk_entry_key_press (GtkWidget   *widget,
             GdkEventKey *event)
{
  GtkEntry *entry = GTK_ENTRY (widget);
  GtkEntryPrivate *priv = entry->priv;

  gtk_entry_reset_blink_time (entry);
  gtk_entry_pend_cursor_blink (entry);

  if (priv->editable)
    {
      if (gtk_im_context_filter_keypress (priv->im_context, event))  ///调用输入法注册的回调
    {
      gtk_entry_obscure_mouse_cursor (entry);
      priv->need_im_reset = TRUE;
      return TRUE;
    }
    }
 

 
 
 
 
  写一个典型的输入法可以实现的回调函数,
 
  struct GtkIMContextClass {
  /* Signals */
  void     (*preedit_start)        (GtkIMContext *context);
  void     (*preedit_end)          (GtkIMContext *context);
  void     (*preedit_changed)      (GtkIMContext *context);
  void     (*commit)               (GtkIMContext *context, const gchar *str);
  gboolean (*retrieve_surrounding) (GtkIMContext *context);
  gboolean (*delete_surrounding)   (GtkIMContext *context,
                    gint          offset,
                    gint          n_chars);

  /* Virtual functions */
  void     (*set_client_window)   (GtkIMContext   *context,
                   GdkWindow      *window);
  void     (*get_preedit_string)  (GtkIMContext   *context,
                   gchar         **str,
                   PangoAttrList **attrs,
                   gint           *cursor_pos);
  gboolean (*filter_keypress)     (GtkIMContext   *context,
                       GdkEventKey    *event);
  void     (*focus_in)            (GtkIMContext   *context);
  void     (*focus_out)           (GtkIMContext   *context);
  void     (*reset)               (GtkIMContext   *context);
  void     (*set_cursor_location) (GtkIMContext   *context,
                   GdkRectangle   *area);
  void     (*set_use_preedit)     (GtkIMContext   *context,
                   gboolean        use_preedit);
  void     (*set_surrounding)     (GtkIMContext   *context,
                   const gchar    *text,
                   gint            len,
                   gint            cursor_index);
  gboolean (*get_surrounding)     (GtkIMContext   *context,
                   gchar         **text,
                   gint           *cursor_index);
};
 
 
 
 
 

  评论这张
 
阅读(1083)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017