mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-05 08:25:32 +00:00
143 lines
No EOL
5.7 KiB
TypeScript
143 lines
No EOL
5.7 KiB
TypeScript
/*
|
|
* This file defines DOM-specific keyboard API that is not available in headless mode, extending web-core's
|
|
* base KeyboardInterface offerings.
|
|
*/
|
|
namespace com.keyman.text {
|
|
/**
|
|
* Function registerKeyboard KR
|
|
* Scope Public
|
|
* @param {Object} Pk Keyboard object
|
|
* Description Register and load the keyboard. This implementation overwrites web-core's intentionally,
|
|
* as web-core lacks access to the `KeyboardManager` object and class.
|
|
*/
|
|
KeyboardInterface.prototype.registerKeyboard = function(Pk): void {
|
|
let keyman = com.keyman.singleton;
|
|
keyman.keyboardManager._registerKeyboard(Pk);
|
|
}
|
|
|
|
/**
|
|
* Add the basic keyboard parameters (keyboard stub) to the array of keyboard stubs
|
|
* If no language code is specified in a keyboard it cannot be registered,
|
|
* and a keyboard stub must be registered before the keyboard is loaded
|
|
* for the keyboard to be usable.
|
|
*
|
|
* @param {Object} Pstub Keyboard stub object
|
|
* @return {?number} 1 if already registered, else null
|
|
*/
|
|
KeyboardInterface.prototype.registerStub = function(Pstub): number {
|
|
let keyboardManager = com.keyman.singleton.keyboardManager;
|
|
if (keyboardManager.keymanweb.initialized) {
|
|
// If language code already defined (or not specified in stub), check to see if stub already registered
|
|
for(let Lk=0; Lk < keyboardManager.keyboardStubs.length; Lk++) {
|
|
if(keyboardManager.keyboardStubs[Lk]['KI'] == Pstub['KI']) {
|
|
if(Pstub['KLC'] == '' || (keyboardManager.keyboardStubs[Lk]['KLC'] == Pstub['KLC'])) {
|
|
return 1; // no need to register
|
|
}
|
|
}
|
|
}
|
|
}
|
|
keyboardManager._registerStub(Pstub);
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Function KT
|
|
* Scope Public
|
|
* @param {string} Ptext Text to insert
|
|
* @param {?number} PdeadKey Dead key number, if any (???)
|
|
* @return {boolean} true if inserted
|
|
* Description Insert text into active control. Is utilized by keyboards with custom help HTML and requires
|
|
* special DOM handling.
|
|
*/
|
|
KeyboardInterface.prototype.insertText = function(Ptext: string, PdeadKey:number): boolean {
|
|
let keyman = com.keyman.singleton;
|
|
this.resetContextCache();
|
|
|
|
// Find the correct output target to manipulate.
|
|
let outputTarget: OutputTarget = this.activeTargetOutput ? this.activeTargetOutput : dom.Utils.getOutputTarget();
|
|
|
|
if(outputTarget != null) {
|
|
// Required for the `sil_euro_latin` keyboard's desktop OSK/table to function properly.
|
|
keyman.uiManager.setActivatingUI(true);
|
|
dom.DOMEventHandlers.states._IgnoreNextSelChange = 100;
|
|
keyman.domManager.focusLastActiveElement();
|
|
dom.DOMEventHandlers.states._IgnoreNextSelChange = 0;
|
|
|
|
if(Ptext!=null) {
|
|
this.output(0, outputTarget, Ptext);
|
|
}
|
|
|
|
if((typeof(PdeadKey)!=='undefined') && (PdeadKey !== null)) {
|
|
this.deadkeyOutput(0, outputTarget, PdeadKey);
|
|
}
|
|
|
|
outputTarget.invalidateSelection();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Function KSF
|
|
* Scope Public
|
|
* Description Save keyboard focus
|
|
*/
|
|
KeyboardInterface.prototype.saveFocus = function(): void {
|
|
dom.DOMEventHandlers.states._IgnoreNextSelChange = 1;
|
|
}
|
|
|
|
/**
|
|
* Legacy entry points (non-standard names)- included only to allow existing IME keyboards to continue to be used
|
|
*/
|
|
KeyboardInterface.prototype['getLastActiveElement'] = function(): OutputTarget {
|
|
return dom.Utils.getOutputTarget();
|
|
}
|
|
|
|
KeyboardInterface.prototype['focusLastActiveElement'] = function(): void {
|
|
let keyman = com.keyman.singleton;
|
|
keyman.domManager.focusLastActiveElement();
|
|
}
|
|
|
|
//The following entry points are defined but should not normally be used in a keyboard, as OSK display is no longer determined by the keyboard
|
|
KeyboardInterface.prototype['hideHelp'] = function(): void {
|
|
let keyman = com.keyman.singleton;
|
|
keyman.osk.startHide(true);
|
|
}
|
|
|
|
KeyboardInterface.prototype['showHelp'] = function(Px: number, Py: number): void {
|
|
let keyman = com.keyman.singleton;
|
|
if(keyman.osk instanceof osk.FloatingOSKView) {
|
|
keyman.osk.presentAtPosition(Px,Py);
|
|
} else {
|
|
keyman.osk.present();
|
|
}
|
|
}
|
|
|
|
KeyboardInterface.prototype['showPinnedHelp'] = function(): void {
|
|
let keyman = com.keyman.singleton;
|
|
if(keyman.osk instanceof osk.FloatingOSKView) {
|
|
// An old KMW bug previously auto-unset the affected field when this function was
|
|
// used by CJK keyboards during rule processing. As a result, we need to condition
|
|
// on whether or not:
|
|
// 1. The active keyboard is CJK
|
|
// 2. A keyboard rule is actively processing.
|
|
//
|
|
// If BOTH are true, we do NOT mutate keyman.osk.userPositioned.
|
|
// Otherwise, not all conditions are met, so we still allow OSK pinning.
|
|
if(!keyman.core.activeKeyboard.isCJK || !this.ruleBehavior) {
|
|
keyman.osk.userPositioned=true;
|
|
}
|
|
}
|
|
// Automatically reuses previously-set positioning.
|
|
// Other OSK API functions must have previously been used to set the
|
|
// pinned position.
|
|
keyman.osk.present();
|
|
}
|
|
|
|
// Also needed for some legacy CJK keyboards.
|
|
KeyboardInterface.prototype['GetLastActiveElement'] = KeyboardInterface.prototype['getLastActiveElement'];
|
|
KeyboardInterface.prototype['FocusLastActiveElement'] = KeyboardInterface.prototype['focusLastActiveElement'];
|
|
KeyboardInterface.prototype['HideHelp'] = KeyboardInterface.prototype['hideHelp'];
|
|
KeyboardInterface.prototype['ShowHelp'] = KeyboardInterface.prototype['showHelp'];
|
|
KeyboardInterface.prototype['ShowPinnedHelp'] = KeyboardInterface.prototype['showPinnedHelp'];
|
|
} |