On 08/12/2016 07:24, Gregory Ewing wrote:
BartC wrote:
(I'm in the middle of porting my console editor to Linux. But one
problem is that on one Linux, half the key combinations (eg.
Shift+Ctrl+B) are not recognised.
If you're reading characters from a tty device in raw
mode (which I assume is what you mean by "console editor")
I'm not aware of *any* Unix system that will let you
distinguish between Ctrl+B and Shift+Ctrl+B that way.
That's because the tty driver delivers ASCII characters,
and there are no separate ASCII codes for shifted control
characters.
Run the code below and start pressing keys. On both of my Linuxes, I get
escape sequences shown when I Insert, Delete, Home, End, Page Up, Page
Down, Up, Down, Left, Right and most of the function keys; not just
single ASCII codes.
But I also get different sequences, on Ubuntu, when I press Shift, Ctrl
or Alt with those keys, but not all shifts nor combinations will work
(some have special meanings anyway).
Then I try the same on Debian (I think it is) on a Raspberry Pi, and
most Shift and Ctrl are ignored, except for Ctrl A to Z (with a few gaps).
(Neither will see Shift+Ctrl+B, which means go to start of the file,
same as Ctrl+Home. Ubuntu sees Ctrl+Home, but not Debian, although it
will report Alt+Home. And some laptop keyboards already have Home on an
Alternate-Function shift! It's a mess.)
Except that was only two Linuxes; perhaps on others, the keyboard will
likely be crippled in some other way.
No, they'll all be the same -- if it has an ASCII code,
you'll be able to get it from a tty device, otherwise you
won't.
How people manage to do anything on such an OS I've no idea.
Programs that need to be able to distinguish all of the
modifiers are normally implemented as GUI applications,
which get keyboard input a different way.
How do they work; what magic do they use to get that key information,
and why can't it be done outside of a GUI? As I understand a Linux GUI
is built on top of Linux.
----------------------
# Python 2 because of the 'print' handling
def getch(): # adapted from first getch I saw on the internet
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ord(ch)
print "Press keys"
print ("Hit Escape twice to quit")
escape=0
while 1:
k=getch()
if k==27:
print
print "Esc ",
if escape: break
elif k==13:
print "Enter"
elif k==10:
print "Newline"
elif k<=26:
print "Ctrl",chr(k+64)
else:
print chr(k),
escape = k==27
----------------------
(On another test, using a C-based getch(), pressing Enter returns code
10 not 13; another difference to note. Either code appears to clash with
Ctrl-M or Ctrl-J, a difference from Windows where Ctrl-J, Ctrl-M and
Enter are distinct keys, as they are in actuality.)
--
Bartc
--
https://mail.python.org/mailman/listinfo/python-list