public inbox for cygwin-xfree@sourceware.org help / color / mirror / Atom feed
From: Jon TURNEY <jon.turney@dronecode.org.uk> To: cygwin-xfree@cygwin.com Cc: oschmidt-mailinglists@gmx.de Subject: Re: considering modifier keys after gaining focus Date: Wed, 11 Jan 2012 17:16:00 -0000 [thread overview] Message-ID: <4F0DC3DF.8000802@dronecode.org.uk> (raw) In-Reply-To: <4F0B2DC8.9030706@gmx.de> On 09/01/2012 18:11, Oliver Schmidt wrote: > On 09.01.2012 15:06, Jon TURNEY wrote: >> The code would seem to end up simpler (which is an important consideration) if >> we were to modify winKeybdReleaseKeys() not to release modifier keys. Some >> archaeology is probably required to determine if releasing the modifier keys >> in winKeybdReleaseKeys() is necessary to avoid some other undesirable behaviour? > > I don't know anything about the cygwin X server history, I can only > guess why the current code is as it is: Perhaps the modifier keys are > released afer loosing a window's focus because if another Non-cygwin > window gains the focus, no more modifier change events will arrive to > the cygwin x server. Then you know as much as I do. I didn't write this code. Fortunately, the history of the code is preserved both in the VCS, and in discussions on this mailing list. I think it is useful to consider this history when reviewing a patch, as there are a couple of dangers this avoids: Are we going in circles? Are we fixing one bug just to re-introduce another bug which has already been fixed? Are we doing in the wrong direction? Adding special case on top of special case, increasing the complexity of the code, is often a sign that something is wrong with the approach taken. Anyhow, in a brief look at some mailing list discussions from 2002 or so, it seems that: i) We must release modifier keys when focus leaves the X server, as modifier keys may be part of a Windows shell shortcut which moves the focus elsewhere, e.g. alt-tab) so the key-release isn't received by the X server. ii) We must release non-modifier keys when focus leaves the X server, or they continue to auto-repeat in the X server (specifically a problem when a key-press closes a window (such as typing ctrl-d or exit into an Xterm), as the key-release goes to the next window to receive focus, which may not be an X window) After your change we will have: iii) We must press held modifier keys when focus enters the X server (toggling latching ones as appropriate), so that the future key-presses have the correct modifiers. So I guess we should also consider: iv) What should we do about held non-modifier keys when focus enters the X server? It looks like these should be pressed as well for strict correctness. If we hold down a non-modifier key so it auto-repeats, and move the focus between X and native windows, the native windows receive repeats, but the the X windows do not. I doubt many people care about this behaviour, though :-) Staring at the code some more, this means that winInitializeModeKeyStates() is possibly wrong: It should do the same work as winRestoreModeKeyStates(). If it's possible to launch the X server with a key held down, that key won't be noticed until it's pressed and released :-) >> This maps VK_CONTROL to KEY_LCtrl. Why not use VK_LCONTROL and VK_RCONTROL, >> so the generated key-press is for the correct key? >> Ditto for VK_LSHIFT and VK_RSHIFT > > Perhaps this might improve the patch, however the internal modifier > state of the xserver has only ShiftMask, LockMask, ControlMask, > Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, and Mod5Mask. So the internal > state does not distinguish betweem left or right shift key. Hm... on looking at this again, isn't that code you are adding checking the internal state of non-latching modifiers bogus? If we release all keys on WM_KILLFOCUS, then the non-latching modifiers will always be clear when the WM_SETFOCUS occurs, so we will always generate the keypress for the modifier. (This is different to the existing code below for the latching modifiers, where we generate a keypress and release if necessary to toggle the state of the latching modifier in the X server to match the actual state) -- Jon TURNEY Volunteer Cygwin/X X Server maintainer -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://x.cygwin.com/docs/ FAQ: http://x.cygwin.com/docs/faq/
next prev parent reply other threads:[~2012-01-11 17:16 UTC|newest] Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-08-16 15:31 Oliver Schmidt 2011-08-21 8:44 ` Corinna Vinschen 2011-08-21 10:04 ` Oliver Schmidt 2012-01-08 15:23 ` Oliver Schmidt 2012-01-09 14:06 ` Jon TURNEY 2012-01-09 18:11 ` Oliver Schmidt 2012-01-10 9:47 ` Oliver Schmidt 2012-01-10 10:15 ` Oliver Schmidt 2012-01-11 17:16 ` Jon TURNEY [this message] 2012-01-12 12:19 ` Oliver Schmidt 2012-01-12 12:38 ` Oliver Schmidt
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=4F0DC3DF.8000802@dronecode.org.uk \ --to=jon.turney@dronecode.org.uk \ --cc=cygwin-xfree@cygwin.com \ --cc=oschmidt-mailinglists@gmx.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).