Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 2546ffb3ea49dcdd93d428c76e1814be > files > 6

gnome-libs-1.4.2-18.fc15.src.rpm

--- 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,