VNC viewer: improved keyboard support

git-svn-id: svn://kolibrios.org@5693 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2015-08-07 13:18:23 +00:00
parent ece7ffbd2b
commit bf523330da
3 changed files with 83 additions and 96 deletions

View File

@ -28,7 +28,7 @@ draw_gui:
cmp [status], STATUS_CONNECTING cmp [status], STATUS_CONNECTING
ja @f ja @f
mov ebx, 25 shl 16 + 14 mov ebx, 25 shl 16 + 24
xor ecx, ecx xor ecx, ecx
mov edx, serverstr mov edx, serverstr
mov esi, userstr-serverstr mov esi, userstr-serverstr

View File

@ -19,19 +19,13 @@ generate_keymap:
mcall 26, 2, 2, keymap_shift+128 mcall 26, 2, 2, keymap_shift+128
mcall 26, 2, 3, keymap_alt+128 mcall 26, 2, 3, keymap_alt+128
mov esi, keymap+128
mov edi, keymap mov edi, keymap
mov ecx, 128
call convert_keymap call convert_keymap
mov esi, keymap_shift+128
mov edi, keymap_shift mov edi, keymap_shift
mov ecx, 128
call convert_keymap call convert_keymap
mov esi, keymap_alt+128
mov edi, keymap_alt mov edi, keymap_alt
mov ecx, 128
call convert_keymap call convert_keymap
ret ret
@ -39,83 +33,50 @@ generate_keymap:
convert_keymap: convert_keymap:
push edi
lea esi, [edi+128]
mov ecx, 128
xor eax, eax
.loop: .loop:
lodsb lodsb
cmp al, 0x08 ; Backspace
jne @f
mov ax, 0x08ff
jmp .next
@@:
cmp al, 0x09 ; Tab
jne @f
mov ax, 0x09ff
jmp .next
@@:
cmp al, 0x0d ; Enter
jne @f
mov ax, 0x0dff
jmp .next
@@:
cmp al, 0x1b ; Escape
jne @f
mov ax, 0x1bff
jmp .next
@@:
cmp al, 0x34 ; Insert
jne @f
mov ax, 0x63ff
jmp .next
@@:
cmp al, 0xb6 ; Delete
jne @f
mov ax, 0xffff
jmp .next
@@:
cmp al, 0xb4 ; Home
jne @f
mov ax, 0x50ff
jmp .next
@@:
cmp al, 0xb5 ; End
jne @f
mov ax, 0x57ff
jmp .next
@@:
cmp al, 0xb8 ; PgUp
jne @f
mov ax, 0x55ff
jmp .next
@@:
cmp al, 0xb7 ; PgDown
jne @f
mov ax, 0x56ff
jmp .next
@@:
cmp al, 0xb0 ; Left
jne @f
mov ax, 0x51ff
jmp .next
@@:
cmp al, 0xb2 ; Up
jne @f
mov ax, 0x52ff
jmp .next
@@:
cmp al, 0xb3 ; Right
jne @f
mov ax, 0x53ff
jmp .next
@@:
cmp al, 0xb1 ; Down
jne @f
mov ax, 0x54ff
jmp .next
@@:
shl ax, 8 shl ax, 8
.next:
stosw stosw
dec ecx dec ecx
jnz .loop jnz .loop
pop edi
; Fill in some keysyms for non-ascii keys
mov word[edi+01*2], 0x1bff ; Escape
mov word[edi+14*2], 0x08ff ; Backspace
mov word[edi+15*2], 0x09ff ; Tab
mov word[edi+28*2], 0x0dff ; Enter
mov word[edi+29*2], 0xe3ff ; Left control key
mov word[edi+42*2], 0xe1ff ; Left shift
mov word[edi+54*2], 0xe2ff ; Right shift
mov word[edi+56*2], 0xe9ff ; Left alt key
mov word[edi+59*2], 0xbeff ; f1
mov word[edi+60*2], 0xbfff ; f2
mov word[edi+61*2], 0xc0ff ; f3
mov word[edi+62*2], 0xc1ff ; f4
mov word[edi+63*2], 0xc2ff ; f5
mov word[edi+64*2], 0xc3ff ; f6
mov word[edi+65*2], 0xc4ff ; f7
mov word[edi+66*2], 0xc5ff ; f8
mov word[edi+67*2], 0xc6ff ; f9
mov word[edi+68*2], 0xc7ff ; f10
mov word[edi+71*2], 0x50ff ; home
mov word[edi+72*2], 0x52ff ; up
mov word[edi+73*2], 0x55ff ; pg up
mov word[edi+75*2], 0x51ff ; left
mov word[edi+77*2], 0x53ff ; right
mov word[edi+79*2], 0x57ff ; end
mov word[edi+80*2], 0x54ff ; down
mov word[edi+81*2], 0x56ff ; pg down
mov word[edi+82*2], 0x63ff ; insert
mov word[edi+83*2], 0xffff ; delete
mov word[edi+87*2], 0xc8ff ; f11
mov word[edi+88*2], 0xc9ff ; f12
mov word[edi+91*2], 0xebff ; left super
ret ret

