From 4e3e03449d52ca228a0eaf6ab3d6237bcaf65be5 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Thu, 31 Jul 2014 11:22:15 +0800 Subject: [PATCH 01/10] revert to 2.1.4 --- Makefile.am | 1 + configure.ac | 38 +++---- po/LINGUAS | 2 + po/Makevars | 41 +++++++ po/POTFILES.in | 2 + po/ja.po | 73 +++++++++++++ po/zh_CN.po | 75 +++++++++++++ src/Makefile.am | 4 +- src/{UI_clutter.c => UI_gtk.c} | 190 ++++++++++++++++++--------------- src/engine.c | 25 ++++- src/engine.h | 10 +- src/handrecog.c | 4 +- src/handrecog.h | 9 +- src/handrecog_lucykila.c | 17 ++- src/main.c | 31 +++--- 15 files changed, 378 insertions(+), 144 deletions(-) create mode 100644 po/LINGUAS create mode 100644 po/Makevars create mode 100644 po/POTFILES.in create mode 100644 po/ja.po create mode 100644 po/zh_CN.po rename src/{UI_clutter.c => UI_gtk.c} (71%) diff --git a/Makefile.am b/Makefile.am index e354822..86351c4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -23,6 +23,7 @@ SUBDIRS = \ src \ icons \ + po \ data \ doc \ $(NULL) diff --git a/configure.ac b/configure.ac index 0d0dcad..8625fe9 100644 --- a/configure.ac +++ b/configure.ac @@ -21,9 +21,9 @@ # if not 1, append datestamp to the version number. m4_define([package_name], [ibus-handwrite]) - + AC_PREREQ([2.53]) -AC_INIT([package_name], [2.1.5], [http://code.google.com/p/ibus/issues/entry], [package_name]) +AC_INIT([package_name], [2.1.4], [http://code.google.com/p/ibus/issues/entry], [package_name]) AM_INIT_AUTOMAKE([-Wall]) AC_GNU_SOURCE @@ -31,10 +31,9 @@ AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) # define PACKAGE_VERSION_* variables -AC_PROG_CC_C99 +AC_PROG_CC AC_ISC_POSIX AC_HEADER_STDC -AC_PROG_MKDIR_P PKG_PROG_PKG_CONFIG @@ -49,15 +48,15 @@ AC_SUBST(zinnia,"") AC_ARG_WITH(zinnia-tomoe,[AC_HELP_STRING([--with-zinnia-tomoe=[[dir]]],[specify the dir that hold zinnia-tomoe data file])], [ tomoedir=${withval} - - rpm_sepc_with_tomoe="--with-zinnia-tomoe=${withval}" - zinnia_tomoe="zinnia-tomoe" + + rpm_sepc_with_tomoe="--with-zinnia-tomoe=${withval}" + zinnia_tomoe="zinnia-tomoe" zinnia="zinnia" - + AC_DEFINE_UNQUOTED(TOMOE_DATA_DIR,"${tomoedir}",[the dir that hold zinnia-tomoe data file]) ],[ AS_IF([test "x${enable_zinnia}" = "xyes"], - [AC_MSG_WARN(zinnia engine disabled due to the missing --with-zinnia-tomoe)]) + [AC_MSG_WARN(zinnia engine disabled due to the missing --with-zinnia-tomoe)]) enable_zinnia=no; ]) @@ -78,27 +77,30 @@ AS_IF([test "x${enable_zinnia}" = "xyes"], AS_IF([test "x${have_zinnia}" = "xyes" ],[ AM_CONDITIONAL(WITH_ZINNIA,[true]) ],[ - AM_CONDITIONAL(WITH_ZINNIA,[false]) + AM_CONDITIONAL(WITH_ZINNIA,[false]) ]) -AC_CHECK_LIB(m, main) -AC_CHECK_LIB(GL, main) - # check ibus PKG_CHECK_MODULES(IBUS, [ ibus-1.0 >= 1.3 ]) -PKG_CHECK_MODULES(CLUTTOR, [ - clutter-1.0 clutter-cogl-1.0 +PKG_CHECK_MODULES(GTK2, [ + gtk+-2.0 >= 2.10 +]) + +PKG_CHECK_MODULES(GTKGL, [ + gtkglext-1.0 ]) PKG_CHECK_MODULES(ALL_NEED, [ - clutter-1.0 clutter-cogl-1.0 ibus-1.0 >= 1.3 + ibus-1.0 >= 1.2 gtkglext-1.0 ]) -AC_DEFINE_UNQUOTED(ICONDIR,"${sharedstatedir}/ibus/icons",[icon filedir]) +AM_GNU_GETTEXT([external]) +AM_GNU_GETTEXT_VERSION(0.16.1) +#AC_DEFINE_UNQUOTED(ICONDIR,"${sharedstatedir}/ibus/icons",[icon filedir]) AC_CHECK_DECL(MAP_ANONYMOUS,[], [ @@ -111,7 +113,7 @@ AC_CHECK_DECL(MAP_ANONYMOUS,[], AC_DEFINE(MICROCAI_WITHEMAIL,"microcai@fedoraproject.org",[author microcai and his email]) # OUTPUT files -AC_CONFIG_FILES( +AC_CONFIG_FILES(po/Makefile.in Makefile ibus-handwrite.spec src/Makefile diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..72879c6 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,2 @@ +zh_CN +ja diff --git a/po/Makevars b/po/Makevars new file mode 100644 index 0000000..99c63d2 --- /dev/null +++ b/po/Makevars @@ -0,0 +1,41 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = microcai + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = $(PACKAGE_BUGREPORT) + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..73def29 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,2 @@ +src/main.c +src/engine.c \ No newline at end of file diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..65e162a --- /dev/null +++ b/po/ja.po @@ -0,0 +1,73 @@ +# Copyright (C) 2010 microcai +# This file is distributed under the same license as the ibus-handwrite package. +# FIRST AUTHOR , 2010. +# microcai , 2010. +msgid "" +msgstr "" +"Project-Id-Version: 0.01\n" +"Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n" +"POT-Creation-Date: 2011-01-26 08:05+0800\n" +"PO-Revision-Date: 2010-01-28 01:44+0800\n" +"Last-Translator: microcai \n" +"Language-Team: ja \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: UTF-8\n" + +#: src/main.c:49 +msgid "the icon file" +msgstr "" + +#: src/main.c:49 +msgid "icon file" +msgstr "" + +#: src/main.c:50 +msgid "set table file path" +msgstr "" + +#: src/main.c:50 +msgid "tablefile" +msgstr "" + +#: src/main.c:51 +msgid "set locale path" +msgstr "" + +#: src/main.c:51 +msgid "locale" +msgstr "" + +#: src/main.c:52 +msgid "set languate, accept zh and jp" +msgstr "" + +#: src/main.c:52 +msgid "lang" +msgstr "" + +#: src/main.c:120 +msgid "hand write recognizer" +msgstr "" + +#: src/main.c:151 +#, c-format +msgid "ibus-handwrite Version %s Start Up\n" +msgstr "ibus-handwrite バージョン %s を起動\n" + +#: src/engine.c:126 +msgid "color" +msgstr "顔色" + +#: src/engine.c:127 +msgid "click to set color" +msgstr "をクリックして色を設定" + +#: src/engine.c:142 +msgid "engine" +msgstr "エンジン" + +#: src/engine.c:143 +msgid "click to set engine" +msgstr "をクリックしてエンジンを設定する" diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..7b7abc3 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,75 @@ +# Copyright (C) 2010 microcai +# This file is distributed under the same license as the ibus-handwrite package. +# FIRST AUTHOR , 2010. +# microcai , 2010. +msgid "" +msgstr "" +"Project-Id-Version: 0.01\n" +"Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n" +"POT-Creation-Date: 2011-01-26 08:05+0800\n" +"PO-Revision-Date: 2010-01-28 01:44+0800\n" +"Last-Translator: microcai \n" +"Language-Team: zh_CN \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: UTF-8\n" + +#: src/main.c:49 +msgid "the icon file" +msgstr "icon 文件" + +#: src/main.c:49 +msgid "icon file" +msgstr "icon 文件" + +#: src/main.c:50 +msgid "set table file path" +msgstr "设置表" + +#: src/main.c:50 +msgid "tablefile" +msgstr "表文件" + +#: src/main.c:51 +#, fuzzy +msgid "set locale path" +msgstr "设置表" + +#: src/main.c:51 +msgid "locale" +msgstr "" + +#: src/main.c:52 +msgid "set languate, accept zh and jp" +msgstr "设置语言,接受zh和jp" + +#: src/main.c:52 +msgid "lang" +msgstr "语言" + +#: src/main.c:120 +msgid "hand write recognizer" +msgstr "手写识别" + +#: src/main.c:151 +#, c-format +msgid "ibus-handwrite Version %s Start Up\n" +msgstr "ibus-handwrite 版本 %s 启动\n" + +#: src/engine.c:126 +msgid "color" +msgstr "" + +#: src/engine.c:127 +#, fuzzy +msgid "click to set color" +msgstr "单击切换引擎" + +#: src/engine.c:142 +msgid "engine" +msgstr "识别引擎" + +#: src/engine.c:143 +msgid "click to set engine" +msgstr "单击切换引擎" diff --git a/src/Makefile.am b/src/Makefile.am index b33ac98..6c66ab5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -24,7 +24,7 @@ test: ibus-engine-handwrite $(builddir)/ibus-engine-handwrite \ --icondir $(top_srcdir)/icons/ \ --table $(top_srcdir)/data/table.txt \ - --locale /tmp/${prefix}/share/locale/ + --locale /tmp/${prefix}/share/locale/ if WITH_ZINNIA test-jp: ibus-engine-handwrite $(builddir)/ibus-engine-handwrite \ @@ -50,7 +50,7 @@ ibus_engine_handwrite_SOURCES = main.c \ $(NULL) -ibus_engine_handwrite_SOURCES += UI_clutter.c \ +ibus_engine_handwrite_SOURCES += UI_gtk.c \ $(NULL) if WITH_ZINNIA diff --git a/src/UI_clutter.c b/src/UI_gtk.c similarity index 71% rename from src/UI_clutter.c rename to src/UI_gtk.c index fefddb9..ff777f9 100644 --- a/src/UI_clutter.c +++ b/src/UI_gtk.c @@ -5,9 +5,10 @@ * Author: cai */ + +#include +#include #include -#include -#include #include "engine.h" #include "UI.h" @@ -17,23 +18,89 @@ #define N_(String) gettext_noop (String) -static void widget_realize(ClutterActor *widget, gpointer user_data); +static void widget_realize(GtkWidget *widget, gpointer user_data); -static gboolean paint_lines_gl(ClutterCanvas *canvas, cairo_t *cr, - gint width, gint height, IBusHandwriteEngine * engine) +static gboolean paint_lines(GtkWidget *widget, GdkEventExpose *event,IBusHandwriteEngine * engine) { + GdkGC *gc; + GdkWindow * window; + GdkColormap * cmap; + GtkStyle* style; + + LineStroke cl; + int i; + + MatchedChar * matched; + + puts(__func__); + + + style = gtk_style_copy(widget->style); + + style = gtk_style_attach(style,widget->window); + + gtk_paint_shadow(style,widget->window,GTK_STATE_ACTIVE,GTK_SHADOW_ETCHED_OUT,NULL,widget,NULL,0,0,200,200); + + gtk_style_detach(style); + + window = widget->window; + + cmap= gtk_widget_get_colormap(widget); + gdk_colormap_alloc_color(cmap,engine->color,FALSE,TRUE); + + gc = gdk_gc_new(window); + gdk_gc_set_line_attributes(gc,3,GDK_LINE_SOLID,GDK_CAP_ROUND,GDK_JOIN_ROUND); + gdk_gc_set_foreground(gc,engine->color); + + //已经录入的笔画 + + for (i = 0; i < engine->engine->strokes->len ; i++ ) + { + printf("drawing %d th line, total %d\n",i,engine->engine->strokes->len); + cl = g_array_index(engine->engine->strokes,LineStroke,i); + gdk_draw_lines(window, gc, cl.points,cl.segments ); + } + //当下笔画 + if ( engine->currentstroke.segments && engine->currentstroke.points ) + gdk_draw_lines(window, gc, engine->currentstroke.points, + engine->currentstroke.segments); + + g_object_unref(gc); + + gdk_colormap_free_colors(cmap,engine->color,1); + return TRUE; +} - printf("%s called with canvas=%p\n",__func__,canvas); +static gboolean paint_lines_gl(GtkWidget *widget, GdkEventExpose *event,IBusHandwriteEngine * engine) +{ + GdkColormap * cmap; + GdkGLDrawable * gldrawable; + GdkGLContext * glcontext; + gint width,height; LineStroke cl; int i,j; + + cmap= gtk_widget_get_colormap(widget); + gdk_colormap_alloc_color(cmap,engine->color,FALSE,TRUE); + + + gldrawable = gtk_widget_get_gl_drawable(widget); + glcontext = gtk_widget_get_gl_context(widget); + + g_assert(gdk_gl_drawable_gl_begin(gldrawable,glcontext)); + + gdk_gl_drawable_get_size(gldrawable,&width,&height); + glClearColor(240,240,230,1); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3us(engine->color->red,engine->color->green,engine->color->blue); + gdk_colormap_free_colors(cmap,engine->color,1); + //已经录入的笔画 for (i = 0; i < engine->engine->strokes->len ; i++ ) { @@ -60,13 +127,17 @@ static gboolean paint_lines_gl(ClutterCanvas *canvas, cairo_t *cr, glEnd(); } - glFinish(); + + if(gdk_gl_drawable_is_double_buffered(gldrawable)) + gdk_gl_drawable_swap_buffers(gldrawable); + else + glFinish(); + + gdk_gl_drawable_gl_end(gldrawable); } -#if 0 static gboolean widget_resize(GtkWidget *widget, GdkEventConfigure *event,IBusHandwriteEngine * engine) { - GdkGLDrawable * gldrawable; GdkGLContext * glcontext; @@ -84,12 +155,9 @@ static gboolean widget_resize(GtkWidget *widget, GdkEventConfigure *event,IBusHa return TRUE; } -#endif - -#if 0 - static void glwidget_realize(GtkWidget *widget, gpointer user_data) { + GdkGLDrawable * gldrawable; GdkGLContext * glcontext; @@ -104,12 +172,9 @@ static void glwidget_realize(GtkWidget *widget, gpointer user_data) gdk_gl_drawable_gl_end(gldrawable); } } -#endif -static void regen_loopuptable(ClutterActor * widget, IBusHandwriteEngine * engine) +static void regen_loopuptable(GtkWidget * widget, IBusHandwriteEngine * engine) { - return ; -#if 0 int i; MatchedChar *matched; char drawtext[32]={0}; @@ -140,11 +205,9 @@ static void regen_loopuptable(ClutterActor * widget, IBusHandwriteEngine * engin gtk_widget_show(bt); } -#endif } -#if 0 static gboolean on_mouse_move(GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { @@ -209,10 +272,8 @@ static gboolean on_mouse_move(GtkWidget *widget, GdkEventMotion *event, } return FALSE; } -#endif -#if 0 -static gboolean on_button(ClutterActor* widget, GdkEventButton *event, gpointer user_data) +static gboolean on_button(GtkWidget* widget, GdkEventButton *event, gpointer user_data) { int i; IBusHandwriteEngine * engine; @@ -257,7 +318,7 @@ static gboolean on_button(ClutterActor* widget, GdkEventButton *event, gpointer g_print("mouse released\n"); - clutter_actor_queue_redraw(widget); + gtk_widget_queue_draw(widget); regen_loopuptable(engine->lookuppanel,engine); break; @@ -266,74 +327,37 @@ static gboolean on_button(ClutterActor* widget, GdkEventButton *event, gpointer } return TRUE; } -#endif void UI_buildui(IBusHandwriteEngine * engine) { //建立绘图窗口, 建立空点 if (!engine->drawpanel) { - engine->drawpanel = clutter_stage_new(); - clutter_stage_set_title(CLUTTER_STAGE(engine->drawpanel),"draw here"); - - ClutterLayoutManager * box = clutter_box_layout_new(); - clutter_box_layout_set_vertical(CLUTTER_BOX_LAYOUT(box),1); - - clutter_layout_manager_set_container(box,CLUTTER_CONTAINER(engine->drawpanel)); + engine->drawpanel = gtk_window_new(GTK_WINDOW_POPUP); -// clutter_container_add_actor(,box); - - ClutterActor * drawing_area = clutter_actor_new(); - - clutter_actor_set_size(drawing_area,400,400); - - ClutterContent * drawer = clutter_canvas_new(); - clutter_canvas_set_size(CLUTTER_CANVAS(drawer),400,400); - clutter_actor_set_content(drawing_area,drawer); - - g_signal_connect(G_OBJECT(drawer),"draw",G_CALLBACK(paint_lines_gl),engine); - - //g_signal_connect(G_OBJECT(drawing_area),"motion-event",G_CALLBACK(on_mouse_move),engine); - //g_signal_connect(G_OBJECT(drawing_area),"button-release-event",G_CALLBACK(on_button),engine); - //g_signal_connect(G_OBJECT(drawing_area),"button-press-event",G_CALLBACK(on_button),engine); - - - clutter_box_layout_pack(CLUTTER_BOX_LAYOUT(box), - drawing_area,1,1,1,CLUTTER_BOX_ALIGNMENT_START,CLUTTER_BOX_ALIGNMENT_CENTER); - - clutter_container_add_actor(CLUTTER_CONTAINER(engine->drawpanel),drawing_area); - - - engine->lookuppanel = clutter_table_layout_new(); - - clutter_box_layout_pack(CLUTTER_BOX_LAYOUT(box), - engine->lookuppanel,1,1,1,CLUTTER_BOX_ALIGNMENT_END,CLUTTER_BOX_ALIGNMENT_CENTER); - - g_signal_connect(G_OBJECT(engine->drawpanel),"expose-event",G_CALLBACK(paint_lines_gl),engine); - -/* gtk_widget_set_tooltip_markup(GTK_WIDGET(engine->drawpanel), _("Hint:\n" "Left mouse key to draw strokes.\n" "Holding right mouse key to move the widget.\n" )); -*/ -// gtk_window_set_position(GTK_WINDOW(engine->drawpanel),GTK_WIN_POS_MOUSE); -// GtkWidget * vbox = gtk_vbox_new(FALSE,0); + gtk_window_set_position(GTK_WINDOW(engine->drawpanel),GTK_WIN_POS_MOUSE); -// gtk_container_add(GTK_CONTAINER(engine->drawpanel),vbox); + GtkWidget * vbox = gtk_vbox_new(FALSE,0); -// GtkWidget * drawing_area = gtk_drawing_area_new(); + gtk_container_add(GTK_CONTAINER(engine->drawpanel),vbox); -// GdkGLConfig * glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_DOUBLE|GDK_GL_MODE_MULTISAMPLE); + GtkWidget * drawing_area = gtk_drawing_area_new(); -// if (gtk_widget_set_gl_capability(drawing_area, glconfig, NULL, FALSE, -// GDK_GL_RGBA_TYPE)) -/* { + GdkGLConfig * glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_DOUBLE|GDK_GL_MODE_MULTISAMPLE); + + if (gtk_widget_set_gl_capability(drawing_area, glconfig, NULL, FALSE, + GDK_GL_RGBA_TYPE)) + { g_signal_connect(G_OBJECT(drawing_area),"configure-event",G_CALLBACK(widget_resize),engine); g_signal_connect(G_OBJECT(drawing_area),"realize",G_CALLBACK(glwidget_realize),engine); + g_signal_connect(G_OBJECT(drawing_area),"expose-event",G_CALLBACK(paint_lines_gl),engine); } else { //没有 GLX 就使用普通 GDK 绘图 @@ -355,20 +379,21 @@ void UI_buildui(IBusHandwriteEngine * engine) g_signal_connect(G_OBJECT(engine->drawpanel),"realize",G_CALLBACK(widget_realize),engine); - */ - + g_signal_connect(G_OBJECT(drawing_area),"motion_notify_event",G_CALLBACK(on_mouse_move),engine); + g_signal_connect(G_OBJECT(drawing_area),"button-release-event",G_CALLBACK(on_button),engine); + g_signal_connect(G_OBJECT(drawing_area),"button-press-event",G_CALLBACK(on_button),engine); } - clutter_actor_show_all(engine->drawpanel); + gtk_widget_show_all(engine->drawpanel); } void UI_show_ui(IBusHandwriteEngine * engine) { -// GdkCursor* cursor; + GdkCursor* cursor; printf("%s \n", __func__); if (engine->drawpanel) { - clutter_actor_show_all(engine->drawpanel); + gtk_widget_show_all(engine->drawpanel); } } @@ -376,7 +401,7 @@ void UI_hide_ui(IBusHandwriteEngine * engine) { if (engine->drawpanel) { - clutter_actor_hide(engine->drawpanel); + gtk_widget_hide_all(engine->drawpanel); } } @@ -384,14 +409,14 @@ void UI_cancelui(IBusHandwriteEngine* engine) { // 撤销绘图窗口,销毁点列表 if (engine->drawpanel) - clutter_actor_destroy(engine->drawpanel); + gtk_widget_destroy(engine->drawpanel); engine->drawpanel = NULL; } -static void widget_realize(ClutterActor *widget, gpointer user_data) +static void widget_realize(GtkWidget *widget, gpointer user_data) { - return ; -#if 0 + GdkPixmap * pxmp; + GdkGC * gc; GdkColor black, white; int R = 5; guint width,height; @@ -425,11 +450,8 @@ static void widget_realize(ClutterActor *widget, gpointer user_data) g_object_unref(gc); - clutter_stage_set_user_resizable() - gtk_widget_reset_shapes(widget); gtk_widget_shape_combine_mask(widget, pxmp, 0, 0); gtk_widget_input_shape_combine_mask(widget, pxmp, 0, 0); g_object_unref(pxmp); -#endif } diff --git a/src/engine.c b/src/engine.c index d4aa5bc..db5305d 100644 --- a/src/engine.c +++ b/src/engine.c @@ -110,7 +110,7 @@ static void ibus_handwrite_engine_disable(IBusHandwriteEngine *engine) UI_cancelui(engine); // 撤销绘图窗口,销毁点列表 if (engine->drawpanel) - clutter_actor_destroy(engine->drawpanel); + gtk_widget_destroy(engine->drawpanel); engine->drawpanel = NULL; g_free(engine->currentstroke.points); engine->currentstroke.points = NULL; @@ -121,14 +121,13 @@ static void ibus_handwrite_engine_focus_in(IBusHandwriteEngine *engine) UI_show_ui(engine); IBusPropList * pl = ibus_prop_list_new(); -#if 0 + IBusProperty * p = ibus_property_new("choose-color", PROP_TYPE_NORMAL, ibus_text_new_from_static_string(_("color")), GTK_STOCK_COLOR_PICKER, ibus_text_new_from_static_string(_("click to set color")), TRUE, TRUE, PROP_STATE_UNCHECKED, NULL); - TODO color picker for clutter? + ibus_prop_list_append(pl, p); -#endif #ifdef WITH_ZINNIA if( strcmp(lang,"jp") ==0 || strcmp(lang,"ja")) @@ -185,6 +184,22 @@ void ibus_handwrite_property_activate(IBusEngine *engine,const gchar *prop_name, handwrite->engine = ibus_handwrite_recog_new(handwrite->engine_type); handwrite->engine->engine = handwrite; + }else if(g_strcmp0(prop_name,"choose-color")==0) + { + g_debug("color choose"); + + GtkWidget * dialog = gtk_color_selection_dialog_new(prop_name); + + + GtkWidget * color_sel = gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dialog)); + + gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(color_sel),handwrite->color); + + gtk_dialog_run(GTK_DIALOG(dialog)); + + gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(color_sel),handwrite->color); + + gtk_widget_destroy(dialog); } } @@ -213,7 +228,7 @@ static gboolean ibus_handwrite_engine_process_key_event(IBusEngine *engine, { IBusHandwriteEngine *handwrite = (IBusHandwriteEngine *) engine; - clutter_actor_queue_redraw(handwrite->drawpanel); + gtk_widget_queue_draw(handwrite->drawpanel); if (!modifiers) return FALSE; diff --git a/src/engine.h b/src/engine.h index 40fbfea..d2099d2 100644 --- a/src/engine.h +++ b/src/engine.h @@ -3,7 +3,7 @@ #define __ENGINE_H__ #include -#include +#include #include "handrecog.h" #define IBUS_TYPE_HANDWRITE_ENGINE \ @@ -22,10 +22,10 @@ struct _IBusHandwriteEngine IBusEngine parent; /* members */ GType engine_type; - ClutterActor * drawpanel; - ClutterActor * lookuppanel; - Point lastpoint; - ClutterColor color[1]; // color used by pen + GtkWidget * drawpanel; + GtkWidget * lookuppanel; + GdkPoint lastpoint; + GdkColor color[1]; // color used by pen guint mouse_state; IbusHandwriteRecog * engine; LineStroke currentstroke; diff --git a/src/handrecog.c b/src/handrecog.c index 6d3fc6d..8a29655 100644 --- a/src/handrecog.c +++ b/src/handrecog.c @@ -47,8 +47,8 @@ void ibus_handwrite_recog_append_stroke(IbusHandwriteRecog*obj,LineStroke stroke if (stroke.segments) { - s.points = g_new(Point,s.segments); - memcpy(s.points, stroke.points, s.segments * sizeof(Point)); + s.points = g_new(GdkPoint,s.segments); + memcpy(s.points, stroke.points, s.segments * sizeof(GdkPoint)); obj->strokes = g_array_append_val(obj->strokes,s); diff --git a/src/handrecog.h b/src/handrecog.h index 8401a5b..a209e96 100644 --- a/src/handrecog.h +++ b/src/handrecog.h @@ -9,22 +9,17 @@ #define HANDRECOG_C_ #include -#include -//#include +#include typedef struct _LineStroke LineStroke; typedef struct _MatchedChar MatchedChar; typedef struct _IbusHandwriteRecog IbusHandwriteRecog; typedef struct _IbusHandwriteRecogClass IbusHandwriteRecogClass; -typedef struct Point { - int x, y; -}Point; - struct _LineStroke { int segments; //包含有的段数目 - Point* points; //包含的用来构成笔画的点 + GdkPoint* points; //包含的用来构成笔画的点 }; struct _MatchedChar{ diff --git a/src/handrecog_lucykila.c b/src/handrecog_lucykila.c index 2c6ecd5..da37283 100644 --- a/src/handrecog_lucykila.c +++ b/src/handrecog_lucykila.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include "engine.h" @@ -120,8 +119,8 @@ static int lucykila_open_table(IbusHandwriteRecogLucyKila*obj) void ibus_handwrite_recog_change_stroke(IbusHandwriteRecog* obj) { - Point startpoint; - Point endpoint; + GdkPoint startpoint; + GdkPoint endpoint; IbusHandwriteRecogLucyKila * me; int i; @@ -143,10 +142,10 @@ void ibus_handwrite_recog_change_stroke(IbusHandwriteRecog* obj) //检测输入的笔画,h ? s ? p? z ? n? //有米有折点 - cairo_rectangle_int_t ret = + GdkRectangle ret = { MIN(startpoint.x,endpoint.x), MIN(endpoint.y,startpoint.y), - fabs(endpoint.x - startpoint.x), fabs(endpoint.y - startpoint.y) + abs(endpoint.x - startpoint.x), abs(endpoint.y - startpoint.y) }; @@ -155,10 +154,10 @@ void ibus_handwrite_recog_change_stroke(IbusHandwriteRecog* obj) int init=0; printf("is z!!!?\n"); - cairo_region_t * rg = cairo_region_create_rectangle(&ret); + GdkRegion * rg = gdk_region_rectangle(&ret); for(i=1;i < laststrok.segments -1 ;++i) { - if(!cairo_region_contains_point(rg,laststrok.points[i].x,laststrok.points[i].y)) + if(!gdk_region_point_in(rg,laststrok.points[i].x,laststrok.points[i].y)) { init ++; } @@ -167,11 +166,11 @@ void ibus_handwrite_recog_change_stroke(IbusHandwriteRecog* obj) { printf("god z!!!\n"); me->input = g_string_append_c(me->input,'z'); - cairo_region_destroy(rg); + gdk_region_destroy(rg); return ; } } - cairo_region_destroy(rg); + gdk_region_destroy(rg); } printf("NO Z!"); diff --git a/src/main.c b/src/main.c index 438bd4e..70440d9 100644 --- a/src/main.c +++ b/src/main.c @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #define _(String) gettext (String) @@ -40,7 +40,7 @@ int main(int argc, char* argv[]) setlocale(LC_ALL, ""); - + gtk_set_locale(); textdomain(GETTEXT_PACKAGE); GOptionEntry args[] = @@ -53,18 +53,18 @@ int main(int argc, char* argv[]) {0} }; - clutter_init_with_args(&argc,&argv,PACKAGE_NAME,args,PACKAGE_NAME,&err); + gtk_init_with_args(&argc,&argv,PACKAGE_NAME,args,PACKAGE_NAME,&err); if(err) { - g_error("clutter init fail %s",err->message ); + g_error("git init fail %s",err->message ); } -/* + if(G_UNLIKELY(!gtk_gl_init_check(&argc, &argv))) { g_warning("GLX extension not available, use slow soft cairo rendering instead"); } -*/ + #ifdef WITH_ZINNIA if(strcmp(language,"zh")==0 ||strcmp(language,"zh_CN") ==0 ) { @@ -79,6 +79,11 @@ int main(int argc, char* argv[]) #endif + if(locale_dir) + { + bindtextdomain(GETTEXT_PACKAGE,locale_dir); + } + gchar * engine_name = g_strdup_printf("handwrite-%s",lang); gchar * dbus_name = g_strdup_printf("org.freedesktop.IBus.handwrite-%s",lang); @@ -90,13 +95,15 @@ int main(int argc, char* argv[]) bus = ibus_bus_new(); - g_signal_connect (bus, "disconnected", G_CALLBACK (clutter_main_quit), NULL); + g_signal_connect (bus, "disconnected", G_CALLBACK (gtk_main_quit), NULL); factory = ibus_factory_new(ibus_bus_get_connection(bus)); ibus_bus_request_name(bus, dbus_name, 0); +// g_free(dbus_name); + if (!have_ibus) { char * exefile ; @@ -108,7 +115,7 @@ int main(int argc, char* argv[]) exefile, GETTEXT_PACKAGE); gchar * iconfile = g_strdup_printf("%s/ibus-handwrite.svg",icondir); - + desc = ibus_engine_desc_new(engine_name, "handwrite", _("hand write recognizer"), lang, "GPL", MICROCAI_WITHEMAIL, iconfile, "us"); @@ -137,12 +144,12 @@ int main(int argc, char* argv[]) g_object_unref(component); -// GdkScreen * screen = gdk_screen_get_default(); -// GdkColormap * map = gdk_screen_get_rgba_colormap(screen); -// if(map) gtk_widget_set_default_colormap(map); + GdkScreen * screen = gdk_screen_get_default(); + GdkColormap * map = gdk_screen_get_rgba_colormap(screen); + if(map) gtk_widget_set_default_colormap(map); printf(_("ibus-handwrite Version %s Start Up\n"), PACKAGE_VERSION); - ibus_main(); + gtk_main(); return 0; } From 7dc9c52e8829b75e216d8f4be4271046ff03e821 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Mon, 16 Jun 2014 16:03:03 +0800 Subject: [PATCH 02/10] fixes escape input --- src/engine.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/engine.c b/src/engine.c index db5305d..da01f06 100644 --- a/src/engine.c +++ b/src/engine.c @@ -230,11 +230,9 @@ static gboolean ibus_handwrite_engine_process_key_event(IBusEngine *engine, gtk_widget_queue_draw(handwrite->drawpanel); - if (!modifiers) - return FALSE; - - if(!handwrite->engine->strokes->len ) - return FALSE; + /* filter out the key release event. */ + if (modifiers & IBUS_RELEASE_MASK) + return TRUE; switch (keyval) { From 545237bd5cc8526cbeece2a078215752879cc63e Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Wed, 23 Jul 2014 13:44:14 +0800 Subject: [PATCH 03/10] drop openGL depends --- src/UI_gtk.c | 120 +-------------------------------------------------- 1 file changed, 1 insertion(+), 119 deletions(-) diff --git a/src/UI_gtk.c b/src/UI_gtk.c index ff777f9..7d0edcd 100644 --- a/src/UI_gtk.c +++ b/src/UI_gtk.c @@ -7,8 +7,6 @@ #include -#include -#include #include "engine.h" #include "UI.h" @@ -71,108 +69,6 @@ static gboolean paint_lines(GtkWidget *widget, GdkEventExpose *event,IBusHandwri return TRUE; } -static gboolean paint_lines_gl(GtkWidget *widget, GdkEventExpose *event,IBusHandwriteEngine * engine) -{ - GdkColormap * cmap; - GdkGLDrawable * gldrawable; - GdkGLContext * glcontext; - gint width,height; - - LineStroke cl; - int i,j; - - - cmap= gtk_widget_get_colormap(widget); - gdk_colormap_alloc_color(cmap,engine->color,FALSE,TRUE); - - - gldrawable = gtk_widget_get_gl_drawable(widget); - glcontext = gtk_widget_get_gl_context(widget); - - g_assert(gdk_gl_drawable_gl_begin(gldrawable,glcontext)); - - gdk_gl_drawable_get_size(gldrawable,&width,&height); - - glClearColor(240,240,230,1); - - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - - glColor3us(engine->color->red,engine->color->green,engine->color->blue); - - gdk_colormap_free_colors(cmap,engine->color,1); - - //已经录入的笔画 - for (i = 0; i < engine->engine->strokes->len ; i++ ) - { - printf("drawing %d th line, total %d\n",i,engine->engine->strokes->len); - cl = g_array_index(engine->engine->strokes,LineStroke,i); - - glBegin(GL_LINE_STRIP); - - for( j = 0 ; j < cl.segments ; ++j) - { - glVertex2f((float)cl.points[j].x *2 /width - 1 ,1 - (float)cl.points[j].y*2/height); - } - glEnd(); - } - //当下笔画 - if ( engine->currentstroke.segments && engine->currentstroke.points ) - { - glBegin(GL_LINE_STRIP); - - for( j = 0 ; j < engine->currentstroke.segments ; ++j) - { - glVertex2f((float)engine->currentstroke.points[j].x*2/width - 1,1 - (float)engine->currentstroke.points[j].y*2/height); - } - glEnd(); - } - - - if(gdk_gl_drawable_is_double_buffered(gldrawable)) - gdk_gl_drawable_swap_buffers(gldrawable); - else - glFinish(); - - gdk_gl_drawable_gl_end(gldrawable); -} - -static gboolean widget_resize(GtkWidget *widget, GdkEventConfigure *event,IBusHandwriteEngine * engine) -{ - GdkGLDrawable * gldrawable; - GdkGLContext * glcontext; - - gldrawable = gtk_widget_get_gl_drawable(widget); - glcontext = gtk_widget_get_gl_context(widget); - - g_assert(gdk_gl_drawable_gl_begin(gldrawable,glcontext)); - - glViewport(0,0,event->width,event->height); - - glFinish(); - - gdk_gl_drawable_gl_end(gldrawable); - - return TRUE; -} - -static void glwidget_realize(GtkWidget *widget, gpointer user_data) -{ - - GdkGLDrawable * gldrawable; - GdkGLContext * glcontext; - - gldrawable = gtk_widget_get_gl_drawable(widget); - glcontext = gtk_widget_get_gl_context(widget); - - if (gdk_gl_drawable_gl_begin(gldrawable, glcontext)) - { - glEnable(GL_LINE_SMOOTH); - glLineWidth(3); - glFinish(); - gdk_gl_drawable_gl_end(gldrawable); - } -} - static void regen_loopuptable(GtkWidget * widget, IBusHandwriteEngine * engine) { int i; @@ -350,24 +246,10 @@ void UI_buildui(IBusHandwriteEngine * engine) GtkWidget * drawing_area = gtk_drawing_area_new(); - GdkGLConfig * glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_DOUBLE|GDK_GL_MODE_MULTISAMPLE); - - if (gtk_widget_set_gl_capability(drawing_area, glconfig, NULL, FALSE, - GDK_GL_RGBA_TYPE)) - { - g_signal_connect(G_OBJECT(drawing_area),"configure-event",G_CALLBACK(widget_resize),engine); - g_signal_connect(G_OBJECT(drawing_area),"realize",G_CALLBACK(glwidget_realize),engine); - g_signal_connect(G_OBJECT(drawing_area),"expose-event",G_CALLBACK(paint_lines_gl),engine); } - else - { - //没有 GLX 就使用普通 GDK 绘图 - g_signal_connect(G_OBJECT(drawing_area),"expose-event",G_CALLBACK(paint_lines),engine); - } + g_signal_connect(G_OBJECT(drawing_area),"expose-event",G_CALLBACK(paint_lines),engine); gtk_box_pack_start(GTK_BOX(vbox),drawing_area,TRUE,TRUE,FALSE); -// gtk_window_get_default_size(GTK_WINDOW(engine->drawpanel),200,250); - gtk_widget_set_size_request(drawing_area,200,200); engine->lookuppanel = gtk_table_new(2,5,TRUE); From c2d5a2f28d411f997670e59a76eb4ab3b4debf68 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Wed, 23 Jul 2014 13:55:31 +0800 Subject: [PATCH 04/10] remove openGL deps --- configure.ac | 8 +++----- src/main.c | 6 ------ 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index 8625fe9..70ea9e4 100644 --- a/configure.ac +++ b/configure.ac @@ -35,6 +35,8 @@ AC_PROG_CC AC_ISC_POSIX AC_HEADER_STDC +AC_CHECK_LIB([m],[atan2]) + PKG_PROG_PKG_CONFIG AC_ARG_WITH(debian,[AC_HELP_STRING([--with-debian],[enable debian specific build])],[],[]) @@ -89,12 +91,8 @@ PKG_CHECK_MODULES(GTK2, [ gtk+-2.0 >= 2.10 ]) -PKG_CHECK_MODULES(GTKGL, [ - gtkglext-1.0 -]) - PKG_CHECK_MODULES(ALL_NEED, [ - ibus-1.0 >= 1.2 gtkglext-1.0 + ibus-1.0 >= 1.2 gtk+-2.0 >= 2.10 ]) AM_GNU_GETTEXT([external]) diff --git a/src/main.c b/src/main.c index 70440d9..900e840 100644 --- a/src/main.c +++ b/src/main.c @@ -5,7 +5,6 @@ #include #include #include -#include #include #define _(String) gettext (String) @@ -60,11 +59,6 @@ int main(int argc, char* argv[]) g_error("git init fail %s",err->message ); } - if(G_UNLIKELY(!gtk_gl_init_check(&argc, &argv))) - { - g_warning("GLX extension not available, use slow soft cairo rendering instead"); - } - #ifdef WITH_ZINNIA if(strcmp(language,"zh")==0 ||strcmp(language,"zh_CN") ==0 ) { From ba58ae7dd5a2c1fc6769b78b3e6b6b0290e59fe9 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Fri, 25 Jul 2014 17:15:09 +0800 Subject: [PATCH 05/10] update autoconf --- configure.ac | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 70ea9e4..ebc8f70 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ m4_define([package_name], [ibus-handwrite]) AC_PREREQ([2.53]) -AC_INIT([package_name], [2.1.4], [http://code.google.com/p/ibus/issues/entry], [package_name]) +AC_INIT([package_name], [2.2.0], [http://code.google.com/p/ibus/issues/entry], [package_name]) AM_INIT_AUTOMAKE([-Wall]) AC_GNU_SOURCE @@ -87,12 +87,12 @@ PKG_CHECK_MODULES(IBUS, [ ibus-1.0 >= 1.3 ]) -PKG_CHECK_MODULES(GTK2, [ - gtk+-2.0 >= 2.10 +PKG_CHECK_MODULES(GTK3, [ + gtk+-3.0 >= 3.0 ]) PKG_CHECK_MODULES(ALL_NEED, [ - ibus-1.0 >= 1.2 gtk+-2.0 >= 2.10 + ibus-1.0 >= 1.2 gtk+-3.0 >= 3.0 ]) AM_GNU_GETTEXT([external]) From ddab9136996d3f3998e0aca5095ee245642b3503 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Mon, 28 Jul 2014 13:10:40 +0800 Subject: [PATCH 06/10] migrate main.c --- src/main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 900e840..2c3bbda 100644 --- a/src/main.c +++ b/src/main.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #define _(String) gettext (String) @@ -139,8 +140,9 @@ int main(int argc, char* argv[]) g_object_unref(component); GdkScreen * screen = gdk_screen_get_default(); - GdkColormap * map = gdk_screen_get_rgba_colormap(screen); - if(map) gtk_widget_set_default_colormap(map); + GdkVisual * visual = gdk_screen_get_rgba_visual(screen); + if(visual) + gtk_widget_set_default_visual(visual); printf(_("ibus-handwrite Version %s Start Up\n"), PACKAGE_VERSION); From dfd897f27b205145d62db63d7457867a704bf729 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Mon, 28 Jul 2014 13:22:00 +0800 Subject: [PATCH 07/10] migrate handrecog_lucykila.c --- src/handrecog_lucykila.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/handrecog_lucykila.c b/src/handrecog_lucykila.c index da37283..8533c71 100644 --- a/src/handrecog_lucykila.c +++ b/src/handrecog_lucykila.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "engine.h" #include "handrecog.h" @@ -142,7 +143,7 @@ void ibus_handwrite_recog_change_stroke(IbusHandwriteRecog* obj) //检测输入的笔画,h ? s ? p? z ? n? //有米有折点 - GdkRectangle ret = + cairo_rectangle_int_t rect = { MIN(startpoint.x,endpoint.x), MIN(endpoint.y,startpoint.y), abs(endpoint.x - startpoint.x), abs(endpoint.y - startpoint.y) @@ -154,10 +155,11 @@ void ibus_handwrite_recog_change_stroke(IbusHandwriteRecog* obj) int init=0; printf("is z!!!?\n"); - GdkRegion * rg = gdk_region_rectangle(&ret); + + cairo_region_t * rg = cairo_region_create_rectangle(&rect); for(i=1;i < laststrok.segments -1 ;++i) { - if(!gdk_region_point_in(rg,laststrok.points[i].x,laststrok.points[i].y)) + if(!cairo_region_contains_point(rg,laststrok.points[i].x,laststrok.points[i].y)) { init ++; } @@ -166,11 +168,11 @@ void ibus_handwrite_recog_change_stroke(IbusHandwriteRecog* obj) { printf("god z!!!\n"); me->input = g_string_append_c(me->input,'z'); - gdk_region_destroy(rg); + cairo_region_destroy(rg); return ; } } - gdk_region_destroy(rg); + cairo_region_destroy(rg); } printf("NO Z!"); From 49ed21667027d04bfcd66751bf0bd559686c650f Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Mon, 28 Jul 2014 15:01:45 +0800 Subject: [PATCH 08/10] migrate UI_gtk.c in progress --- src/UI_gtk.c | 124 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 49 deletions(-) diff --git a/src/UI_gtk.c b/src/UI_gtk.c index 7d0edcd..44f40c8 100644 --- a/src/UI_gtk.c +++ b/src/UI_gtk.c @@ -6,7 +6,10 @@ */ +#include #include +#include +#include #include "engine.h" #include "UI.h" @@ -15,14 +18,33 @@ #define _(String) gettext (String) #define N_(String) gettext_noop (String) +#define WIDTH 200 +#define HEIGHT 200 + +#define MAX_COLOR_VALUE 65535.0 static void widget_realize(GtkWidget *widget, gpointer user_data); -static gboolean paint_lines(GtkWidget *widget, GdkEventExpose *event,IBusHandwriteEngine * engine) +static gboolean _draw_lines(cairo_t * cr, LineStroke cl) +{ + if (0 == cl.segments) + return FALSE; + + int i; + for (i = 0; i < cl.segments; ++i) { + GdkPoint point = cl.points[i]; + cairo_line_to(cr, point.x, point.y); + } + + cairo_stroke(cr); + + return TRUE; +} + +static gboolean paint_lines(GtkWidget *widget, GdkEventExpose *event, IBusHandwriteEngine * engine) { - GdkGC *gc; + cairo_t * cr; GdkWindow * window; - GdkColormap * cmap; GtkStyle* style; LineStroke cl; @@ -32,40 +54,35 @@ static gboolean paint_lines(GtkWidget *widget, GdkEventExpose *event,IBusHandwri puts(__func__); + window = gtk_widget_get_window(widget); + cr = gdk_cairo_create(window); style = gtk_style_copy(widget->style); - style = gtk_style_attach(style,widget->window); - gtk_paint_shadow(style,widget->window,GTK_STATE_ACTIVE,GTK_SHADOW_ETCHED_OUT,NULL,widget,NULL,0,0,200,200); + gtk_paint_shadow(style,cr,GTK_STATE_ACTIVE,GTK_SHADOW_ETCHED_OUT,widget,NULL,0,0,WIDTH,HEIGHT); gtk_style_detach(style); - window = widget->window; - - cmap= gtk_widget_get_colormap(widget); - gdk_colormap_alloc_color(cmap,engine->color,FALSE,TRUE); + cairo_set_line_width(cr,3.0); + cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND); + cairo_set_line_join(cr,CAIRO_LINE_JOIN_ROUND); - gc = gdk_gc_new(window); - gdk_gc_set_line_attributes(gc,3,GDK_LINE_SOLID,GDK_CAP_ROUND,GDK_JOIN_ROUND); - gdk_gc_set_foreground(gc,engine->color); + gdk_cairo_set_source_color (cr, engine->color); //已经录入的笔画 - for (i = 0; i < engine->engine->strokes->len ; i++ ) { printf("drawing %d th line, total %d\n",i,engine->engine->strokes->len); cl = g_array_index(engine->engine->strokes,LineStroke,i); - gdk_draw_lines(window, gc, cl.points,cl.segments ); + _draw_lines(cr, cl); } //当下笔画 if ( engine->currentstroke.segments && engine->currentstroke.points ) - gdk_draw_lines(window, gc, engine->currentstroke.points, - engine->currentstroke.segments); + _draw_lines(cr, engine->currentstroke); - g_object_unref(gc); + cairo_destroy(cr); - gdk_colormap_free_colors(cmap,engine->color,1); return TRUE; } @@ -115,6 +132,8 @@ static gboolean on_mouse_move(GtkWidget *widget, GdkEventMotion *event, guint width,height; + GdkWindow * window; + gtk_window_get_size(GTK_WINDOW(engine->drawpanel),&width,&height); @@ -126,11 +145,13 @@ static gboolean on_mouse_move(GtkWidget *widget, GdkEventMotion *event, if(event->state & GDK_BUTTON2_MASK ) ct = GDK_BOTTOM_RIGHT_CORNER; - gdk_window_set_cursor(widget->window,gdk_cursor_new(ct)); + window = gtk_widget_get_window(widget); + + gdk_window_set_cursor(window,gdk_cursor_new(ct)); if (engine->mouse_state == GDK_BUTTON_PRESS) // 鼠标按下状态 { - gdk_window_set_cursor(widget->window,gdk_cursor_new(ct)); + gdk_window_set_cursor(window,gdk_cursor_new(ct)); engine->currentstroke.points = g_renew(GdkPoint,engine->currentstroke.points,engine->currentstroke.segments +1 ); @@ -250,12 +271,12 @@ void UI_buildui(IBusHandwriteEngine * engine) gtk_box_pack_start(GTK_BOX(vbox),drawing_area,TRUE,TRUE,FALSE); - gtk_widget_set_size_request(drawing_area,200,200); + gtk_widget_set_size_request(drawing_area,WIDTH,HEIGHT); engine->lookuppanel = gtk_table_new(2,5,TRUE); gtk_box_pack_end(GTK_BOX(vbox),engine->lookuppanel,FALSE,TRUE,FALSE); - gtk_widget_set_size_request(engine->lookuppanel,200,50); + gtk_widget_set_size_request(engine->lookuppanel,WIDTH,50); gtk_widget_add_events(GTK_WIDGET(drawing_area),GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK| GDK_BUTTON_PRESS_MASK); @@ -297,43 +318,48 @@ void UI_cancelui(IBusHandwriteEngine* engine) static void widget_realize(GtkWidget *widget, gpointer user_data) { - GdkPixmap * pxmp; - GdkGC * gc; - GdkColor black, white; - int R = 5; - guint width,height; + cairo_t * cr; + cairo_surface_t * surface; + cairo_region_t * region; + GdkWindow * window; + const int R = 5; + guint width,height; - //二值图像,白就是 1 - white.pixel = 1; - black.pixel = 0; + window = gtk_widget_get_window(widget); - gtk_window_set_opacity(GTK_WINDOW(widget), 0.62); + gtk_widget_set_opacity(widget, 0.62); gtk_window_get_size(GTK_WINDOW(widget),&width,&height); - pxmp = gdk_pixmap_new(NULL, width, height, 1); - gc = gdk_gc_new(GDK_DRAWABLE(pxmp)); + surface = gdk_window_create_similar_surface + (window, CAIRO_CONTENT_ALPHA, width, height); + cr = cairo_create(surface); - gdk_gc_set_foreground(gc, &black); + cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0); + cairo_rectangle(cr, 0, 0, WIDTH, HEIGHT); + cairo_fill(cr); - gdk_draw_rectangle(GDK_DRAWABLE(pxmp), gc, 1, 0, 0, width, height); + cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.0); - gdk_gc_set_foreground(gc, &white); + cairo_move_to(cr, 0, R); + cairo_arc_negative(cr, R, R, R, M_PI, M_PI/2); + cairo_line_to(cr, WIDTH - R, 0); + cairo_arc_negative(cr, WIDTH - R, R, R, M_PI/2, 0); + cario_line_to(cr, WIDTH, HEIGHT - R); + cairo_arc_negative(cr, WIDTH - R, HEIGHT - R, R, 0, -M_PI/2); + cairo_line_to(cr, R, HEIGHT); + cairo_arc_negative(cr, R, HEIGHT - R, R, -M_PI/2, -M_PI); + cairo_close_path(cr); + cairo_fill(cr); - gdk_draw_arc(GDK_DRAWABLE(pxmp), gc, 1, 0, 0, R*2, R*2, 0, 360 * 64); - gdk_draw_arc(GDK_DRAWABLE(pxmp), gc, 1, width - R*2, 0, R*2, R*2, 0, 360 - * 64); - gdk_draw_arc(GDK_DRAWABLE(pxmp), gc, 1, width - R*2, height - R*2, R*2, R*2, 0, - 360 * 64); - gdk_draw_arc(GDK_DRAWABLE(pxmp), gc, 1, 0, height - R*2, R*2, R*2, 0, 360 - * 64); - gdk_draw_rectangle(GDK_DRAWABLE(pxmp), gc, 1, 0, R, width, height - R*2); - gdk_draw_rectangle(GDK_DRAWABLE(pxmp), gc, 1, R, 0, width - R*2, height); + region = gdk_cairo_region_create_from_surface(surface); - g_object_unref(gc); + cairo_destroy(cr); + cairo_surface_destroy(surface); gtk_widget_reset_shapes(widget); - gtk_widget_shape_combine_mask(widget, pxmp, 0, 0); - gtk_widget_input_shape_combine_mask(widget, pxmp, 0, 0); - g_object_unref(pxmp); + gdk_window_shape_combine_region(window, region, 0, 0); + gdk_window_input_shape_combine_region(window, region, 0, 0); + + cairo_region_destory(region); } From d5026d42150e497a60afe870bcab2caf63320da3 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Mon, 28 Jul 2014 16:12:09 +0800 Subject: [PATCH 09/10] migrate UI_gtk.c --- src/UI_gtk.c | 20 +++++++++----------- src/handrecog.h | 1 - src/main.c | 4 +--- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/UI_gtk.c b/src/UI_gtk.c index 44f40c8..0241a97 100644 --- a/src/UI_gtk.c +++ b/src/UI_gtk.c @@ -45,7 +45,7 @@ static gboolean paint_lines(GtkWidget *widget, GdkEventExpose *event, IBusHandwr { cairo_t * cr; GdkWindow * window; - GtkStyle* style; + GtkStyleContext* stylectx; LineStroke cl; int i; @@ -57,13 +57,11 @@ static gboolean paint_lines(GtkWidget *widget, GdkEventExpose *event, IBusHandwr window = gtk_widget_get_window(widget); cr = gdk_cairo_create(window); - style = gtk_style_copy(widget->style); - style = gtk_style_attach(style,widget->window); - - gtk_paint_shadow(style,cr,GTK_STATE_ACTIVE,GTK_SHADOW_ETCHED_OUT,widget,NULL,0,0,WIDTH,HEIGHT); - - gtk_style_detach(style); + /* render frame border */ + stylectx = gtk_widget_get_style_context(widget); + gtk_render_frame(stylectx, cr, 0, 0, WIDTH, HEIGHT); + /* set line attributes */ cairo_set_line_width(cr,3.0); cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND); cairo_set_line_join(cr,CAIRO_LINE_JOIN_ROUND); @@ -304,7 +302,7 @@ void UI_hide_ui(IBusHandwriteEngine * engine) { if (engine->drawpanel) { - gtk_widget_hide_all(engine->drawpanel); + gtk_widget_hide(engine->drawpanel); } } @@ -345,7 +343,7 @@ static void widget_realize(GtkWidget *widget, gpointer user_data) cairo_arc_negative(cr, R, R, R, M_PI, M_PI/2); cairo_line_to(cr, WIDTH - R, 0); cairo_arc_negative(cr, WIDTH - R, R, R, M_PI/2, 0); - cario_line_to(cr, WIDTH, HEIGHT - R); + cairo_line_to(cr, WIDTH, HEIGHT - R); cairo_arc_negative(cr, WIDTH - R, HEIGHT - R, R, 0, -M_PI/2); cairo_line_to(cr, R, HEIGHT); cairo_arc_negative(cr, R, HEIGHT - R, R, -M_PI/2, -M_PI); @@ -357,9 +355,9 @@ static void widget_realize(GtkWidget *widget, gpointer user_data) cairo_destroy(cr); cairo_surface_destroy(surface); - gtk_widget_reset_shapes(widget); + /* gtk_widget_reset_shapes(widget); */ gdk_window_shape_combine_region(window, region, 0, 0); gdk_window_input_shape_combine_region(window, region, 0, 0); - cairo_region_destory(region); + cairo_region_destroy(region); } diff --git a/src/handrecog.h b/src/handrecog.h index a209e96..c9b2ad0 100644 --- a/src/handrecog.h +++ b/src/handrecog.h @@ -9,7 +9,6 @@ #define HANDRECOG_C_ #include -#include typedef struct _LineStroke LineStroke; typedef struct _MatchedChar MatchedChar; diff --git a/src/main.c b/src/main.c index 2c3bbda..959d620 100644 --- a/src/main.c +++ b/src/main.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #define _(String) gettext (String) @@ -40,7 +41,6 @@ int main(int argc, char* argv[]) setlocale(LC_ALL, ""); - gtk_set_locale(); textdomain(GETTEXT_PACKAGE); GOptionEntry args[] = @@ -141,8 +141,6 @@ int main(int argc, char* argv[]) GdkScreen * screen = gdk_screen_get_default(); GdkVisual * visual = gdk_screen_get_rgba_visual(screen); - if(visual) - gtk_widget_set_default_visual(visual); printf(_("ibus-handwrite Version %s Start Up\n"), PACKAGE_VERSION); From 91255f77e8d38e474565c0de1dbf10dffc557ff4 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Tue, 29 Jul 2014 15:35:10 +0800 Subject: [PATCH 10/10] fixes bugs --- src/UI_gtk.c | 70 +++++++++++++++++++--------------------------------- 1 file changed, 26 insertions(+), 44 deletions(-) diff --git a/src/UI_gtk.c b/src/UI_gtk.c index 0241a97..152d2b6 100644 --- a/src/UI_gtk.c +++ b/src/UI_gtk.c @@ -18,21 +18,20 @@ #define _(String) gettext (String) #define N_(String) gettext_noop (String) -#define WIDTH 200 -#define HEIGHT 200 - -#define MAX_COLOR_VALUE 65535.0 +#define WIDTH 260 +#define HEIGHT 260 +#define PANELHEIGHT 60 static void widget_realize(GtkWidget *widget, gpointer user_data); -static gboolean _draw_lines(cairo_t * cr, LineStroke cl) +static gboolean _draw_lines(cairo_t * cr, LineStroke * cl) { - if (0 == cl.segments) + if (0 == cl->segments) return FALSE; int i; - for (i = 0; i < cl.segments; ++i) { - GdkPoint point = cl.points[i]; + for (i = 0; i < cl->segments; ++i) { + GdkPoint point = cl->points[i]; cairo_line_to(cr, point.x, point.y); } @@ -41,22 +40,15 @@ static gboolean _draw_lines(cairo_t * cr, LineStroke cl) return TRUE; } -static gboolean paint_lines(GtkWidget *widget, GdkEventExpose *event, IBusHandwriteEngine * engine) +static gboolean paint_lines(GtkWidget *widget, cairo_t * cr, IBusHandwriteEngine * engine) { - cairo_t * cr; - GdkWindow * window; GtkStyleContext* stylectx; LineStroke cl; int i; - MatchedChar * matched; - puts(__func__); - window = gtk_widget_get_window(widget); - cr = gdk_cairo_create(window); - /* render frame border */ stylectx = gtk_widget_get_style_context(widget); gtk_render_frame(stylectx, cr, 0, 0, WIDTH, HEIGHT); @@ -73,13 +65,11 @@ static gboolean paint_lines(GtkWidget *widget, GdkEventExpose *event, IBusHandwr { printf("drawing %d th line, total %d\n",i,engine->engine->strokes->len); cl = g_array_index(engine->engine->strokes,LineStroke,i); - _draw_lines(cr, cl); + _draw_lines(cr, &cl); } //当下笔画 if ( engine->currentstroke.segments && engine->currentstroke.points ) - _draw_lines(cr, engine->currentstroke); - - cairo_destroy(cr); + _draw_lines(cr, &(engine->currentstroke)); return TRUE; } @@ -102,7 +92,9 @@ static void regen_loopuptable(GtkWidget * widget, IBusHandwriteEngine * engine) bt = gtk_button_new_with_label(drawtext); - gtk_table_attach_defaults(GTK_TABLE(widget),bt,i%5,i%5+1,i/5,i/5+1); + g_object_set(G_OBJECT(bt), "expand", TRUE, NULL); + + gtk_grid_attach(GTK_TABLE(widget), bt, i%5, i/5, 1, 1); gtk_widget_show(bt); @@ -128,14 +120,13 @@ static gboolean on_mouse_move(GtkWidget *widget, GdkEventMotion *event, GdkCursorType ct ; - guint width,height; + gint width,height; GdkWindow * window; gtk_window_get_size(GTK_WINDOW(engine->drawpanel),&width,&height); - - ct = event->y < (height-50) ? GDK_PENCIL:GDK_CENTER_PTR; + ct = event->y < (height - PANELHEIGHT) ? GDK_PENCIL:GDK_CENTER_PTR; if( event->state & (GDK_BUTTON2_MASK |GDK_BUTTON3_MASK )) ct = GDK_FLEUR; @@ -162,9 +153,6 @@ static gboolean on_mouse_move(GtkWidget *widget, GdkEventMotion *event, printf("move, x= %lf, Y=%lf, segments = %d \n",event->x,event->y,engine->currentstroke.segments); gtk_widget_queue_draw(widget); - while (gtk_events_pending ()) - gtk_main_iteration (); - } else if(event->state & GDK_BUTTON2_MASK) { @@ -190,7 +178,6 @@ static gboolean on_mouse_move(GtkWidget *widget, GdkEventMotion *event, static gboolean on_button(GtkWidget* widget, GdkEventButton *event, gpointer user_data) { - int i; IBusHandwriteEngine * engine; engine = (IBusHandwriteEngine *) (user_data); @@ -259,22 +246,23 @@ void UI_buildui(IBusHandwriteEngine * engine) gtk_window_set_position(GTK_WINDOW(engine->drawpanel),GTK_WIN_POS_MOUSE); - GtkWidget * vbox = gtk_vbox_new(FALSE,0); + GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_box_set_homogeneous(vbox, FALSE); gtk_container_add(GTK_CONTAINER(engine->drawpanel),vbox); GtkWidget * drawing_area = gtk_drawing_area_new(); - g_signal_connect(G_OBJECT(drawing_area),"expose-event",G_CALLBACK(paint_lines),engine); + g_signal_connect(G_OBJECT(drawing_area),"draw",G_CALLBACK(paint_lines),engine); gtk_box_pack_start(GTK_BOX(vbox),drawing_area,TRUE,TRUE,FALSE); - gtk_widget_set_size_request(drawing_area,WIDTH,HEIGHT); + gtk_widget_set_size_request(drawing_area, WIDTH, HEIGHT - PANELHEIGHT); - engine->lookuppanel = gtk_table_new(2,5,TRUE); + engine->lookuppanel = gtk_grid_new(); gtk_box_pack_end(GTK_BOX(vbox),engine->lookuppanel,FALSE,TRUE,FALSE); - gtk_widget_set_size_request(engine->lookuppanel,WIDTH,50); + gtk_widget_set_size_request(engine->lookuppanel, WIDTH, PANELHEIGHT); gtk_widget_add_events(GTK_WIDGET(drawing_area),GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK| GDK_BUTTON_PRESS_MASK); @@ -289,8 +277,6 @@ void UI_buildui(IBusHandwriteEngine * engine) void UI_show_ui(IBusHandwriteEngine * engine) { - GdkCursor* cursor; - printf("%s \n", __func__); if (engine->drawpanel) { @@ -321,7 +307,7 @@ static void widget_realize(GtkWidget *widget, gpointer user_data) cairo_region_t * region; GdkWindow * window; const int R = 5; - guint width,height; + gint width,height; window = gtk_widget_get_window(widget); @@ -334,19 +320,15 @@ static void widget_realize(GtkWidget *widget, gpointer user_data) cr = cairo_create(surface); cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0); - cairo_rectangle(cr, 0, 0, WIDTH, HEIGHT); - cairo_fill(cr); - - cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.0); cairo_move_to(cr, 0, R); - cairo_arc_negative(cr, R, R, R, M_PI, M_PI/2); + cairo_arc(cr, R, R, R, M_PI, -M_PI/2); cairo_line_to(cr, WIDTH - R, 0); - cairo_arc_negative(cr, WIDTH - R, R, R, M_PI/2, 0); + cairo_arc(cr, WIDTH - R, R, R, -M_PI/2, 0); cairo_line_to(cr, WIDTH, HEIGHT - R); - cairo_arc_negative(cr, WIDTH - R, HEIGHT - R, R, 0, -M_PI/2); + cairo_arc(cr, WIDTH - R, HEIGHT - R, R, 0, M_PI/2); cairo_line_to(cr, R, HEIGHT); - cairo_arc_negative(cr, R, HEIGHT - R, R, -M_PI/2, -M_PI); + cairo_arc(cr, R, HEIGHT - R, R, M_PI/2, M_PI); cairo_close_path(cr); cairo_fill(cr);