[Spice-devel] [spice-gtk] widget: Disable IME context on main widget

Christophe Fergeau cfergeau at redhat.com
Fri Jun 10 12:24:58 UTC 2016


On Fri, Jun 10, 2016 at 08:14:07AM -0400, Frediano Ziglio wrote:
> > 
> > On Fri, Jun 10, 2016 at 11:14:11AM +0100, Frediano Ziglio wrote:
> > > This prevent Windows to handle IME on the widget which cause the
> > > application to not receive keyboard event.
> > 
> > Would be slightly clearer as
> > "This prevents Windows from handling IME on the SpiceDisplay widget. If
> > IME is enabled, the widget is going to be unable to receive some
> > keyboard events (such as XXX)"
> 
> Ehm... some... I think like 60% of the keyboard :-)
> At least all alphabetical keys are not working.
> 
> > I assume this is equivalent to the IMEDisableIMM() patch, but not global
> > to the application?
> > 
> 
> Yes, and the icon stay active (which is the complaint about the ImmDisableIME
> patch).
> Yes, it's not global but window specific.
> 
> > > 
> > > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > > ---
> > >  src/spice-widget.c | 4 ++++
> > >  1 file changed, 4 insertions(+)
> > > 
> > > diff --git a/src/spice-widget.c b/src/spice-widget.c
> > > index c528614..58a1307 100644
> > > --- a/src/spice-widget.c
> > > +++ b/src/spice-widget.c
> > > @@ -1403,6 +1403,10 @@ static void update_display(SpiceDisplay *display)
> > >  {
> > >  #ifdef G_OS_WIN32
> > >      win32_window = display ?
> > >      GDK_WINDOW_HWND(gtk_widget_get_window(GTK_WIDGET(display))) : NULL;
> > > +    if (win32_window) {
> > > +        ImmAssociateContext(win32_window, NULL);
> > > +        ImmAssociateContext(GetParent(win32_window), NULL);
> > 
> > Why do we need to do it on the parent too? The mapping from GtkWidget
> > hierarchy to actual win32 window handles sounds like some private gtk+
> > implementation detail to me.
> > 
> > Christophe
> > 
> 
> Good question... using Spy or other tools looks like 2 windows are
> created. Only win32_window does not work.

Hmm, do you think something like the snippet below could work rather
than hardcoding the GetParent? Or maybe the GetParent only means that
you need to call ImmAssociateContext() on gtk_widget_get_parent(display)
as well (no idea what it is).

/* Need special handling in case gtk_widget_get_parent() is NULL? */
parent_win32 = GDK_WINDOW_HWND(gtk_widget_get_window(gtk_widget_get_parent(display)));
current_win32 = win32_window;
while (current_win32 != parent_win32) {
    ImmAssociateContext(current_win32, NULL);
    current_win32 = GetParent(current_win32);
}

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20160610/1e0a5cf7/attachment.sig>


More information about the Spice-devel mailing list