--- src/item-edit.c.orig Thu Dec 27 07:10:52 2001 +++ src/item-edit.c Fri Mar 1 21:58:00 2002 @@ -42,6 +42,41 @@ ARG_SHEET_CONTROL_GUI, /* The SheetControlGUI * argument */ }; +/* Update XIM position */ +static void +item_edit_update_im_position(ItemEdit* item_edit, int x, int y) +{ + /* Need widget pointer that has GdkIC */ + GnumericCanvas* gcanvas = + GNUMERIC_CANVAS(GNOME_CANVAS_ITEM(item_edit)->canvas); + int cx, cy; + + if (GTK_WIDGET_HAS_FOCUS(gcanvas) && gdk_im_ready() && + gcanvas->ic && (gdk_ic_get_style (gcanvas->ic) + & GDK_IM_PREEDIT_POSITION)){ + + int width, height; + + /* position should be inside the widget */ + if ( x <= 0 || y <=0 ) + return; + + gnome_canvas_get_scroll_offsets(GNOME_CANVAS(gcanvas), &cx, &cy); + + gcanvas->ic_attr->spot_location.x = + (int)GNOME_CANVAS_ITEM(item_edit)->x1 + x - cx; + gcanvas->ic_attr->spot_location.y = + (int)GNOME_CANVAS_ITEM(item_edit)->y1 + y - 2 - cy; + + gdk_window_get_size (GTK_WIDGET(gcanvas)->window, &width, &height); + gcanvas->ic_attr->preedit_area.width = width; + gcanvas->ic_attr->preedit_area.height = height; + + gdk_ic_set_attr (gcanvas->ic, gcanvas->ic_attr, + GDK_IC_SPOT_LOCATION | GDK_IC_PREEDIT_AREA); + } +} + static void scan_at (const char *text, int *scan) { @@ -169,6 +204,8 @@ gdk_draw_line (drawable, style->black_gc, x, y-font->ascent, x, y+font->descent); + + item_edit_update_im_position(item_edit, x, y+font->descent); } static void @@ -239,6 +276,11 @@ if (item_edit->font == NULL) return; top_pos += item_edit->font->ascent; + + /* Handle multibyte */ + if( cursor_pos != -1 ) + cursor_pos = strlen(gtk_editable_get_chars(GTK_EDITABLE(item_edit->entry), + 0, cursor_pos)); /* Draw the background (recall that gdk_draw_rectangle excludes far coords) */ gdk_draw_rectangle (