diff --git a/web/source/kmwlayout.ts b/web/source/kmwlayout.ts
deleted file mode 100644
index fdf47416bd..0000000000
--- a/web/source/kmwlayout.ts
+++ /dev/null
@@ -1,305 +0,0 @@
-/***
- KeymanWeb 10.0
- Copyright 2017 SIL International
-***/
-if (!window['keyman']['initialized']) {
- window['keyman']['dfltLayout'] = {
- "desktop":
- {
- "font": "Tahoma,Helvetica",
- "layer": [
- {
- "id": "default",
- "row": [
- {
- "id": "1",
- "key": [
- { "id": "K_BKQUOTE" },
- { "id": "K_1" },
- { "id": "K_2" },
- { "id": "K_3" },
- { "id": "K_4" },
- { "id": "K_5" },
- { "id": "K_6" },
- { "id": "K_7" },
- { "id": "K_8" },
- { "id": "K_9" },
- { "id": "K_0" },
- { "id": "K_HYPHEN" },
- { "id": "K_EQUAL" },
- { "id": "K_BKSP", "text": "*BkSp*", "sp": "1", "width": "130" }
- ]
- },
- {
- "id": "2",
- "key": [
- { "id": "K_TAB", "text": "*Tab*", "sp": "1", "width": "130" },
- { "id": "K_Q" },
- { "id": "K_W" },
- { "id": "K_E" },
- { "id": "K_R" },
- { "id": "K_T" },
- { "id": "K_Y" },
- { "id": "K_U" },
- { "id": "K_I" },
- { "id": "K_O" },
- { "id": "K_P" },
- { "id": "K_LBRKT" },
- { "id": "K_RBRKT" },
- { "id": "K_BKSLASH" }
- ]
- },
- {
- "id": "3",
- "key": [
- { "id": "K_CAPS", "text": "*Caps*", "sp": "1", "width": "165" },
- { "id": "K_A" },
- { "id": "K_S" },
- { "id": "K_D" },
- { "id": "K_F" },
- { "id": "K_G" },
- { "id": "K_H" },
- { "id": "K_J" },
- { "id": "K_K" },
- { "id": "K_L" },
- { "id": "K_COLON" },
- { "id": "K_QUOTE" },
- { "id": "K_ENTER", "text": "*Enter*", "sp": "1", "width": "165" }
- ]
- },
- {
- "id": "4",
- "key": [
- { "id": "K_SHIFT", "text": "*Shift*", "sp": "1", "width": "130" },
- { "id": "K_oE2" },
- { "id": "K_Z" },
- { "id": "K_X" },
- { "id": "K_C" },
- { "id": "K_V" },
- { "id": "K_B" },
- { "id": "K_N" },
- { "id": "K_M" },
- { "id": "K_COMMA" },
- { "id": "K_PERIOD" },
- { "id": "K_SLASH" },
- { "id": "K_RSHIFT", "text": "*Shift*", "sp": "1", "width": "130" }
- ]
- },
- {
- "id": "5",
- "key": [
- { "id": "K_LCONTROL", "text": "*Ctrl*", "sp": "1", "width": "170" },
- { "id": "K_LALT", "text": "*Alt*", "sp": "1", "width": "160" },
- { "id": "K_SPACE", "text": "", "width": "770" },
- { "id": "K_RALT", "text": "*Alt*", "sp": "1", "width": "160" },
- { "id": "K_RCONTROL", "text": "*Ctrl*", "sp": "1", "width": "170" }
- ]
- }
- ]
- }
- ]
- },
- "tablet":
- {
- "font": "Tahoma,Helvetica",
- "layer": [
- {
- "id": "default",
- "row": [
- {
- "id": "0",
- "key": [
- { "id": "K_1" },
- { "id": "K_2" },
- { "id": "K_3" },
- { "id": "K_4" },
- { "id": "K_5" },
- { "id": "K_6" },
- { "id": "K_7" },
- { "id": "K_8" },
- { "id": "K_9" },
- { "id": "K_0" },
- { "id": "K_HYPHEN" },
- { "id": "K_EQUAL" },
- { "sp": "10", "width": "1" }
- ]
- },
- {
- "id": "1",
- "key": [
- { "id": "K_Q", "pad": "25" },
- { "id": "K_W" },
- { "id": "K_E" },
- { "id": "K_R" },
- { "id": "K_T" },
- { "id": "K_Y" },
- { "id": "K_U" },
- { "id": "K_I" },
- { "id": "K_O" },
- { "id": "K_P" },
- { "id": "K_LBRKT" },
- { "id": "K_RBRKT" },
- { "sp": "10", "width": "1" }
- ]
- },
- {
- "id": "2",
- "key": [
- { "id": "K_A", "pad": "50" },
- { "id": "K_S" },
- { "id": "K_D" },
- { "id": "K_F" },
- { "id": "K_G" },
- { "id": "K_H" },
- { "id": "K_J" },
- { "id": "K_K" },
- { "id": "K_L" },
- { "id": "K_COLON" },
- { "id": "K_QUOTE" },
- { "id": "K_BKSLASH", "width": "90" }
- ]
- },
- {
- "id": "3",
- "key": [
- { "id": "K_oE2", "width": "90" },
- { "id": "K_Z" },
- { "id": "K_X" },
- { "id": "K_C" },
- { "id": "K_V" },
- { "id": "K_B" },
- { "id": "K_N" },
- { "id": "K_M" },
- { "id": "K_COMMA" },
- { "id": "K_PERIOD" },
- { "id": "K_SLASH" },
- { "id": "K_BKQUOTE" },
- { "sp": "10", "width": "1" }
- ]
- },
- {
- "id": "4",
- "key": [
- {
- "id": "K_SHIFT", "text": "*Shift*", "sp": "1", "width": "200", "sk": [
- { "id": "K_LCONTROL", "text": "*Ctrl*", "sp": "1", "width": "50", "nextlayer": "ctrl" },
- { "id": "K_LCONTROL", "text": "*LCtrl*", "sp": "1", "width": "50", "nextlayer": "leftctrl" },
- { "id": "K_RCONTROL", "text": "*RCtrl*", "sp": "1", "width": "50", "nextlayer": "rightctrl" },
- { "id": "K_LALT", "text": "*Alt*", "sp": "1", "width": "50", "nextlayer": "alt" },
- { "id": "K_LALT", "text": "*LAlt*", "sp": "1", "width": "50", "nextlayer": "leftalt" },
- { "id": "K_RALT", "text": "*RAlt*", "sp": "1", "width": "50", "nextlayer": "rightalt" },
- { "id": "K_ALTGR", "text": "*AltGr*", "sp": "1", "width": "50", "nextlayer": "ctrl-alt" }]
- },
- { "id": "K_LOPT", "text": "*Menu*", "sp": "1", "width": "150" },
- { "id": "K_SPACE", "text": "", "width": "570" },
- { "id": "K_BKSP", "text": "*BkSp*", "sp": "1", "width": "150" },
- { "id": "K_ENTER", "text": "*Enter*", "sp": "1", "width": "200" }
- ]
- }
- ]
- }
- ]
- },
- "phone":
- {
- "font": "Tahoma,Helvetica",
- "layer": [
- {
- "id": "default",
- "row": [
- {
- "id": "0",
- "key": [
- { "id": "K_1" },
- { "id": "K_2" },
- { "id": "K_3" },
- { "id": "K_4" },
- { "id": "K_5" },
- { "id": "K_6" },
- { "id": "K_7" },
- { "id": "K_8" },
- { "id": "K_9" },
- { "id": "K_0" },
- { "id": "K_HYPHEN" },
- { "id": "K_EQUAL" },
- { "sp": "10", "width": "1" }
- ]
- },
- {
- "id": "1",
- "key": [
- { "id": "K_Q", "pad": "25" },
- { "id": "K_W" },
- { "id": "K_E" },
- { "id": "K_R" },
- { "id": "K_T" },
- { "id": "K_Y" },
- { "id": "K_U" },
- { "id": "K_I" },
- { "id": "K_O" },
- { "id": "K_P" },
- { "id": "K_LBRKT" },
- { "id": "K_RBRKT" },
- { "sp": "10", "width": "1" }
- ]
- },
- {
- "id": "2",
- "key": [
- { "id": "K_A", "pad": "50" },
- { "id": "K_S" },
- { "id": "K_D" },
- { "id": "K_F" },
- { "id": "K_G" },
- { "id": "K_H" },
- { "id": "K_J" },
- { "id": "K_K" },
- { "id": "K_L" },
- { "id": "K_COLON" },
- { "id": "K_QUOTE" },
- { "id": "K_BKSLASH", "width": "90" }
- ]
- },
- {
- "id": "3",
- "key": [
- { "id": "K_oE2", "width": "90" },
- { "id": "K_Z" },
- { "id": "K_X" },
- { "id": "K_C" },
- { "id": "K_V" },
- { "id": "K_B" },
- { "id": "K_N" },
- { "id": "K_M" },
- { "id": "K_COMMA" },
- { "id": "K_PERIOD" },
- { "id": "K_SLASH" },
- { "id": "K_BKQUOTE" },
- { "sp": "10", "width": "1" }
- ]
- },
- {
- "id": "4",
- "key": [
- {
- "id": "K_SHIFT", "text": "*Shift*", "sp": "1", "width": "200", "sk": [
- { "id": "K_LCONTROL", "text": "*Ctrl*", "sp": "1", "width": "50", "nextlayer": "ctrl" },
- { "id": "K_LCONTROL", "text": "*LCtrl*", "sp": "1", "width": "50", "nextlayer": "leftctrl" },
- { "id": "K_RCONTROL", "text": "*RCtrl*", "sp": "1", "width": "50", "nextlayer": "rightctrl" },
- { "id": "K_LALT", "text": "*Alt*", "sp": "1", "width": "50", "nextlayer": "alt" },
- { "id": "K_LALT", "text": "*LAlt*", "sp": "1", "width": "50", "nextlayer": "leftalt" },
- { "id": "K_RALT", "text": "*RAlt*", "sp": "1", "width": "50", "nextlayer": "rightalt" },
- { "id": "K_ALTGR", "text": "*AltGr*", "sp": "1", "width": "50", "nextlayer": "ctrl-alt" }]
- },
- { "id": "K_LOPT", "text": "*Menu*", "width": "150", "sp": "1" },
- { "id": "K_SPACE", "width": "570", "text": "" },
- { "id": "K_BKSP", "text": "*BkSp*", "width": "150", "sp": "1" },
- { "id": "K_ENTER", "text": "*Enter*", "width": "200", "sp": "1" }
- ]
- }
- ]
- }
- ]
- }
- };
-}
diff --git a/web/source/kmwosk.ts b/web/source/kmwosk.ts
index a2309041c5..8e5ca80b34 100644
--- a/web/source/kmwosk.ts
+++ b/web/source/kmwosk.ts
@@ -1,5 +1,6 @@
/// // Includes KMW-added property declaration extensions for HTML elements.
/// // Includes KMW string extension declarations.
+/// // Includes the default layout specification.
namespace com.keyman {
export class OSKKeySpec {
@@ -3398,7 +3399,7 @@ if(!window['keyman']['initialized']) {
var layout;
// Build a layout using the default for the device
- var layoutType=formFactor, dfltLayout=keymanweb['dfltLayout'];
+ var layoutType=formFactor, dfltLayout=com.keyman.osk.Layouts.dfltLayout;
if(typeof dfltLayout[layoutType] != 'object') {
layoutType = 'desktop';
}
diff --git a/web/source/osk/defaultLayouts.ts b/web/source/osk/defaultLayouts.ts
new file mode 100644
index 0000000000..a370eb8345
--- /dev/null
+++ b/web/source/osk/defaultLayouts.ts
@@ -0,0 +1,342 @@
+/***
+ KeymanWeb 10.0
+ Copyright 2017 SIL International
+***/
+
+namespace com.keyman.osk {
+ // The following types provide type definitions for the full JSON format we use for visual keyboard definitions.
+ export type LayoutKey = {
+ "id"?: string,
+ "text"?: string,
+ "sp"?: number|"0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"|"10",
+ "width"?: string,
+ "nextlayer"?: string,
+ "pad"?: string,
+ "sk"?: LayoutKey[]
+ }
+
+ export type LayoutRow = {
+ "id": string, // represents a number, though...
+ "key": LayoutKey[]
+ };
+
+ export type LayoutLayer = {
+ "id": string,
+ "row": LayoutRow[]
+ }
+
+ export type LayoutFormFactor = {
+ "font": string,
+ "layer": LayoutLayer[]
+ }
+
+ export type LayoutSpec = {
+ "desktop"?: LayoutFormFactor,
+ "phone"?: LayoutFormFactor,
+ "tablet"?: LayoutFormFactor
+ }
+
+ // This class manages default layout construction for consumption by OSKs without a specified layout.
+ export class Layouts {
+ // Defines the default visual layout for a keyboard.
+ static dfltLayout: LayoutSpec = {
+ "desktop":
+ {
+ "font": "Tahoma,Helvetica",
+ "layer": [
+ {
+ "id": "default",
+ "row": [
+ {
+ "id": "1",
+ "key": [
+ { "id": "K_BKQUOTE" },
+ { "id": "K_1" },
+ { "id": "K_2" },
+ { "id": "K_3" },
+ { "id": "K_4" },
+ { "id": "K_5" },
+ { "id": "K_6" },
+ { "id": "K_7" },
+ { "id": "K_8" },
+ { "id": "K_9" },
+ { "id": "K_0" },
+ { "id": "K_HYPHEN" },
+ { "id": "K_EQUAL" },
+ { "id": "K_BKSP", "text": "*BkSp*", "sp": "1", "width": "130" }
+ ]
+ },
+ {
+ "id": "2",
+ "key": [
+ { "id": "K_TAB", "text": "*Tab*", "sp": "1", "width": "130" },
+ { "id": "K_Q" },
+ { "id": "K_W" },
+ { "id": "K_E" },
+ { "id": "K_R" },
+ { "id": "K_T" },
+ { "id": "K_Y" },
+ { "id": "K_U" },
+ { "id": "K_I" },
+ { "id": "K_O" },
+ { "id": "K_P" },
+ { "id": "K_LBRKT" },
+ { "id": "K_RBRKT" },
+ { "id": "K_BKSLASH" }
+ ]
+ },
+ {
+ "id": "3",
+ "key": [
+ { "id": "K_CAPS", "text": "*Caps*", "sp": "1", "width": "165" },
+ { "id": "K_A" },
+ { "id": "K_S" },
+ { "id": "K_D" },
+ { "id": "K_F" },
+ { "id": "K_G" },
+ { "id": "K_H" },
+ { "id": "K_J" },
+ { "id": "K_K" },
+ { "id": "K_L" },
+ { "id": "K_COLON" },
+ { "id": "K_QUOTE" },
+ { "id": "K_ENTER", "text": "*Enter*", "sp": "1", "width": "165" }
+ ]
+ },
+ {
+ "id": "4",
+ "key": [
+ { "id": "K_SHIFT", "text": "*Shift*", "sp": "1", "width": "130" },
+ { "id": "K_oE2" },
+ { "id": "K_Z" },
+ { "id": "K_X" },
+ { "id": "K_C" },
+ { "id": "K_V" },
+ { "id": "K_B" },
+ { "id": "K_N" },
+ { "id": "K_M" },
+ { "id": "K_COMMA" },
+ { "id": "K_PERIOD" },
+ { "id": "K_SLASH" },
+ { "id": "K_RSHIFT", "text": "*Shift*", "sp": "1", "width": "130" }
+ ]
+ },
+ {
+ "id": "5",
+ "key": [
+ { "id": "K_LCONTROL", "text": "*Ctrl*", "sp": "1", "width": "170" },
+ { "id": "K_LALT", "text": "*Alt*", "sp": "1", "width": "160" },
+ { "id": "K_SPACE", "text": "", "width": "770" },
+ { "id": "K_RALT", "text": "*Alt*", "sp": "1", "width": "160" },
+ { "id": "K_RCONTROL", "text": "*Ctrl*", "sp": "1", "width": "170" }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "tablet":
+ {
+ "font": "Tahoma,Helvetica",
+ "layer": [
+ {
+ "id": "default",
+ "row": [
+ {
+ "id": "0",
+ "key": [
+ { "id": "K_1" },
+ { "id": "K_2" },
+ { "id": "K_3" },
+ { "id": "K_4" },
+ { "id": "K_5" },
+ { "id": "K_6" },
+ { "id": "K_7" },
+ { "id": "K_8" },
+ { "id": "K_9" },
+ { "id": "K_0" },
+ { "id": "K_HYPHEN" },
+ { "id": "K_EQUAL" },
+ { "sp": "10", "width": "1" }
+ ]
+ },
+ {
+ "id": "1",
+ "key": [
+ { "id": "K_Q", "pad": "25" },
+ { "id": "K_W" },
+ { "id": "K_E" },
+ { "id": "K_R" },
+ { "id": "K_T" },
+ { "id": "K_Y" },
+ { "id": "K_U" },
+ { "id": "K_I" },
+ { "id": "K_O" },
+ { "id": "K_P" },
+ { "id": "K_LBRKT" },
+ { "id": "K_RBRKT" },
+ { "sp": "10", "width": "1" }
+ ]
+ },
+ {
+ "id": "2",
+ "key": [
+ { "id": "K_A", "pad": "50" },
+ { "id": "K_S" },
+ { "id": "K_D" },
+ { "id": "K_F" },
+ { "id": "K_G" },
+ { "id": "K_H" },
+ { "id": "K_J" },
+ { "id": "K_K" },
+ { "id": "K_L" },
+ { "id": "K_COLON" },
+ { "id": "K_QUOTE" },
+ { "id": "K_BKSLASH", "width": "90" }
+ ]
+ },
+ {
+ "id": "3",
+ "key": [
+ { "id": "K_oE2", "width": "90" },
+ { "id": "K_Z" },
+ { "id": "K_X" },
+ { "id": "K_C" },
+ { "id": "K_V" },
+ { "id": "K_B" },
+ { "id": "K_N" },
+ { "id": "K_M" },
+ { "id": "K_COMMA" },
+ { "id": "K_PERIOD" },
+ { "id": "K_SLASH" },
+ { "id": "K_BKQUOTE" },
+ { "sp": "10", "width": "1" }
+ ]
+ },
+ {
+ "id": "4",
+ "key": [
+ {
+ "id": "K_SHIFT", "text": "*Shift*", "sp": "1", "width": "200", "sk": [
+ { "id": "K_LCONTROL", "text": "*Ctrl*", "sp": "1", "width": "50", "nextlayer": "ctrl" },
+ { "id": "K_LCONTROL", "text": "*LCtrl*", "sp": "1", "width": "50", "nextlayer": "leftctrl" },
+ { "id": "K_RCONTROL", "text": "*RCtrl*", "sp": "1", "width": "50", "nextlayer": "rightctrl" },
+ { "id": "K_LALT", "text": "*Alt*", "sp": "1", "width": "50", "nextlayer": "alt" },
+ { "id": "K_LALT", "text": "*LAlt*", "sp": "1", "width": "50", "nextlayer": "leftalt" },
+ { "id": "K_RALT", "text": "*RAlt*", "sp": "1", "width": "50", "nextlayer": "rightalt" },
+ { "id": "K_ALTGR", "text": "*AltGr*", "sp": "1", "width": "50", "nextlayer": "ctrl-alt" }]
+ },
+ { "id": "K_LOPT", "text": "*Menu*", "sp": "1", "width": "150" },
+ { "id": "K_SPACE", "text": "", "width": "570" },
+ { "id": "K_BKSP", "text": "*BkSp*", "sp": "1", "width": "150" },
+ { "id": "K_ENTER", "text": "*Enter*", "sp": "1", "width": "200" }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "phone":
+ {
+ "font": "Tahoma,Helvetica",
+ "layer": [
+ {
+ "id": "default",
+ "row": [
+ {
+ "id": "0",
+ "key": [
+ { "id": "K_1" },
+ { "id": "K_2" },
+ { "id": "K_3" },
+ { "id": "K_4" },
+ { "id": "K_5" },
+ { "id": "K_6" },
+ { "id": "K_7" },
+ { "id": "K_8" },
+ { "id": "K_9" },
+ { "id": "K_0" },
+ { "id": "K_HYPHEN" },
+ { "id": "K_EQUAL" },
+ { "sp": "10", "width": "1" }
+ ]
+ },
+ {
+ "id": "1",
+ "key": [
+ { "id": "K_Q", "pad": "25" },
+ { "id": "K_W" },
+ { "id": "K_E" },
+ { "id": "K_R" },
+ { "id": "K_T" },
+ { "id": "K_Y" },
+ { "id": "K_U" },
+ { "id": "K_I" },
+ { "id": "K_O" },
+ { "id": "K_P" },
+ { "id": "K_LBRKT" },
+ { "id": "K_RBRKT" },
+ { "sp": "10", "width": "1" }
+ ]
+ },
+ {
+ "id": "2",
+ "key": [
+ { "id": "K_A", "pad": "50" },
+ { "id": "K_S" },
+ { "id": "K_D" },
+ { "id": "K_F" },
+ { "id": "K_G" },
+ { "id": "K_H" },
+ { "id": "K_J" },
+ { "id": "K_K" },
+ { "id": "K_L" },
+ { "id": "K_COLON" },
+ { "id": "K_QUOTE" },
+ { "id": "K_BKSLASH", "width": "90" }
+ ]
+ },
+ {
+ "id": "3",
+ "key": [
+ { "id": "K_oE2", "width": "90" },
+ { "id": "K_Z" },
+ { "id": "K_X" },
+ { "id": "K_C" },
+ { "id": "K_V" },
+ { "id": "K_B" },
+ { "id": "K_N" },
+ { "id": "K_M" },
+ { "id": "K_COMMA" },
+ { "id": "K_PERIOD" },
+ { "id": "K_SLASH" },
+ { "id": "K_BKQUOTE" },
+ { "sp": "10", "width": "1" }
+ ]
+ },
+ {
+ "id": "4",
+ "key": [
+ {
+ "id": "K_SHIFT", "text": "*Shift*", "sp": "1", "width": "200", "sk": [
+ { "id": "K_LCONTROL", "text": "*Ctrl*", "sp": "1", "width": "50", "nextlayer": "ctrl" },
+ { "id": "K_LCONTROL", "text": "*LCtrl*", "sp": "1", "width": "50", "nextlayer": "leftctrl" },
+ { "id": "K_RCONTROL", "text": "*RCtrl*", "sp": "1", "width": "50", "nextlayer": "rightctrl" },
+ { "id": "K_LALT", "text": "*Alt*", "sp": "1", "width": "50", "nextlayer": "alt" },
+ { "id": "K_LALT", "text": "*LAlt*", "sp": "1", "width": "50", "nextlayer": "leftalt" },
+ { "id": "K_RALT", "text": "*RAlt*", "sp": "1", "width": "50", "nextlayer": "rightalt" },
+ { "id": "K_ALTGR", "text": "*AltGr*", "sp": "1", "width": "50", "nextlayer": "ctrl-alt" }]
+ },
+ { "id": "K_LOPT", "text": "*Menu*", "width": "150", "sp": "1" },
+ { "id": "K_SPACE", "width": "570", "text": "" },
+ { "id": "K_BKSP", "text": "*BkSp*", "width": "150", "sp": "1" },
+ { "id": "K_ENTER", "text": "*Enter*", "width": "200", "sp": "1" }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/web/source/tsconfig.embedded.json b/web/source/tsconfig.embedded.json
index e863213884..c0670f5665 100644
--- a/web/source/tsconfig.embedded.json
+++ b/web/source/tsconfig.embedded.json
@@ -8,7 +8,6 @@
"keymanweb.ts",
"kmwosk.ts",
"kmwembedded.ts",
- "kmwlayout.ts",
"kmwinit.ts",
"kmwapi.ts"
]
diff --git a/web/source/tsconfig.web.json b/web/source/tsconfig.web.json
index 9180f664bd..774373e2a5 100644
--- a/web/source/tsconfig.web.json
+++ b/web/source/tsconfig.web.json
@@ -8,7 +8,6 @@
"keymanweb.ts",
"kmwosk.ts",
"kmwnative.ts",
- "kmwlayout.ts",
"kmwinit.ts",
"kmwapi.ts"
]