mirror of
https://github.com/keymanapp/keyman.git
synced 2026-09-21 23:27:39 +00:00
Merge pull request #1626 from keymanapp/beta-final-master-merge
Merge final 11.0 beta changes to 12.0 alpha
This commit is contained in:
commit
f1878cc8ba
16 changed files with 271 additions and 77 deletions
|
|
@ -3,6 +3,12 @@
|
|||
## 12.0 alpha
|
||||
* Started work on Keyman for Android 12.
|
||||
|
||||
## 2019-02-25 11.0.2100 stable
|
||||
* 11.0 Stable release
|
||||
|
||||
## 2019-02-15 11.0.2062 beta
|
||||
* No changes.
|
||||
|
||||
## 2019-02-07 11.0.2061 beta
|
||||
* Bug fix:
|
||||
* Add notifications when keyboard or font fails to download from Keyman cloud (#1570)
|
||||
|
|
|
|||
|
|
@ -1,8 +1,15 @@
|
|||
# Keyman for iPhone and iPad Version History
|
||||
|
||||
## 12.0 alpha
|
||||
* Started work on Keyman for iPhone and iPad 12.
|
||||
|
||||
## 2019 01-04 11.0.302 beta
|
||||
## 2019-02-25 11.0.320 stable
|
||||
* 11.0 Stable release
|
||||
|
||||
## 2019-02-25 11.0.302 beta
|
||||
* Keyman now works again on iOS 9.3.5 (#1588)
|
||||
|
||||
## 2019-01-04 11.0.301 beta
|
||||
* Improves loading efficiency of system keyboard, helping prevent related crashes (#1475)
|
||||
|
||||
## 2019-01-02 11.0.300 beta
|
||||
|
|
|
|||
|
|
@ -3,22 +3,46 @@
|
|||
## 12.0 alpha
|
||||
* Started work on Keyman for Linux 12
|
||||
|
||||
## 2019-02-25 11.0.120 stable
|
||||
* 11.0 Stable release
|
||||
|
||||
## 2019-02-22 11.0.111 beta
|
||||
* Use lowercase ID and kmx filenames when installing .kmp packages (#1601)
|
||||
|
||||
## 2019-02-19 11.0.110 beta
|
||||
* Update readme about launchpad (#1574)
|
||||
|
||||
## 2019-02-18 11.0.109 beta
|
||||
* create appstream appdata for keyman-config (#1543)
|
||||
* Create appstream appdata for keyman-config (#1543)
|
||||
|
||||
## 2019-02-15 11.0.108 beta
|
||||
* handle keyboard package install/uninstall when languages aren't defined (#1585)
|
||||
* Handle keyboard package install/uninstall when languages aren't defined (#1585)
|
||||
|
||||
## 2019-02-08 11.0.107 beta
|
||||
* add disco distribution information (#1572)
|
||||
* Add disco distribution information (#1572)
|
||||
|
||||
## 2019-02-05 11.0.106 beta
|
||||
* update readme about packaging and fix build.sh script (#1565)
|
||||
* Update readme about packaging and fix build.sh script (#1565)
|
||||
* Bugfix for potential utf overrun in Keyman Core (#1547)
|
||||
|
||||
## 2019-01-10 11.0.105 beta
|
||||
* add icons for km-config and .kmp files (#1495)
|
||||
* restart ibus as user and on gnome-shell (#1510,#1521)
|
||||
* build on xenial (#1518,#1477)
|
||||
* Restart ibus as user and on gnome-shell (#1510,#1521)
|
||||
* Build on xenial (#1518,#1477)
|
||||
* Remove debconf template not needed any more (#1497)
|
||||
|
||||
## 2019-01-04 11.0.104 beta
|
||||
* Add km-config and .kmp icons (#1495)
|
||||
|
||||
## 2019-01-04 11.0.103 beta
|
||||
* No changes.
|
||||
|
||||
## 2019-01-04 11.0.102 beta
|
||||
* Initial build of Keyman Core on xenial (#1477)
|
||||
* Auto restart IBus when apt and kbp versioning (#1468)
|
||||
* Fix majorversion which broke download window (#1490)
|
||||
|
||||
## 2019-01-03 11.0.101 beta
|
||||
* No changes.
|
||||
|
||||
## 2019-01-02 11.0.100 beta
|
||||
* Initial beta release of Keyman for Linux
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ def install_to_ibus(bus, keyboard_id):
|
|||
preload_engines = ibus_settings.get_strv("preload-engines")
|
||||
logging.debug(preload_engines)
|
||||
if keyboard_id not in preload_engines:
|
||||
# TODO: in the event preload_engines contains upper-case keyboards, we'll need to uninstall_from_ibus #1601
|
||||
preload_engines.append(keyboard_id)
|
||||
logging.debug(preload_engines)
|
||||
ibus_settings.set_strv("preload-engines", preload_engines)
|
||||
|
|
|
|||
|
|
@ -115,6 +115,10 @@ def check_keyman_dir(basedir, error_message):
|
|||
raise InstallError(InstallStatus.Abort, error_message)
|
||||
os.mkdir(keyman_dir)
|
||||
|
||||
def extract_package_id(inputfile):
|
||||
packageID, ext = os.path.splitext(os.path.basename(inputfile))
|
||||
return packageID.lower()
|
||||
|
||||
def install_kmp_shared(inputfile, online=False):
|
||||
"""
|
||||
Install a kmp file to /usr/local/share/keyman
|
||||
|
|
@ -127,7 +131,7 @@ def install_kmp_shared(inputfile, online=False):
|
|||
check_keyman_dir('/usr/local/share/doc', "You do not have permissions to install the documentation to the shared documentation area /usr/local/share/doc/keyman")
|
||||
check_keyman_dir('/usr/local/share/fonts', "You do not have permissions to install the font files to the shared font area /usr/local/share/fonts")
|
||||
|
||||
packageID, ext = os.path.splitext(os.path.basename(inputfile))
|
||||
packageID = extract_package_id(inputfile)
|
||||
packageDir = os.path.join('/usr/local/share/keyman', packageID)
|
||||
kmpdocdir = os.path.join('/usr/local/share/doc/keyman', packageID)
|
||||
kmpfontdir = os.path.join('/usr/local/share/fonts/keyman', packageID)
|
||||
|
|
@ -173,10 +177,17 @@ def install_kmp_shared(inputfile, online=False):
|
|||
name, ext = os.path.splitext(f['name'])
|
||||
ldmlfile = os.path.join(packageDir, name+".ldml")
|
||||
output_ldml(ldmlfile, ldml)
|
||||
# Special handling of icon to convert to PNG
|
||||
elif ftype == KMFileTypes.KM_ICON:
|
||||
# Special handling of icon to convert to PNG
|
||||
logging.info("Converting %s to PNG and installing both as keyman files", f['name'])
|
||||
checkandsaveico(fpath)
|
||||
elif ftype == KMFileTypes.KM_KMX:
|
||||
# Sanitize keyboard filename if not lower case
|
||||
kmx_id, ext = os.path.splitext(os.path.basename(f['name']))
|
||||
for kb in keyboards:
|
||||
if kmx_id.lower() == kb['id'] and kmx_id != kb['id']:
|
||||
os.rename(os.path.join(packageDir, f['name']), os.path.join(packageDir, kb['id']+'.kmx'))
|
||||
|
||||
for kb in keyboards:
|
||||
# install all kmx for first lang not just packageID
|
||||
kmx_file = os.path.join(packageDir, kb['id'] + ".kmx")
|
||||
|
|
@ -191,7 +202,7 @@ def install_kmp_shared(inputfile, online=False):
|
|||
raise InstallError(InstallStatus.Abort, message)
|
||||
|
||||
def install_kmp_user(inputfile, online=False):
|
||||
packageID, ext = os.path.splitext(os.path.basename(inputfile))
|
||||
packageID = extract_package_id(inputfile)
|
||||
packageDir=user_keyboard_dir(packageID)
|
||||
if not os.path.isdir(packageDir):
|
||||
os.makedirs(packageDir)
|
||||
|
|
@ -234,6 +245,13 @@ def install_kmp_user(inputfile, online=False):
|
|||
elif ftype == KMFileTypes.KM_SOURCE:
|
||||
#TODO for the moment just leave it for ibus-kmfl to ignore if it doesn't load
|
||||
pass
|
||||
elif ftype == KMFileTypes.KM_KMX:
|
||||
# Sanitize keyboard filename if not lower case
|
||||
kmx_id, ext = os.path.splitext(os.path.basename(f['name']))
|
||||
for kb in keyboards:
|
||||
if kmx_id.lower() == kb['id'] and kmx_id != kb['id']:
|
||||
os.rename(os.path.join(packageDir, f['name']), os.path.join(packageDir, kb['id']+'.kmx'))
|
||||
|
||||
install_keyboards_to_ibus(keyboards, packageDir)
|
||||
else:
|
||||
logging.error("install_kmp.py: error: No kmp.json or kmp.inf found in %s", inputfile)
|
||||
|
|
|
|||
|
|
@ -23,8 +23,9 @@ if [[ -z "${TIER}" ]]; then
|
|||
# This is the tier that the latest version is currently found on
|
||||
# This should be changed to stable before the first stable build
|
||||
# In master branch this should be alpha and the debian/watch files should check alpha dir
|
||||
tier="beta"
|
||||
# tier="stable"
|
||||
# tier="alpha"
|
||||
# tier="beta"
|
||||
tier="stable"
|
||||
else
|
||||
tier="${TIER}"
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -522,8 +522,8 @@
|
|||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 989C9C251A7876DE00A20425 /* Build configuration list for PBXNativeTarget "Keyman" */;
|
||||
buildPhases = (
|
||||
9A5A4B1321F78E0100B31301 /* Assert version number same as git branch */,
|
||||
D2FF67BB6C749BA6861F5E25 /* [CP] Check Pods Manifest.lock */,
|
||||
9A5A4B1321F78E0100B31301 /* Assert version number same as git branch */,
|
||||
E2588F2E1F2644850061C9C4 /* Run Script */,
|
||||
989C9C041A7876DE00A20425 /* Sources */,
|
||||
989C9C051A7876DE00A20425 /* Frameworks */,
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@
|
|||
<key>LSMinimumSystemVersion</key>
|
||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>$(COPYRIGHT_STRING_RIGHTS)</string>
|
||||
<string>$(COPYRIGHT_STRING)</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
|
|
|
|||
|
|
@ -14,6 +14,9 @@
|
|||
@property (nonatomic, weak) IBOutlet NSTextField *versionLabel;
|
||||
@property (nonatomic, weak) IBOutlet NSTextField *copyrightLabel;
|
||||
@property (nonatomic, weak) IBOutlet NSButton *licenseButton;
|
||||
// not needed at the moment but might be:
|
||||
@property (nonatomic, weak) IBOutlet NSButton *closeButton;
|
||||
@property (nonatomic, weak) IBOutlet NSButton *configureButton;
|
||||
@end
|
||||
|
||||
@implementation KMAboutWindowController
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<window title="KeymanMac" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" animationBehavior="default" id="F0z-JX-Cv5" customClass="KMAboutWindow">
|
||||
<window title="KeymanMac" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" animationBehavior="default" id="F0z-JX-Cv5" customClass="KMAboutWindow">
|
||||
<windowStyleMask key="styleMask" closable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="196" y="240" width="450" height="318"/>
|
||||
|
|
@ -41,36 +41,23 @@
|
|||
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="7" id="vyH-ga-e1G"/>
|
||||
</constraints>
|
||||
</customView>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="i8D-2n-KYh">
|
||||
<rect key="frame" x="20" y="60" width="89" height="19"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="19" id="si0-WI-zp7"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="roundRect" title="License Agreement" bezelStyle="roundedRect" alignment="left" controlSize="mini" state="on" imageScaling="proportionallyDown" inset="2" id="hYC-Bx-aoP">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="miniSystem"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="licenseAction:" target="-2" id="DOO-Wo-6Sv"/>
|
||||
</connections>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ln9-LY-e8d">
|
||||
<rect key="frame" x="20" y="35" width="256" height="15"/>
|
||||
<rect key="frame" x="20" y="37" width="256" height="15"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="15" id="Eps-Mv-cM9"/>
|
||||
<constraint firstAttribute="height" constant="15" id="G4Q-fU-0ZT"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Version 1.0.100" id="69w-EI-e3y">
|
||||
<font key="font" metaFont="miniSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="textColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IcZ-9F-kwH">
|
||||
<rect key="frame" x="20" y="20" width="80" height="11"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Copyright ©2018" id="fjZ-Vg-DtW">
|
||||
<rect key="frame" x="20" y="20" width="256" height="11"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Copyright ©2017-2019" id="fjZ-Vg-DtW">
|
||||
<font key="font" metaFont="miniSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="textColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="sgd-KC-LbG">
|
||||
|
|
@ -78,29 +65,31 @@
|
|||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="SILInBlue76" id="0zb-i2-bhN"/>
|
||||
</imageView>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XIT-T3-xre">
|
||||
<rect key="frame" x="390" y="19" width="50" height="19"/>
|
||||
<rect key="frame" x="390" y="20" width="50" height="18"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="18" id="CPF-NR-u5o"/>
|
||||
<constraint firstAttribute="width" constant="50" id="DAH-lD-hjp"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="roundRect" title="Close" bezelStyle="roundedRect" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Kab-Up-fYH">
|
||||
<buttonCell key="cell" type="roundRect" title="Close" bezelStyle="roundedRect" alignment="center" state="on" imageScaling="proportionallyDown" inset="2" id="Kab-Up-fYH">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
</buttonCell>
|
||||
<color key="contentTintColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<connections>
|
||||
<action selector="closeAction:" target="-2" id="frJ-pm-Iyg"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xqc-bi-pPI">
|
||||
<rect key="frame" x="282" y="19" width="100" height="19"/>
|
||||
<rect key="frame" x="282" y="20" width="100" height="18"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="18" id="W0C-Lh-ns5"/>
|
||||
<constraint firstAttribute="width" constant="100" id="l3A-K7-gqm"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="roundRect" title="Configuration" bezelStyle="roundedRect" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="vkh-b5-vO7">
|
||||
<buttonCell key="cell" type="roundRect" title="Configuration" bezelStyle="roundedRect" alignment="center" state="on" imageScaling="proportionallyDown" inset="2" id="vkh-b5-vO7">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
</buttonCell>
|
||||
<color key="contentTintColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<connections>
|
||||
<action selector="configAction:" target="-2" id="3W6-cm-6P5"/>
|
||||
</connections>
|
||||
|
|
@ -112,39 +101,53 @@
|
|||
</constraints>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageAlignment="left" imageScaling="proportionallyUpOrDown" image="keyman-88" id="4mp-20-rlf"/>
|
||||
</imageView>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="i8D-2n-KYh">
|
||||
<rect key="frame" x="20" y="62" width="89" height="19"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="19" id="f6Q-Hd-Y7v"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="roundRect" title="License Agreement" bezelStyle="roundedRect" alignment="left" controlSize="mini" state="on" imageScaling="proportionallyDown" inset="2" id="hYC-Bx-aoP">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="miniSystem"/>
|
||||
</buttonCell>
|
||||
<color key="contentTintColor" name="linkColor" catalog="System" colorSpace="catalog"/>
|
||||
<connections>
|
||||
<action selector="licenseAction:" target="-2" id="DOO-Wo-6Sv"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="IcZ-9F-kwH" firstAttribute="top" secondItem="ln9-LY-e8d" secondAttribute="bottom" priority="750" constant="4" id="34l-hR-vnD"/>
|
||||
<constraint firstItem="ln9-LY-e8d" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="22" id="0Ka-HE-KQP"/>
|
||||
<constraint firstAttribute="trailing" secondItem="wFc-QI-nGq" secondAttribute="trailing" id="3IX-BW-75e"/>
|
||||
<constraint firstItem="FYn-ZH-f76" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="4Pt-4T-0oy"/>
|
||||
<constraint firstAttribute="bottom" secondItem="XIT-T3-xre" secondAttribute="bottom" constant="20" id="4Yp-Kh-DkL"/>
|
||||
<constraint firstItem="wFc-QI-nGq" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="5wh-lg-tMG"/>
|
||||
<constraint firstItem="sgd-KC-LbG" firstAttribute="centerY" secondItem="UOr-Co-IuK" secondAttribute="centerY" id="6m8-lC-irl"/>
|
||||
<constraint firstAttribute="bottom" secondItem="IcZ-9F-kwH" secondAttribute="bottom" constant="20" symbolic="YES" id="7Ws-Q0-kt9"/>
|
||||
<constraint firstItem="xqc-bi-pPI" firstAttribute="leading" secondItem="IcZ-9F-kwH" secondAttribute="trailing" priority="250" constant="8" symbolic="YES" id="8hY-Hr-7J0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="FYn-ZH-f76" secondAttribute="trailing" id="A7I-Rh-hkf"/>
|
||||
<constraint firstAttribute="bottom" secondItem="FYn-ZH-f76" secondAttribute="bottom" priority="750" constant="93" id="L7A-L6-Rcz"/>
|
||||
<constraint firstItem="i8D-2n-KYh" firstAttribute="top" secondItem="FYn-ZH-f76" secondAttribute="bottom" constant="16" id="M00-mR-yMk"/>
|
||||
<constraint firstItem="xqc-bi-pPI" firstAttribute="leading" secondItem="IcZ-9F-kwH" secondAttribute="trailing" constant="8" symbolic="YES" id="FM1-dK-Ex8"/>
|
||||
<constraint firstItem="i8D-2n-KYh" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="20" symbolic="YES" id="Hlq-gA-2d5"/>
|
||||
<constraint firstItem="IcZ-9F-kwH" firstAttribute="bottom" secondItem="xqc-bi-pPI" secondAttribute="bottom" id="Kz8-go-bM4"/>
|
||||
<constraint firstAttribute="bottom" secondItem="FYn-ZH-f76" secondAttribute="bottom" priority="750" constant="95" id="L7A-L6-Rcz"/>
|
||||
<constraint firstItem="UOr-Co-IuK" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" constant="8" id="Ovf-6T-VEs"/>
|
||||
<constraint firstItem="UOr-Co-IuK" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="15" id="Wq2-xT-mCh"/>
|
||||
<constraint firstItem="XIT-T3-xre" firstAttribute="leading" secondItem="xqc-bi-pPI" secondAttribute="trailing" constant="8" symbolic="YES" id="Xu7-qs-jYd"/>
|
||||
<constraint firstItem="ln9-LY-e8d" firstAttribute="leading" secondItem="i8D-2n-KYh" secondAttribute="leading" constant="2" id="YgZ-NC-0Za"/>
|
||||
<constraint firstItem="wFc-QI-nGq" firstAttribute="top" secondItem="UOr-Co-IuK" secondAttribute="bottom" id="ZZw-D6-rjh"/>
|
||||
<constraint firstItem="XIT-T3-xre" firstAttribute="bottom" secondItem="xqc-bi-pPI" secondAttribute="bottom" id="cSa-p4-Xov"/>
|
||||
<constraint firstItem="xqc-bi-pPI" firstAttribute="leading" secondItem="ln9-LY-e8d" secondAttribute="trailing" priority="750" constant="8" symbolic="YES" id="ey1-4k-Pht"/>
|
||||
<constraint firstItem="i8D-2n-KYh" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="20" symbolic="YES" id="hLb-9t-eDw"/>
|
||||
<constraint firstItem="ln9-LY-e8d" firstAttribute="trailing" secondItem="IcZ-9F-kwH" secondAttribute="trailing" id="dyb-wg-u34"/>
|
||||
<constraint firstItem="IcZ-9F-kwH" firstAttribute="top" secondItem="ln9-LY-e8d" secondAttribute="bottom" constant="6" id="enO-bO-PxF"/>
|
||||
<constraint firstItem="ln9-LY-e8d" firstAttribute="top" secondItem="i8D-2n-KYh" secondAttribute="bottom" constant="10" id="ifk-FX-W2G"/>
|
||||
<constraint firstItem="FYn-ZH-f76" firstAttribute="top" secondItem="wFc-QI-nGq" secondAttribute="bottom" id="kuI-RR-4wa"/>
|
||||
<constraint firstItem="i8D-2n-KYh" firstAttribute="top" secondItem="FYn-ZH-f76" secondAttribute="bottom" constant="14" id="n5K-FQ-XsJ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="XIT-T3-xre" secondAttribute="trailing" constant="10" id="pJs-ap-Bgn"/>
|
||||
<constraint firstItem="IcZ-9F-kwH" firstAttribute="leading" secondItem="ln9-LY-e8d" secondAttribute="leading" id="q3g-Rz-0gh"/>
|
||||
<constraint firstAttribute="trailing" secondItem="sgd-KC-LbG" secondAttribute="trailing" constant="15" id="xGg-Cj-G34"/>
|
||||
<constraint firstItem="ln9-LY-e8d" firstAttribute="leading" secondItem="IcZ-9F-kwH" secondAttribute="leading" id="xJt-fZ-7VH"/>
|
||||
<constraint firstAttribute="bottom" secondItem="xqc-bi-pPI" secondAttribute="bottom" constant="20" id="ysa-9B-9Vg"/>
|
||||
<constraint firstItem="ln9-LY-e8d" firstAttribute="top" secondItem="i8D-2n-KYh" secondAttribute="bottom" constant="10" id="znF-Zd-vGG"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="132" y="133"/>
|
||||
<point key="canvasLocation" x="31" y="126"/>
|
||||
</window>
|
||||
</objects>
|
||||
<resources>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,15 @@
|
|||
# Keyman for macOS Version History
|
||||
|
||||
## 12.0 alpha
|
||||
* Started work on Keyman for macOS 12.
|
||||
|
||||
## 2019-02-25 11.0.220 stable
|
||||
* 11.0 Stable release
|
||||
|
||||
## 2019-02-20 11.0.201 beta
|
||||
* Update version strings to 11.0.0 (#1583)
|
||||
* Workaround bug in macOS 10.13.1-10.13.3 which caused preferences dialog to fail to appear (#1447)
|
||||
* Fix broken About dialog (#1594)
|
||||
|
||||
## 2019-01-02 11.0.200 beta
|
||||
* Initial beta release of Keyman for macOS 11
|
||||
|
|
|
|||
|
|
@ -8,16 +8,31 @@
|
|||
* Centralizes code paths to improve parity between hardware and OSK-based keystrokes.
|
||||
* In both cases above, significant unit testing was facilitated and has been added as a result, further improving code maintainability into the future.
|
||||
|
||||
## 2019-02-25 11.0.220 stable
|
||||
* 11.0 Stable release
|
||||
|
||||
## 2019-02-25 11.0.208 beta
|
||||
* KeymanWeb now works again in Safari on iOS 9.3.5 (#1588)
|
||||
|
||||
## 2019-01-18 11.0.206 beta
|
||||
* Change: Update beta version and remove hardcoded version strings (#1537)
|
||||
|
||||
## 2019-01-17 11.0.205 beta
|
||||
* New Feature: The `displayUnderlying` flag for showing base layout key caps is now available per-platform. (#1539)
|
||||
* Bug Fix: Fix missing text on spacebar and update Karma version (#1540)
|
||||
|
||||
## 2019-01-15 11.0.204 beta
|
||||
* No changes
|
||||
|
||||
## 2019-01-11 11.0.203 beta
|
||||
* Add default mapping for K_oE2 (102nd key) (#1491)
|
||||
|
||||
## 2019-01-04 11.0.202 beta
|
||||
* Bug Fix:
|
||||
* Fixed external keyboard keys "tab" and "backspace" for embedded platforms (#1474)
|
||||
* Bug Fix: Fixed external keyboard keys "tab" and "backspace" for embedded platforms (#1474)
|
||||
|
||||
## 2019-01-03 11.0.201 beta
|
||||
* New Feature:
|
||||
* Adds the alignInputs() API function to facilitate touch-alias element work-arounds in case of future issues. (#69)
|
||||
|
||||
* Bug Fix:
|
||||
* Fixed keyboard layer transition bug on mobile devices. (#978)
|
||||
* New Feature: Adds the alignInputs() API function to facilitate touch-alias element work-arounds in case of future issues. (#69)
|
||||
* Bug Fix: Fixed keyboard layer transition bug on mobile devices. (#978)
|
||||
|
||||
## 2019-01-02 11.0.200 beta
|
||||
* Initial beta release of KeymanWeb 11
|
||||
|
|
|
|||
|
|
@ -1,10 +1,29 @@
|
|||
# Keyman Desktop Version History
|
||||
|
||||
## 12.0 alpha
|
||||
* Started work on Keyman Desktop 12.
|
||||
|
||||
## 2019-02-13 11.0.1308.0 beta
|
||||
## 2019-02-25 11.0.1350.0 stable
|
||||
* 11.0 Stable release
|
||||
|
||||
## 2019-02-25 11.0.1313.0 beta
|
||||
* Bug Fix: AltGr causes sticky Left Control when some Windows European layouts are installed. (#1621)
|
||||
|
||||
## 2019-02-21 11.0.1312.0 beta
|
||||
* Bug Fix: Make sure backspace in Word (TSF) deletes both halves of surrogate pair for supplementary multilingual plane scripts (#1603)
|
||||
|
||||
## 2019-02-20 11.0.1311.0 beta
|
||||
* Minor tweaks to Kannada localization (#1598)
|
||||
|
||||
## 2019-02-19 11.0.1310.0 beta
|
||||
* No changes to Keyman Desktop
|
||||
|
||||
## 2019-02-15 11.0.1309.0 beta
|
||||
* Bug Fix: Upgrading from 9.0 to 11.0 did not preserve keyboards and settings (#1548)
|
||||
|
||||
## 2019-02-14 11.0.1308.0 beta
|
||||
* No changes to Keyman Desktop
|
||||
|
||||
## 2019-02-01 11.0.1307.0 beta
|
||||
* No changes to Keyman Desktop
|
||||
|
||||
|
|
|
|||
|
|
@ -1,15 +1,34 @@
|
|||
# Keyman Developer Version History
|
||||
|
||||
## 12.0 alpha
|
||||
* Started work on Keyman Developer 12.
|
||||
|
||||
## 2019-02-14 11.0.1308.0 beta
|
||||
* Change: Adds option to check filename conventions (#1549)
|
||||
## 2019-02-25 11.0.1350.0 stable
|
||||
* 11.0 Stable release
|
||||
|
||||
## 2019-02-25 11.0.1313.0 beta
|
||||
* No changes to Keyman Developer
|
||||
|
||||
## 2019-02-21 11.0.1312.0 beta
|
||||
* Bug fix: Connect buttons to actions in Distribution tab in Project (#1606)
|
||||
* Bug fix: Fix crash saving new keyboard when missing files are referenced (#1605)
|
||||
* Bug fix: Fix resizing of text editor windows (#1607)
|
||||
|
||||
## 2019-02-20 11.0.1311.0 beta
|
||||
* No changes to Keyman Developer
|
||||
|
||||
## 2019-02-19 11.0.1310.0 beta
|
||||
* Bug fix: Developer does not focus the text editor automatically after load (#1582)
|
||||
|
||||
## 2019-02-15 11.0.1309.0 beta
|
||||
* Bug fix: Developer was not maintaining project state between page loads (#1580)
|
||||
* Bug fix: Developer now maintains the view state when switching between Design and Code views of touch layout editor (#1579)
|
||||
* Bug fix: New Project Wizard wasn't adding metadata files to project (#1578)
|
||||
* Bug Fix: Package RTL keyboard metadata was being overwritten if .kmx was after .js in package file list (#1576)
|
||||
|
||||
## 2019-02-14 11.0.1308.0 beta
|
||||
* Change: Adds option to check filename conventions (#1549)
|
||||
|
||||
## 2019-02-01 11.0.1307.0 beta
|
||||
* Change: Removed unused test window (#1560)
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
<map value="0x4" message="$(string.Map.LALT)"/>
|
||||
<map value="0x5" message="$(string.Map.LCTRL_LALT)"/>
|
||||
<map value="0x8" message="$(string.Map.RALT)"/>
|
||||
<map value="0x9" message="$(string.Map.LCTRL_RALT)"/> <!-- Because Windows simulates this for AltGr in European keyboards -->
|
||||
<map value="0xA" message="$(string.Map.RCTRL_RALT)"/>
|
||||
|
||||
<map value="0x10" message="$(string.Map.SHIFT)"/>
|
||||
|
|
@ -210,6 +211,7 @@
|
|||
<string id="Map.RCTRL" value="RCTRL" />
|
||||
<string id="Map.LALT" value="LALT" />
|
||||
<string id="Map.LCTRL_LALT" value="LCTRL+LALT" />
|
||||
<string id="Map.LCTRL_RALT" value="LCTRL+RALT" />
|
||||
<string id="Map.RALT" value="RALT" />
|
||||
<string id="Map.RCTRL_RALT" value="RCTRL+RALT" />
|
||||
|
||||
|
|
|
|||
|
|
@ -415,23 +415,90 @@ private:
|
|||
*/
|
||||
|
||||
if (msg == wm_keyman_keyevent && flag_ShouldSerializeInput /*&& _td->lpActiveKeyboard*/) {
|
||||
INPUT input;
|
||||
input.type = INPUT_KEYBOARD;
|
||||
input.ki.wVk = (WORD)wParam;
|
||||
input.ki.wScan = (lParam & 0xFF0000) >> 16;
|
||||
input.ki.time = GetMessageTime();
|
||||
input.ki.dwExtraInfo = EXTRAINFO_FLAG_SERIALIZED_USER_KEY_EVENT;
|
||||
input.ki.dwFlags = lParam & 0xFFFF;
|
||||
|
||||
if (!SendInput(1, &input, sizeof(INPUT))) {
|
||||
DebugLastError("SendInput");
|
||||
if (wParam == VK_RMENU && (lParam & (KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP)) == (KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP) && GetKeyState(VK_LCONTROL) < 0) {
|
||||
/*
|
||||
When Windows has a European layout that uses AltGr installed, it can emit an additional LCtrl down via software
|
||||
when RAlt is pressed. However, the corresponding LCtrl up is never received, seemingly because when Keyman
|
||||
re-emits the LCtrl+RAlt, there are subtle differences in the event flags which we cannot duplicate -- specifically
|
||||
the flag that emits WM_SYSKEYDOWN for the VK_LCONTROL, even though it is received before the VK_RALT event. It
|
||||
appears that Windows figures this out by giving this VK_LCONTROL the scan code 0x21D instead of 0x1D. But we
|
||||
are unable to emit that scan code: Windows truncates the scan code sent through SendInput so that we can only
|
||||
send 0x1D.
|
||||
|
||||
So we simulate the release of the Left Control key ourselves when the release of the Right Alt is received,
|
||||
using VK_CONTROL and scan 0x1D, and hope for the best.
|
||||
|
||||
The full Windows sequence is:
|
||||
|
||||
WM_SYSKEYDOWN VK_CONTROL 0x21D
|
||||
WM_SYSKEYDOWN VK_MENU 0x38 EXTENDED_BIT
|
||||
...
|
||||
WM_KEYUP VK_CONTROL 0x21D
|
||||
WM_KEYUP VK_MENU 0x38 EXTENDED_BIT
|
||||
|
||||
The best Keyman can do is:
|
||||
|
||||
WM_KEYDOWN VK_CONTROL 0x1D
|
||||
WM_KEYDOWN VK_MENU 0x38 EXTENDED_BIT
|
||||
...
|
||||
WM_KEYUP VK_CONTROL 0x1D
|
||||
WM_KEYUP VK_MENU 0x38 EXTENDED_BIT
|
||||
|
||||
There is a possibility that some apps may try and sniff that 0x21D scan code and get confused because Keyman
|
||||
doesn't emit it. Hopefully this is rare.
|
||||
*/
|
||||
INPUT input[2];
|
||||
input[0].type = INPUT_KEYBOARD;
|
||||
input[0].ki.wVk = VK_CONTROL;
|
||||
input[0].ki.wScan = 0x21D; // Yeah, Windows chops this to 0x1D. Such is life.
|
||||
input[0].ki.time = GetMessageTime();
|
||||
input[0].ki.dwExtraInfo = EXTRAINFO_FLAG_SERIALIZED_USER_KEY_EVENT;
|
||||
input[0].ki.dwFlags = KEYEVENTF_KEYUP;
|
||||
|
||||
input[1].type = INPUT_KEYBOARD;
|
||||
input[1].ki.wVk = (WORD)wParam;
|
||||
input[1].ki.wScan = (lParam & 0xFFF0000) >> 16;
|
||||
input[1].ki.time = GetMessageTime();
|
||||
input[1].ki.dwExtraInfo = EXTRAINFO_FLAG_SERIALIZED_USER_KEY_EVENT;
|
||||
input[1].ki.dwFlags = lParam & 0xFFFF;
|
||||
|
||||
if (!SendInput(2, input, sizeof(INPUT))) {
|
||||
DebugLastError("SendInput");
|
||||
}
|
||||
|
||||
UpdateLocalModifierState(
|
||||
(BYTE)input[0].ki.wVk,
|
||||
input[0].ki.dwFlags & KEYEVENTF_EXTENDEDKEY ? TRUE : FALSE,
|
||||
(BYTE)input[0].ki.wScan,
|
||||
input[0].ki.dwFlags & KEYEVENTF_KEYUP ? TRUE : FALSE);
|
||||
|
||||
UpdateLocalModifierState(
|
||||
(BYTE)input[1].ki.wVk,
|
||||
input[1].ki.dwFlags & KEYEVENTF_EXTENDEDKEY ? TRUE : FALSE,
|
||||
(BYTE)input[1].ki.wScan,
|
||||
input[1].ki.dwFlags & KEYEVENTF_KEYUP ? TRUE : FALSE);
|
||||
}
|
||||
else {
|
||||
INPUT input;
|
||||
input.type = INPUT_KEYBOARD;
|
||||
input.ki.wVk = (WORD)wParam;
|
||||
input.ki.wScan = (lParam & 0xFFF0000) >> 16;
|
||||
input.ki.time = GetMessageTime();
|
||||
input.ki.dwExtraInfo = EXTRAINFO_FLAG_SERIALIZED_USER_KEY_EVENT;
|
||||
input.ki.dwFlags = lParam & 0xFFFF;
|
||||
|
||||
if (!SendInput(1, &input, sizeof(INPUT))) {
|
||||
DebugLastError("SendInput");
|
||||
}
|
||||
|
||||
UpdateLocalModifierState(
|
||||
(BYTE)input.ki.wVk,
|
||||
input.ki.dwFlags & KEYEVENTF_EXTENDEDKEY ? TRUE : FALSE,
|
||||
(BYTE)input.ki.wScan,
|
||||
input.ki.dwFlags & KEYEVENTF_KEYUP ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
UpdateLocalModifierState(
|
||||
(BYTE) input.ki.wVk,
|
||||
input.ki.dwFlags & KEYEVENTF_EXTENDEDKEY ? TRUE : FALSE,
|
||||
(BYTE) input.ki.wScan,
|
||||
input.ki.dwFlags & KEYEVENTF_KEYUP ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
return DefWindowProc(hwnd, msg, wParam, lParam);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue