diff --git a/kvmd/web/css/keyboard.css b/kvmd/web/css/keyboard.css index 7686a3f3..ebe1d95e 100644 --- a/kvmd/web/css/keyboard.css +++ b/kvmd/web/css/keyboard.css @@ -1,32 +1,32 @@ -div#keyboard { +div.keyboard { zoom: 0.8; } -div#keyboard div.keyboard-block { - padding-right: 15px; +div.keyboard div.keyboard-block { display: table-cell; -} -div#keyboard div.keyboard-block:last-child { padding-right: 0; } +div.keyboard div.keyboard-block:not(:first-child) { + padding-left: 15px; +} -div#keyboard div.keyboard-row { +div.keyboard div.keyboard-row { white-space: nowrap; height: 40px; margin-bottom: 5px; } -div#keyboard div.keyboard-row:last-child { +div.keyboard div.keyboard-row:last-child { margin-bottom: 0; } -div#keyboard div.key, div.modifier, div.empty-key { +div.keyboard div.key, div.modifier, div.empty-key { box-sizing: border-box; display: inline-block; margin-right: 5px; padding: 0; width: 40px; } -div#keyboard div.key, div.modifier { +div.keyboard div.key, div.modifier { font-size: 0.9em; text-align: center; vertical-align: top; @@ -38,57 +38,70 @@ div#keyboard div.key, div.modifier { cursor: pointer; height: 40px; } -div#keyboard div.key:hover, div.modifier:hover { +div.keyboard div.key:hover, div.modifier:hover { color: var(--fg-color-intensive); background-color: var(--bg-color-ctl); } -div#keyboard div.pressed { +div.keyboard div.pressed { box-shadow: none; color: var(--fg-color-selected) !important; background-color: var(--bg-color-dark) !important; } -div#keyboard div.holded { +div.keyboard div.holded { box-shadow: none; color: var(--fg-color-normal) !important; background-color: var(--bg-color-intensive) !important; } -div#keyboard div.key:last-child, div.empty-key:last-child, div.modifier:last-child { +div.keyboard div.key:last-child, div.empty-key:last-child, div.modifier:last-child { margin-right: 0; } -div#keyboard div.wide-1 { +div.keyboard div.margin-0 { + margin-right: 0px; +} +div.keyboard div.wide-0 { + width: 26px; +} +div.keyboard div.wide-1 { width: 61px; } -div#keyboard div.wide-2 { +div.keyboard div.wide-2 { width: 64px; } -div#keyboard div.wide-3 { +div.keyboard div.wide-3 { width: 77px; } -div#keyboard div.wide-4 { +div.keyboard div.wide-4 { width: 102px; } -div#keyboard div.wide-5 { +div.keyboard div.wide-5 { width: 288px; } -div#keyboard div.left { +div.keyboard div.left { text-align: left !important; padding-left: 6px !important; } -div#keyboard div.right { +div.keyboard div.right { text-align: right !important; padding-right: 6px !important; } -div#keyboard div.small { +div.keyboard div.small { font-size: 0.7em; } -div#keyboard p { +div.keyboard p { margin: 0; position: relative; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); } -div#keyboard b { +div.keyboard b { color: var(--bg-color-intensive); } + +div#keyboard-desktop { + display: block; +} +div#keyboard-mobile { + display: none; +} diff --git a/kvmd/web/css/mobile.css b/kvmd/web/css/mobile.css index 0675b6c9..1eda438c 100644 --- a/kvmd/web/css/mobile.css +++ b/kvmd/web/css/mobile.css @@ -25,6 +25,12 @@ color: var(--fg-color-normal); background-color: var(--bg-color-gray); } + div#keyboard-desktop { + display: none !important; + } + div#keyboard-mobile { + display: block !important; + } div#stream-mouse-buttons { display: block !important; diff --git a/kvmd/web/index.html b/kvmd/web/index.html index 4d284e04..fe5a97ad 100644 --- a/kvmd/web/index.html +++ b/kvmd/web/index.html @@ -217,25 +217,25 @@

- +
- - - - - - - + + + + + + +
- - + +
- - - - - - + + + + + +
@@ -257,123 +257,231 @@
Virtual Keyboard
-
+
-

Esc

+

Esc

-

F1

-

F2

-

F3

-

F4

+

F1

+

F2

+

F3

+

F4

-

