From 72960f684cf105ef9ee6940e9a485a19f355e3fb Mon Sep 17 00:00:00 2001 From: Yaroslav Kolomiiets Date: Mon, 20 Feb 2017 09:51:30 +0200 Subject: emu: windows scroll wheel --- emu/Nt/win.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/emu/Nt/win.c b/emu/Nt/win.c index c1bccfa7..b1480fd7 100644 --- a/emu/Nt/win.c +++ b/emu/Nt/win.c @@ -308,6 +308,7 @@ WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) LPMINMAXINFO mmi; LONG x, y, w, h, b; HCURSOR dcurs; + POINT m; switch(msg) { case WM_SETCURSOR: @@ -320,6 +321,15 @@ WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) dcurs = LoadCursor(NULL, IDC_ARROW); SetCursor(dcurs); break; + case WM_MOUSEWHEEL: + if((int)wparam>0) + b = 8; + else + b = 16; + m.x = LOWORD(lparam); + m.y = HIWORD(lparam); + ScreenToClient(hwnd, &m); + goto mok; case WM_LBUTTONDBLCLK: b = (1<<8) | 1; goto process; @@ -338,8 +348,9 @@ WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) case WM_RBUTTONDOWN: b = 0; process: - x = LOWORD(lparam); - y = HIWORD(lparam); + m.x = LOWORD(lparam); + m.y = HIWORD(lparam); + mok: if(wparam & MK_LBUTTON) b |= 1; if(wparam & MK_MBUTTON) @@ -350,7 +361,7 @@ WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) else b |= 4; //right button } - mousetrack(b, x, y, 0); + mousetrack(b, m.x, m.y, 0); break; case WM_SYSKEYDOWN: if(gkscanq) @@ -446,10 +457,6 @@ WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) gkbdputc(gkbdq, wparam); break; case WM_CLOSE: - // no longer used? - //m.b = 128; - //m.modify = 1; - //mousetrack(128, 0, 0, 1); DestroyWindow(hwnd); break; case WM_DESTROY: -- cgit v1.2.3 From 9c4d04b2570d1da7e63d999658c1f67abd49bb37 Mon Sep 17 00:00:00 2001 From: Yaroslav Kolomiiets Date: Mon, 20 Feb 2017 09:52:53 +0200 Subject: emu: do not drop successive scroll events --- emu/port/devpointer.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/emu/port/devpointer.c b/emu/port/devpointer.c index 30bad028..0590c2cc 100644 --- a/emu/port/devpointer.c +++ b/emu/port/devpointer.c @@ -74,15 +74,6 @@ mousetrack(int b, int x, int y, int isdelta) y += mouse.v.y; } msec = osmillisec(); - if(0 && b && (mouse.v.b ^ b)&0x1f){ - if(msec - mouse.v.msec < 300 && mouse.lastb == b - && abs(mouse.v.x - x) < 12 && abs(mouse.v.y - y) < 12) - b |= 1<<8; - mouse.lastb = b & 0x1f; - mouse.v.msec = msec; - } - if((b&(1<<8))==0 && x == mouse.v.x && y == mouse.v.y && mouse.v.b == b) - return; lastb = mouse.v.b; mouse.v.x = x; mouse.v.y = y; -- cgit v1.2.3 From dd44a8359b624560c9b44d30762b60593cdc2617 Mon Sep 17 00:00:00 2001 From: Yaroslav Kolomiiets Date: Mon, 20 Feb 2017 15:45:18 +0200 Subject: Sys->char2byte: allow 21-bit runes --- libinterp/runt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libinterp/runt.c b/libinterp/runt.c index 81a5490b..977d642c 100644 --- a/libinterp/runt.c +++ b/libinterp/runt.c @@ -376,7 +376,7 @@ Sys_char2byte(void *fp) c = f->c; if(a == H || (UWORD)n>=a->len) error(exBounds); - if(c<0 || c>=(1<<16)) + if(c<0 || c>=Runemax) c = Runeerror; if(c < Runeself){ a->data[n] = c; -- cgit v1.2.3 From 322254a191e29f4eabbe5dd05962f1212937a6d8 Mon Sep 17 00:00:00 2001 From: Yaroslav Kolomiiets Date: Tue, 21 Feb 2017 13:33:43 +0200 Subject: emu: fix conversion to windows UTF-16 and back --- emu/Nt/r16.c | 90 ++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 39 deletions(-) diff --git a/emu/Nt/r16.c b/emu/Nt/r16.c index 92a36521..ba0ceb0d 100644 --- a/emu/Nt/r16.c +++ b/emu/Nt/r16.c @@ -9,26 +9,16 @@ #include "error.h" #include "r16.h" -#define Bit(i) (7-(i)) -/* N 0's preceded by i 1's, T(Bit(2)) is 1100 0000 */ -#define T(i) (((1 << (Bit(i)+1))-1) ^ 0xFF) -/* 0000 0000 0000 0111 1111 1111 */ -#define RuneX(i) ((1 << (Bit(i) + ((i)-1)*Bitx))-1) - enum { - Bitx = Bit(1), - - Tx = T(1), /* 1000 0000 */ - Rune1 = (1<<(Bit(0)+0*Bitx))-1, /* 0000 0000 0000 0000 0111 1111 */ - - Maskx = (1<= Runeself) - n = runelen(c); + if(c > Runemax) + c = Runeerror; + if(c >= LSurrogateMin && c <= LSurrogateMax) + c = Runeerror; + if(c >= HSurrogateMin && c<= HSurrogateMax){ + lc = *r++; + if(lc >= LSurrogateMin || lc <= LSurrogateMax) + c = (c&Bits10)<<10 | (lc&Bits10) + R16self; + else + c = Runeerror; + } + n = runelen(c); if(p + n >= ep) break; - rc = c; - if(c < Runeself) - *p++ = c; - else - p += runetochar(p, &rc); + p += runetochar(p, &c); } *p = '\0'; return op; @@ -84,20 +79,18 @@ runes16toutf(char *p, Rune16 *r, int nc) int rune16nlen(Rune16 *r, int nrune) { - int nb, i; + int nb; Rune c; nb = 0; while(nrune--) { c = *r++; - if(c <= Rune1){ - nb++; - } else { - for(i = 2; i < UTFmax + 1; i++) - if(c <= RuneX(i) || i == UTFmax){ - nb += i; - break; - } + if(c < R16self) + nb += runelen(c); + else { + c -= R16self; + nb += runelen(HSurrogateMin | (c>>10)); + nb += runelen(LSurrogateMin | (c&Bits10)); } } return nb; @@ -113,7 +106,17 @@ utftorunes16(Rune16 *r, char *p, int nc) er = r + nc; while(*p != '\0' && r + 1 < er){ p += chartorune(&rc, p); - *r++ = rc; /* we'll ignore surrogate pairs */ + if(rc < R16self){ + *r++ = rc; + continue; + } + if(rc > Runemax || er-r < 2){ + *r++ = Runeerror; + continue; + } + rc -= R16self; + *r++ = HSurrogateMin | (rc>>10); + *r++ = LSurrogateMin | (rc&Bits10); } *r = '\0'; return or; @@ -167,8 +170,17 @@ int widebytes(wchar_t *ws) { int n = 0; - - while (*ws) - n += runelen(*ws++); + wchar_t c; + + while (*ws){ + c = *ws++; + if(c < R16self) + n += runelen(c); + else { + c -= R16self; + n += runelen(HSurrogateMin | (c>>10)); + n += runelen(LSurrogateMin | (c&Bits10)); + } + } return n+1; } -- cgit v1.2.3