View File

@ -159,11 +159,11 @@ mainloop:
key: key:
mcall 66, 3 mcall 66, 3
mov ebx, eax mov ebx, eax ; get modifier keys
mcall 2 mcall 2 ; get key scancode
cmp ah, 224 ; ext cmp ah, 224 ; extended keycode?
je mainloop ;; TODO je .extended
xor al, al xor al, al
test ah, 0x80 ; key up? test ah, 0x80 ; key up?
@ -172,26 +172,46 @@ key:
@@: @@:
mov byte[KeyEvent.down], al mov byte[KeyEvent.down], al
shr eax, 7 movzx eax, ah
and eax, 0x000000fe
test ebx, 100000b ; alt? test ebx, 100000b ; alt?
jz @f jz .no_alt
add eax, 512 mov ax, [keymap_alt+eax*2]
jmp .key jmp .key
@@: .no_alt:
test ebx, 11b ; shift? test ebx, 11b ; shift?
jz @f jz .no_shift
add eax, 256 mov ax, [keymap_shift+eax*2]
@@: jmp .key
.no_shift:
test ebx, 10000000b ; numlock ?
jz .no_numlock
cmp al, 71
jb .no_numlock
cmp al, 83
ja .no_numlock
mov ah, [keymap_numlock+eax-71]
xor al, al
jmp .key
.extended: ; extended keys always use regular keymap
mcall 2
shr eax, 8
jz mainloop
.no_numlock:
mov ax, [keymap+eax*2]
.key: .key:
mov ax, [keymap+eax] test ax, ax
jz mainloop
mov word[KeyEvent.key+2], ax mov word[KeyEvent.key+2], ax
DEBUGF 1, "Sending key: 0x%x\n", ax DEBUGF 1, "Sending key: 0x%x\n", ax
mcall send, [socketnum], KeyEvent, 8, 0 mcall send, [socketnum], KeyEvent, 8, 0
jmp mainloop jmp mainloop
mouse: mouse:
; DEBUGF 1, "Sending pointer event\n" ; DEBUGF 1, "Sending pointer event\n"
@ -222,6 +242,12 @@ button:
include_debug_strings include_debug_strings
keymap_numlock:
db '7', '8', '9', '-'
db '4', '5', '6', '+'
db '1', '2', '3'
db '0', '.'
HandShake db "RFB 003.003", 10 HandShake db "RFB 003.003", 10
ClientInit db 0 ; not shared ClientInit db 0 ; not shared
@ -323,9 +349,9 @@ update_gui dd 0
mouse_dd dd 0 mouse_dd dd 0
update_framebuffer dd 0 update_framebuffer dd 0
URLbox edit_box 235, 70, 10, 0xffffff, 0x6f9480, 0, 0, 0, 65535, serveraddr, mouse_dd, ed_focus, 0, 0 URLbox edit_box 235, 70, 20, 0xffffff, 0x6f9480, 0, 0, 0, 65535, serveraddr, mouse_dd, ed_focus, 0, 0
USERbox edit_box 200, 90, 10, 0xffffff, 0x6f9480, 0, 0, 0, 127, username, mouse_dd, ed_focus, 0, 0 USERbox edit_box 215, 90, 10, 0xffffff, 0x6f9480, 0, 0, 0, 127, username, mouse_dd, ed_focus, 0, 0
PASSbox edit_box 200, 90, 30, 0xffffff, 0x6f9480, 0, 0, 0, 127, password, mouse_dd, ed_pass, 0, 0 PASSbox edit_box 215, 90, 30, 0xffffff, 0x6f9480, 0, 0, 0, 127, password, mouse_dd, ed_pass, 0, 0
serverstr db "server:" serverstr db "server:"
userstr db "username:" userstr db "username:"