Hi,
  I'm interested in working with you on the IME support issue, especially on
Linux. I just read attached document, and following are some of my questions
and information:

1. How about the support of "on-the-spot" mode (preedit/composition) and
surrounding text? Which require more events than key press/release and
commit. As I know that some of input methods (at least on Linux) rely on
these features.

2. On Linux/Gtk, some input methods (like SCIM) will intercept key events by
using gtk_key_snooper_install(), so that when input method is on, only key
events that are not handled by input method will be delivered to
application. Which might lead problem if application relies on those key
events to work.

Regards
James Su

2009/6/5 Hironori Bono (坊野 博典) <hb...@chromium.org>

> Hi Jeremy, et al,
>
> Sorry for my slow update.
> This is the draft report of my investigation that implements the
> NSTextInput protocol on Mac, implements the GtkIMContext on Linux and
> observes keyboard events on Windows, Mac, and Linux. (Sorry, I would
> like to send it as a PDF file because the google site somehow
> compresses its figures too much to make its characters unreadable.)
> Since I'm still finding the best solutions for the issues, any
> comments and suggestions are definitely welcome.
>
> Regards,
>
> Hironori Bono
> E-mail: hb...@chromium.org
>
> 2009/5/29 Hironori Bono (坊野 博典) <hb...@chromium.org>:
> > Hi Jeremy,
> >
> > I have been investigating keyboard events on Windows, Linux, and Mac
> > to find solutions for these issues. Shall we have a discussion about
> > these issues when I finish writing my report (maybe sometime next
> > week)?
> >
> > Regards,
> >
> > Hironori Bono
> > E-mail: hb...@chromium.org
> >
> > On Thu, May 28, 2009 at 7:14 AM, Jeremy Moskovich <jer...@chromium.org>
> wrote:
> >> Hi All,
> >> We currently fudge our keyboard handling on OSX, we interpret command
> key
> >> shortcuts ourselves and thus miss out on quite a few Cocoa text handling
> >> niceities.  We also don't support IMEs.
> >> Relevant bugs:
> >> http://crbug.com/10862 - OS X: Can't use command-key shortcuts with
> foreign
> >> keyboard layouts
> >> http://crbug.com/12698 - standard macintosh text editing keyboard
> shortcuts
> >> are missing
> >> http://crbug.com/11981 - Deadkeys do not work
> >> http://crbug.com/11952 - IME support (Chinese input method doesnt work)
> >> We also don't handle activation/deactivation of edit menu items
> correctly
> >> (select all is always disabled).
> >> I've done a little digging in WebKit's keyboard handling and what
> follows is
> >> a proposal on how we can more closely match the OSX keyboard handling
> code
> >> and [hopefully] do things the right way.  I don't purport to understand
> this
> >> all and there may be simpler ways to achieve this so feel free to
> comment.
> >> Standard commands (Copy/Paste/Select-all):
> >> WebKit handles these through the regular obj-c selectors in WebHTMLView,
> see
> >> the WEBCORE_COMMAND macro.
> >> We could do the same thing and add these selectors
> >> to BrowserWindowController which would then send an IPC message over to
> the
> >> renderer process to execute the appropriate command.
> >> The tricky bit is updating the menus, the model in Cocoa is for the OS
> to
> >> call you for each menu item before displaying a menu.  We can't block
> the
> >> browser process on the renderer process so the browser process would
> always
> >> need to know if there is an active selection.  WebCore appears to
> already
> >> have a mechanism to do this via notifyAccessibilityForSelectionChange()
> - we
> >> could use the same or a similar mechanism to send an IPC message back to
> the
> >> browser process each time the selection changes.
> >> Emacs keyboard commands and IMEs:
> >> The IME part of the title may be nonsense, but looking at the code it
> >> appears the code path and issues are the same.
> >> I've attached the stack trace for hitting cntrl-t to the end of this
> email.
> >>  The tricky bit here is that WebCore is first given a shot at handling
> the
> >> event and then passes it back to WebHTMLView to take another look at the
> >> event which is where it's actually parsed.  I assume this is to give JS
> code
> >> a chance to listen on these events.
> >> Since we can't serialize an NSEvent, we can't replicate this code solely
> in
> >> the renderer.
> >> A possible solution to this would be to store a queue of the last N
> NSEvents
> >> per renderer matched with an ID.  the event would then be serialized and
> >> sent to the renderer which could then send it's own IPC message back to
> the
> >> browser process to get Cocoa to handle the message, we could pick the
> >> NSEvent out of the queue by ID and send back the relevant edit command
> to
> >> the renderer.
> >> Since the events belong to a specific renderer a malicious renderer
> process
> >> can't access events not targeted at them.
> >> Best regards,
> >> Jeremy
> >> Stack trace of hitting cntrl-t (transpose) in a text view, Cocoa
> >> [browser-process] stuff marked in bold.
> >> #0 WebCore::executeTranspose (frame=0x70b9800) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebCore/editing/EditorCommand.cpp:961
> >> #1 0x03702f0f in WebCore::Editor::Command::execute (this=0xbfffe2f4,
> >> paramet...@0xbfffe2ac, triggeringEvent=0x24178380) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebCore/editing/EditorCommand.cpp:1450
> >> #2 0x037052ad in WebCore::Editor::Command::execute (this=0xbfffe2f4,
> >> triggeringEvent=0x24178380) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebCore/editing/EditorCommand.cpp:1455
> >> #3 0x0031d3da in -[WebHTMLView(WebNSTextInputSupport)
> doCommandBySelector:]
> >> (self=0x6cefe90, _cmd=0x943edca4, selector=0x94423fa4) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebKit/mac/WebView/WebHTMLView.mm:5337
> >> #4 0x0031c238 in -[WebHTMLView(WebInternal)
> >> _interceptEditingKeyEvent:shouldSaveCommand:] (self=0x6cefe90,
> >> _cmd=0x3a405c, event=0x24178380, shouldSave=0 '\000') at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebKit/mac/WebView/WebHTMLView.mm:4966
> >> #5 0x002eb19b in WebEditorClient::handleKeyboardEvent (this=0x6c31aa0,
> >> event=0x24178380) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebKit/mac/WebCoreSupport/WebEditorClient.mm:440
> >> #6 0x036f8875 in WebCore::Editor::handleKeyboardEvent (this=0x70b9cd4,
> >> event=0x24178380) at
> >> /Users/Shared/playmobil/work/git.WebKit/WebCore/editing/Editor.cpp:105
> >> #7 0x037156fb in WebCore::EventHandler::defaultKeyboardEventHandler
> >> (this=0x70b9d00, event=0x24178380) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebCore/page/EventHandler.cpp:1907
> >> #8 0x03a7876e in WebCore::Node::defaultEventHandler (this=0x1c23f430,
> >> event=0x24178380) at
> >> /Users/Shared/playmobil/work/git.WebKit/WebCore/dom/Node.cpp:2812
> >> #9 0x037c7d17 in WebCore::HTMLInputElement::defaultEventHandler
> >> (this=0x1c23f430, evt=0x24178380) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebCore/html/HTMLInputElement.cpp:1120
> >> #10 0x03a70c27 in WebCore::Node::dispatchGenericEvent (this=0x1c23f430,
> >> prpeve...@0xbfffe63c) at
> >> /Users/Shared/playmobil/work/git.WebKit/WebCore/dom/Node.cpp:2439
> >> #11 0x03a70f0f in WebCore::Node::dispatchEvent (this=0x1c23f430,
> >> e...@0xbfffe6e8, e...@0xbfffe6cc) at
> >> /Users/Shared/playmobil/work/git.WebKit/WebCore/dom/Node.cpp:2336
> >> #12 0x03718720 in WebCore::EventHandler::keyEvent (this=0x70b9d00,
> >> initialkeyeve...@0xbfffe74c) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebCore/page/EventHandler.cpp:1848
> >> #13 0x0371da3b in WebCore::EventHandler::keyEvent (this=0x70b9d00,
> >> event=0x2416ded0) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebCore/page/mac/EventHandlerMac.mm:172
> >> #14 0x003138ce in -[WebHTMLView performKeyEquivalent:] (self=0x6cefe90,
> >> _cmd=0x94421a60, event=0x2416ded0) at
> >>
> /Users/Shared/playmobil/work/git.WebKit/WebKit/mac/WebView/WebHTMLView.mm:4013
> >> #15 0x959398b6 in -[NSControl _performKeyEquivalent:conditionally:] ()
> >> #16 0x95939782 in -[NSView performKeyEquivalent:] ()
> >> #17 0x95939782 in -[NSView performKeyEquivalent:] ()
> >> #18 0x95939782 in -[NSView performKeyEquivalent:] ()
> >> #19 0x95939782 in -[NSView performKeyEquivalent:] ()
> >> #20 0x95939782 in -[NSView performKeyEquivalent:] ()
> >> #21 0x95939782 in -[NSView performKeyEquivalent:] ()
> >> #22 0x95939782 in -[NSView performKeyEquivalent:] ()
> >> #23 0x95939782 in -[NSView performKeyEquivalent:] ()
> >> #24 0x959394eb in -[NSWindow performKeyEquivalent:] ()
> >> #25 0x0004dbc1 in ?? ()
> >> #26 0x959391af in -[NSApplication _handleKeyEquivalent:] ()
> >> #27 0x958560fb in -[NSApplication sendEvent:] ()
> >> #28 0x0003918a in ?? ()
> >> #29 0x957b362f in -[NSApplication run] ()
> >> #30 0x95780834 in NSApplicationMain ()
> >> #31 0x00003296 in ?? ()
> >
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
Chromium Developers mailing list: chromium-dev@googlegroups.com 
View archives, change email options, or unsubscribe: 
    http://groups.google.com/group/chromium-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to