Am 22.05.2020 um 16:56 schrieb Takashi Yano via Cygwin:
On Fri, 22 May 2020 22:54:05 +0900
Takashi Yano via Cygwin <cygwin@cygwin.com> wrote:
On Fri, 22 May 2020 21:58:00 +0900
Takashi Yano via Cygwin <cygwin@cygwin.com> wrote:
On Fri, 22 May 2020 20:01:31 +0900
Takashi Yano via Cygwin <cygwin@cygwin.com> wrote:
On Fri, 22 May 2020 12:14:43 +0200
Thomas Wolff wrote:
Hi Takashi,

Am 22.05.2020 um 11:22 schrieb Takashi Yano via Cygwin:
Hi Thomas,

On Thu, 21 May 2020 19:41:27 +0200
Thomas Wolff wrote:
I have uploaded mintty 3.1.6 with the following changes:

Window handling
     * Fixed resource leak when displaying images (#995).
     * Fixed crash condition on keyboard auto-repeat (#996). (Apologies
for this one.)

The homepage is at http://mintty.github.io/
It also links to the issue tracker.
After v3.1.5, the key repeat rate becomes almost halfened.
Is this behaviour by design?

The key repeat rate is about 30 chars/sec in v3.1.4, but
it is 15 chars/sec in v3.1.5 and v3.1.6.

It is little bit flustrating in editor cursor movement.

I've uploaded a commit: keyboard auto-repeat handling is now unaffected
by default
Explanation: the new auto-repeat rate limitation with a maximum of 30
cps (following the DECARR sequence of VT520) was effectively slowing
down keyboards; I had the impression 30 would be enough... sorry
I also think 30 cps would be enough, however, the key repeat rate
is not as setting by ESC[n-p sequence. Measured results in v3.1.6
are as follows. Actual key repeat rate does not increase linearly.

^[[1-p  : 1 cps
^[[2-p  : 2 cps
^[[3-p  : 3 cps
^[[5-p  : 4.7cps
^[[10-p : 8.2cps
^[[20-p : 14.8cps
^[[30-p : 16.3cps
Revising code in wininput.c as follows resolve this problem.

static LONG last_key_time = 0;
static LONG last_message_time = 0;

   LONG message_time = GetMessageTime();
   LONG last_key_time_new = message_time;
   if (repeat) {
#ifdef auto_repeat_cursor_keys_option
     switch (key) {
       when VK_PRIOR ... VK_DOWN: do not return...;
     }
#endif
     if (!term.auto_repeat)
       return true;
     if (message_time - last_message_time < 2*1000/term.repeat_rate)
       /* Key repeat seems to be continued. */
       last_key_time_new = last_key_time + 1000/term.repeat_rate;
     last_message_time = message_time;
     if (message_time - last_key_time < 1000/term.repeat_rate)
       return true;
   }
   last_key_time = last_key_time_new;

^[[1-p   : 1 cps
^[[2-p   : 2 cps
^[[3-p   : 3 cps
^[[5-p   : 5 cps
^[[10-p  : 9.7cps
^[[20-p  : 19.4cps
^[[30-p  : 29.0cps
The simplified following code also work as expected.
Protection for division by 0 is added as well.

static LONG last_key_time = 0;

   LONG message_time = GetMessageTime();
   if (repeat) {
#ifdef auto_repeat_cursor_keys_option
     switch (key) {
       when VK_PRIOR ... VK_DOWN: do not return...;
     }
#endif
     if (!term.auto_repeat)
       return true;
     if (term.repeat_rate &&
         message_time - last_key_time < 1000 / term.repeat_rate)
       return true;
   }
   if (term.repeat_rate &&
       message_time - last_key_time < 2*1000 / term.repeat_rate)
     /* Key repeat seems to be continued. */
     last_key_time += 1000 / term.repeat_rate;
   else
     last_key_time = message_time;
Sorry again and again. After all, the code above doesn't work
as expected. I would like to propose the code below.

static LONG last_key_time = 0;

   LONG message_time = GetMessageTime();
   if (repeat) {
#ifdef auto_repeat_cursor_keys_option
     switch (key) {
       when VK_PRIOR ... VK_DOWN: do not return...;
     }
#endif
     if (!term.auto_repeat)
       return true;
     if (term.repeat_rate &&
         message_time - last_key_time < 1000 / term.repeat_rate)
       return true;
   }
   if (term.repeat_rate && repeat &&
       message_time - last_key_time < 2*1000 / term.repeat_rate)
     /* Key repeat seems to be continued. */
     last_key_time += 1000 / term.repeat_rate;
   else
     last_key_time = message_time;
Thank you, I've uploaded that version.
Thomas
--
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to