Index: gtkspell/gtkspell.c =================================================================== RCS file: /cvsroot/gtkspell/gtkspell2/gtkspell/gtkspell.c,v retrieving revision 1.13 diff -u -p -r1.13 gtkspell.c --- gtkspell/gtkspell.c 16 Aug 2004 18:59:31 -0000 1.13 +++ gtkspell/gtkspell.c 21 Aug 2004 16:12:02 -0000 @@ -355,6 +355,33 @@ replace_word(GtkWidget *menuitem, GtkSpe g_free(oldword); } +#ifdef _WIN32 +/* This is workaround for a bug in windows GTK+. Clicking outside of the + parent menu (including on a submenu-item) close the whole menu before + the "activate" event is thrown for the given submenu-item. Fixed by + replacing "activate" by "button-release-event". */ +static gboolean +win32_replace_word(GtkWidget *widget, GdkEventButton *event, gpointer user_data) +{ + replace_word(widget, user_data); + return FALSE; +} + +static gboolean +win32_ignore_all(GtkWidget *widget, GdkEventButton *event, gpointer user_data) +{ + ignore_all(widget, user_data); + return FALSE; +} + +static gboolean +win32_add_to_dictionary(GtkWidget *widget, GdkEventButton *event, gpointer user_data) +{ + add_to_dictionary(widget, user_data); + return FALSE; +} +#endif + GtkWidget* build_suggestion_menu(GtkSpell *spell, GtkTextBuffer *buffer, const char *word) { @@ -401,8 +428,13 @@ build_suggestion_menu(GtkSpell *spell, G count = 0; } mi = gtk_menu_item_new_with_label(suggestion); +#ifdef _WIN32 + g_signal_connect(G_OBJECT(mi), "button-release-event", + G_CALLBACK(win32_replace_word), spell); +#else g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(replace_word), spell); +#endif gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); count++; @@ -423,8 +455,13 @@ build_suggestion_menu(GtkSpell *spell, G g_free(label); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU)); +#ifdef _WIN32 + g_signal_connect(G_OBJECT(mi), "button-release-event", + G_CALLBACK(win32_add_to_dictionary), spell); +#else g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(add_to_dictionary), spell); +#endif gtk_widget_show_all(mi); gtk_menu_shell_append(GTK_MENU_SHELL(topmenu), mi); @@ -432,8 +469,13 @@ build_suggestion_menu(GtkSpell *spell, G mi = gtk_image_menu_item_new_with_label(_("Ignore All")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU)); +#ifdef _WIN32 + g_signal_connect(G_OBJECT(mi), "button-release-event", + G_CALLBACK(win32_ignore_all), spell); +#else g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(ignore_all), spell); +#endif gtk_widget_show_all(mi); gtk_menu_shell_append(GTK_MENU_SHELL(topmenu), mi);