aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2010-11-23 22:26:55 +0800
committerRodrigo Moya <rodrigo@gnome-db.org>2011-06-30 00:41:04 +0800
commitc15a75e9ab3fd69d28782f708648f3b7587cb86d (patch)
tree2a882186f1e1ed98ac54a1531824c4f8bc181545 /widgets
parent89f4d51b10b78379e09364bc872868758b968078 (diff)
downloadgsoc2013-evolution-c15a75e9ab3fd69d28782f708648f3b7587cb86d.tar.gz
gsoc2013-evolution-c15a75e9ab3fd69d28782f708648f3b7587cb86d.tar.zst
gsoc2013-evolution-c15a75e9ab3fd69d28782f708648f3b7587cb86d.zip
Bug #371705 - Calendar's day view does not reset its IM context
Diffstat (limited to 'widgets')
-rw-r--r--widgets/text/e-text.c87
1 files changed, 39 insertions, 48 deletions
diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c
index 6ce9716b00..fc0c5ee922 100644
--- a/widgets/text/e-text.c
+++ b/widgets/text/e-text.c
@@ -134,6 +134,7 @@ static void e_text_do_popup (EText *text, GdkEventButton *button, gint position)
static void e_text_update_primary_selection (EText *text);
static void e_text_paste (EText *text, GdkAtom selection);
static void e_text_insert (EText *text, const gchar *string);
+static void e_text_reset_im_context (EText *text);
static void reset_layout_attrs (EText *text);
@@ -177,6 +178,16 @@ static GdkAtom clipboard_atom = GDK_NONE;
+static void
+disconnect_im_context (EText *text)
+{
+ if (!text || !text->im_context)
+ return;
+
+ g_signal_handlers_disconnect_matched (text->im_context, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, text);
+ text->im_context_signals_registered = FALSE;
+}
+
/* Dispose handler for the text item */
#if 0
@@ -255,10 +266,7 @@ e_text_dispose (GObject *object)
}
if (text->im_context) {
- g_signal_handlers_disconnect_matched (text->im_context,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL,
- NULL, text);
+ disconnect_im_context (text);
g_object_unref (text->im_context);
text->im_context = NULL;
}
@@ -906,14 +914,16 @@ e_text_set_property (GObject *object,
}
case PROP_IM_CONTEXT:
- if (text->im_context)
+ if (text->im_context) {
+ disconnect_im_context (text);
g_object_unref (text->im_context);
+ }
text->im_context = g_value_get_object (value);
if (text->im_context)
g_object_ref (text->im_context);
- text->need_im_reset = FALSE;
+ text->need_im_reset = TRUE;
break;
case PROP_HANDLE_POPUP:
@@ -1720,6 +1730,8 @@ start_editing (EText *text)
if (text->editing)
return;
+ e_text_reset_im_context (text);
+
g_free (text->revert);
text->revert = g_strdup (text->text);
@@ -1768,6 +1780,10 @@ e_text_stop_editing (EText *text)
g_timer_destroy (text->timer);
text->timer = NULL;
}
+
+ text->need_im_reset = TRUE;
+ text->preedit_len = 0;
+ text->preedit_pos = 0;
}
void
@@ -1791,9 +1807,6 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
EText *text = E_TEXT (item);
ETextEventProcessorEvent e_tep_event;
GdkWindow *window;
-
- static EText *save_text = NULL;
-
gint return_val = 0;
if (!text->model)
@@ -1808,27 +1821,6 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
GdkEventFocus *focus_event;
focus_event = (GdkEventFocus *) event;
if (focus_event->in) {
-
- /* Evil hack to disconnect the signal handlers for the previous Etext
- * which was not disconnected because of being in preedit mode.
- * In preedit mode the widget can go out of focus due to popups associated
- * with preedit.,but still the callbacks need to be connected.
- * Here when a new text widget comes into focus we can disconnect the
- * old one.Shouldn't hurt much, as in worst case, save_text which should
- * be disconnected will be overwritten and we will have signal
- * handlers connect to multiple e-texts but with subsequent commit these
- * should go away.
- */
-
- if (save_text && save_text->im_context) {
- g_signal_handlers_disconnect_matched (
- save_text->im_context,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, save_text);
- save_text->im_context_signals_registered =
- FALSE;
- }
-
if (text->im_context) {
if (!text->im_context_signals_registered) {
g_signal_connect (text->im_context, "commit",
@@ -1841,22 +1833,16 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
G_CALLBACK (e_text_delete_surrounding_cb), text);
text->im_context_signals_registered = TRUE;
}
+ gtk_im_context_focus_in (text->im_context);
}
+
start_editing (text);
text->show_cursor = FALSE; /* so we'll redraw and the cursor will be shown */
} else {
- /* Incase we are not disconnecting the signals
- * for text, we are saving text for
- * disconnecting in the next focus_in.
- */
- if (!text->preedit_len && 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;
- } else {
- save_text = text;
+ if (text->im_context) {
+ gtk_im_context_focus_out (text->im_context);
+ disconnect_im_context (text);
+ text->need_im_reset = TRUE;
}
e_text_stop_editing (text);
@@ -1902,8 +1888,7 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event)
gint ret;
if (text->im_context &&
- gtk_im_context_filter_keypress (
- text->im_context, (GdkEventKey*)event)) {
+ gtk_im_context_filter_keypress (text->im_context, (GdkEventKey*) event)) {
text->need_im_reset = TRUE;
return 1;
}
@@ -2097,6 +2082,7 @@ e_text_delete_selection (EText *text)
if (sel_start != sel_end)
e_text_model_delete (text->model, sel_start, sel_end - sel_start);
+ text->need_im_reset = TRUE;
}
void
@@ -2363,16 +2349,14 @@ e_text_do_popup (EText *text, GdkEventButton *button, gint position)
closure);
}
-#if 0
static void
e_text_reset_im_context (EText *text)
{
- if (text->need_im_reset) {
- text->need_im_reset = 0;
+ if (text->need_im_reset && text->im_context) {
+ text->need_im_reset = FALSE;
gtk_im_context_reset (text->im_context);
}
}
-#endif
/* fixme: */
@@ -2880,6 +2864,7 @@ e_text_command (ETextEventProcessor *tep,
g_timer_reset (text->timer);
}
+ text->need_im_reset = TRUE;
use_start = TRUE;
break;
case E_TEP_SELECT:
@@ -2890,6 +2875,7 @@ e_text_command (ETextEventProcessor *tep,
e_text_update_primary_selection (text);
+ text->need_im_reset = TRUE;
use_start = FALSE;
break;
@@ -2902,6 +2888,7 @@ e_text_command (ETextEventProcessor *tep,
g_timer_reset (text->timer);
}
+ text->need_im_reset = TRUE;
use_start = FALSE;
break;
@@ -2915,6 +2902,7 @@ e_text_command (ETextEventProcessor *tep,
if (text->timer) {
g_timer_reset (text->timer);
}
+ text->need_im_reset = TRUE;
}
break;
case E_TEP_COPY:
@@ -2930,6 +2918,7 @@ e_text_command (ETextEventProcessor *tep,
if (text->timer) {
g_timer_reset (text->timer);
}
+ text->need_im_reset = TRUE;
break;
case E_TEP_GET_SELECTION:
e_text_paste (text, GDK_SELECTION_PRIMARY);
@@ -2980,6 +2969,8 @@ e_text_command (ETextEventProcessor *tep,
break;
}
+ e_text_reset_im_context (text);
+
/* it's possible to get here without ever having been realized
by our canvas (if the e-text started completely obscured.)
so let's create our layout object if we don't already have