From d7c88b6bae65d1519ca5d5b99c96df05a8bf04ca Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 13 Aug 2026 11:34:46 +0200 Subject: [PATCH] fix(windows): support .png format icon in tray icon Fixes: KEYMAN-WINDOWS-3CT Fixes: #12905 --- windows/src/engine/keyman/UfrmKeyman7Main.pas | 31 ++++++++++--- .../keyman/langswitch/LangSwitchManager.pas | 15 +++++++ .../src/test/manual-tests/png-icon/README.md | 6 +++ .../test/manual-tests/png-icon/pngicon.kpj | 8 ++++ .../manual-tests/png-icon/source/pngicon.ico | Bin 0 -> 27952 bytes .../manual-tests/png-icon/source/pngicon.kmn | 12 +++++ .../manual-tests/png-icon/source/pngicon.kps | 41 ++++++++++++++++++ 7 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 windows/src/test/manual-tests/png-icon/README.md create mode 100644 windows/src/test/manual-tests/png-icon/pngicon.kpj create mode 100644 windows/src/test/manual-tests/png-icon/source/pngicon.ico create mode 100644 windows/src/test/manual-tests/png-icon/source/pngicon.kmn create mode 100644 windows/src/test/manual-tests/png-icon/source/pngicon.kps diff --git a/windows/src/engine/keyman/UfrmKeyman7Main.pas b/windows/src/engine/keyman/UfrmKeyman7Main.pas index 8fdb620318..5154dc90db 100644 --- a/windows/src/engine/keyman/UfrmKeyman7Main.pas +++ b/windows/src/engine/keyman/UfrmKeyman7Main.pas @@ -1227,16 +1227,35 @@ end; procedure TfrmKeyman7Main.SetTrayIcon(rp: TRunningProduct; kbd: IKeymanKeyboardInstalled); var cust: IKeymanCustomisation; - bb: IPicture; - h: OLE_HANDLE; + lskbd: TLangSwitchKeyboard; + icon: TIcon; begin if Assigned(rp) then begin - bb := kbd.Bitmap; - if Assigned(bb) then + lskbd := LangSwitchManager.FindKeyboardByKeymanID(kbd.KeymanID); + if Assigned(lskbd) and (lskbd is TLangSwitchKeyboard_TIP) then + try + icon := TIcon.Create; + try + icon.Handle := (lskbd as TLangSwitchKeyboard_TIP).IconHandle; + rp.FTrayIcon.Icon.Assign(icon); + icon.ReleaseHandle; + finally + icon.Free; + end; + except + on E:Exception do + begin + // #12905: icon is otherwise invalid + TKeymanSentryClient.ReportHandledException(E, 'SetTrayIcon: Invalid icon for keyboard "'+kbd.ID+'"; icon filename "'+kbd.IconFilename+'"'); + // Use the default app icon + rp.FTrayIcon.Icon.Assign(FTrayIcon); + end; + end + else begin - bb.get_Handle(h); - rp.FTrayIcon.Icon.Handle := CopyIcon(h); + // Use the default app icon + rp.FTrayIcon.Icon.Assign(FTrayIcon); end; if VisualKeyboardVisible then diff --git a/windows/src/engine/keyman/langswitch/LangSwitchManager.pas b/windows/src/engine/keyman/langswitch/LangSwitchManager.pas index e6a800fb1e..a3bcc723b9 100644 --- a/windows/src/engine/keyman/langswitch/LangSwitchManager.pas +++ b/windows/src/engine/keyman/langswitch/LangSwitchManager.pas @@ -186,6 +186,7 @@ type procedure Refresh; function FindKeyboard(FHKL: HKL; FProfileGuid: TGUID): TLangSwitchKeyboard; overload; function FindKeyboard(id: string): TLangSwitchKeyboard; overload; + function FindKeyboardByKeymanID(id: Integer): TLangSwitchKeyboard; overload; property Languages[Index: Integer]: TLangSwitchLanguage read GetLanguage; property LanguageCount: Integer read GetLanguageCount; property TotalKeyboardCount: Integer read GetTotalKeyboardCount; // I4606 @@ -594,6 +595,20 @@ begin Result := nil; end; +function TLangSwitchManager.FindKeyboardByKeymanID( + id: Integer): TLangSwitchKeyboard; +var + lang: TLangSwitchLanguage; + kbd: TLangSwitchKeyboard; +begin + for lang in FLanguages do + for kbd in lang.FKeyboards do + if kbd.KeymanID = id then + Exit(kbd); + + Result := nil; +end; + function TLangSwitchManager.FindKeyboard(FHKL: HKL; FProfileGuid: TGUID): TLangSwitchKeyboard; var diff --git a/windows/src/test/manual-tests/png-icon/README.md b/windows/src/test/manual-tests/png-icon/README.md new file mode 100644 index 0000000000..ab5e87c707 --- /dev/null +++ b/windows/src/test/manual-tests/png-icon/README.md @@ -0,0 +1,6 @@ +# pngicon keyboard + +A keyboard with a PNG format icon - for testing #12905 + +https://github.com/keymanapp/keyman/issues/12905 + diff --git a/windows/src/test/manual-tests/png-icon/pngicon.kpj b/windows/src/test/manual-tests/png-icon/pngicon.kpj new file mode 100644 index 0000000000..d3a678044b --- /dev/null +++ b/windows/src/test/manual-tests/png-icon/pngicon.kpj @@ -0,0 +1,8 @@ + + + + 2.0 + True + True + + diff --git a/windows/src/test/manual-tests/png-icon/source/pngicon.ico b/windows/src/test/manual-tests/png-icon/source/pngicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e65712af282abdd5879879b6a13e6e7f7b96d9ac GIT binary patch literal 27952 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⁡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 use(main) + +group(main) using keys diff --git a/windows/src/test/manual-tests/png-icon/source/pngicon.kps b/windows/src/test/manual-tests/png-icon/source/pngicon.kps new file mode 100644 index 0000000000..373e8276f3 --- /dev/null +++ b/windows/src/test/manual-tests/png-icon/source/pngicon.kps @@ -0,0 +1,41 @@ + + + + 18.0.249.0 + 7.0 + + + + + + + + + + + + + pngicon + Copyright © + + A keyboard with a PNG icon + + + + + ..\build\pngicon.kmx + + 0 + .kmx + + + + + pngicon + + German + + + + +