diff -Nur gtk+-2.4.14.bak/gtk/gtkentry.c gtk+-2.4.14/gtk/gtkentry.c --- gtk+-2.4.14.bak/gtk/gtkentry.c 2004-09-18 19:05:29.000000000 +0900 +++ gtk+-2.4.14/gtk/gtkentry.c 2005-02-17 15:01:40.000000000 +0900 @@ -199,6 +199,8 @@ static void gtk_entry_drag_data_delete (GtkWidget *widget, GdkDragContext *context); +static GtkIMContext *gtk_entry_get_im_context(GtkWidget *widget); + /* GtkEditable method implementations */ static void gtk_entry_insert_text (GtkEditable *editable, @@ -448,6 +450,8 @@ gtk_object_class->destroy = gtk_entry_destroy; + widget_class->get_im_context = gtk_entry_get_im_context; + class->move_cursor = gtk_entry_move_cursor; class->insert_at_cursor = gtk_entry_insert_at_cursor; class->delete_from_cursor = gtk_entry_delete_from_cursor; @@ -4586,6 +4590,14 @@ gtk_editable_delete_text (editable, sel_start, sel_end); } + +static GtkIMContext * +gtk_entry_get_im_context(GtkWidget *widget) +{ + g_return_val_if_fail(GTK_IS_ENTRY(widget), NULL); + return GTK_ENTRY(widget)->im_context; +} + /* We display the cursor when * * - the selection is empty, AND diff -Nur gtk+-2.4.14.bak/gtk/gtktextview.c gtk+-2.4.14/gtk/gtktextview.c --- gtk+-2.4.14.bak/gtk/gtktextview.c 2004-07-06 15:02:27.000000000 +0900 +++ gtk+-2.4.14/gtk/gtktextview.c 2005-02-17 15:02:09.000000000 +0900 @@ -233,6 +233,8 @@ guint info, guint time); +static GtkIMContext *gtk_text_view_get_im_context(GtkWidget *widget); + static void gtk_text_view_set_scroll_adjustments (GtkTextView *text_view, GtkAdjustment *hadj, GtkAdjustment *vadj); @@ -530,6 +532,8 @@ widget_class->drag_data_received = gtk_text_view_drag_data_received; widget_class->popup_menu = gtk_text_view_popup_menu; + + widget_class->get_im_context = gtk_text_view_get_im_context; container_class->add = gtk_text_view_add; container_class->remove = gtk_text_view_remove; @@ -6207,6 +6211,13 @@ } } +static GtkIMContext * +gtk_text_view_get_im_context (GtkWidget *widget) +{ + g_return_val_if_fail(GTK_IS_TEXT_VIEW(widget), NULL); + return GTK_TEXT_VIEW(widget)->im_context; +} + static GtkAdjustment* get_hadjustment (GtkTextView *text_view) { diff -Nur gtk+-2.4.14.bak/gtk/gtkwidget.c gtk+-2.4.14/gtk/gtkwidget.c --- gtk+-2.4.14.bak/gtk/gtkwidget.c 2004-10-13 00:16:01.000000000 +0900 +++ gtk+-2.4.14/gtk/gtkwidget.c 2005-02-17 14:45:35.000000000 +0900 @@ -403,6 +403,9 @@ klass->no_expose_event = NULL; + /* for getting GtkIMContext */ + klass->get_im_context = NULL; + g_object_class_install_property (gobject_class, PROP_NAME, g_param_spec_string ("name", @@ -7492,3 +7495,17 @@ g_object_notify (G_OBJECT (widget), "no_show_all"); } + +GtkIMContext * +gtk_widget_get_im_context(GtkWidget *widget) +{ + GtkWidgetClass *klass; + + g_return_val_if_fail (GTK_IS_WIDGET(widget), NULL); + + klass = GTK_WIDGET_GET_CLASS (widget); + if (klass->get_im_context) + return klass->get_im_context (widget); + + return NULL; +} diff -Nur gtk+-2.4.14.bak/gtk/gtkwidget.h gtk+-2.4.14/gtk/gtkwidget.h --- gtk+-2.4.14.bak/gtk/gtkwidget.h 2004-08-04 07:22:03.000000000 +0900 +++ gtk+-2.4.14/gtk/gtkwidget.h 2005-02-17 14:46:10.000000000 +0900 @@ -34,6 +34,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -406,8 +407,10 @@ gboolean (*can_activate_accel) (GtkWidget *widget, guint signal_id); + /* for getting GtkIMContext */ + GtkIMContext *(*get_im_context) (GtkWidget *widget); + /* Padding for future expansion */ - void (*_gtk_reserved2) (void); void (*_gtk_reserved3) (void); void (*_gtk_reserved4) (void); void (*_gtk_reserved5) (void); @@ -610,6 +613,9 @@ /* Accessibility support */ AtkObject* gtk_widget_get_accessible (GtkWidget *widget); +/* for GtkIMContext */ +GtkIMContext *gtk_widget_get_im_context (GtkWidget *widget); + /* The following functions must not be called on an already * realized widget. Because it is possible that somebody * can call get_colormap() or get_visual() and save the diff -Nur gtk+-2.4.14.bak/gtk/gtkwindow.c gtk+-2.4.14/gtk/gtkwindow.c --- gtk+-2.4.14.bak/gtk/gtkwindow.c 2004-10-04 23:52:22.000000000 +0900 +++ gtk+-2.4.14/gtk/gtkwindow.c 2005-02-17 15:00:15.000000000 +0900 @@ -4235,16 +4235,26 @@ GdkEventKey *event) { GtkWindow *window = GTK_WINDOW (widget); + GtkWidget *focus; + GtkIMContext *im_context = NULL; gboolean handled = FALSE; + /* bypass to GtkIMContext */ + focus = window->focus_widget; + if (focus) + im_context = gtk_widget_get_im_context(focus); + /* handle mnemonics and accelerators */ - if (!handled) + if (!im_context && !handled) handled = gtk_window_activate_key (window, event); /* handle focus widget key events */ if (!handled) handled = gtk_window_propagate_key_event (window, event); + if (im_context && !handled) + handled = gtk_window_activate_key (window, event); + /* Chain up, invokes binding set */ if (!handled) handled = GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);