[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Dan Nicolaescu] S-arrow_keys not working in cua-selection-mode anym
From: |
Stefan Monnier |
Subject: |
Re: [Dan Nicolaescu] S-arrow_keys not working in cua-selection-mode anymore |
Date: |
Wed, 14 Nov 2007 10:14:07 -0500 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.0.50 (gnu/linux) |
>>> CUA normally works by looking for a shift modifier on the event,
>>> but it has special code to handle a non-windowing system:
>>
>>> ((if window-system
>>> (memq 'shift (event-modifiers
>>> (aref (this-single-command-raw-keys) 0)))
>>> (or
>>> (memq 'shift (event-modifiers
>>> (aref (this-single-command-keys) 0)))
>>> ;; See if raw escape sequence maps to a shifted event, e.g. S-up or
>>> C-S-home.
>>> (and (boundp 'local-function-key-map)
>>> local-function-key-map
>>> (let ((ev (lookup-key local-function-key-map
>>> (this-single-command-raw-keys))))
>>> (and (vector ev)
>>> (symbolp (setq ev (aref ev 0)))
>>> (string-match "S-" (symbol-name ev)))))))
>>
>>
>> Oh, indeed, sorry for not catching this. It should use input-decode-map
>> rather than local-function-key-map.
> Ok. Could someone please make the change (trunk only!!). Thanks!
I'll do it.
>> It may be even better to *also*
>> check local-function-key-map (after input-decode-map), but it shouldn't
>> be necessary.
> Huh? It may be better ... but not necessary ??
Since until Emacs-23, function-key-map was used for such things, some
users may have added decoding entries to their function-key-map.
For this reason it may be better to check that map as well. But it's
probably not very important. Also it may be undesirable (before
function-key-map, the keys are kind of like X11's
this-single-command-raw-keys, whereas after function-key-map, they may
be somewhat different: removal of shift could be implemented in
function-key-map for example).
>> This said, I'm not quite sure I understand enough of the above code:
>> why does it need to behave differently depending on window-system?
> The problem is to get around the implicit translation of "Shift-XXX" to
> "XXX" if "Shift-XXX" has no specific binding.
> On a window-system, this-single-command-raw-keys returns the untranslated
> keys, so I can use it to check directly if user pressed a shifted key.
> The problem is (or was??) how to test for a shifted function key
> on a non-window system.
> Suppose S-up sends "ESC A B" in xterm.
> Then this-single-command-raw-keys returns [27 65 66].
> This is not useful.
> And this-single-command-keys returns [up].
> This is not useful either.
> So the only way is to go back to the raw key sequence and look it up
> in the function key translation map to see if the result is a shifted key.
> If you have a better way of checking this, I'm listening :-)
I understand the need for the tty version of the code, but I'm wondering
why that branch can't be used equally well for the window-system case.
I.e. I suggest the code below instead:
((or
(memq 'shift (event-modifiers
(aref (this-single-command-keys) 0)))
;; See if raw escape sequence maps to a shifted event, e.g. S-up or
C-S-home.
(let ((ev (lookup-key input-decode-map
(this-single-command-raw-keys))))
(if (vector ev)
(and (symbolp (setq ev (aref ev 0)))
(string-match "S-" (symbol-name ev)))
(memq 'shift (event-modifiers
(aref (this-single-command-raw-keys) 0))))))
Stefan