F5

-

F6

-

F7

-

F8

+

F5

+

F6

+

F7

+

F8

-

F9

-

F10

-

F11

-

F12

+

F9

+

F10

+

F11

+

F12

+
+
+
+

~
`

+

!
1

+

@
2

+

#
3

+

$
4

+

%
5

+

^
6

+

&
7

+

*
8

+

(
9

+

)
0

+

_
-

+

+
=

+

-

~
`

-

!
1

-

@
2

-

#
3

-

$
4

-

%
5

-

^
6

-

&
7

-

*
8

-

(
9

-

)
0

-

_
-

-

+
=

-

+


+

Q

+

W

+

E

+

R

+

T

+

Y

+

U

+

I

+

O

+

P

+

{
[

+

}
]

+

|
\

-


-

Q

-

W

-

E

-

R

-

T

-

Y

-

U

-

I

-

O

-

P

-

{
[

-

}
]

-

|
\

+

Caps Lock

+

A

+

S

+

D

+

F

+

G

+

H

+

J

+

K

+

L

+

:
;

+

"
'

+

Enter

-

Caps Lock

-

A

-

S

-

D

-

F

-

G

-

H

-

J

-

K

-

L

-

:
;

-

"
'

-

Enter

+


Shift

+

Z

+

X

+

C

+

V

+

B

+

N

+

M

+

<
,

+

>
.

+

?
/

+


Shift

-


Shift

-

Z

-

X

-

C

-

V

-

B

-

N

-

M

-

<
,

-

>
.

-

?
/

-


Shift

-
-
-


Ctrl

-


Win

-


Alt

-
-


Alt

-


Win

-


Ctrl

+


Ctrl

+


Win

+


Alt

+
+


Alt

+


Win

+


Ctrl

-


Pt/Sq

-

ScrLk

-

P/Brk

+


Pt/Sq

+

ScrLk

+

P/Brk

+
+
+
+

Ins

+

Home

+

PgUp

-

Ins

-

Home

-

PgUp

-
-
-

Del

-

End

-

PgDn

+

Del

+

End

+

PgDn

-

+

-

-

-

+

+

+

+
+
+
+ +
+
+
+

Esc

+
+

F1

+

F2

+

F3

+

F4

+

F5

+

F6

+

F7

+

F8

+

F9

+

F10

+

F11

+

F12

+
+


Pt/Sq

+

ScrLk

+

P/Brk

+

Ins

+

Home

+

End

+

Del

+
+
+
+

