emacs-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]