diff options
author | Yves Combe <ycombe@src.gnome.org> | 2005-09-25 22:28:31 (GMT) |
---|---|---|
committer | Yves Combe <ycombe@src.gnome.org> | 2005-09-25 22:28:31 (GMT) |
commit | 0b42a7daf83b1bcdac73a9112e8402cb5c567ada (patch) | |
tree | 4769b5ffaa19105ee408608720968edc083292b9 | |
parent | da3166caae2b77ea1e72592649cefddc372b7685 (diff) |
Use IMContext: compare words with commit_str only, show preedit string as help.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | src/boards/wordsgame.c | 234 |
2 files changed, 131 insertions, 110 deletions
@@ -1,3 +1,10 @@ +2005-09-26 Yves Combe <yves@ycombe.net> + + Use IMContext: compare words with commit_str only, show preedit string as help. + + * src/boards/wordsgame.c: (start_board), (end_board), (key_press), + (wordsgame_next_level): + 2005-09-25 Yves Combe <yves@ycombe.net> fix segfault in worsgame (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=273680). Same bug as in reading (see 2005-11-09). diff --git a/src/boards/wordsgame.c b/src/boards/wordsgame.c index 56d5366..12fca51 100644 --- a/src/boards/wordsgame.c +++ b/src/boards/wordsgame.c @@ -1,6 +1,6 @@ /* gcompris - wordsgame.c * - * Time-stamp: <2005/09/25 09:44:21 yves> + * Time-stamp: <2005/09/26 00:17:42 yves> * * Copyright (C) 2000 Bruno Coudoin * @@ -102,6 +102,8 @@ static void player_loose(void); static guint32 fallSpeed = 0; static double speed = 0.0; +static GnomeCanvasItem *preedit_text = NULL; + /* Description of this plugin */ static BoardPlugin menu_bp = { @@ -178,7 +180,7 @@ static void start_board (GcomprisBoard *agcomprisBoard) gcomprisBoard=agcomprisBoard; /* disable im_context */ - gcomprisBoard->disable_im_context = TRUE; + //gcomprisBoard->disable_im_context = TRUE; gcompris_set_background(gnome_canvas_root(gcomprisBoard->canvas), "images/scenery_background.png"); @@ -205,6 +207,11 @@ end_board () pause_board(TRUE); gcompris_score_end(); wordsgame_destroy_all_items(); + if (preedit_text){ + gtk_object_destroy(GTK_OBJECT(preedit_text)); + preedit_text=NULL; + } + gcompris_im_reset(); gcomprisBoard = NULL; } } @@ -226,143 +233,144 @@ static gint key_press(guint keyval, gchar *commit_str, gchar *preedit_str) gchar *letter; gint i; LettersItem *item; + gint str_length; + gchar *str; + gunichar unichar_letter; if(!gcomprisBoard) return FALSE; - if(!g_unichar_isalnum (gdk_keyval_to_unicode (keyval))) - return FALSE; - + if (keyval){ + g_warning("keyval %d", keyval); + return TRUE; + } - /* Add some filter for control and shift key */ - switch (keyval) - { - case GDK_Shift_L: - case GDK_Shift_R: - case GDK_Control_L: - case GDK_Control_R: - case GDK_Caps_Lock: - case GDK_Shift_Lock: - case GDK_Meta_L: - case GDK_Meta_R: - case GDK_Alt_L: - case GDK_Alt_R: - case GDK_Super_L: - case GDK_Super_R: - case GDK_Hyper_L: - case GDK_Hyper_R: - case GDK_Mode_switch: - case GDK_dead_circumflex: - case GDK_Num_Lock: - return FALSE; - case GDK_KP_0: - keyval=GDK_0; - break; - case GDK_KP_1: - keyval=GDK_1; - break; - case GDK_KP_2: - keyval=GDK_2; - break; - case GDK_KP_3: - keyval=GDK_3; - break; - case GDK_KP_4: - keyval=GDK_4; - break; - case GDK_KP_5: - keyval=GDK_5; - break; - case GDK_KP_6: - keyval=GDK_6; - break; - case GDK_KP_7: - keyval=GDK_7; - break; - case GDK_KP_8: - keyval=GDK_8; - break; - case GDK_KP_9: - keyval=GDK_9; - break; - } + if (preedit_str){ + g_warning("preedit_str %s", preedit_str); + /* show the preedit string on bottom of the window */ + GcomprisProperties *properties = gcompris_get_properties (); + gchar *text; + PangoAttrList *attrs; + gint cursor_pos; + gtk_im_context_get_preedit_string (properties->context, + &text, + &attrs, + &cursor_pos); + + if (!preedit_text) + preedit_text = \ + gnome_canvas_item_new (gnome_canvas_root(gcomprisBoard->canvas), + gnome_canvas_text_get_type (), + "font", gcompris_skin_font_board_huge_bold, + "x", (double) BOARDWIDTH/2, + "y", (double) BOARDHEIGHT - 100, + "anchor", GTK_ANCHOR_N, + //"fill_color_rgba", 0xba00ffff, + NULL); + + + gnome_canvas_item_set (preedit_text, + "text", text, + "attributes", attrs, + NULL); + + return TRUE; + + } - letter=g_strnfill(6,'\0'); - g_unichar_to_utf8 (gdk_keyval_to_unicode(keyval), letter); + /* commit str */ + g_warning("commit_str %s", commit_str); + str = commit_str; - if(item_on_focus==NULL) + for (i=0; i < g_utf8_strlen(commit_str,-1); i++){ + unichar_letter = g_utf8_get_char(str); + str = g_utf8_next_char(str); + if(!g_unichar_isalnum (unichar_letter)){ + player_loose(); + return FALSE; + } + + letter = g_new0(gchar,6); + g_unichar_to_utf8 (unichar_letter, letter); + + if(item_on_focus==NULL) { - g_static_rw_lock_reader_lock (&items_lock); - gint count=items->len; - g_static_rw_lock_reader_unlock (&items_lock); - - for (i=0;i<count;i++) + g_static_rw_lock_reader_lock (&items_lock); + gint count=items->len; + g_static_rw_lock_reader_unlock (&items_lock); + + for (i=0;i<count;i++) { - g_static_rw_lock_reader_lock (&items_lock); - item=g_ptr_array_index(items,i); - g_static_rw_lock_reader_unlock (&items_lock); - assert (item!=NULL); - if (strcmp(item->letter,letter)==0) + g_static_rw_lock_reader_lock (&items_lock); + item=g_ptr_array_index(items,i); + g_static_rw_lock_reader_unlock (&items_lock); + assert (item!=NULL); + if (strcmp(item->letter,letter)==0) { - item_on_focus=item; - break; + item_on_focus=item; + break; } } } - - - if(item_on_focus!=NULL) + + + if(item_on_focus!=NULL) { - - if(strcmp(item_on_focus->letter, letter)==0) + + if(strcmp(item_on_focus->letter, letter)==0) { - item_on_focus->count++; - g_free(item_on_focus->overword); - item_on_focus->overword=g_utf8_strndup(item_on_focus->word,item_on_focus->count); - gnome_canvas_item_set (item_on_focus->overwriteItem, + item_on_focus->count++; + g_free(item_on_focus->overword); + item_on_focus->overword=g_utf8_strndup(item_on_focus->word,item_on_focus->count); + gnome_canvas_item_set (item_on_focus->overwriteItem, "text", item_on_focus->overword, NULL); - - - if (item_on_focus->count<g_utf8_strlen(item_on_focus->word,-1)) + + + if (item_on_focus->count<g_utf8_strlen(item_on_focus->word,-1)) { - g_free(item_on_focus->letter); - item_on_focus->letter=g_utf8_strndup(item_on_focus->pos,1); - item_on_focus->pos=g_utf8_find_next_char(item_on_focus->pos,NULL); + g_free(item_on_focus->letter); + item_on_focus->letter=g_utf8_strndup(item_on_focus->pos,1); + item_on_focus->pos=g_utf8_find_next_char(item_on_focus->pos,NULL); } - else + else { - player_win(item_on_focus); - item_on_focus=NULL; + player_win(item_on_focus); + item_on_focus=NULL; } } - else + else { - /* It is a loose : unselect the word and defocus */ - g_free(item_on_focus->overword); - item_on_focus->overword=g_strdup(" "); - item_on_focus->count=0; - g_free(item_on_focus->letter); - item_on_focus->letter=g_utf8_strndup(item_on_focus->word,1); - - item_on_focus->pos=g_utf8_find_next_char(item_on_focus->word,NULL); - - gnome_canvas_item_set (item_on_focus->overwriteItem, - "text", item_on_focus->overword, + /* It is a loose : unselect the word and defocus */ + g_free(item_on_focus->overword); + item_on_focus->overword=g_strdup(" "); + item_on_focus->count=0; + g_free(item_on_focus->letter); + item_on_focus->letter=g_utf8_strndup(item_on_focus->word,1); + + item_on_focus->pos=g_utf8_find_next_char(item_on_focus->word,NULL); + + gnome_canvas_item_set (item_on_focus->overwriteItem, + "text", item_on_focus->overword, NULL); - item_on_focus=NULL; - player_loose(); + item_on_focus=NULL; + g_free(letter); + player_loose(); + break; } } - else + else { - /* Anyway kid you clicked on the wrong key */ - player_loose(); + /* Anyway kid you clicked on the wrong key */ + player_loose(); + g_free(letter); + break; } - g_free(letter); - return TRUE; + g_free(letter); + } + return TRUE; } static gboolean @@ -402,8 +410,14 @@ static void wordsgame_next_level() gcompris_bar_set_level(gcomprisBoard); gcompris_score_set(gcomprisBoard->sublevel); - wordsgame_destroy_all_items(); + + if (preedit_text){ + gtk_object_destroy(GTK_OBJECT(preedit_text)); + preedit_text=NULL; + } + gcompris_im_reset(); + wordsgame_read_wordfile(); items=g_ptr_array_new(); items2del=g_ptr_array_new(); |