~
`

+

!
1

+

@
2

+

#
3

+

$
4

+

%
5

+

^
6

+

&
7

+

*
8

+

(
9

+

)
0

+

_
-

+

+
=

+

+
+
+


+

Q

+

W

+

E

+

R

+

T

+

Y

+

U

+

I

+

O

+

P

+

{
[

+

}
]

+

|
\

+
+
+

Caps Lock

+

A

+

S

+

D

+

F

+

G

+

H

+

J

+

K

+

L

+

:
;

+

"
'

+

Enter

+
+
+


Shift

+

Z

+

X

+

C

+

V

+

B

+

N

+

M

+

<
,

+

>
.

+

?
/

+

PgUp

+

+

PgDn

+
+
+


Ctrl

+


Win

+


Alt

+
+


Alt

+


Win

+


Ctrl

+


Shift

+

+

+

diff --git a/kvmd/web/js/hid.js b/kvmd/web/js/hid.js index 09c67d98..fb8438a5 100644 --- a/kvmd/web/js/hid.js +++ b/kvmd/web/js/hid.js @@ -48,7 +48,7 @@ function Hid() { $("pak-button").title = $("pak-led").title = "Your browser does not support the Clipboard API.\nUse Google Chrome or Chromium."; } - Array.prototype.forEach.call($$("shortcut"), function(el_shortcut) { + Array.prototype.forEach.call(document.querySelectorAll("[data-shortcut]"), function(el_shortcut) { el_shortcut.onclick = () => __emitShortcut(el_shortcut.getAttribute("data-shortcut").split(" ")); }); }; diff --git a/kvmd/web/js/keyboard.js b/kvmd/web/js/keyboard.js index f1296bed..b29f1764 100644 --- a/kvmd/web/js/keyboard.js +++ b/kvmd/web/js/keyboard.js @@ -5,8 +5,8 @@ function Keyboard() { var __ws = null; - var __keys = []; - var __modifiers = []; + var __keys = [].slice.call(document.querySelectorAll("div#keyboard-desktop div.keyboard-block div.keyboard-row div.key")); + var __modifiers = [].slice.call(document.querySelectorAll("div#keyboard-desktop div.keyboard-block div.keyboard-row div.modifier")); var __mac_cmd_hook = (( window.navigator.oscpu @@ -38,12 +38,10 @@ function Keyboard() { }; el_key.ontouchstart = (event) => __touchHandler(event, el_key, true); el_key.ontouchend = (event) => __touchHandler(event, el_key, false); - __keys.push(el_key); }); Array.prototype.forEach.call($$("modifier"), function(el_key) { el_key.onmousedown = () => __toggleModifierHandler(el_key); - __modifiers.push(el_key); }); if (__mac_cmd_hook) { @@ -64,7 +62,7 @@ function Keyboard() { self.releaseAll = function() { __keys.concat(__modifiers).forEach(function(el_key) { if (__isActive(el_key)) { - self.fireEvent(el_key.id, false); + self.fireEvent(el_key.getAttribute("data-key"), false); } }); }; @@ -88,7 +86,7 @@ function Keyboard() { var __keyboardHandler = function(event, state) { event.preventDefault(); - var el_key = $(event.code); + var el_key = document.querySelector("[data-key='" + event.code + "']"); if (el_key && !event.repeat) { __commonHandler(el_key, state, "pressed"); if (__mac_cmd_hook) { @@ -97,8 +95,7 @@ function Keyboard() { if ((event.code === "MetaLeft" || event.code === "MetaRight") && !state) { __keys.forEach(function(el_key) { if (__isActive(el_key)) { - // __commonHandler(el_key, false, "pressed"); - self.fireEvent(el_key.id, false); + self.fireEvent(el_key.getAttribute("data-key"), false); } }); } @@ -126,7 +123,7 @@ function Keyboard() { __modifiers.forEach(function(el_key) { if (__isHolded(el_key)) { __deactivate(el_key); - __sendKey(el_key.id, false); + __sendKey(el_key, false); } }); }; @@ -134,32 +131,57 @@ function Keyboard() { var __commonHandler = function(el_key, state, cls) { if (state && !__isActive(el_key)) { __deactivate(el_key); - el_key.classList.add(cls); - __sendKey(el_key.id, true); + __activate(el_key, cls); + __sendKey(el_key, true); } else { __deactivate(el_key); - __sendKey(el_key.id, false); + __sendKey(el_key, false); } }; var __isPressed = function(el_key) { - return el_key.classList.contains("pressed"); + var is_pressed = false; + Array.prototype.forEach.call(__resolveKeys(el_key), function(el_key) { + is_pressed = (is_pressed || el_key.classList.contains("pressed")); + }); + return is_pressed; }; var __isHolded = function(el_key) { - return el_key.classList.contains("holded"); + var is_holded = false; + Array.prototype.forEach.call(__resolveKeys(el_key), function(el_key) { + is_holded = (is_holded || el_key.classList.contains("holded")); + }); + return is_holded; }; var __isActive = function(el_key) { - return (__isPressed(el_key) || __isHolded(el_key)); + var is_active = false; + Array.prototype.forEach.call(__resolveKeys(el_key), function(el_key) { + is_active = (is_active || el_key.classList.contains("pressed") || el_key.classList.contains("holded")); + }); + return is_active; + }; + + var __activate = function(el_key, cls) { + Array.prototype.forEach.call(__resolveKeys(el_key), function(el_key) { + el_key.classList.add(cls); + }); }; var __deactivate = function(el_key) { - el_key.classList.remove("pressed"); - el_key.classList.remove("holded"); + Array.prototype.forEach.call(__resolveKeys(el_key), function(el_key) { + el_key.classList.remove("pressed"); + el_key.classList.remove("holded"); + }); }; - var __sendKey = function(code, state) { + var __resolveKeys = function(el_key) { + return document.querySelectorAll("[data-key='" + el_key.getAttribute("data-key") + "']"); + }; + + var __sendKey = function(el_key, state) { + var code = el_key.getAttribute("data-key"); tools.debug("Key", (state ? "pressed:" : "released:"), code); if (__ws) { __ws.send(JSON.stringify({