Commit 6afd1741 authored by John Ralls's avatar John Ralls

Merge branch 'suyuan/fix-macos-accented-char-input' into gtk-3-24.

parents 9d12953c cfad43b8
Pipeline #60124 passed with stage
in 6 minutes and 29 seconds
......@@ -31,7 +31,7 @@
if ((self = [super initWithFrame: frameRect]))
{
markedRange = NSMakeRange (NSNotFound, 0);
selectedRange = NSMakeRange (NSNotFound, 0);
selectedRange = NSMakeRange (0, 0);
}
return self;
......@@ -57,6 +57,16 @@
-(void) keyDown: (NSEvent *) theEvent
{
/* NOTE: When user press Cmd+A, interpretKeyEvents: will call noop:
method. When user press and hold A to show the accented char window,
it consumed repeating key down events for key 'A' do NOT call
any other method. We use this behavior to determine if this key
down event is filtered by interpretKeyEvents.
*/
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_FILTERED));
GDK_NOTE (EVENTS, g_message ("keyDown"));
[self interpretKeyEvents: [NSArray arrayWithObject: theEvent]];
}
......@@ -124,7 +134,8 @@
-(void)unmarkText
{
GDK_NOTE (EVENTS, g_message ("unmarkText"));
markedRange = selectedRange = NSMakeRange (NSNotFound, 0);
selectedRange = NSMakeRange (0, 0);
markedRange = NSMakeRange (NSNotFound, 0);
g_object_set_data_full (G_OBJECT (gdk_window), TIC_MARKED_TEXT, NULL, g_free);
}
......@@ -209,8 +220,15 @@
else
{
str = [string UTF8String];
selectedRange = NSMakeRange ([string length], 0);
}
if (replacementRange.length > 0)
{
g_object_set_data (G_OBJECT (gdk_window), TIC_INSERT_TEXT_REPLACE_LEN,
GINT_TO_POINTER (replacementRange.length));
}
g_object_set_data_full (G_OBJECT (gdk_window), TIC_INSERT_TEXT, g_strdup (str), g_free);
GDK_NOTE (EVENTS, g_message ("insertText: set %s (%p, nsview %p): %s",
TIC_INSERT_TEXT, gdk_window, self,
......@@ -537,6 +555,8 @@
-(void)noop: (id)sender
{
GDK_NOTE (EVENTS, g_message ("noop"));
g_object_set_data (G_OBJECT (gdk_window), GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
/* --------------------------------------------------------------- */
......
......@@ -24,6 +24,7 @@
#define TIC_SELECTED_POS "tic-selected-pos"
#define TIC_SELECTED_LEN "tic-selected-len"
#define TIC_INSERT_TEXT "tic-insert-text"
#define TIC_INSERT_TEXT_REPLACE_LEN "tic-insert-text-replace-len"
#define TIC_IN_KEY_DOWN "tic-in-key-down"
/* GtkIMContext */
......
......@@ -129,8 +129,11 @@ output_result (GtkIMContext *context,
{
GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
gboolean retval = FALSE;
int fixed_str_replace_len;
gchar *fixed_str, *marked_str;
fixed_str_replace_len = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (win),
TIC_INSERT_TEXT_REPLACE_LEN));
fixed_str = g_strdup (g_object_get_data (G_OBJECT (win), TIC_INSERT_TEXT));
marked_str = g_strdup (g_object_get_data (G_OBJECT (win), TIC_MARKED_TEXT));
if (fixed_str)
......@@ -139,6 +142,13 @@ output_result (GtkIMContext *context,
g_free (qc->preedit_str);
qc->preedit_str = NULL;
g_object_set_data (G_OBJECT (win), TIC_INSERT_TEXT, NULL);
if (fixed_str_replace_len)
{
gboolean retval;
g_object_set_data (G_OBJECT (win), TIC_INSERT_TEXT_REPLACE_LEN, 0);
g_signal_emit_by_name (context, "delete-surrounding",
-fixed_str_replace_len, fixed_str_replace_len, &retval);
}
g_signal_emit_by_name (context, "commit", fixed_str);
g_signal_emit_by_name (context, "preedit_changed");
......@@ -168,6 +178,11 @@ output_result (GtkIMContext *context,
}
if (!fixed_str && !marked_str)
{
unsigned int filtered =
GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (win),
GIC_FILTER_KEY));
if (filtered)
retval = TRUE;
if (qc->preedit_str && strlen (qc->preedit_str) > 0)
retval = TRUE;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment