On Apr 11 11:33, Corinna Vinschen wrote: > On Apr 10 22:09, Andy Koppe wrote: > > Christopher Faylor wrote: > > > The problem is that screen explicitly sets VERASE to 0. I believe that > > > it does that to mean "there is really no erase character since I'm > > > handling that". > > > > You're right. Zero is the value of the _POSIX_VDISABLE constant for > > disabling special characters. Therefore, using c_cc[VERASE] as the > > backspace keycode was a bad idea all along. Sorry for suggesting it in > > the first place. > > > > > That should not cause Cygwin to send a null character. > > > I think it should probably just send the default \177 character. > > > > Makes sense given the botched design, but of course it does mean that > > the user's backspace keycode setting is ignored. Also, 'screen' would > > be expecting what was set in c_cc[VERASE] as the backspace keycode. > > That would be surprising. If you set VEARSE to 0 on Linux, a following > tcgetattr returns 0 as the VERASE value. stty prints "<undef>". The > same holds true for other settings like VKILL, VINTR, etc. So, if the > process sets VERASE to 0, and is then puzzled to get a 0 VERASE value > from the OS, it's the application's fault.
I think I see what you mean now. The c_cc[VERASE] value is the one which is expected for the VERASE functionality (unless it's set to 0 == _POSIX_VDISABLE), but it has nothing to do with the actual setting of the backspace key in the terminal. So, actually the key value should not be stored in c_cc[VERASE] at all, and it should not be possible to set the value returned by the backspace key via tcsetattr. So, what we really need to implement is what you proposed. I prepared a patch, see below. It seems to work nicely and you can easily switch the backspace character now via the DECBKM escape codes. If everybody agrees with this solution, I'll check it in. Corinna * fhandler.h (class dev_console): Add backspace_keycode member. * fhandler_console.cc (fhandler_console::get_tty_stuff): Initialize backspace_keycode with CERASE. (fhandler_console::read): Return dev_state->backspace_keycode if the backspace key is pressed. (fhandler_console::char_command): Implement DECBKM escape sequence. Index: fhandler.h =================================================================== RCS file: /cvs/src/src/winsup/cygwin/fhandler.h,v retrieving revision 1.398 diff -u -p -r1.398 fhandler.h --- fhandler.h 2 Apr 2010 22:36:43 -0000 1.398 +++ fhandler.h 11 Apr 2010 12:24:51 -0000 @@ -924,6 +924,7 @@ class dev_console bool iso_2022_G1; bool alternate_charset_active; bool metabit; + char backspace_keycode; char my_title_buf [TITLESIZE + 1]; Index: fhandler_console.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/fhandler_console.cc,v retrieving revision 1.217 diff -u -p -r1.217 fhandler_console.cc --- fhandler_console.cc 10 Apr 2010 18:05:52 -0000 1.217 +++ fhandler_console.cc 11 Apr 2010 12:24:51 -0000 @@ -118,6 +118,7 @@ fhandler_console::get_tty_stuff (int fla if (PRIMARYLANGID (LOWORD (GetKeyboardLayout (0))) == LANG_ENGLISH) dev_state->meta_mask |= RIGHT_ALT_PRESSED; dev_state->set_default_attr (); + dev_state->backspace_keycode = CERASE; shared_console_info->tty_min_state.sethwnd ((HWND) INVALID_HANDLE_VALUE); } @@ -374,10 +375,9 @@ fhandler_console::read (void *pv, size_t if (control_key_state & LEFT_ALT_PRESSED) dev_state->nModifiers |= 8; - /* Send the VERASE character from the terminal settings as backspace keycode. */ if (input_rec.Event.KeyEvent.wVirtualScanCode == 14) { - char c = ti.c_cc[VERASE] ?: CERASE; + char c = dev_state->backspace_keycode; nread = 0; if (control_key_state & ALT_PRESSED) { if (dev_state->metabit) @@ -1398,6 +1398,10 @@ fhandler_console::char_command (char c) } break; + case 67: /* DECBKM ("DEC Backarrow Key Mode") */ + dev_state->backspace_keycode = (c == 'h' ? CTRL('H') : CERASE); + break; + case 1000: /* Mouse tracking */ dev_state->use_mouse = (c == 'h') ? 1 : 0; syscall_printf ("mouse support set to mode %d", dev_state->use_mouse); -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple