forked from AuroraMiddleware/gtk
Merge branch 'suyuan/fix-macos-accented-char-input' into gtk-3-24.
This commit is contained in:
commit
6afd174162
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user