Re: [evolution-patches] libgal's e-text focus out should not clean im_context signal handlers. [need review]



Hi,

the patch looks OK. Please commit. Thanks for the patch.

Radek

On Wed, 2004-07-14 at 15:25 -0700, Yong Sun wrote:
Hi, guys,

Please help to review this little patch.

Invoke evolution on Japanese locales and open Mail composer. Switch 
"To:" field, input 'Ctrl + Space' and change to Kanji-mode.  Input 'a', 
'Space', 'Space', 'i', then the preedit area is erase without determing 
the former char 'a'. This is because when e-text dealing with the focus 
out event, it will clean the im_context signal handlers, but when 
Japanese IIIM candidate window shows, e-text will lose its focus.

This patch also fix an on-spot issue of e-text. While drawing the 
cursor, notify the current cursor position to im_context.

Regards

Index: e-text.c
===================================================================
RCS file: /export/src/cvs/gal/gal/e-text/e-text.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- e-text.c	2003/11/06 04:30:50	1.4
+++ e-text.c	2004/07/14 21:58:52	1.5
@@ -1618,9 +1618,18 @@
  		} else {
  			if (text->show_cursor) {
  				PangoRectangle strong_pos, weak_pos;
-				char *offs = g_utf8_offset_to_pointer (text->text, 
text->selection_start);
+				GdkRectangle pixel_pos;

+				char *offs = g_utf8_offset_to_pointer (text->text, 
text->selection_start);
  				pango_layout_get_cursor_pos (text->layout, offs - text->text + 
text->preedit_len, &strong_pos, &weak_pos);
+
+				/* notify the location to gtk_im_context */
+				pixel_pos.x = PANGO_PIXELS (strong_pos.x);
+				pixel_pos.y = PANGO_PIXELS (strong_pos.y);
+				pixel_pos.width = PANGO_PIXELS (strong_pos.width);
+				pixel_pos.height = PANGO_PIXELS (strong_pos.height);
+				gtk_im_context_set_cursor_location(text->im_context, &pixel_pos);
+
  				draw_pango_rectangle (drawable, main_gc, xpos, ypos, strong_pos);
  				if (strong_pos.x != weak_pos.x ||
  				    strong_pos.y != weak_pos.y ||
@@ -2190,13 +2199,6 @@
  				start_editing (text);
  				text->show_cursor = FALSE; /* so we'll redraw and the cursor will 
be shown */
  			} else {
-				if (text->im_context) {
-					g_signal_handlers_disconnect_matched (text->im_context,
-									      G_SIGNAL_MATCH_DATA,
-									      0, 0, NULL,
-									      NULL, text);
-					text->im_context_signals_registered = FALSE;
-				}
  				e_text_stop_editing (text);
  				if (text->timeout_id) {
  					g_source_remove(text->timeout_id);

--
Radek Doulík <rodo novell com>
Novell, Inc.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]