--- libgnomeui/gnome-icon-item.c Sat Oct 16 20:26:29 1999 +++ libgnomeui/gnome-icon-item.c Sat Oct 16 23:58:52 1999 @@ -104,6 +104,12 @@ priv->need_state_update = TRUE; gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (iti)); + { + GdkIC *ic; + GtkObject *canvas = (GtkObject *)GNOME_CANVAS_ITEM(iti)->canvas; + ic = gtk_object_get_data((GtkObject *)canvas, "ic"); + if (ic) gdk_im_end(); + } gtk_signal_emit (GTK_OBJECT (iti), iti_signals[EDITING_STOPPED]); } @@ -194,6 +200,64 @@ iti_edition_accept (iti); } +static void +ic_destroy(GtkObject *canvas) +{ + GdkIC *ic; + GdkICAttr *attr; + ic = gtk_object_get_data(canvas, "ic"); + if (ic) { + gdk_ic_destroy(ic); + gtk_object_set_data(canvas, "ic", NULL); + } + attr = gtk_object_get_data(canvas, "ic-attr"); + if (attr) { + gdk_ic_attr_destroy(attr); + gtk_object_set_data(canvas, "ic-attr", NULL); + } +} + +static GdkIC * +create_ic(Iti *iti) +{ + GdkIC *ic; + GdkICAttr *attr; + GtkLayout *canvas; + GtkWidget *widget; + GdkICAttributesType attrmask = GDK_IC_ALL_REQ; + GdkIMStyle supported_style = GDK_IM_PREEDIT_NOTHING | + GDK_IM_PREEDIT_POSITION | + GDK_IM_STATUS_NOTHING; + attr = gdk_ic_attr_new(); + if (!attr) return NULL; + attr->style = gdk_im_decide_style (supported_style); + attrmask |= GDK_IC_PREEDIT_FOREGROUND | GDK_IC_PREEDIT_BACKGROUND; + canvas = (GtkLayout *)GNOME_CANVAS_ITEM(iti)->canvas; + widget = (GtkWidget *)canvas; + + attr->client_window = canvas->bin_window; + attr->preedit_foreground = widget->style->fg[GTK_STATE_NORMAL]; + attr->preedit_background = widget->style->bg[GTK_STATE_NORMAL]; + if (attr->style & GDK_IM_PREEDIT_POSITION) { + int width, height; + gdk_window_get_size(canvas->bin_window, &width, &height); + attrmask |= GDK_IC_PREEDIT_POSITION_REQ; + attr->spot_location.x = 0; + attr->spot_location.y = 0; + attr->preedit_area.x = 0; + attr->preedit_area.y = 0; + attr->preedit_area.width = width; + attr->preedit_area.height = height; + attr->preedit_fontset = iti->ti->font; + } + ic = gdk_ic_new(attr, attrmask); + if (!ic) return NULL; + gtk_object_set_data((GtkObject *)canvas, "ic", ic); + gtk_object_set_data((GtkObject *)canvas, "ic-attr", attr); + gtk_signal_connect((GtkObject *)canvas, "unrealize", (GtkSignalFunc)ic_destroy, NULL); + return ic; +} + /* Starts the editing state of an icon text item */ static void iti_start_editing (Iti *iti) @@ -225,6 +289,13 @@ priv->need_state_update = TRUE; gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (iti)); + { + GdkIC *ic; + GtkLayout *canvas = (GtkLayout *)GNOME_CANVAS_ITEM(iti)->canvas; + ic = gtk_object_get_data((GtkObject *)canvas,"ic"); + if (ic == NULL && gdk_im_ready()) ic = create_ic(iti); + if (ic) gdk_im_begin(ic, canvas->bin_window); + } gtk_signal_emit (GTK_OBJECT (iti), iti_signals[EDITING_STARTED]); } @@ -396,9 +467,14 @@ GdkGC *gc, *bgc, *sgc, *bsgc; GList *item; int xpos, len; + int xx = x, yy = y; priv = iti->priv; style = GTK_WIDGET (GNOME_CANVAS_ITEM (iti)->canvas)->style; + xx = x - GNOME_CANVAS_ITEM(iti)->x1 - MARGIN_X + + GNOME_CANVAS_ITEM(iti)->canvas->layout.hadjustment->value; + yy = y - GNOME_CANVAS_ITEM(iti)->y1 - MARGIN_Y + + GNOME_CANVAS_ITEM(iti)->canvas->layout.vadjustment->value; ti = iti->ti; len = 0; @@ -462,19 +538,38 @@ px, y, text_wc, 1); - if (cursor == i) + if (cursor == i) { + GdkIC *ic; + ic = gtk_object_get_data((GtkObject *)GNOME_CANVAS_ITEM(iti)->canvas, "ic"); + if (ic && (gdk_ic_get_style(ic) & GDK_IM_PREEDIT_POSITION)) { + GdkICAttr *attr; + attr = gtk_object_get_data((GtkObject *)GNOME_CANVAS_ITEM(iti)->canvas, "ic-attr"); + attr->spot_location.x = px - 1- xx; + attr->spot_location.y = y - yy; + gdk_ic_set_attr (ic, attr, GDK_IC_SPOT_LOCATION); + } gdk_draw_line (drawable, gc, px - 1, y - ti->font->ascent, px - 1, y + ti->font->descent - 1); + } offset += size; } - if (cursor == i) { + if (cursor == i && !item->next) { int px = x + xpos + offset; + GdkIC *ic; + ic = gtk_object_get_data((GtkObject *)GNOME_CANVAS_ITEM(iti)->canvas, "ic"); + if (ic && (gdk_ic_get_style(ic) & GDK_IM_PREEDIT_POSITION)) { + GdkICAttr *attr; + attr = gtk_object_get_data((GtkObject *)GNOME_CANVAS_ITEM(iti)->canvas, "ic-attr"); + attr->spot_location.x = px - 1 - xx; + attr->spot_location.y = y - yy; + gdk_ic_set_attr (ic, attr, GDK_IC_SPOT_LOCATION); + } gdk_draw_line (drawable, gc,