Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-09-27 06:36:50 +0400
committerChristopher Faylor <me@cgf.cx>2003-09-27 06:36:50 +0400
commit63726a5eb47ec3a95be7dfa96443119e1c762f6b (patch)
tree34082d9620f9b98d231c498b761c4a790dcdc402 /winsup/cygwin
parentecc28ff8db7c43779f328d31633d5f8358a3cf5b (diff)
* fhandler_console.c (fhandler_console::read): Record the state of the SHIFT,
CTRL and ALT keys at the time of the last keyboard input event. (fhandler_console::ioctl): Handle requests to retrieve the keyboard modifiers via the TIOCLINUX command. * fhandler_tty.c (fhandler_tty_slave::read): Ditto. * include/sys/termios.h (TIOCLINUX): New macro definition.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog11
-rw-r--r--winsup/cygwin/fhandler_console.cc28
-rw-r--r--winsup/cygwin/fhandler_tty.cc16
-rw-r--r--winsup/cygwin/include/sys/termios.h1
4 files changed, 54 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 7159614a4..75495eafd 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,12 @@
+2003-09-26 Pavel Tsekov <ptsekov@gmx.net>
+
+ * fhandler_console.c (fhandler_console::read): Record the state of the
+ SHIFT, CTRL and ALT keys at the time of the last keyboard input event.
+ (fhandler_console::ioctl): Handle requests to retrieve the keyboard
+ modifiers via the TIOCLINUX command.
+ * fhandler_tty.c (fhandler_tty_slave::read): Ditto.
+ * include/sys/termios.h (TIOCLINUX): New macro definition.
+
2003-09-26 Pierre Humblet <pierre.humblet@ieee.org>
* pinfo.cc (pinfo::init): Do not give FILE_MAP_WRITE access to Everybody.
@@ -16,7 +25,7 @@
2003-09-26 Pierre Humblet <pierre.humblet@ieee.org>
* uinfo.cc (cygheap_user::init): Make sure the current user appears
- in the default DACL. Rearrange to decrease the indentation levels.
+ in the default DACL. Rearrange to decrease the indentation levels.
Initialize the effec_cygsid directly.
(internal_getlogin): Do not reinitialize myself->gid. Open the process
token with the required access.
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index d85da9e6b..e80e47be4 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -294,6 +294,8 @@ fhandler_console::read (void *pv, size_t& buflen)
#define virtual_key_code (input_rec.Event.KeyEvent.wVirtualKeyCode)
#define control_key_state (input_rec.Event.KeyEvent.dwControlKeyState)
+ dev_state->nModifiers = 0;
+
#ifdef DEBUGGING
/* allow manual switching to/from raw mode via ctrl-alt-scrolllock */
if (input_rec.Event.KeyEvent.bKeyDown &&
@@ -340,13 +342,25 @@ fhandler_console::read (void *pv, size_t& buflen)
&& input_rec.Event.KeyEvent.wVirtualScanCode == 0x38))
continue;
+ if (control_key_state & SHIFT_PRESSED)
+ dev_state->nModifiers |= 1;
+ if (control_key_state & RIGHT_ALT_PRESSED)
+ dev_state->nModifiers |= 2;
+ if (control_key_state & CTRL_PRESSED)
+ dev_state->nModifiers |= 4;
+ if (control_key_state & LEFT_ALT_PRESSED)
+ dev_state->nModifiers |= 8;
+
if (wch == 0 ||
/* arrow/function keys */
(input_rec.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY))
{
toadd = get_nonascii_key (input_rec, tmp);
if (!toadd)
- continue;
+ {
+ dev_state->nModifiers = 0;
+ continue;
+ }
nread = strlen (toadd);
}
else
@@ -379,6 +393,7 @@ fhandler_console::read (void *pv, size_t& buflen)
tmp[1] = cyg_tolower (tmp[1]);
toadd = tmp;
nread++;
+ dev_state->nModifiers &= ~4;
}
}
#undef ich
@@ -715,6 +730,17 @@ fhandler_console::ioctl (unsigned int cmd, void *buf)
case TIOCSWINSZ:
(void) bg_check (SIGTTOU);
return 0;
+ case TIOCLINUX:
+ if (* (int *) buf == 6)
+ {
+ * (int *) buf = dev_state->nModifiers;
+ return 0;
+ }
+ else
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
}
return fhandler_base::ioctl (cmd, buf);
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index d0499f236..87aaca73a 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -1028,6 +1028,7 @@ fhandler_tty_slave::ioctl (unsigned int cmd, void *arg)
{
case TIOCGWINSZ:
case TIOCSWINSZ:
+ case TIOCLINUX:
break;
case FIONBIO:
set_nonblocking (*(int *) arg);
@@ -1071,6 +1072,21 @@ fhandler_tty_slave::ioctl (unsigned int cmd, void *arg)
WaitForSingleObject (ioctl_done_event, INFINITE);
}
break;
+ case TIOCLINUX:
+ int val = * (unsigned char *) arg;
+ if (val == 6 && ioctl_request_event && ioctl_done_event)
+ {
+ get_ttyp ()->arg.value = val;
+ SetEvent (ioctl_request_event);
+ WaitForSingleObject (ioctl_done_event, INFINITE);
+ * (unsigned char *) arg = get_ttyp ()->arg.value & 0xFF;
+ }
+ else
+ {
+ get_ttyp ()->ioctl_retval = -1;
+ set_errno (EINVAL);
+ }
+ break;
}
release_output_mutex ();
diff --git a/winsup/cygwin/include/sys/termios.h b/winsup/cygwin/include/sys/termios.h
index 7c47372b8..0d381270e 100644
--- a/winsup/cygwin/include/sys/termios.h
+++ b/winsup/cygwin/include/sys/termios.h
@@ -330,5 +330,6 @@ struct winsize
#define TIOCGWINSZ (('T' << 8) | 1)
#define TIOCSWINSZ (('T' << 8) | 2)
+#define TIOCLINUX (('T' << 8) | 3)
#endif /* _SYS_TERMIOS_H */