diff options
109 files changed, 2542 insertions, 1246 deletions
diff --git a/addons/game.controller.default/addon.xml b/addons/game.controller.default/addon.xml index 202881b477..d6a41adcdb 100644 --- a/addons/game.controller.default/addon.xml +++ b/addons/game.controller.default/addon.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="game.controller.default" name="Default Controller" - version="1.0.41" + version="1.0.42" provider-name="Team Kodi"> <extension point="kodi.game.controller" library="resources/layout.xml"/> <extension point="xbmc.addon.metadata"> @@ -9,6 +9,7 @@ <assets> <icon>resources/icon.png</icon> </assets> + <summary lang="af_ZA">Verstek Beheerder</summary> <summary lang="be_BY">Прадвызначаны кантролер</summary> <summary lang="bs_BA">Zadani Džojstik</summary> <summary lang="ca_ES">Comandament per defecte</summary> @@ -41,6 +42,7 @@ <summary lang="tr_TR">Varsayılan Oyun Kumandası</summary> <summary lang="zh_CN">默认控制器</summary> <summary lang="zh_TW">預設控制器</summary> + <description lang="af_ZA">Die bestek media sentrum beheerder is gebaseer op die Xbox 360 beheerder.</description> <description lang="be_BY">Прадвызначаны кантролер на аснове кантролера Xbox 360.</description> <description lang="bs_BA">Zadani džojstik za medijski centar je baziran na Xbox 360 džojstik.</description> <description lang="ca_ES">El comandament predeterminat del centre multimèdia es basa en el comandament d'Xbox 360.</description> @@ -70,6 +72,7 @@ <description lang="tr_TR">Varsayılan ortam merkezi denetleyicisi, Xbox 360 oyun kumandasını temel alır.</description> <description lang="zh_CN">默认媒体中心控制器基于 Xbox 360 控制器。</description> <description lang="zh_TW">預設的媒體中心控制器佈局是以Xbox 360控制器為基礎。</description> + <disclaimer lang="af_ZA">Beeld krediet: Wikipedia (wikipedia.org)</disclaimer> <disclaimer lang="be_BY">Крыніца выяў: Wikipedia (wikipedia.org)</disclaimer> <disclaimer lang="bs_BA">Zasluga za sliku: Wikipedia (wikipedia.org)</disclaimer> <disclaimer lang="ca_ES">Crèdit de la imatge: Wikipedia (wikipedia.org)</disclaimer> diff --git a/addons/game.controller.default/resources/language/resource.language.af_za/strings.po b/addons/game.controller.default/resources/language/resource.language.af_za/strings.po index d2cc836b2c..c8dd92f163 100644 --- a/addons/game.controller.default/resources/language/resource.language.af_za/strings.po +++ b/addons/game.controller.default/resources/language/resource.language.af_za/strings.po @@ -5,49 +5,49 @@ msgid "" msgstr "" "Project-Id-Version: KODI Main\n" -"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"Report-Msgid-Bugs-To: translations@kodi.tv\n" "POT-Creation-Date: 2014-05-30 17:00+8\n" -"PO-Revision-Date: 2021-05-20 16:49+0000\n" -"Last-Translator: Christian Gade <gade@kodi.tv>\n" +"PO-Revision-Date: 2024-01-15 01:17+0000\n" +"Last-Translator: Heiko Berner <berner.h@gmail.com>\n" "Language-Team: Afrikaans (South Africa) <https://kodi.weblate.cloud/projects/kodi-core/game-controller-default/af_za/>\n" "Language: af_za\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.6.2\n" +"X-Generator: Weblate 5.3\n" msgctxt "Addon Summary" msgid "Default Controller" -msgstr "" +msgstr "Verstek Beheerder" msgctxt "Addon Description" msgid "The default media center controller is based on the Xbox 360 controller." -msgstr "" +msgstr "Die bestek media sentrum beheerder is gebaseer op die Xbox 360 beheerder." msgctxt "Addon Disclaimer" msgid "Image credit: Wikipedia (wikipedia.org)" -msgstr "" +msgstr "Beeld krediet: Wikipedia (wikipedia.org)" msgctxt "#30000" msgid "Kodi" -msgstr "" +msgstr "Kodi" msgctxt "#30001" msgid "A" -msgstr "" +msgstr "A" msgctxt "#30002" msgid "B" -msgstr "" +msgstr "B" msgctxt "#30003" msgid "X" -msgstr "" +msgstr "X" msgctxt "#30004" msgid "Y" -msgstr "" +msgstr "Y" msgctxt "#30005" msgid "Start" @@ -63,40 +63,40 @@ msgstr "Gids" msgctxt "#30008" msgid "Left Stick" -msgstr "" +msgstr "Linker Stok" msgctxt "#30009" msgid "Right Stick" -msgstr "" +msgstr "Regter Stok" msgctxt "#30010" msgid "Up" -msgstr "" +msgstr "Op" msgctxt "#30011" msgid "Down" -msgstr "" +msgstr "Af" msgctxt "#30012" msgid "Right" -msgstr "" +msgstr "Regs" msgctxt "#30013" msgid "Left" -msgstr "" +msgstr "Links" msgctxt "#30014" msgid "Left Shoulder" -msgstr "" +msgstr "Linker Skouer" msgctxt "#30015" msgid "Right Shoulder" -msgstr "" +msgstr "Regter Skouer" msgctxt "#30016" msgid "Left Trigger" -msgstr "" +msgstr "Linker Sneller" msgctxt "#30017" msgid "Right Trigger" -msgstr "" +msgstr "Regter Sneller" diff --git a/addons/game.controller.keyboard/addon.xml b/addons/game.controller.keyboard/addon.xml index eed3e7cd1d..ff0533f16d 100644 --- a/addons/game.controller.keyboard/addon.xml +++ b/addons/game.controller.keyboard/addon.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="game.controller.keyboard" name="IBM Model M Keyboard" - version="1.1.33" + version="1.1.40" provider-name="Team Kodi"> <extension point="kodi.game.controller" library="resources/layout.xml"/> <extension point="xbmc.addon.metadata"> diff --git a/addons/game.controller.keyboard/resources/language/resource.language.af_za/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.af_za/strings.po index 5937a4dd94..00d3506b60 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.af_za/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.af_za/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.am_et/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.am_et/strings.po index b706bc5107..a96fa3b74b 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.am_et/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.am_et/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ar_sa/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ar_sa/strings.po index e2aaf23704..4895f59e5b 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ar_sa/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ar_sa/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ast_es/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ast_es/strings.po index 44f29fa6b4..ab8d602dca 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ast_es/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ast_es/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.az_az/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.az_az/strings.po index 769af455b5..0b7aed5424 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.az_az/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.az_az/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.be_by/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.be_by/strings.po index 2005f8bae0..eefcb41fb9 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.be_by/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.be_by/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.bg_bg/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.bg_bg/strings.po index 1fc61c8557..eeb73ce9a5 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.bg_bg/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.bg_bg/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.bs_ba/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.bs_ba/strings.po index bf1db31f95..d7efb5031f 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.bs_ba/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.bs_ba/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ca_es/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ca_es/strings.po index 4e32574309..9363c280d6 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ca_es/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ca_es/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.cs_cz/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.cs_cz/strings.po index 9901e6770d..7b6523f3ac 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.cs_cz/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.cs_cz/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.cy_gb/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.cy_gb/strings.po index 0d748ae9e7..3a1db1005e 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.cy_gb/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.cy_gb/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.da_dk/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.da_dk/strings.po index 66c6129ce6..b33fe12571 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.da_dk/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.da_dk/strings.po @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "Højre Meta" msgctxt "#30108" -msgid "Left Super" -msgstr "Venstre Super" +msgid "Left Windows" +msgstr "" msgctxt "#30109" -msgid "Right Super" -msgstr "Højre Super" +msgid "Right Windows" +msgstr "" msgctxt "#30110" msgid "!" @@ -547,8 +547,8 @@ msgid "~" msgstr "~" msgctxt "#30130" -msgid "Mode" -msgstr "Tilstand" +msgid "Mode/Option" +msgstr "" msgctxt "#30131" msgid "Compose" @@ -583,8 +583,8 @@ msgid "Undo" msgstr "Fortryd" msgctxt "#30139" -msgid "Num Pad Equals" -msgstr "Num Pad =" +msgid "Num Pad =" +msgstr "" msgctxt "#30140" msgid "Clear" @@ -593,3 +593,19 @@ msgstr "Ryd" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30139" +#~ msgid "Num Pad Equals" +#~ msgstr "Num Pad =" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "Venstre Super" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "Højre Super" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Tilstand" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.de_de/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.de_de/strings.po index 481978e361..f80e185178 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.de_de/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.de_de/strings.po @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "Meta rechts" msgctxt "#30108" -msgid "Left Super" -msgstr "Super links" +msgid "Left Windows" +msgstr "" msgctxt "#30109" -msgid "Right Super" -msgstr "Super rechts" +msgid "Right Windows" +msgstr "" msgctxt "#30110" msgid "!" @@ -547,8 +547,8 @@ msgid "~" msgstr "~" msgctxt "#30130" -msgid "Mode" -msgstr "Mode" +msgid "Mode/Option" +msgstr "" msgctxt "#30131" msgid "Compose" @@ -583,8 +583,8 @@ msgid "Undo" msgstr "Undo" msgctxt "#30139" -msgid "Num Pad Equals" -msgstr "Ziffernblock =" +msgid "Num Pad =" +msgstr "" msgctxt "#30140" msgid "Clear" @@ -593,3 +593,19 @@ msgstr "Löschen" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30139" +#~ msgid "Num Pad Equals" +#~ msgstr "Ziffernblock =" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "Super links" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "Super rechts" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Mode" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.el_gr/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.el_gr/strings.po index 9254b722c8..a4fed8a99d 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.el_gr/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.el_gr/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.en_au/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.en_au/strings.po index 6f0c463af1..c6b757cf65 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.en_au/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.en_au/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.en_gb/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.en_gb/strings.po index 1346477145..b5fc35298b 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.en_gb/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.en_gb/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.en_nz/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.en_nz/strings.po index f087ad15f5..8dbb7cc236 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.en_nz/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.en_nz/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.en_us/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.en_us/strings.po index f2506cf98f..469061502b 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.en_us/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.en_us/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.eo/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.eo/strings.po index 277c52bda0..057b25fe5a 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.eo/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.eo/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.es_ar/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.es_ar/strings.po index b8f7085312..c8dd9ad195 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.es_ar/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.es_ar/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.es_es/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.es_es/strings.po index d27decdc7c..e858636623 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.es_es/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.es_es/strings.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: KODI Addons\n" "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" "POT-Creation-Date: 2014-05-30 17:00+8\n" -"PO-Revision-Date: 2023-01-16 22:15+0000\n" +"PO-Revision-Date: 2024-01-19 21:17+0000\n" "Last-Translator: José Antonio Alvarado <jalvarado0.eses@gmail.com>\n" "Language-Team: Spanish (Spain) <https://kodi.weblate.cloud/projects/kodi-add-ons-game/game-controller-keyboard/es_es/>\n" "Language: es_es\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15\n" +"X-Generator: Weblate 5.3\n" msgctxt "Addon Summary" msgid "IBM Model M keyboard" @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "Meta Derecho" msgctxt "#30108" -msgid "Left Super" -msgstr "Súper Izquierdo" +msgid "Left Windows" +msgstr "Ventanas de la izquierda" msgctxt "#30109" -msgid "Right Super" -msgstr "Súper Derecho" +msgid "Right Windows" +msgstr "Ventanas de la derecha" msgctxt "#30110" msgid "!" @@ -547,8 +547,8 @@ msgid "~" msgstr "~" msgctxt "#30130" -msgid "Mode" -msgstr "Modo" +msgid "Mode/Option" +msgstr "Modo/Opción" msgctxt "#30131" msgid "Compose" @@ -583,8 +583,8 @@ msgid "Undo" msgstr "Deshacer" msgctxt "#30139" -msgid "Num Pad Equals" -msgstr "Bloq Num =" +msgid "Num Pad =" +msgstr "" msgctxt "#30140" msgid "Clear" @@ -592,4 +592,20 @@ msgstr "Limpiar" msgctxt "#30141" msgid "OEM 102nd Key" -msgstr "" +msgstr "OEM 102 Teclas" + +#~ msgctxt "#30139" +#~ msgid "Num Pad Equals" +#~ msgstr "Bloq Num =" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "Súper Izquierdo" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "Súper Derecho" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Modo" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.es_mx/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.es_mx/strings.po index 18cc097109..9434e7f25b 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.es_mx/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.es_mx/strings.po @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "Meta Derecho" msgctxt "#30108" -msgid "Left Super" -msgstr "Súper Izquierdo" +msgid "Left Windows" +msgstr "" msgctxt "#30109" -msgid "Right Super" -msgstr "Súper Derecho" +msgid "Right Windows" +msgstr "" msgctxt "#30110" msgid "!" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" @@ -593,3 +593,11 @@ msgstr "" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "Súper Izquierdo" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "Súper Derecho" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.et_ee/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.et_ee/strings.po index b7a03342e7..4a63bec9c4 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.et_ee/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.et_ee/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.eu_es/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.eu_es/strings.po index 6d2eb561df..21871e6ed4 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.eu_es/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.eu_es/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.fa_af/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.fa_af/strings.po index 36b6689cc5..2ee9a49940 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.fa_af/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.fa_af/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.fa_ir/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.fa_ir/strings.po index 89236c7122..c8906b7e45 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.fa_ir/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.fa_ir/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.fi_fi/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.fi_fi/strings.po index 0d7eaf0df5..3882040b1e 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.fi_fi/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.fi_fi/strings.po @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "Oikea Meta" msgctxt "#30108" -msgid "Left Super" -msgstr "Vasen Super" +msgid "Left Windows" +msgstr "" msgctxt "#30109" -msgid "Right Super" -msgstr "Oikea Super" +msgid "Right Windows" +msgstr "" msgctxt "#30110" msgid "!" @@ -547,8 +547,8 @@ msgid "~" msgstr "~" msgctxt "#30130" -msgid "Mode" -msgstr "Mode" +msgid "Mode/Option" +msgstr "" msgctxt "#30131" msgid "Compose" @@ -583,8 +583,8 @@ msgid "Undo" msgstr "Kumoa" msgctxt "#30139" -msgid "Num Pad Equals" -msgstr "Numeronäppäimistön on yhtä kuin" +msgid "Num Pad =" +msgstr "" msgctxt "#30140" msgid "Clear" @@ -593,3 +593,19 @@ msgstr "Clear" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30139" +#~ msgid "Num Pad Equals" +#~ msgstr "Numeronäppäimistön on yhtä kuin" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "Vasen Super" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "Oikea Super" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Mode" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.fo_fo/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.fo_fo/strings.po index df1447794e..c643d4c55e 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.fo_fo/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.fo_fo/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.fr_ca/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.fr_ca/strings.po index 2d958c5776..0d3c2fdf58 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.fr_ca/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.fr_ca/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.fr_fr/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.fr_fr/strings.po index 32a861d89f..637440afff 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.fr_fr/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.fr_fr/strings.po @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "Méta droit" msgctxt "#30108" -msgid "Left Super" -msgstr "Super gauche" +msgid "Left Windows" +msgstr "" msgctxt "#30109" -msgid "Right Super" -msgstr "Super droite" +msgid "Right Windows" +msgstr "" msgctxt "#30110" msgid "!" @@ -547,8 +547,8 @@ msgid "~" msgstr "~" msgctxt "#30130" -msgid "Mode" -msgstr "Mode" +msgid "Mode/Option" +msgstr "" msgctxt "#30131" msgid "Compose" @@ -583,8 +583,8 @@ msgid "Undo" msgstr "Annuler" msgctxt "#30139" -msgid "Num Pad Equals" -msgstr "Pavé Num. Equals" +msgid "Num Pad =" +msgstr "" msgctxt "#30140" msgid "Clear" @@ -593,3 +593,19 @@ msgstr "Clear" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30139" +#~ msgid "Num Pad Equals" +#~ msgstr "Pavé Num. Equals" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "Super gauche" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "Super droite" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Mode" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.gl_es/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.gl_es/strings.po index 6feb20da2f..2c8d9a88a3 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.gl_es/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.gl_es/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.he_il/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.he_il/strings.po index 3a0810c031..997a9d43fb 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.he_il/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.he_il/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.hi_in/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.hi_in/strings.po index e1e04dfa0c..8cab97da7c 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.hi_in/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.hi_in/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.hr_hr/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.hr_hr/strings.po index d0dde31546..0f23c610c2 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.hr_hr/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.hr_hr/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.hu_hu/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.hu_hu/strings.po index 3c704c4f26..7f4b8606f2 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.hu_hu/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.hu_hu/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.hy_am/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.hy_am/strings.po index 5ce37ac2f9..acc5f32db2 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.hy_am/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.hy_am/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.id_id/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.id_id/strings.po index 39f11f5f1d..40cd48070a 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.id_id/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.id_id/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.is_is/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.is_is/strings.po index 087a456492..facfee6e43 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.is_is/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.is_is/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.it_it/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.it_it/strings.po index bc22b3a094..2fd4f761d6 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.it_it/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.it_it/strings.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: KODI Addons\n" "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" "POT-Creation-Date: 2014-05-30 17:00+8\n" -"PO-Revision-Date: 2023-11-29 13:11+0000\n" +"PO-Revision-Date: 2024-02-03 03:13+0000\n" "Last-Translator: Massimo Pissarello <mapi68@gmail.com>\n" "Language-Team: Italian <https://kodi.weblate.cloud/projects/kodi-add-ons-game/game-controller-keyboard/it_it/>\n" "Language: it_it\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.2.1\n" +"X-Generator: Weblate 5.3\n" msgctxt "Addon Summary" msgid "IBM Model M keyboard" @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "Meta destro" msgctxt "#30108" -msgid "Left Super" -msgstr "Super sinistro" +msgid "Left Windows" +msgstr "Windows sinistro" msgctxt "#30109" -msgid "Right Super" -msgstr "Super destro" +msgid "Right Windows" +msgstr "Windows destro" msgctxt "#30110" msgid "!" @@ -547,8 +547,8 @@ msgid "~" msgstr "~" msgctxt "#30130" -msgid "Mode" -msgstr "Modalità" +msgid "Mode/Option" +msgstr "Modalità/Opzione" msgctxt "#30131" msgid "Compose" @@ -583,8 +583,8 @@ msgid "Undo" msgstr "Annulla" msgctxt "#30139" -msgid "Num Pad Equals" -msgstr "Tastierino numerico uguale" +msgid "Num Pad =" +msgstr "" msgctxt "#30140" msgid "Clear" @@ -592,4 +592,24 @@ msgstr "Pulisci" msgctxt "#30141" msgid "OEM 102nd Key" -msgstr "" +msgstr "Tasto 102 OEM" + +#~ msgctxt "#30139" +#~ msgid "Num Pad Equals" +#~ msgstr "Tastierino numerico uguale" + +#~ msgctxt "#30130" +#~ msgid "Mode/Option/AltGr" +#~ msgstr "Modalità/Opzione/AltGr" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "Super sinistro" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "Super destro" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Modalità" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ja_jp/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ja_jp/strings.po index 65f9ee50b1..7f00ea843b 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ja_jp/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ja_jp/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.kn_in/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.kn_in/strings.po index 05fad666a3..6605eac36b 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.kn_in/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.kn_in/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ko_kr/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ko_kr/strings.po index d19ae3534a..17477ae899 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ko_kr/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ko_kr/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.lt_lt/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.lt_lt/strings.po index 3271199feb..9b5fee5f77 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.lt_lt/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.lt_lt/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.lv_lv/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.lv_lv/strings.po index 287c14a927..bfe1d7be25 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.lv_lv/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.lv_lv/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.mi/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.mi/strings.po index e03dd69cfb..ea440922cf 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.mi/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.mi/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.mk_mk/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.mk_mk/strings.po index a3392b9cc8..fd44681058 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.mk_mk/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.mk_mk/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ml_in/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ml_in/strings.po index d5759d9a3e..d96d7e94a4 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ml_in/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ml_in/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.mn_mn/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.mn_mn/strings.po index d5b2f68dc2..aa7e70b826 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.mn_mn/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.mn_mn/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ms_my/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ms_my/strings.po index f8164d04e8..bf28a5c43c 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ms_my/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ms_my/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.mt_mt/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.mt_mt/strings.po index f256e66916..3ddf6f167e 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.mt_mt/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.mt_mt/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.my_mm/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.my_mm/strings.po index a96fb0f7d0..100dd613fa 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.my_mm/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.my_mm/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.nb_no/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.nb_no/strings.po index 96b30e0efe..23e9b02d97 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.nb_no/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.nb_no/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.nl_nl/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.nl_nl/strings.po index 5f9caf3f1c..4367f6dc75 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.nl_nl/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.nl_nl/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.oc_fr/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.oc_fr/strings.po index e2375b3d18..ff72e7ef7d 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.oc_fr/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.oc_fr/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.os_os/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.os_os/strings.po index ccdb474c28..8f31bbb2ee 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.os_os/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.os_os/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.pl_pl/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.pl_pl/strings.po index 50165b7580..ddd3aa8b21 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.pl_pl/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.pl_pl/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,8 +547,8 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" -msgstr "Mode" +msgid "Mode/Option" +msgstr "" msgctxt "#30131" msgid "Compose" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" @@ -593,3 +593,7 @@ msgstr "" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Mode" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.pt_br/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.pt_br/strings.po index 42547f5d03..034ec5f1b5 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.pt_br/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.pt_br/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.pt_pt/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.pt_pt/strings.po index f611be5d2f..5821568063 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.pt_pt/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.pt_pt/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ro_ro/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ro_ro/strings.po index 4541484c50..836e406517 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ro_ro/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ro_ro/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,7 +547,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ru_ru/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ru_ru/strings.po index d84b02b3eb..0ca54021eb 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ru_ru/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ru_ru/strings.po @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "Правая Meta" msgctxt "#30108" -msgid "Left Super" -msgstr "Левый Super" +msgid "Left Windows" +msgstr "" msgctxt "#30109" -msgid "Right Super" -msgstr "Правый Super" +msgid "Right Windows" +msgstr "" msgctxt "#30110" msgid "!" @@ -547,8 +547,8 @@ msgid "~" msgstr "~" msgctxt "#30130" -msgid "Mode" -msgstr "Mode" +msgid "Mode/Option" +msgstr "" msgctxt "#30131" msgid "Compose" @@ -583,8 +583,8 @@ msgid "Undo" msgstr "Undo" msgctxt "#30139" -msgid "Num Pad Equals" -msgstr "Num Pad =" +msgid "Num Pad =" +msgstr "" msgctxt "#30140" msgid "Clear" @@ -593,3 +593,19 @@ msgstr "Clear" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30139" +#~ msgid "Num Pad Equals" +#~ msgstr "Num Pad =" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "Левый Super" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "Правый Super" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Mode" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.si_lk/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.si_lk/strings.po index 7316bf7235..c5e3359ff1 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.si_lk/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.si_lk/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.sk_sk/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.sk_sk/strings.po index d2037c9515..1bb946c831 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.sk_sk/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.sk_sk/strings.po @@ -459,11 +459,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -547,8 +547,8 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" -msgstr "Mode" +msgid "Mode/Option" +msgstr "" msgctxt "#30131" msgid "Compose" @@ -583,7 +583,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" @@ -593,3 +593,7 @@ msgstr "" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Mode" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.sl_si/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.sl_si/strings.po index ab04aaaf64..1bccea3627 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.sl_si/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.sl_si/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.sq_al/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.sq_al/strings.po index 6356d60e35..82252b946a 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.sq_al/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.sq_al/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.sr_rs/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.sr_rs/strings.po index 232b0d7b9d..7e419fea5d 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.sr_rs/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.sr_rs/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.sr_rs@latin/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.sr_rs@latin/strings.po index 0b8d62d277..57213ecd17 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.sr_rs@latin/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.sr_rs@latin/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.sv_se/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.sv_se/strings.po index a8967e2e7f..21c22c5190 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.sv_se/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.sv_se/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.szl/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.szl/strings.po index 8a4d0916af..77b0858021 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.szl/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.szl/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.ta_in/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.ta_in/strings.po index 0d1cd037bb..fc923ef322 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.ta_in/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.ta_in/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.te_in/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.te_in/strings.po index 1b98da4ea9..54d5c1cd66 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.te_in/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.te_in/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.tg_tj/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.tg_tj/strings.po index baeb5bf0e9..3a529970ac 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.tg_tj/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.tg_tj/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.th_th/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.th_th/strings.po index 9adb655a3c..ecedfcfab6 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.th_th/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.th_th/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.tr_tr/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.tr_tr/strings.po index 147bdb7be2..1c7c3fcac1 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.tr_tr/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.tr_tr/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.uk_ua/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.uk_ua/strings.po index 5a43e03e71..741ceeab9a 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.uk_ua/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.uk_ua/strings.po @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "Права Meta" msgctxt "#30108" -msgid "Left Super" -msgstr "Лівий Super" +msgid "Left Windows" +msgstr "" msgctxt "#30109" -msgid "Right Super" -msgstr "Правий Super" +msgid "Right Windows" +msgstr "" msgctxt "#30110" msgid "!" @@ -547,8 +547,8 @@ msgid "~" msgstr "~" msgctxt "#30130" -msgid "Mode" -msgstr "Mode" +msgid "Mode/Option" +msgstr "" msgctxt "#30131" msgid "Compose" @@ -583,8 +583,8 @@ msgid "Undo" msgstr "Undo" msgctxt "#30139" -msgid "Num Pad Equals" -msgstr "Num Pad =" +msgid "Num Pad =" +msgstr "" msgctxt "#30140" msgid "Clear" @@ -593,3 +593,19 @@ msgstr "Clear" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30139" +#~ msgid "Num Pad Equals" +#~ msgstr "Num Pad =" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "Лівий Super" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "Правий Super" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Mode" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.uz_uz/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.uz_uz/strings.po index 6a4f5cd503..d43b92118a 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.uz_uz/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.uz_uz/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.vi_vn/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.vi_vn/strings.po index a735c4b017..f5a618ee6d 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.vi_vn/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.vi_vn/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.zh_cn/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.zh_cn/strings.po index b4d29d13c7..a7464b8720 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.zh_cn/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.zh_cn/strings.po @@ -459,12 +459,12 @@ msgid "Right Meta" msgstr "右 Meta" msgctxt "#30108" -msgid "Left Super" -msgstr "左 Super" +msgid "Left Windows" +msgstr "" msgctxt "#30109" -msgid "Right Super" -msgstr "右 Super" +msgid "Right Windows" +msgstr "" msgctxt "#30110" msgid "!" @@ -547,8 +547,8 @@ msgid "~" msgstr "~" msgctxt "#30130" -msgid "Mode" -msgstr "Mode" +msgid "Mode/Option" +msgstr "" msgctxt "#30131" msgid "Compose" @@ -583,8 +583,8 @@ msgid "Undo" msgstr "撤消" msgctxt "#30139" -msgid "Num Pad Equals" -msgstr "数字键盘 Equals" +msgid "Num Pad =" +msgstr "" msgctxt "#30140" msgid "Clear" @@ -593,3 +593,19 @@ msgstr "清除" msgctxt "#30141" msgid "OEM 102nd Key" msgstr "" + +#~ msgctxt "#30139" +#~ msgid "Num Pad Equals" +#~ msgstr "数字键盘 Equals" + +#~ msgctxt "#30108" +#~ msgid "Left Super" +#~ msgstr "左 Super" + +#~ msgctxt "#30109" +#~ msgid "Right Super" +#~ msgstr "右 Super" + +#~ msgctxt "#30130" +#~ msgid "Mode" +#~ msgstr "Mode" diff --git a/addons/game.controller.keyboard/resources/language/resource.language.zh_tw/strings.po b/addons/game.controller.keyboard/resources/language/resource.language.zh_tw/strings.po index 31c924995f..48ed402478 100644 --- a/addons/game.controller.keyboard/resources/language/resource.language.zh_tw/strings.po +++ b/addons/game.controller.keyboard/resources/language/resource.language.zh_tw/strings.po @@ -458,11 +458,11 @@ msgid "Right Meta" msgstr "" msgctxt "#30108" -msgid "Left Super" +msgid "Left Windows" msgstr "" msgctxt "#30109" -msgid "Right Super" +msgid "Right Windows" msgstr "" msgctxt "#30110" @@ -546,7 +546,7 @@ msgid "~" msgstr "" msgctxt "#30130" -msgid "Mode" +msgid "Mode/Option" msgstr "" msgctxt "#30131" @@ -582,7 +582,7 @@ msgid "Undo" msgstr "" msgctxt "#30139" -msgid "Num Pad Equals" +msgid "Num Pad =" msgstr "" msgctxt "#30140" diff --git a/addons/game.controller.keyboard/resources/layout.xml b/addons/game.controller.keyboard/resources/layout.xml index 9cb549d504..aec5584ea0 100644 --- a/addons/game.controller.keyboard/resources/layout.xml +++ b/addons/game.controller.keyboard/resources/layout.xml @@ -1,145 +1,145 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <layout label="30000" image="layout.png"> <category name="keys" label="35167"> - <key name="1" symbol="1" label="30002"/> - <key name="2" symbol="2" label="30003"/> - <key name="3" symbol="3" label="30004"/> - <key name="4" symbol="4" label="30005"/> - <key name="5" symbol="5" label="30006"/> - <key name="6" symbol="6" label="30007"/> - <key name="7" symbol="7" label="30008"/> - <key name="8" symbol="8" label="30009"/> - <key name="9" symbol="9" label="30010"/> - <key name="0" symbol="0" label="30011"/> - <key name="a" symbol="a" label="30012"/> - <key name="b" symbol="b" label="30013"/> - <key name="c" symbol="c" label="30014"/> - <key name="d" symbol="d" label="30015"/> - <key name="e" symbol="e" label="30016"/> - <key name="f" symbol="f" label="30017"/> - <key name="g" symbol="g" label="30018"/> - <key name="h" symbol="h" label="30019"/> - <key name="i" symbol="i" label="30020"/> - <key name="j" symbol="j" label="30021"/> - <key name="k" symbol="k" label="30022"/> - <key name="l" symbol="l" label="30023"/> - <key name="m" symbol="m" label="30024"/> - <key name="n" symbol="n" label="30025"/> - <key name="o" symbol="o" label="30026"/> - <key name="p" symbol="p" label="30027"/> - <key name="q" symbol="q" label="30028"/> - <key name="r" symbol="r" label="30029"/> - <key name="s" symbol="s" label="30030"/> - <key name="t" symbol="t" label="30031"/> - <key name="u" symbol="u" label="30032"/> - <key name="v" symbol="v" label="30033"/> - <key name="w" symbol="w" label="30034"/> - <key name="x" symbol="x" label="30035"/> - <key name="y" symbol="y" label="30036"/> - <key name="z" symbol="z" label="30037"/> - <key name="f1" symbol="f1" label="30038"/> - <key name="f2" symbol="f2" label="30039"/> - <key name="f3" symbol="f3" label="30040"/> - <key name="f4" symbol="f4" label="30041"/> - <key name="f5" symbol="f5" label="30042"/> - <key name="f6" symbol="f6" label="30043"/> - <key name="f7" symbol="f7" label="30044"/> - <key name="f8" symbol="f8" label="30045"/> - <key name="f9" symbol="f9" label="30046"/> - <key name="f10" symbol="f10" label="30047"/> - <key name="f11" symbol="f11" label="30048"/> - <key name="f12" symbol="f12" label="30049"/> - <key name="f13" symbol="f13" label="30103"/> - <key name="f14" symbol="f14" label="30104"/> - <key name="f15" symbol="f15" label="30105"/> - <key name="escape" symbol="escape" label="30050"/> - <key name="tab" symbol="tab" label="30051"/> - <key name="backspace" symbol="backspace" label="30052"/> - <key name="clear" symbol="clear" label="30140"/> - <key name="enter" symbol="enter" label="30053"/> - <key name="space" symbol="space" label="30054"/> - <key name="leftalt" symbol="leftalt" label="30055"/> - <key name="rightalt" symbol="rightalt" label="30056"/> - <key name="leftctrl" symbol="leftctrl" label="30057"/> - <key name="rightctrl" symbol="rightctrl" label="30058"/> - <key name="leftshift" symbol="leftshift" label="30059"/> - <key name="rightshift" symbol="rightshift" label="30060"/> - <key name="leftmeta" symbol="leftmeta" label="30106"/> - <key name="rightmeta" symbol="rightmeta" label="30107"/> - <key name="leftsuper" symbol="leftsuper" label="30108"/> - <key name="rightsuper" symbol="rightsuper" label="30109"/> - <key name="capslock" symbol="capslock" label="30061"/> - <key name="numlock" symbol="numlock" label="30063"/> - <key name="scrolllock" symbol="scrolllock" label="30062"/> - <key name="minus" symbol="minus" label="30064"/> - <key name="equals" symbol="equals" label="30065"/> - <key name="backslash" symbol="backslash" label="30066"/> - <key name="leftbracket" symbol="leftbracket" label="30067"/> - <key name="rightbracket" symbol="rightbracket" label="30068"/> - <key name="semicolon" symbol="semicolon" label="30069"/> - <key name="quote" symbol="quote" label="30070"/> - <key name="period" symbol="period" label="30071"/> - <key name="comma" symbol="comma" label="30072"/> - <key name="slash" symbol="slash" label="30073"/> - <key name="printscreen" symbol="printscreen" label="30074"/> - <key name="pause" symbol="pause" label="30075"/> - <key name="insert" symbol="insert" label="30076"/> - <key name="home" symbol="home" label="30077"/> - <key name="pageup" symbol="pageup" label="30078"/> - <key name="pagedown" symbol="pagedown" label="30079"/> - <key name="delete" symbol="delete" label="30080"/> - <key name="end" symbol="end" label="30081"/> - <key name="left" symbol="left" label="30082"/> - <key name="up" symbol="up" label="30083"/> - <key name="down" symbol="down" label="30084"/> - <key name="right" symbol="right" label="30085"/> - <key name="kp1" symbol="kp1" label="30086"/> - <key name="kp2" symbol="kp2" label="30087"/> - <key name="kp3" symbol="kp3" label="30088"/> - <key name="kp4" symbol="kp4" label="30089"/> - <key name="kp5" symbol="kp5" label="30090"/> - <key name="kp6" symbol="kp6" label="30091"/> - <key name="kp7" symbol="kp7" label="30092"/> - <key name="kp8" symbol="kp8" label="30093"/> - <key name="kp9" symbol="kp9" label="30094"/> - <key name="kp0" symbol="kp0" label="30095"/> - <key name="kpdivide" symbol="kpdivide" label="30096"/> - <key name="kpmultiply" symbol="kpmultiply" label="30097"/> - <key name="kpminus" symbol="kpminus" label="30098"/> - <key name="kpplus" symbol="kpplus" label="30099"/> - <key name="kpenter" symbol="kpenter" label="30100"/> - <key name="kpperiod" symbol="kpperiod" label="30101"/> - <key name="kpequals" symbol="kpequals" label="30139"/> - <key name="grave" symbol="grave" label="30102"/> - <key name="exclaim" symbol="exclaim" label="30110"/> - <key name="doublequote" symbol="doublequote" label="30111"/> - <key name="hash" symbol="hash" label="30112"/> - <key name="ampersand" symbol="ampersand" label="30113"/> - <key name="leftparen" symbol="leftparen" label="30114"/> - <key name="rightparen" symbol="rightparen" label="30115"/> - <key name="asterisk" symbol="asterisk" label="30116"/> - <key name="plus" symbol="plus" label="30117"/> - <key name="colon" symbol="colon" label="30118"/> - <key name="less" symbol="less" label="30119"/> - <key name="greater" symbol="greater" label="30120"/> - <key name="question" symbol="question" label="30121"/> - <key name="at" symbol="at" label="30122"/> - <key name="caret" symbol="caret" label="30123"/> - <key name="underscore" symbol="underscore" label="30124"/> - <key name="dollar" symbol="dollar" label="30125"/> - <key name="leftbrace" symbol="leftbrace" label="30126"/> - <key name="rightbrace" symbol="rightbrace" label="30127"/> - <key name="bar" symbol="bar" label="30128"/> - <key name="tilde" symbol="tilde" label="30129"/> - <key name="mode" symbol="mode" label="30130"/> - <key name="compose" symbol="compose" label="30131"/> - <key name="help" symbol="help" label="30132"/> - <key name="sysreq" symbol="sysreq" label="30133"/> - <key name="break" symbol="break" label="30134"/> - <key name="menu" symbol="menu" label="30135"/> - <key name="power" symbol="power" label="30136"/> - <key name="euro" symbol="euro" label="30137"/> - <key name="undo" symbol="undo" label="30138"/> - <key name="oem102" symbol="oem102" label="30141"/> + <key name="grave" symbol="grave" label="30102" /> + <key name="1" symbol="1" label="30002" /> + <key name="2" symbol="2" label="30003" /> + <key name="3" symbol="3" label="30004" /> + <key name="4" symbol="4" label="30005" /> + <key name="5" symbol="5" label="30006" /> + <key name="6" symbol="6" label="30007" /> + <key name="7" symbol="7" label="30008" /> + <key name="8" symbol="8" label="30009" /> + <key name="9" symbol="9" label="30010" /> + <key name="0" symbol="0" label="30011" /> + <key name="minus" symbol="minus" label="30064" /> + <key name="equals" symbol="equals" label="30065" /> + <key name="backspace" symbol="backspace" label="30052" /> + <key name="tab" symbol="tab" label="30051" /> + <key name="q" symbol="q" label="30028" /> + <key name="w" symbol="w" label="30034" /> + <key name="e" symbol="e" label="30016" /> + <key name="r" symbol="r" label="30029" /> + <key name="t" symbol="t" label="30031" /> + <key name="y" symbol="y" label="30036" /> + <key name="u" symbol="u" label="30032" /> + <key name="i" symbol="i" label="30020" /> + <key name="o" symbol="o" label="30026" /> + <key name="p" symbol="p" label="30027" /> + <key name="leftbracket" symbol="leftbracket" label="30067" /> + <key name="rightbracket" symbol="rightbracket" label="30068" /> + <key name="backslash" symbol="backslash" label="30066" /> + <key name="capslock" symbol="capslock" label="30061" /> + <key name="a" symbol="a" label="30012" /> + <key name="s" symbol="s" label="30030" /> + <key name="d" symbol="d" label="30015" /> + <key name="f" symbol="f" label="30017" /> + <key name="g" symbol="g" label="30018" /> + <key name="h" symbol="h" label="30019" /> + <key name="j" symbol="j" label="30021" /> + <key name="k" symbol="k" label="30022" /> + <key name="l" symbol="l" label="30023" /> + <key name="semicolon" symbol="semicolon" label="30069" /> + <key name="quote" symbol="quote" label="30070" /> + <key name="enter" symbol="enter" label="30053" /> + <key name="leftshift" symbol="leftshift" label="30059" /> + <key name="z" symbol="z" label="30037" /> + <key name="x" symbol="x" label="30035" /> + <key name="c" symbol="c" label="30014" /> + <key name="v" symbol="v" label="30033" /> + <key name="b" symbol="b" label="30013" /> + <key name="n" symbol="n" label="30025" /> + <key name="m" symbol="m" label="30024" /> + <key name="comma" symbol="comma" label="30072" /> + <key name="period" symbol="period" label="30071" /> + <key name="slash" symbol="slash" label="30073" /> + <key name="rightshift" symbol="rightshift" label="30060" /> + <key name="leftctrl" symbol="leftctrl" label="30057" /> + <key name="leftsuper" symbol="leftsuper" label="30108" /> + <key name="leftalt" symbol="leftalt" label="30055" /> + <key name="space" symbol="space" label="30054" /> + <key name="rightalt" symbol="rightalt" label="30056" /> + <key name="rightsuper" symbol="rightsuper" label="30109" /> + <key name="menu" symbol="menu" label="30135" /> + <key name="rightctrl" symbol="rightctrl" label="30058" /> + <key name="insert" symbol="insert" label="30076" /> + <key name="home" symbol="home" label="30077" /> + <key name="pageup" symbol="pageup" label="30078" /> + <key name="delete" symbol="delete" label="30080" /> + <key name="end" symbol="end" label="30081" /> + <key name="pagedown" symbol="pagedown" label="30079" /> + <key name="up" symbol="up" label="30083" /> + <key name="down" symbol="down" label="30084" /> + <key name="left" symbol="left" label="30082" /> + <key name="right" symbol="right" label="30085" /> + <key name="escape" symbol="escape" label="30050" /> + <key name="f1" symbol="f1" label="30038" /> + <key name="f2" symbol="f2" label="30039" /> + <key name="f3" symbol="f3" label="30040" /> + <key name="f4" symbol="f4" label="30041" /> + <key name="f5" symbol="f5" label="30042" /> + <key name="f6" symbol="f6" label="30043" /> + <key name="f7" symbol="f7" label="30044" /> + <key name="f8" symbol="f8" label="30045" /> + <key name="f9" symbol="f9" label="30046" /> + <key name="f10" symbol="f10" label="30047" /> + <key name="f11" symbol="f11" label="30048" /> + <key name="f12" symbol="f12" label="30049" /> + <key name="f13" symbol="f13" label="30103" /> + <key name="f14" symbol="f14" label="30104" /> + <key name="f15" symbol="f15" label="30105" /> + <key name="printscreen" symbol="printscreen" label="30074" /> + <key name="scrolllock" symbol="scrolllock" label="30062" /> + <key name="pause" symbol="pause" label="30075" /> + <key name="kp0" symbol="kp0" label="30095" /> + <key name="kp1" symbol="kp1" label="30086" /> + <key name="kp2" symbol="kp2" label="30087" /> + <key name="kp3" symbol="kp3" label="30088" /> + <key name="kp4" symbol="kp4" label="30089" /> + <key name="kp5" symbol="kp5" label="30090" /> + <key name="kp6" symbol="kp6" label="30091" /> + <key name="kp7" symbol="kp7" label="30092" /> + <key name="kp8" symbol="kp8" label="30093" /> + <key name="kp9" symbol="kp9" label="30094" /> + <key name="kpperiod" symbol="kpperiod" label="30101" /> + <key name="kpenter" symbol="kpenter" label="30100" /> + <key name="kpplus" symbol="kpplus" label="30099" /> + <key name="kpminus" symbol="kpminus" label="30098" /> + <key name="kpmultiply" symbol="kpmultiply" label="30097" /> + <key name="kpdivide" symbol="kpdivide" label="30096" /> + <key name="kpequals" symbol="kpequals" label="30139" /> + <key name="numlock" symbol="numlock" label="30063" /> + <key name="tilde" symbol="tilde" label="30129" /> + <key name="exclaim" symbol="exclaim" label="30110" /> + <key name="at" symbol="at" label="30122" /> + <key name="hash" symbol="hash" label="30112" /> + <key name="dollar" symbol="dollar" label="30125" /> + <key name="caret" symbol="caret" label="30123" /> + <key name="ampersand" symbol="ampersand" label="30113" /> + <key name="asterisk" symbol="asterisk" label="30116" /> + <key name="leftparen" symbol="leftparen" label="30114" /> + <key name="rightparen" symbol="rightparen" label="30115" /> + <key name="underscore" symbol="underscore" label="30124" /> + <key name="plus" symbol="plus" label="30117" /> + <key name="leftbrace" symbol="leftbrace" label="30126" /> + <key name="rightbrace" symbol="rightbrace" label="30127" /> + <key name="bar" symbol="bar" label="30128" /> + <key name="colon" symbol="colon" label="30118" /> + <key name="doublequote" symbol="doublequote" label="30111" /> + <key name="less" symbol="less" label="30119" /> + <key name="greater" symbol="greater" label="30120" /> + <key name="question" symbol="question" label="30121" /> + <key name="leftmeta" symbol="leftmeta" label="30106" /> + <key name="rightmeta" symbol="rightmeta" label="30107" /> + <key name="clear" symbol="clear" label="30140" /> + <key name="mode" symbol="mode" label="30130" /> + <key name="compose" symbol="compose" label="30131" /> + <key name="help" symbol="help" label="30132" /> + <key name="sysreq" symbol="sysreq" label="30133" /> + <key name="break" symbol="break" label="30134" /> + <key name="power" symbol="power" label="30136" /> + <key name="euro" symbol="euro" label="30137" /> + <key name="undo" symbol="undo" label="30138" /> + <key name="oem102" symbol="oem102" label="30141" /> </category> </layout> diff --git a/addons/game.controller.snes/addon.xml b/addons/game.controller.snes/addon.xml index 6c4df17b90..0a7f0bb37d 100644 --- a/addons/game.controller.snes/addon.xml +++ b/addons/game.controller.snes/addon.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="game.controller.snes" name="SNES Controller" - version="1.0.39" + version="1.0.40" provider-name="Team Kodi"> <extension point="kodi.game.controller" library="resources/layout.xml"/> <extension point="xbmc.addon.metadata"> @@ -9,6 +9,7 @@ <assets> <icon>resources/icon.png</icon> </assets> + <summary lang="af_ZA">SNES beheerder</summary> <summary lang="be_BY">Кантролер SNES</summary> <summary lang="bs_BA">Super Nintendo Džojstik</summary> <summary lang="ca_ES">Comandament SNES</summary> @@ -40,6 +41,7 @@ <summary lang="tr_TR">SNES oyun kumandası</summary> <summary lang="zh_CN">SNES 控制器</summary> <summary lang="zh_TW">SNES控制器</summary> + <description lang="af_ZA">Die SNES (ook bekend as Super NES of Super Nintendo) is 'n 16-bis konsole vrygestel in 1990. Die beheerder ontwerp het gedien as inspirasie vir die PlayStation, Dreamcast, Xbox en Wii Classic beheerders.</description> <description lang="be_BY">SNES (таксама вядомая як Super NES або Super Nintendo) - 16-бітавая гульнявая кансоль, выпушчаная ў 1990. Па ўзоры яе кантролераў ствараліся кантролеры для PlayStation, Dreamcast, Xbox і Wii Classic.</description> <description lang="bs_BA">Super Nintendo (također poznat kao Super NES ili SNES) je 16-bitna konzola objavljena 1990-te godine. Dizajn džojstika poslužio je kao inspiracija za PlayStation, Dreamcast, Xbox i Wii Classic džojstike.</description> <description lang="ca_ES">La SNES (també coneguda com Super NES o Super Nintendo) és una consola de 16 bits llançada el 1990. El disseny del comandament va servir d'inspiració per als comandaments de PlayStation, Dreamcast, Xbox i Wii Classic.</description> @@ -70,6 +72,7 @@ <description lang="tr_TR">SNES (Super NES veya Super Nintendo olarak da bilinir), 1990 yılında yayımlanan 16 bit bir konsoldur. Konsol denetimcisi, PlayStation, Dreamcast, Xbox ve Wii Classic oyun kumandaları için bir esin kaynağı olarak kabul edilmektedir.</description> <description lang="zh_CN">SNES(又名超级 NES 或超级任天堂)是1990年发布的16位游戏主机。其手柄设计为 PlayStation、Dreamcast、Xbox 和 Wii 经典手柄提供了灵感。</description> <description lang="zh_TW">SNES(又名超任)是在1990發表的16位元遊戲主機。該機型的控制器設計思路啟發了後繼的PS、DC、Xbox及Wii等主機。</description> + <disclaimer lang="af_ZA">Beeld krediet: OpenEmu (openemu.org)</disclaimer> <disclaimer lang="be_BY">Крыніца выяў: OpenEmu (openemu.org)</disclaimer> <disclaimer lang="bs_BA">Zasluga za sliku: OpenEmu (openemu.org)</disclaimer> <disclaimer lang="ca_ES">Crèdit de la imatge: OpenEmu (openemu.org)</disclaimer> diff --git a/addons/game.controller.snes/resources/language/resource.language.af_za/strings.po b/addons/game.controller.snes/resources/language/resource.language.af_za/strings.po index 0eedf5b186..f5bc78cbdf 100644 --- a/addons/game.controller.snes/resources/language/resource.language.af_za/strings.po +++ b/addons/game.controller.snes/resources/language/resource.language.af_za/strings.po @@ -5,49 +5,49 @@ msgid "" msgstr "" "Project-Id-Version: KODI Main\n" -"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" +"Report-Msgid-Bugs-To: translations@kodi.tv\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2021-05-20 16:49+0000\n" -"Last-Translator: Christian Gade <gade@kodi.tv>\n" +"PO-Revision-Date: 2024-01-15 01:17+0000\n" +"Last-Translator: Heiko Berner <berner.h@gmail.com>\n" "Language-Team: Afrikaans (South Africa) <https://kodi.weblate.cloud/projects/kodi-core/game-controller-snes/af_za/>\n" "Language: af_za\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.6.2\n" +"X-Generator: Weblate 5.3\n" msgctxt "Addon Summary" msgid "SNES controller" -msgstr "" +msgstr "SNES beheerder" msgctxt "Addon Description" msgid "The SNES (akso known as Super NES or Super Nintendo) is a 16-bit console released in 1990. The controller design served as inspiration for the PlayStation, Dreamcast, Xbox and Wii Classic controllers." -msgstr "" +msgstr "Die SNES (ook bekend as Super NES of Super Nintendo) is 'n 16-bis konsole vrygestel in 1990. Die beheerder ontwerp het gedien as inspirasie vir die PlayStation, Dreamcast, Xbox en Wii Classic beheerders." msgctxt "Addon Disclaimer" msgid "Image credit: OpenEmu (openemu.org)" -msgstr "" +msgstr "Beeld krediet: OpenEmu (openemu.org)" msgctxt "#30000" msgid "Super Nintendo" -msgstr "" +msgstr "Super Nintendo" msgctxt "#30001" msgid "A" -msgstr "" +msgstr "A" msgctxt "#30002" msgid "B" -msgstr "" +msgstr "B" msgctxt "#30003" msgid "X" -msgstr "" +msgstr "X" msgctxt "#30004" msgid "Y" -msgstr "" +msgstr "Y" msgctxt "#30005" msgid "Start" @@ -59,24 +59,24 @@ msgstr "Kies" msgctxt "#30007" msgid "Up" -msgstr "" +msgstr "Op" msgctxt "#30008" msgid "Right" -msgstr "" +msgstr "Regs" msgctxt "#30009" msgid "Down" -msgstr "" +msgstr "Af" msgctxt "#30010" msgid "Left" -msgstr "" +msgstr "Links" msgctxt "#30011" msgid "Left Bumper" -msgstr "" +msgstr "Linker Stamper" msgctxt "#30012" msgid "Right Bumper" -msgstr "" +msgstr "Regter Stamper" diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp index b704f9b633..00ad20cc9d 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp @@ -15,7 +15,6 @@ #include "cores/VideoPlayer/Process/ProcessInfo.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" -#include "utils/log.h" #include <mutex> @@ -130,6 +129,13 @@ void CVideoBufferPoolVTB::Return(int id) IHardwareDecoder* CDecoder::Create(CDVDStreamInfo &hint, CProcessInfo &processInfo, AVPixelFormat fmt) { +#if defined(TARGET_DARWIN_EMBEDDED) + // force disable HW acceleration for live streams + // to avoid absent image issue on interlaced videos + if (processInfo.IsRealtimeStream()) + return nullptr; +#endif + if (fmt == AV_PIX_FMT_VIDEOTOOLBOX && CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_VIDEOPLAYER_USEVTB)) return new VTB::CDecoder(processInfo); diff --git a/xbmc/games/controllers/CMakeLists.txt b/xbmc/games/controllers/CMakeLists.txt index b00e1caa4a..b54f5c0604 100644 --- a/xbmc/games/controllers/CMakeLists.txt +++ b/xbmc/games/controllers/CMakeLists.txt @@ -1,7 +1,9 @@ set(SOURCES Controller.cpp ControllerLayout.cpp ControllerManager.cpp - ControllerTranslator.cpp) + ControllerTranslator.cpp + DefaultController.cpp +) set(HEADERS Controller.h ControllerDefinitions.h @@ -9,6 +11,8 @@ set(HEADERS Controller.h ControllerLayout.h ControllerManager.h ControllerTranslator.h - ControllerTypes.h) + ControllerTypes.h + DefaultController.h +) core_add_library(games_controller) diff --git a/xbmc/games/controllers/DefaultController.cpp b/xbmc/games/controllers/DefaultController.cpp new file mode 100644 index 0000000000..58bb464e3d --- /dev/null +++ b/xbmc/games/controllers/DefaultController.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2024 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "DefaultController.h" + +using namespace KODI; +using namespace GAME; + +const char* CDefaultController::FEATURE_A = "a"; +const char* CDefaultController::FEATURE_B = "b"; +const char* CDefaultController::FEATURE_X = "x"; +const char* CDefaultController::FEATURE_Y = "y"; +const char* CDefaultController::FEATURE_START = "start"; +const char* CDefaultController::FEATURE_BACK = "back"; +const char* CDefaultController::FEATURE_GUIDE = "guide"; +const char* CDefaultController::FEATURE_UP = "up"; +const char* CDefaultController::FEATURE_RIGHT = "right"; +const char* CDefaultController::FEATURE_DOWN = "down"; +const char* CDefaultController::FEATURE_LEFT = "left"; +const char* CDefaultController::FEATURE_LEFT_THUMB = "leftthumb"; +const char* CDefaultController::FEATURE_RIGHT_THUMB = "rightthumb"; +const char* CDefaultController::FEATURE_LEFT_BUMPER = "leftbumper"; +const char* CDefaultController::FEATURE_RIGHT_BUMPER = "rightbumper"; +const char* CDefaultController::FEATURE_LEFT_TRIGGER = "lefttrigger"; +const char* CDefaultController::FEATURE_RIGHT_TRIGGER = "righttrigger"; +const char* CDefaultController::FEATURE_LEFT_STICK = "leftstick"; +const char* CDefaultController::FEATURE_RIGHT_STICK = "rightstick"; +const char* CDefaultController::FEATURE_LEFT_MOTOR = "leftmotor"; +const char* CDefaultController::FEATURE_RIGHT_MOTOR = "rightmotor"; diff --git a/xbmc/games/controllers/DefaultController.h b/xbmc/games/controllers/DefaultController.h new file mode 100644 index 0000000000..f82ce49748 --- /dev/null +++ b/xbmc/games/controllers/DefaultController.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2024 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +namespace KODI +{ +namespace GAME +{ +class CDefaultController +{ +public: + // Face buttons + static const char* FEATURE_A; + static const char* FEATURE_B; + static const char* FEATURE_X; + static const char* FEATURE_Y; + static const char* FEATURE_START; + static const char* FEATURE_BACK; + static const char* FEATURE_GUIDE; + static const char* FEATURE_UP; + static const char* FEATURE_RIGHT; + static const char* FEATURE_DOWN; + static const char* FEATURE_LEFT; + static const char* FEATURE_LEFT_THUMB; + static const char* FEATURE_RIGHT_THUMB; + + // Shoulder buttons + static const char* FEATURE_LEFT_BUMPER; + static const char* FEATURE_RIGHT_BUMPER; + + // Triggers + static const char* FEATURE_LEFT_TRIGGER; + static const char* FEATURE_RIGHT_TRIGGER; + + // Analog sticks + static const char* FEATURE_LEFT_STICK; + static const char* FEATURE_RIGHT_STICK; + + // Haptics + static const char* FEATURE_LEFT_MOTOR; + static const char* FEATURE_RIGHT_MOTOR; +}; +} // namespace GAME +} // namespace KODI diff --git a/xbmc/games/controllers/windows/GUIConfigurationWizard.cpp b/xbmc/games/controllers/windows/GUIConfigurationWizard.cpp index ff5f8d8e9d..c2ac2f560f 100644 --- a/xbmc/games/controllers/windows/GUIConfigurationWizard.cpp +++ b/xbmc/games/controllers/windows/GUIConfigurationWizard.cpp @@ -290,8 +290,8 @@ bool CGUIConfigurationWizard::MapPrimitive(JOYSTICK::IButtonMap* buttonMap, } else { - CLog::Log(LOGDEBUG, "{}: mapping feature \"{}\" for device {}", m_strControllerId, - feature.Name(), buttonMap->Location()); + CLog::Log(LOGDEBUG, "{}: mapping feature \"{}\" for device {} to \"{}\"", + m_strControllerId, feature.Name(), buttonMap->Location(), primitive.ToString()); switch (feature.Type()) { diff --git a/xbmc/input/joysticks/DriverPrimitive.cpp b/xbmc/input/joysticks/DriverPrimitive.cpp index 9540dfd2ed..166e9268ea 100644 --- a/xbmc/input/joysticks/DriverPrimitive.cpp +++ b/xbmc/input/joysticks/DriverPrimitive.cpp @@ -8,6 +8,9 @@ #include "DriverPrimitive.h" +#include "games/controllers/ControllerTranslator.h" +#include "utils/StringUtils.h" + #include <utility> using namespace KODI; @@ -199,3 +202,70 @@ bool CDriverPrimitive::IsValid(void) const return false; } + +std::string CDriverPrimitive::ToString() const +{ + switch (m_type) + { + case PRIMITIVE_TYPE::BUTTON: + return StringUtils::Format("button {}", m_driverIndex); + case PRIMITIVE_TYPE::MOTOR: + return StringUtils::Format("motor {}", m_driverIndex); + case PRIMITIVE_TYPE::MOUSE_BUTTON: + return StringUtils::Format("mouse button {}", m_driverIndex); + case PRIMITIVE_TYPE::HAT: + { + switch (m_hatDirection) + { + case HAT_DIRECTION::UP: + return StringUtils::Format("hat {} up", m_driverIndex); + case HAT_DIRECTION::DOWN: + return StringUtils::Format("hat {} down", m_driverIndex); + case HAT_DIRECTION::RIGHT: + return StringUtils::Format("hat {} right", m_driverIndex); + case HAT_DIRECTION::LEFT: + return StringUtils::Format("hat {} left", m_driverIndex); + default: + break; + } + break; + } + case PRIMITIVE_TYPE::SEMIAXIS: + { + switch (m_semiAxisDirection) + { + case SEMIAXIS_DIRECTION::POSITIVE: + return StringUtils::Format("semiaxis +{}", m_driverIndex); + case SEMIAXIS_DIRECTION::NEGATIVE: + return StringUtils::Format("semiaxis -{}", m_driverIndex); + default: + break; + } + break; + } + case PRIMITIVE_TYPE::KEY: + return StringUtils::Format("key {}", + GAME::CControllerTranslator::TranslateKeycode(m_keycode)); + case PRIMITIVE_TYPE::RELATIVE_POINTER: + { + switch (m_pointerDirection) + { + case RELATIVE_POINTER_DIRECTION::UP: + return StringUtils::Format("pointer {} up", m_driverIndex); + case RELATIVE_POINTER_DIRECTION::DOWN: + return StringUtils::Format("pointer {} down", m_driverIndex); + case RELATIVE_POINTER_DIRECTION::RIGHT: + return StringUtils::Format("pointer {} right", m_driverIndex); + case RELATIVE_POINTER_DIRECTION::LEFT: + return StringUtils::Format("pointer {} left", m_driverIndex); + default: + break; + } + break; + } + default: + break; + } + + return ""; +} diff --git a/xbmc/input/joysticks/DriverPrimitive.h b/xbmc/input/joysticks/DriverPrimitive.h index abe372411d..11d391b59a 100644 --- a/xbmc/input/joysticks/DriverPrimitive.h +++ b/xbmc/input/joysticks/DriverPrimitive.h @@ -179,6 +179,13 @@ public: */ bool IsValid(void) const; + /*! + * \brief Convert primitive to a string suitable for logging + * + * \return The primitive as described by a short string, or empty if invalid + */ + std::string ToString() const; + private: PRIMITIVE_TYPE m_type = PRIMITIVE_TYPE::UNKNOWN; unsigned int m_driverIndex = 0; diff --git a/xbmc/input/joysticks/JoystickEasterEgg.cpp b/xbmc/input/joysticks/JoystickEasterEgg.cpp index 0c63e66470..b0259a60b8 100644 --- a/xbmc/input/joysticks/JoystickEasterEgg.cpp +++ b/xbmc/input/joysticks/JoystickEasterEgg.cpp @@ -12,6 +12,7 @@ #include "games/GameServices.h" #include "games/GameSettings.h" #include "games/controllers/ControllerIDs.h" +#include "games/controllers/DefaultController.h" #include "guilib/GUIAudioManager.h" #include "guilib/WindowIDs.h" @@ -22,16 +23,16 @@ const std::map<std::string, std::vector<FeatureName>> CJoystickEasterEgg::m_sequ { DEFAULT_CONTROLLER_ID, { - "up", - "up", - "down", - "down", - "left", - "right", - "left", - "right", - "b", - "a", + GAME::CDefaultController::FEATURE_UP, + GAME::CDefaultController::FEATURE_UP, + GAME::CDefaultController::FEATURE_DOWN, + GAME::CDefaultController::FEATURE_DOWN, + GAME::CDefaultController::FEATURE_LEFT, + GAME::CDefaultController::FEATURE_RIGHT, + GAME::CDefaultController::FEATURE_LEFT, + GAME::CDefaultController::FEATURE_RIGHT, + GAME::CDefaultController::FEATURE_B, + GAME::CDefaultController::FEATURE_A, }, }, { diff --git a/xbmc/input/joysticks/generic/ButtonMapping.cpp b/xbmc/input/joysticks/generic/ButtonMapping.cpp index af6bf8692f..665a23378c 100644 --- a/xbmc/input/joysticks/generic/ButtonMapping.cpp +++ b/xbmc/input/joysticks/generic/ButtonMapping.cpp @@ -454,31 +454,34 @@ bool CButtonMapping::MapPrimitive(const CDriverPrimitive& primitive) { bool bHandled = false; - auto now = std::chrono::steady_clock::now(); - - bool bTimeoutElapsed = true; - - if (m_buttonMapper->NeedsCooldown()) - bTimeoutElapsed = (now >= m_lastAction + std::chrono::milliseconds(MAPPING_COOLDOWN_MS)); - - if (bTimeoutElapsed) - { - bHandled = m_buttonMapper->MapPrimitive(m_buttonMap, m_keymap, primitive); - - if (bHandled) - m_lastAction = std::chrono::steady_clock::now(); - } - else if (m_buttonMap->IsIgnored(primitive)) + if (m_buttonMap->IsIgnored(primitive)) { bHandled = true; } else { - auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now - m_lastAction); + auto now = std::chrono::steady_clock::now(); - CLog::Log(LOGDEBUG, "Button mapping: rapid input after {}ms dropped for profile \"{}\"", - duration.count(), m_buttonMapper->ControllerID()); - bHandled = true; + bool bTimeoutElapsed = true; + + if (m_buttonMapper->NeedsCooldown()) + bTimeoutElapsed = (now >= m_lastAction + std::chrono::milliseconds(MAPPING_COOLDOWN_MS)); + + if (bTimeoutElapsed) + { + bHandled = m_buttonMapper->MapPrimitive(m_buttonMap, m_keymap, primitive); + + if (bHandled) + m_lastAction = std::chrono::steady_clock::now(); + } + else + { + auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now - m_lastAction); + + CLog::Log(LOGDEBUG, "Button mapping: rapid input after {}ms dropped for profile \"{}\"", + duration.count(), m_buttonMapper->ControllerID()); + bHandled = true; + } } return bHandled; diff --git a/xbmc/peripherals/Peripherals.cpp b/xbmc/peripherals/Peripherals.cpp index 3dc5ca6a9c..c178158dec 100644 --- a/xbmc/peripherals/Peripherals.cpp +++ b/xbmc/peripherals/Peripherals.cpp @@ -915,7 +915,7 @@ void CPeripherals::ResetButtonMaps(const std::string& controllerId) PeripheralAddonPtr addon; if (addonBus->GetAddonWithButtonMap(peripheral.get(), addon)) { - CAddonButtonMap buttonMap(peripheral.get(), addon, controllerId); + CAddonButtonMap buttonMap(peripheral.get(), addon, controllerId, *this); buttonMap.Reset(); } } diff --git a/xbmc/peripherals/addons/AddonButtonMap.cpp b/xbmc/peripherals/addons/AddonButtonMap.cpp index f2c894ca4d..0d76ec96a4 100644 --- a/xbmc/peripherals/addons/AddonButtonMap.cpp +++ b/xbmc/peripherals/addons/AddonButtonMap.cpp @@ -10,6 +10,7 @@ #include "PeripheralAddonTranslator.h" #include "input/joysticks/JoystickUtils.h" +#include "peripherals/Peripherals.h" #include "peripherals/devices/Peripheral.h" #include "utils/log.h" @@ -24,8 +25,9 @@ using namespace PERIPHERALS; CAddonButtonMap::CAddonButtonMap(CPeripheral* device, const std::weak_ptr<CPeripheralAddon>& addon, - const std::string& strControllerId) - : m_device(device), m_addon(addon), m_strControllerId(strControllerId) + const std::string& strControllerId, + CPeripherals& manager) + : m_device(device), m_addon(addon), m_strControllerId(strControllerId), m_manager(manager) { auto peripheralAddon = m_addon.lock(); assert(peripheralAddon != nullptr); @@ -58,6 +60,28 @@ bool CAddonButtonMap::Load(void) bSuccess |= addon->GetIgnoredPrimitives(m_device, ignoredPrimitives); } + if (features.empty()) + { + // Check if we can initialize a buttonmap from the peripheral bus + PeripheralBusPtr peripheralBus = m_manager.GetBusByType(m_device->GetBusType()); + if (peripheralBus) + { + CLog::Log(LOGDEBUG, + "Buttonmap not found for {}, attempting to initialize from peripheral bus", + m_device->Location()); + if (peripheralBus->InitializeButtonMap(*m_device, *this)) + { + bSuccess = true; + + if (auto addon = m_addon.lock()) + { + addon->GetFeatures(m_device, m_strControllerId, features); + addon->GetIgnoredPrimitives(m_device, ignoredPrimitives); + } + } + } + } + // GetFeatures() was changed to always return false if no features were // retrieved. Check here, just in case its contract is changed or violated in // the future. diff --git a/xbmc/peripherals/addons/AddonButtonMap.h b/xbmc/peripherals/addons/AddonButtonMap.h index b6a629fef5..cade54bb14 100644 --- a/xbmc/peripherals/addons/AddonButtonMap.h +++ b/xbmc/peripherals/addons/AddonButtonMap.h @@ -18,13 +18,15 @@ namespace PERIPHERALS { class CPeripheral; +class CPeripherals; class CAddonButtonMap : public KODI::JOYSTICK::IButtonMap { public: CAddonButtonMap(CPeripheral* device, const std::weak_ptr<CPeripheralAddon>& addon, - const std::string& strControllerId); + const std::string& strControllerId, + CPeripherals& manager); ~CAddonButtonMap(void) override; @@ -130,6 +132,7 @@ private: CPeripheral* const m_device; const std::weak_ptr<CPeripheralAddon> m_addon; const std::string m_strControllerId; + CPeripherals& m_manager; // Button map state std::string m_controllerAppearance; diff --git a/xbmc/peripherals/addons/AddonButtonMapping.cpp b/xbmc/peripherals/addons/AddonButtonMapping.cpp index af838aaf7f..abf981fdd2 100644 --- a/xbmc/peripherals/addons/AddonButtonMapping.cpp +++ b/xbmc/peripherals/addons/AddonButtonMapping.cpp @@ -31,7 +31,7 @@ CAddonButtonMapping::CAddonButtonMapping(CPeripherals& manager, else { const std::string controllerId = mapper->ControllerID(); - m_buttonMap.reset(new CAddonButtonMap(peripheral, addon, controllerId)); + m_buttonMap = std::make_unique<CAddonButtonMap>(peripheral, addon, controllerId, manager); if (m_buttonMap->Load()) { IKeymap* keymap = peripheral->GetKeymap(controllerId); diff --git a/xbmc/peripherals/addons/AddonInputHandling.cpp b/xbmc/peripherals/addons/AddonInputHandling.cpp index 644c33ea53..7490b9618b 100644 --- a/xbmc/peripherals/addons/AddonInputHandling.cpp +++ b/xbmc/peripherals/addons/AddonInputHandling.cpp @@ -16,8 +16,8 @@ #include "input/keyboard/interfaces/IKeyboardInputHandler.h" #include "input/mouse/generic/MouseInputHandling.h" #include "input/mouse/interfaces/IMouseInputHandler.h" -#include "peripherals/Peripherals.h" #include "peripherals/addons/AddonButtonMap.h" +#include "peripherals/devices/Peripheral.h" #include "utils/log.h" using namespace KODI; @@ -26,105 +26,106 @@ using namespace PERIPHERALS; CAddonInputHandling::CAddonInputHandling(CPeripherals& manager, CPeripheral* peripheral, + std::shared_ptr<CPeripheralAddon> addon, IInputHandler* handler, IDriverReceiver* receiver) + : m_manager(manager), + m_peripheral(peripheral), + m_addon(std::move(addon)), + m_joystickInputHandler(handler), + m_joystickDriverReceiver(receiver) { - PeripheralAddonPtr addon = manager.GetAddonWithButtonMap(peripheral); - - if (!addon) - { - CLog::Log(LOGDEBUG, "Failed to locate add-on for \"{}\"", peripheral->DeviceName()); - } - else - { - m_buttonMap.reset(new CAddonButtonMap(peripheral, addon, handler->ControllerID())); - if (m_buttonMap->Load()) - { - m_driverHandler.reset(new CInputHandling(handler, m_buttonMap.get())); - - if (receiver) - { - m_inputReceiver.reset(new CDriverReceiving(receiver, m_buttonMap.get())); - - // Interfaces are connected here because they share button map as a common resource - handler->SetInputReceiver(m_inputReceiver.get()); - } - } - else - { - m_buttonMap.reset(); - } - } } CAddonInputHandling::CAddonInputHandling(CPeripherals& manager, CPeripheral* peripheral, + std::shared_ptr<CPeripheralAddon> addon, KEYBOARD::IKeyboardInputHandler* handler) + : m_manager(manager), + m_peripheral(peripheral), + m_addon(std::move(addon)), + m_keyboardInputHandler(handler) { - PeripheralAddonPtr addon = manager.GetAddonWithButtonMap(peripheral); - - if (!addon) - { - CLog::Log(LOGDEBUG, "Failed to locate add-on for \"{}\"", peripheral->DeviceName()); - } - else - { - m_buttonMap.reset(new CAddonButtonMap(peripheral, addon, handler->ControllerID())); - if (m_buttonMap->Load()) - { - m_keyboardHandler.reset(new KEYBOARD::CKeyboardInputHandling(handler, m_buttonMap.get())); - } - else - { - m_buttonMap.reset(); - } - } } CAddonInputHandling::CAddonInputHandling(CPeripherals& manager, CPeripheral* peripheral, + std::shared_ptr<CPeripheralAddon> addon, MOUSE::IMouseInputHandler* handler) + : m_manager(manager), + m_peripheral(peripheral), + m_addon(std::move(addon)), + m_mouseInputHandler(handler) { - PeripheralAddonPtr addon = manager.GetAddonWithButtonMap(peripheral); +} - if (!addon) - { - CLog::Log(LOGDEBUG, "Failed to locate add-on for \"{}\"", peripheral->DeviceName()); - } - else +CAddonInputHandling::~CAddonInputHandling(void) +{ + m_joystickDriverHandler.reset(); + m_joystickInputReceiver.reset(); + m_keyboardDriverHandler.reset(); + m_mouseDriverHandler.reset(); + m_buttonMap.reset(); +} + +bool CAddonInputHandling::Load() +{ + std::string controllerId; + if (m_joystickInputHandler != nullptr) + controllerId = m_joystickInputHandler->ControllerID(); + else if (m_keyboardInputHandler != nullptr) + controllerId = m_keyboardInputHandler->ControllerID(); + else if (m_mouseInputHandler != nullptr) + controllerId = m_mouseInputHandler->ControllerID(); + + if (!controllerId.empty()) + m_buttonMap = std::make_unique<CAddonButtonMap>(m_peripheral, m_addon, controllerId, m_manager); + + if (m_buttonMap && m_buttonMap->Load()) { - m_buttonMap.reset(new CAddonButtonMap(peripheral, addon, handler->ControllerID())); - if (m_buttonMap->Load()) + if (m_joystickInputHandler != nullptr) { - m_mouseHandler.reset(new MOUSE::CMouseInputHandling(handler, m_buttonMap.get())); + m_joystickDriverHandler = + std::make_unique<CInputHandling>(m_joystickInputHandler, m_buttonMap.get()); + if (m_joystickDriverReceiver != nullptr) + { + m_joystickInputReceiver = + std::make_unique<CDriverReceiving>(m_joystickDriverReceiver, m_buttonMap.get()); + + // Interfaces are connected here because they share button map as a common resource + m_joystickInputHandler->SetInputReceiver(m_joystickInputReceiver.get()); + } + return true; + } + else if (m_keyboardInputHandler != nullptr) + { + m_keyboardDriverHandler = std::make_unique<KEYBOARD::CKeyboardInputHandling>( + m_keyboardInputHandler, m_buttonMap.get()); + return true; } - else + else if (m_mouseInputHandler != nullptr) { - m_buttonMap.reset(); + m_mouseDriverHandler = + std::make_unique<MOUSE::CMouseInputHandling>(m_mouseInputHandler, m_buttonMap.get()); + return true; } } -} -CAddonInputHandling::~CAddonInputHandling(void) -{ - m_driverHandler.reset(); - m_inputReceiver.reset(); - m_keyboardHandler.reset(); - m_buttonMap.reset(); + return false; } bool CAddonInputHandling::OnButtonMotion(unsigned int buttonIndex, bool bPressed) { - if (m_driverHandler) - return m_driverHandler->OnButtonMotion(buttonIndex, bPressed); + if (m_joystickDriverHandler) + return m_joystickDriverHandler->OnButtonMotion(buttonIndex, bPressed); return false; } bool CAddonInputHandling::OnHatMotion(unsigned int hatIndex, HAT_STATE state) { - if (m_driverHandler) - return m_driverHandler->OnHatMotion(hatIndex, state); + if (m_joystickDriverHandler) + return m_joystickDriverHandler->OnHatMotion(hatIndex, state); return false; } @@ -134,58 +135,58 @@ bool CAddonInputHandling::OnAxisMotion(unsigned int axisIndex, int center, unsigned int range) { - if (m_driverHandler) - return m_driverHandler->OnAxisMotion(axisIndex, position, center, range); + if (m_joystickDriverHandler) + return m_joystickDriverHandler->OnAxisMotion(axisIndex, position, center, range); return false; } void CAddonInputHandling::OnInputFrame(void) { - if (m_driverHandler) - m_driverHandler->OnInputFrame(); + if (m_joystickDriverHandler) + m_joystickDriverHandler->OnInputFrame(); } bool CAddonInputHandling::OnKeyPress(const CKey& key) { - if (m_keyboardHandler) - return m_keyboardHandler->OnKeyPress(key); + if (m_keyboardDriverHandler) + return m_keyboardDriverHandler->OnKeyPress(key); return false; } void CAddonInputHandling::OnKeyRelease(const CKey& key) { - if (m_keyboardHandler) - m_keyboardHandler->OnKeyRelease(key); + if (m_keyboardDriverHandler) + m_keyboardDriverHandler->OnKeyRelease(key); } bool CAddonInputHandling::OnPosition(int x, int y) { - if (m_mouseHandler) - return m_mouseHandler->OnPosition(x, y); + if (m_mouseDriverHandler) + return m_mouseDriverHandler->OnPosition(x, y); return false; } bool CAddonInputHandling::OnButtonPress(MOUSE::BUTTON_ID button) { - if (m_mouseHandler) - return m_mouseHandler->OnButtonPress(button); + if (m_mouseDriverHandler) + return m_mouseDriverHandler->OnButtonPress(button); return false; } void CAddonInputHandling::OnButtonRelease(MOUSE::BUTTON_ID button) { - if (m_mouseHandler) - m_mouseHandler->OnButtonRelease(button); + if (m_mouseDriverHandler) + m_mouseDriverHandler->OnButtonRelease(button); } bool CAddonInputHandling::SetRumbleState(const JOYSTICK::FeatureName& feature, float magnitude) { - if (m_inputReceiver) - return m_inputReceiver->SetRumbleState(feature, magnitude); + if (m_joystickInputReceiver) + return m_joystickInputReceiver->SetRumbleState(feature, magnitude); return false; } diff --git a/xbmc/peripherals/addons/AddonInputHandling.h b/xbmc/peripherals/addons/AddonInputHandling.h index 2a59162647..295e6d4240 100644 --- a/xbmc/peripherals/addons/AddonInputHandling.h +++ b/xbmc/peripherals/addons/AddonInputHandling.h @@ -39,6 +39,7 @@ namespace PERIPHERALS { class CPeripheral; class CPeripherals; +class CPeripheralAddon; class CAddonInputHandling : public KODI::JOYSTICK::IDriverHandler, public KODI::JOYSTICK::IInputReceiver, @@ -48,19 +49,24 @@ class CAddonInputHandling : public KODI::JOYSTICK::IDriverHandler, public: CAddonInputHandling(CPeripherals& manager, CPeripheral* peripheral, + std::shared_ptr<CPeripheralAddon> addon, KODI::JOYSTICK::IInputHandler* handler, KODI::JOYSTICK::IDriverReceiver* receiver); CAddonInputHandling(CPeripherals& manager, CPeripheral* peripheral, + std::shared_ptr<CPeripheralAddon> addon, KODI::KEYBOARD::IKeyboardInputHandler* handler); CAddonInputHandling(CPeripherals& manager, CPeripheral* peripheral, + std::shared_ptr<CPeripheralAddon> addon, KODI::MOUSE::IMouseInputHandler* handler); ~CAddonInputHandling(void) override; + bool Load(); + // implementation of IDriverHandler bool OnButtonMotion(unsigned int buttonIndex, bool bPressed) override; bool OnHatMotion(unsigned int hatIndex, KODI::JOYSTICK::HAT_STATE state) override; @@ -83,10 +89,20 @@ public: bool SetRumbleState(const KODI::JOYSTICK::FeatureName& feature, float magnitude) override; private: - std::unique_ptr<KODI::JOYSTICK::IDriverHandler> m_driverHandler; - std::unique_ptr<KODI::JOYSTICK::IInputReceiver> m_inputReceiver; - std::unique_ptr<KODI::KEYBOARD::IKeyboardDriverHandler> m_keyboardHandler; - std::unique_ptr<KODI::MOUSE::IMouseDriverHandler> m_mouseHandler; + // Construction parameters + CPeripherals& m_manager; + CPeripheral* const m_peripheral; + const std::shared_ptr<CPeripheralAddon> m_addon; + KODI::JOYSTICK::IInputHandler* const m_joystickInputHandler{nullptr}; + KODI::JOYSTICK::IDriverReceiver* const m_joystickDriverReceiver{nullptr}; + KODI::KEYBOARD::IKeyboardInputHandler* m_keyboardInputHandler{nullptr}; + KODI::MOUSE::IMouseInputHandler* const m_mouseInputHandler{nullptr}; + + // Input parameters + std::unique_ptr<KODI::JOYSTICK::IDriverHandler> m_joystickDriverHandler; + std::unique_ptr<KODI::JOYSTICK::IInputReceiver> m_joystickInputReceiver; + std::unique_ptr<KODI::KEYBOARD::IKeyboardDriverHandler> m_keyboardDriverHandler; + std::unique_ptr<KODI::MOUSE::IMouseDriverHandler> m_mouseDriverHandler; std::unique_ptr<KODI::JOYSTICK::IButtonMap> m_buttonMap; }; } // namespace PERIPHERALS diff --git a/xbmc/peripherals/bus/PeripheralBus.h b/xbmc/peripherals/bus/PeripheralBus.h index c23abff7b7..6b67a7f662 100644 --- a/xbmc/peripherals/bus/PeripheralBus.h +++ b/xbmc/peripherals/bus/PeripheralBus.h @@ -17,6 +17,14 @@ class CFileItemList; +namespace KODI +{ +namespace JOYSTICK +{ +class IButtonMap; +} // namespace JOYSTICK +} // namespace KODI + namespace PERIPHERALS { class CPeripheral; @@ -58,6 +66,15 @@ public: virtual bool InitializeProperties(CPeripheral& peripheral); /*! + * \brief Initialize a joystick buttonmap, if possible + */ + virtual bool InitializeButtonMap(const CPeripheral& peripheral, + KODI::JOYSTICK::IButtonMap& buttonMap) const + { + return false; + } + + /*! * @brief Get the instance of the peripheral at the given location. * @param strLocation The location. * @return The peripheral or NULL if it wasn't found. diff --git a/xbmc/peripherals/devices/Peripheral.cpp b/xbmc/peripherals/devices/Peripheral.cpp index 2c656a392b..6c3f7791dd 100644 --- a/xbmc/peripherals/devices/Peripheral.cpp +++ b/xbmc/peripherals/devices/Peripheral.cpp @@ -588,10 +588,21 @@ void CPeripheral::RegisterInputHandler(IInputHandler* handler, bool bPromiscuous auto it = m_inputHandlers.find(handler); if (it == m_inputHandlers.end()) { - CAddonInputHandling* addonInput = - new CAddonInputHandling(m_manager, this, handler, GetDriverReceiver()); - RegisterJoystickDriverHandler(addonInput, bPromiscuous); - m_inputHandlers[handler].reset(addonInput); + PeripheralAddonPtr addon = m_manager.GetAddonWithButtonMap(this); + if (addon) + { + std::unique_ptr<CAddonInputHandling> addonInput = std::make_unique<CAddonInputHandling>( + m_manager, this, std::move(addon), handler, GetDriverReceiver()); + if (addonInput->Load()) + { + RegisterJoystickDriverHandler(addonInput.get(), bPromiscuous); + m_inputHandlers[handler] = std::move(addonInput); + } + } + else + { + CLog::Log(LOGDEBUG, "Failed to locate add-on for \"{}\"", m_strLocation); + } } } @@ -613,10 +624,26 @@ void CPeripheral::RegisterKeyboardHandler(KEYBOARD::IKeyboardInputHandler* handl auto it = m_keyboardHandlers.find(handler); if (it == m_keyboardHandlers.end()) { - std::unique_ptr<CAddonInputHandling> addonInput( - new CAddonInputHandling(m_manager, this, handler)); - RegisterKeyboardDriverHandler(addonInput.get(), bPromiscuous); - m_keyboardHandlers[handler] = std::move(addonInput); + std::unique_ptr<KODI::KEYBOARD::IKeyboardDriverHandler> keyboardDriverHandler; + + PeripheralAddonPtr addon = m_manager.GetAddonWithButtonMap(this); + if (addon) + { + std::unique_ptr<CAddonInputHandling> addonInput = + std::make_unique<CAddonInputHandling>(m_manager, this, std::move(addon), handler); + if (addonInput->Load()) + keyboardDriverHandler = std::move(addonInput); + } + else + { + CLog::Log(LOGDEBUG, "Failed to locate add-on for \"{}\"", m_strLocation); + } + + if (keyboardDriverHandler) + { + RegisterKeyboardDriverHandler(keyboardDriverHandler.get(), bPromiscuous); + m_keyboardHandlers[handler] = std::move(keyboardDriverHandler); + } } } @@ -635,10 +662,26 @@ void CPeripheral::RegisterMouseHandler(MOUSE::IMouseInputHandler* handler, bool auto it = m_mouseHandlers.find(handler); if (it == m_mouseHandlers.end()) { - std::unique_ptr<CAddonInputHandling> addonInput( - new CAddonInputHandling(m_manager, this, handler)); - RegisterMouseDriverHandler(addonInput.get(), bPromiscuous); - m_mouseHandlers[handler] = std::move(addonInput); + std::unique_ptr<KODI::MOUSE::IMouseDriverHandler> mouseDriverHandler; + + PeripheralAddonPtr addon = m_manager.GetAddonWithButtonMap(this); + if (addon) + { + std::unique_ptr<CAddonInputHandling> addonInput = + std::make_unique<CAddonInputHandling>(m_manager, this, std::move(addon), handler); + if (addonInput->Load()) + mouseDriverHandler = std::move(addonInput); + } + else + { + CLog::Log(LOGDEBUG, "Failed to locate add-on for \"{}\"", m_strLocation); + } + + if (mouseDriverHandler) + { + RegisterMouseDriverHandler(mouseDriverHandler.get(), bPromiscuous); + m_mouseHandlers[handler] = std::move(mouseDriverHandler); + } } } diff --git a/xbmc/peripherals/devices/PeripheralJoystick.cpp b/xbmc/peripherals/devices/PeripheralJoystick.cpp index e2087a7bc7..bccad9174b 100644 --- a/xbmc/peripherals/devices/PeripheralJoystick.cpp +++ b/xbmc/peripherals/devices/PeripheralJoystick.cpp @@ -98,7 +98,8 @@ bool CPeripheralJoystick::InitialiseFeature(const PeripheralFeature feature) if (bSuccess) { - m_buttonMap = std::make_unique<CAddonButtonMap>(this, addon, DEFAULT_CONTROLLER_ID); + m_buttonMap = + std::make_unique<CAddonButtonMap>(this, addon, DEFAULT_CONTROLLER_ID, m_manager); if (m_buttonMap->Load()) { InitializeDeadzoneFiltering(*m_buttonMap); diff --git a/xbmc/platform/android/activity/EventLoop.cpp b/xbmc/platform/android/activity/EventLoop.cpp index 47ecdad846..a90dbbcb69 100644 --- a/xbmc/platform/android/activity/EventLoop.cpp +++ b/xbmc/platform/android/activity/EventLoop.cpp @@ -132,7 +132,9 @@ int32_t CEventLoop::processInput(AInputEvent* event) int32_t source = AInputEvent_getSource(event); // handle joystick input - if (IS_FROM_SOURCE(source, AINPUT_SOURCE_GAMEPAD) || IS_FROM_SOURCE(source, AINPUT_SOURCE_JOYSTICK)) + if (IS_FROM_SOURCE(source, AINPUT_SOURCE_GAMEPAD) || + IS_FROM_SOURCE(source, AINPUT_SOURCE_JOYSTICK) || + IS_FROM_SOURCE(source, AINPUT_SOURCE_KEYBOARD)) { if (m_inputHandler->onJoyStickEvent(event)) return true; diff --git a/xbmc/platform/android/peripherals/AndroidJoystickState.cpp b/xbmc/platform/android/peripherals/AndroidJoystickState.cpp index c3e3cc57be..dcbd569c53 100644 --- a/xbmc/platform/android/peripherals/AndroidJoystickState.cpp +++ b/xbmc/platform/android/peripherals/AndroidJoystickState.cpp @@ -9,6 +9,11 @@ #include "AndroidJoystickState.h" #include "AndroidJoystickTranslator.h" +#include "games/controllers/ControllerIDs.h" +#include "games/controllers/DefaultController.h" +#include "input/joysticks/DriverPrimitive.h" +#include "input/joysticks/JoystickTypes.h" +#include "input/joysticks/interfaces/IButtonMap.h" #include "utils/StringUtils.h" #include "utils/log.h" @@ -19,50 +24,121 @@ #include <android/input.h> #include <androidjni/View.h> +using namespace KODI; using namespace PERIPHERALS; -static std::string PrintAxisIds(const std::vector<int>& axisIds) +namespace { - if (axisIds.empty()) - return ""; - - if (axisIds.size() == 1) - return std::to_string(axisIds.front()); - - std::string strAxisIds; - for (const auto& axisId : axisIds) - { - if (strAxisIds.empty()) - strAxisIds = "["; - else - strAxisIds += " | "; - - strAxisIds += std::to_string(axisId); - } - strAxisIds += "]"; - - return strAxisIds; -} - -static void MapAxisIds(int axisId, int primaryAxisId, int secondaryAxisId, std::vector<int>& axisIds) +// Used to set the appearance of PlayStation controllers +constexpr const char* CONTROLLER_ID_PLAYSTATION = "game.controller.ps.dualanalog"; + +// clang-format off +static const std::vector<int> ButtonKeycodes{ + // add the usual suspects + AKEYCODE_HOME, + AKEYCODE_BACK, + AKEYCODE_DPAD_UP, + AKEYCODE_DPAD_DOWN, + AKEYCODE_DPAD_LEFT, + AKEYCODE_DPAD_RIGHT, + AKEYCODE_DPAD_CENTER, + AKEYCODE_MENU, + AKEYCODE_BUTTON_A, + AKEYCODE_BUTTON_B, + AKEYCODE_BUTTON_C, + AKEYCODE_BUTTON_X, + AKEYCODE_BUTTON_Y, + AKEYCODE_BUTTON_Z, + AKEYCODE_BUTTON_L1, + AKEYCODE_BUTTON_R1, + AKEYCODE_BUTTON_L2, + AKEYCODE_BUTTON_R2, + AKEYCODE_BUTTON_THUMBL, + AKEYCODE_BUTTON_THUMBR, + AKEYCODE_BUTTON_START, + AKEYCODE_BUTTON_SELECT, + AKEYCODE_BUTTON_MODE, + // add generic gamepad buttons for controllers that Android doesn't know + // how to map + AKEYCODE_BUTTON_1, + AKEYCODE_BUTTON_2, + AKEYCODE_BUTTON_3, + AKEYCODE_BUTTON_4, + AKEYCODE_BUTTON_5, + AKEYCODE_BUTTON_6, + AKEYCODE_BUTTON_7, + AKEYCODE_BUTTON_8, + AKEYCODE_BUTTON_9, + AKEYCODE_BUTTON_10, + AKEYCODE_BUTTON_11, + AKEYCODE_BUTTON_12, + AKEYCODE_BUTTON_13, + AKEYCODE_BUTTON_14, + AKEYCODE_BUTTON_15, + AKEYCODE_BUTTON_16, + // only add additional buttons at the end of the list +}; +// clang-format on + +// clang-format off +static const std::vector<int> AxisIDs{ + AMOTION_EVENT_AXIS_HAT_X, + AMOTION_EVENT_AXIS_HAT_Y, + AMOTION_EVENT_AXIS_X, + AMOTION_EVENT_AXIS_Y, + AMOTION_EVENT_AXIS_Z, + AMOTION_EVENT_AXIS_RX, + AMOTION_EVENT_AXIS_RY, + AMOTION_EVENT_AXIS_RZ, + AMOTION_EVENT_AXIS_LTRIGGER, + AMOTION_EVENT_AXIS_RTRIGGER, + AMOTION_EVENT_AXIS_GAS, + AMOTION_EVENT_AXIS_BRAKE, + AMOTION_EVENT_AXIS_THROTTLE, + AMOTION_EVENT_AXIS_RUDDER, + AMOTION_EVENT_AXIS_WHEEL, + AMOTION_EVENT_AXIS_GENERIC_1, + AMOTION_EVENT_AXIS_GENERIC_2, + AMOTION_EVENT_AXIS_GENERIC_3, + AMOTION_EVENT_AXIS_GENERIC_4, + AMOTION_EVENT_AXIS_GENERIC_5, + AMOTION_EVENT_AXIS_GENERIC_6, + AMOTION_EVENT_AXIS_GENERIC_7, + AMOTION_EVENT_AXIS_GENERIC_8, + AMOTION_EVENT_AXIS_GENERIC_9, + AMOTION_EVENT_AXIS_GENERIC_10, + AMOTION_EVENT_AXIS_GENERIC_11, + AMOTION_EVENT_AXIS_GENERIC_12, + AMOTION_EVENT_AXIS_GENERIC_13, + AMOTION_EVENT_AXIS_GENERIC_14, + AMOTION_EVENT_AXIS_GENERIC_15, + AMOTION_EVENT_AXIS_GENERIC_16, +}; +// clang-format on + +static void MapAxisIds(int axisId, + int primaryAxisId, + int secondaryAxisId, + std::vector<int>& axisIds) { if (axisId != primaryAxisId && axisId != secondaryAxisId) return; if (axisIds.empty()) { - axisIds.push_back(primaryAxisId); - axisIds.push_back(secondaryAxisId); + axisIds.emplace_back(primaryAxisId); + axisIds.emplace_back(secondaryAxisId); } if (axisIds.size() > 1) return; if (axisId == primaryAxisId) - axisIds.push_back(secondaryAxisId); + axisIds.emplace_back(secondaryAxisId); else if (axisId == secondaryAxisId) axisIds.insert(axisIds.begin(), primaryAxisId); } +} // namespace CAndroidJoystickState::CAndroidJoystickState(CAndroidJoystickState&& other) noexcept : m_deviceId(other.m_deviceId), @@ -97,40 +173,30 @@ bool CAndroidJoystickState::Initialize(const CJNIViewInputDevice& inputDevice) !motionRange.isFromSource(CJNIViewInputDevice::SOURCE_GAMEPAD)) { CLog::Log(LOGDEBUG, - "CAndroidJoystickState: ignoring axis {} from source {} for input device \"{}\" " + "CAndroidJoystickState: axis {} has unexpected source {} for input device \"{}\" " "with ID {}", motionRange.getAxis(), motionRange.getSource(), deviceName, m_deviceId); - continue; } int axisId = motionRange.getAxis(); - JoystickAxis axis { - { axisId }, - motionRange.getFlat(), - motionRange.getFuzz(), - motionRange.getMin(), - motionRange.getMax(), - motionRange.getRange(), - motionRange.getResolution() - }; - - // check if the axis ID belongs to a D-pad, analogue stick or trigger - if (axisId == AMOTION_EVENT_AXIS_HAT_X || axisId == AMOTION_EVENT_AXIS_HAT_Y || - axisId == AMOTION_EVENT_AXIS_X || axisId == AMOTION_EVENT_AXIS_Y || - axisId == AMOTION_EVENT_AXIS_Z || axisId == AMOTION_EVENT_AXIS_RX || - axisId == AMOTION_EVENT_AXIS_RY || axisId == AMOTION_EVENT_AXIS_RZ || - axisId == AMOTION_EVENT_AXIS_LTRIGGER || axisId == AMOTION_EVENT_AXIS_RTRIGGER || - axisId == AMOTION_EVENT_AXIS_GAS || axisId == AMOTION_EVENT_AXIS_BRAKE || - axisId == AMOTION_EVENT_AXIS_THROTTLE || axisId == AMOTION_EVENT_AXIS_RUDDER || axisId == AMOTION_EVENT_AXIS_WHEEL) + JoystickAxis axis{{axisId}, + motionRange.getFlat(), + motionRange.getFuzz(), + motionRange.getMin(), + motionRange.getMax(), + motionRange.getRange(), + motionRange.getResolution()}; + + // check if the axis ID belongs to a D-pad, analogue stick, trigger or + // generic axis + if (std::find(AxisIDs.begin(), AxisIDs.end(), axisId) != AxisIDs.end()) { - // check if this axis is already known + CLog::Log(LOGDEBUG, "CAndroidJoystickState: axis found: {} ({})", + CAndroidJoystickTranslator::TranslateAxis(axisId), axisId); + + // check if this axis is already known if (ContainsAxis(axisId, m_axes)) - { - CLog::Log(LOGWARNING, - "CAndroidJoystickState: duplicate axis {} on input device \"{}\" with ID {}", - PrintAxisIds(axis.ids), deviceName, m_deviceId); continue; - } // map AMOTION_EVENT_AXIS_GAS to AMOTION_EVENT_AXIS_RTRIGGER and // AMOTION_EVENT_AXIS_BRAKE to AMOTION_EVENT_AXIS_LTRIGGER @@ -138,10 +204,7 @@ bool CAndroidJoystickState::Initialize(const CJNIViewInputDevice& inputDevice) MapAxisIds(axisId, AMOTION_EVENT_AXIS_LTRIGGER, AMOTION_EVENT_AXIS_BRAKE, axis.ids); MapAxisIds(axisId, AMOTION_EVENT_AXIS_RTRIGGER, AMOTION_EVENT_AXIS_GAS, axis.ids); - m_axes.push_back(axis); - CLog::Log(LOGDEBUG, - "CAndroidJoystickState: axis {} on input device \"{}\" with ID {} detected", - PrintAxisIds(axis.ids), deviceName, m_deviceId); + m_axes.emplace_back(std::move(axis)); } else CLog::Log(LOGWARNING, @@ -149,30 +212,27 @@ bool CAndroidJoystickState::Initialize(const CJNIViewInputDevice& inputDevice) axisId, deviceName, m_deviceId); } - // add the usual suspects - m_buttons.push_back({ { AKEYCODE_BUTTON_A } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_B } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_C } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_X } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_Y } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_Z } }); - m_buttons.push_back({ { AKEYCODE_BACK } }); - m_buttons.push_back({ { AKEYCODE_MENU } }); - m_buttons.push_back({ { AKEYCODE_HOME } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_SELECT } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_MODE } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_START } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_L1 } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_R1 } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_L2 } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_R2 } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_THUMBL } }); - m_buttons.push_back({ { AKEYCODE_BUTTON_THUMBR } }); - m_buttons.push_back({ { AKEYCODE_DPAD_UP } }); - m_buttons.push_back({ { AKEYCODE_DPAD_RIGHT } }); - m_buttons.push_back({ { AKEYCODE_DPAD_DOWN } }); - m_buttons.push_back({ { AKEYCODE_DPAD_LEFT } }); - m_buttons.push_back({ { AKEYCODE_DPAD_CENTER} }); + // check for presence of buttons + auto results = inputDevice.hasKeys(ButtonKeycodes); + + if (results.size() != ButtonKeycodes.size()) + { + CLog::Log(LOGERROR, "CAndroidJoystickState: failed to get key status for {} buttons", + ButtonKeycodes.size()); + return false; + } + + // log positive results and assign results to buttons + for (unsigned int i = 0; i < ButtonKeycodes.size(); ++i) + { + if (results[i]) + { + const int buttonKeycode = ButtonKeycodes[i]; + CLog::Log(LOGDEBUG, "CAndroidJoystickState: button found: {} ({})", + CAndroidJoystickTranslator::TranslateKeyCode(buttonKeycode), buttonKeycode); + m_buttons.emplace_back(JoystickAxis{{buttonKeycode}}); + } + } // check if there are no buttons or axes at all if (GetButtonCount() == 0 && GetAxisCount() == 0) @@ -198,6 +258,70 @@ void CAndroidJoystickState::Deinitialize(void) m_digitalEvents.clear(); } +bool CAndroidJoystickState::InitializeButtonMap(KODI::JOYSTICK::IButtonMap& buttonMap) const +{ + // We only map the default controller + if (buttonMap.ControllerID() != DEFAULT_CONTROLLER_ID) + return false; + + bool success = false; + + // Map buttons + for (auto it = ButtonKeycodes.begin(); it != ButtonKeycodes.end(); ++it) + { + const int buttonKeycode = *it; + success |= MapButton(buttonMap, buttonKeycode); + } + + // Map D-pad + success |= MapDpad(buttonMap, AMOTION_EVENT_AXIS_HAT_X, AMOTION_EVENT_AXIS_HAT_Y); + + // Map triggers + // Note: This should come after buttons, because the PS4 controller uses + // both a digital button and an analog axis for the triggers, and we want + // the analog axis to override the button for full range of motion. + success |= MapTrigger(buttonMap, AMOTION_EVENT_AXIS_LTRIGGER, + GAME::CDefaultController::FEATURE_LEFT_TRIGGER); + success |= MapTrigger(buttonMap, AMOTION_EVENT_AXIS_RTRIGGER, + GAME::CDefaultController::FEATURE_RIGHT_TRIGGER); + + // Map analog sticks + success |= MapAnalogStick(buttonMap, AMOTION_EVENT_AXIS_X, AMOTION_EVENT_AXIS_Y, + GAME::CDefaultController::FEATURE_LEFT_STICK); + success |= MapAnalogStick(buttonMap, AMOTION_EVENT_AXIS_Z, AMOTION_EVENT_AXIS_RZ, + GAME::CDefaultController::FEATURE_RIGHT_STICK); + + if (success) + { + // If the controller has both L2/R2 buttons and LTRIGGER/RTRIGGER axes, it's + // probably a PS controller + size_t indexL2 = 0; + size_t indexR2 = 0; + size_t indexLTrigger = 0; + size_t indexRTrigger = 0; + if (GetAxesIndex({AKEYCODE_BUTTON_L2}, m_buttons, indexL2) && + GetAxesIndex({AKEYCODE_BUTTON_R2}, m_buttons, indexR2) && + GetAxesIndex({AMOTION_EVENT_AXIS_LTRIGGER}, m_axes, indexLTrigger) && + GetAxesIndex({AMOTION_EVENT_AXIS_RTRIGGER}, m_axes, indexRTrigger)) + { + CLog::Log(LOGDEBUG, "Detected dual-input triggers, ignoring digital buttons"); + std::vector<JOYSTICK::CDriverPrimitive> ignoredPrimitives{ + {JOYSTICK::PRIMITIVE_TYPE::BUTTON, static_cast<unsigned int>(indexL2)}, + {JOYSTICK::PRIMITIVE_TYPE::BUTTON, static_cast<unsigned int>(indexR2)}, + }; + buttonMap.SetIgnoredPrimitives(ignoredPrimitives); + + CLog::Log(LOGDEBUG, "Setting appearance to {}", CONTROLLER_ID_PLAYSTATION); + buttonMap.SetAppearance(CONTROLLER_ID_PLAYSTATION); + } + + // Save the buttonmap + buttonMap.SaveButtonMap(); + } + + return success; +} + bool CAndroidJoystickState::ProcessEvent(const AInputEvent* event) { int32_t type = AInputEvent_getType(event); @@ -219,6 +343,25 @@ bool CAndroidJoystickState::ProcessEvent(const AInputEvent* event) bool result = SetButtonValue(keycode, buttonState); + if (!result) + { + // Try shoehorning keys into buttons + switch (keycode) + { + case AKEYCODE_MENU: + result = SetButtonValue(AKEYCODE_BUTTON_START, buttonState); + break; + case AKEYCODE_BACK: + result = SetButtonValue(AKEYCODE_BUTTON_SELECT, buttonState); + break; + case AKEYCODE_HOME: + result = SetButtonValue(AKEYCODE_BUTTON_MODE, buttonState); + break; + default: + break; + } + } + return result; } @@ -235,7 +378,7 @@ bool CAndroidJoystickState::ProcessEvent(const AInputEvent* event) // get all potential values std::vector<float> values; for (const auto& axisId : axis.ids) - values.push_back(AMotionEvent_getAxisValue(event, axisId, pointer)); + values.emplace_back(AMotionEvent_getAxisValue(event, axisId, pointer)); // remove all zero values values.erase(std::remove(values.begin(), values.end(), 0.0f), values.end()); @@ -274,9 +417,9 @@ void CAndroidJoystickState::GetButtonEvents(std::vector<kodi::addon::PeripheralE // Only report a single event per button (avoids dropping rapid presses) std::vector<kodi::addon::PeripheralEvent> repeatButtons; - for (const auto &digitalEvent : m_digitalEvents) + for (const auto& digitalEvent : m_digitalEvents) { - auto HasButton = [&digitalEvent](const kodi::addon::PeripheralEvent &event) + auto HasButton = [&digitalEvent](const kodi::addon::PeripheralEvent& event) { if (event.Type() == PERIPHERAL_EVENT_TYPE_DRIVER_BUTTON) return event.DriverIndex() == digitalEvent.DriverIndex(); @@ -301,7 +444,7 @@ void CAndroidJoystickState::GetAxisEvents(std::vector<kodi::addon::PeripheralEve bool CAndroidJoystickState::SetButtonValue(int axisId, JOYSTICK_STATE_BUTTON buttonValue) { size_t buttonIndex = 0; - if (!GetAxesIndex({ axisId }, m_buttons, buttonIndex) || buttonIndex >= GetButtonCount()) + if (!GetAxesIndex({axisId}, m_buttons, buttonIndex) || buttonIndex >= GetButtonCount()) return false; std::unique_lock<CCriticalSection> lock(m_eventMutex); @@ -311,7 +454,8 @@ bool CAndroidJoystickState::SetButtonValue(int axisId, JOYSTICK_STATE_BUTTON but return true; } -bool CAndroidJoystickState::SetAxisValue(const std::vector<int>& axisIds, JOYSTICK_STATE_AXIS axisValue) +bool CAndroidJoystickState::SetAxisValue(const std::vector<int>& axisIds, + JOYSTICK_STATE_AXIS axisValue) { size_t axisIndex = 0; if (!GetAxesIndex(axisIds, m_axes, axisIndex) || axisIndex >= GetAxisCount()) @@ -330,6 +474,145 @@ bool CAndroidJoystickState::SetAxisValue(const std::vector<int>& axisIds, JOYSTI return true; } +bool CAndroidJoystickState::MapButton(KODI::JOYSTICK::IButtonMap& buttonMap, + int buttonKeycode) const +{ + size_t buttonIndex = 0; + std::string featureName; + + if (!GetAxesIndex({buttonKeycode}, m_buttons, buttonIndex)) + return false; + + // Check if button is already mapped + JOYSTICK::CDriverPrimitive buttonPrimitive{JOYSTICK::PRIMITIVE_TYPE::BUTTON, + static_cast<unsigned int>(buttonIndex)}; + if (buttonMap.GetFeature(buttonPrimitive, featureName)) + return false; + + // Translate the button + std::string controllerButton = CAndroidJoystickTranslator::TranslateJoystickButton(buttonKeycode); + if (controllerButton.empty()) + return false; + + // Map the button + CLog::Log(LOGDEBUG, "Automatically mapping {} to {}", controllerButton, + buttonPrimitive.ToString()); + buttonMap.AddScalar(controllerButton, buttonPrimitive); + + return true; +} + +bool CAndroidJoystickState::MapTrigger(KODI::JOYSTICK::IButtonMap& buttonMap, + int axisId, + const std::string& triggerName) const +{ + size_t axisIndex = 0; + std::string featureName; + + if (!GetAxesIndex({axisId}, m_axes, axisIndex)) + return false; + + const JOYSTICK::CDriverPrimitive semiaxis{static_cast<unsigned int>(axisIndex), 0, + JOYSTICK::SEMIAXIS_DIRECTION::POSITIVE, 1}; + if (buttonMap.GetFeature(semiaxis, featureName)) + return false; + + CLog::Log(LOGDEBUG, "Automatically mapping {} to {}", triggerName, semiaxis.ToString()); + buttonMap.AddScalar(triggerName, semiaxis); + + return true; +} + +bool CAndroidJoystickState::MapDpad(KODI::JOYSTICK::IButtonMap& buttonMap, + int horizAxisId, + int vertAxisId) const +{ + bool success = false; + + size_t axisIndex = 0; + std::string featureName; + + // Map horizontal axis + if (GetAxesIndex({horizAxisId}, m_axes, axisIndex)) + { + const JOYSTICK::CDriverPrimitive positiveSemiaxis{static_cast<unsigned int>(axisIndex), 0, + JOYSTICK::SEMIAXIS_DIRECTION::POSITIVE, 1}; + const JOYSTICK::CDriverPrimitive negativeSemiaxis{static_cast<unsigned int>(axisIndex), 0, + JOYSTICK::SEMIAXIS_DIRECTION::NEGATIVE, 1}; + if (!buttonMap.GetFeature(positiveSemiaxis, featureName) && + !buttonMap.GetFeature(negativeSemiaxis, featureName)) + { + CLog::Log(LOGDEBUG, "Automatically mapping {} to {}", GAME::CDefaultController::FEATURE_LEFT, + negativeSemiaxis.ToString()); + CLog::Log(LOGDEBUG, "Automatically mapping {} to {}", GAME::CDefaultController::FEATURE_RIGHT, + positiveSemiaxis.ToString()); + buttonMap.AddScalar(GAME::CDefaultController::FEATURE_LEFT, negativeSemiaxis); + buttonMap.AddScalar(GAME::CDefaultController::FEATURE_RIGHT, positiveSemiaxis); + success |= true; + } + } + + // Map vertical axis + if (GetAxesIndex({vertAxisId}, m_axes, axisIndex)) + { + const JOYSTICK::CDriverPrimitive positiveSemiaxis{static_cast<unsigned int>(axisIndex), 0, + JOYSTICK::SEMIAXIS_DIRECTION::POSITIVE, 1}; + const JOYSTICK::CDriverPrimitive negativeSemiaxis{static_cast<unsigned int>(axisIndex), 0, + JOYSTICK::SEMIAXIS_DIRECTION::NEGATIVE, 1}; + if (!buttonMap.GetFeature(positiveSemiaxis, featureName) && + !buttonMap.GetFeature(negativeSemiaxis, featureName)) + { + CLog::Log(LOGDEBUG, "Automatically mapping {} to {}", GAME::CDefaultController::FEATURE_UP, + negativeSemiaxis.ToString()); + CLog::Log(LOGDEBUG, "Automatically mapping {} to {}", GAME::CDefaultController::FEATURE_DOWN, + positiveSemiaxis.ToString()); + buttonMap.AddScalar(GAME::CDefaultController::FEATURE_DOWN, positiveSemiaxis); + buttonMap.AddScalar(GAME::CDefaultController::FEATURE_UP, negativeSemiaxis); + success |= true; + } + } + + return success; +} + +bool CAndroidJoystickState::MapAnalogStick(KODI::JOYSTICK::IButtonMap& buttonMap, + int horizAxisId, + int vertAxisId, + const std::string& analogStickName) const +{ + size_t axisIndex1 = 0; + size_t axisIndex2 = 0; + std::string featureName; + + if (!GetAxesIndex({horizAxisId}, m_axes, axisIndex1) || + !GetAxesIndex({vertAxisId}, m_axes, axisIndex2)) + return false; + + const JOYSTICK::CDriverPrimitive upSemiaxis{static_cast<unsigned int>(axisIndex2), 0, + JOYSTICK::SEMIAXIS_DIRECTION::NEGATIVE, 1}; + const JOYSTICK::CDriverPrimitive downSemiaxis{static_cast<unsigned int>(axisIndex2), 0, + JOYSTICK::SEMIAXIS_DIRECTION::POSITIVE, 1}; + const JOYSTICK::CDriverPrimitive leftSemiaxis{static_cast<unsigned int>(axisIndex1), 0, + JOYSTICK::SEMIAXIS_DIRECTION::NEGATIVE, 1}; + const JOYSTICK::CDriverPrimitive rightSemiaxis{static_cast<unsigned int>(axisIndex1), 0, + JOYSTICK::SEMIAXIS_DIRECTION::POSITIVE, 1}; + if (buttonMap.GetFeature(upSemiaxis, featureName) || + buttonMap.GetFeature(downSemiaxis, featureName) || + buttonMap.GetFeature(leftSemiaxis, featureName) || + buttonMap.GetFeature(rightSemiaxis, featureName)) + return false; + + CLog::Log(LOGDEBUG, "Automatically mapping {} to [{}, {}, {}, {}]", analogStickName, + upSemiaxis.ToString(), downSemiaxis.ToString(), leftSemiaxis.ToString(), + rightSemiaxis.ToString()); + buttonMap.AddAnalogStick(analogStickName, JOYSTICK::ANALOG_STICK_DIRECTION::UP, upSemiaxis); + buttonMap.AddAnalogStick(analogStickName, JOYSTICK::ANALOG_STICK_DIRECTION::DOWN, downSemiaxis); + buttonMap.AddAnalogStick(analogStickName, JOYSTICK::ANALOG_STICK_DIRECTION::LEFT, leftSemiaxis); + buttonMap.AddAnalogStick(analogStickName, JOYSTICK::ANALOG_STICK_DIRECTION::RIGHT, rightSemiaxis); + + return true; +} + float CAndroidJoystickState::Contain(float value, float min, float max) { if (value < min) @@ -347,33 +630,35 @@ float CAndroidJoystickState::Scale(float value, float max, float scaledMax) float CAndroidJoystickState::Deadzone(float value, float deadzone) { - if ((value > 0.0f && value < deadzone) || - (value < 0.0f && value > -deadzone)) + if ((value > 0.0f && value < deadzone) || (value < 0.0f && value > -deadzone)) return 0.0f; return value; } -CAndroidJoystickState::JoystickAxes::const_iterator CAndroidJoystickState::GetAxis(const std::vector<int>& axisIds, const JoystickAxes& axes) +CAndroidJoystickState::JoystickAxes::const_iterator CAndroidJoystickState::GetAxis( + const std::vector<int>& axisIds, const JoystickAxes& axes) { return std::find_if(axes.cbegin(), axes.cend(), - [&axisIds](const JoystickAxis& axis) - { - std::vector<int> matches(std::max(axisIds.size(), axis.ids.size())); - const auto& matchesEnd = std::set_intersection(axisIds.begin(), axisIds.end(), - axis.ids.begin(), axis.ids.end(), - matches.begin()); - matches.resize(matchesEnd - matches.begin()); - return !matches.empty(); - }); + [&axisIds](const JoystickAxis& axis) + { + std::vector<int> matches(std::max(axisIds.size(), axis.ids.size())); + const auto& matchesEnd = + std::set_intersection(axisIds.begin(), axisIds.end(), axis.ids.begin(), + axis.ids.end(), matches.begin()); + matches.resize(matchesEnd - matches.begin()); + return !matches.empty(); + }); } bool CAndroidJoystickState::ContainsAxis(int axisId, const JoystickAxes& axes) { - return GetAxis({ axisId }, axes) != axes.cend(); + return GetAxis({axisId}, axes) != axes.cend(); } -bool CAndroidJoystickState::GetAxesIndex(const std::vector<int>& axisIds, const JoystickAxes& axes, size_t& axesIndex) +bool CAndroidJoystickState::GetAxesIndex(const std::vector<int>& axisIds, + const JoystickAxes& axes, + size_t& axesIndex) { auto axesIt = GetAxis(axisIds, axes); if (axesIt == axes.end()) diff --git a/xbmc/platform/android/peripherals/AndroidJoystickState.h b/xbmc/platform/android/peripherals/AndroidJoystickState.h index 07652d79e9..550222d6f7 100644 --- a/xbmc/platform/android/peripherals/AndroidJoystickState.h +++ b/xbmc/platform/android/peripherals/AndroidJoystickState.h @@ -18,78 +18,113 @@ struct AInputEvent; class CJNIViewInputDevice; +namespace KODI +{ +namespace JOYSTICK +{ +class IButtonMap; +} // namespace JOYSTICK +} // namespace KODI + namespace PERIPHERALS { - class CAndroidJoystickState +class CAndroidJoystickState +{ +public: + CAndroidJoystickState() = default; + CAndroidJoystickState(CAndroidJoystickState&& other) noexcept; + virtual ~CAndroidJoystickState(); + + int GetDeviceId() const { return m_deviceId; } + + unsigned int GetButtonCount() const { return static_cast<unsigned int>(m_buttons.size()); } + unsigned int GetAxisCount() const { return static_cast<unsigned int>(m_axes.size()); } + + /*! + * \brief Initialize the joystick object + * + * Joystick will be initialized before the first call to GetEvents(). + */ + bool Initialize(const CJNIViewInputDevice& inputDevice); + + /*! + * \brief Initialize a joystick buttonmap, if possible + * + * Android has a large database of buttonmaps, which it uses to provide + * mapped button keycodes such as AKEYCODE_BUTTON_A. We can take advantage of + * this to initialize a default buttonmap based on these mappings. + * + * If Android can't map the buttons, it will use generic button keycodes such + * as AKEYCODE_BUTTON_1, in which case we can't initialize the buttonmap. + */ + bool InitializeButtonMap(KODI::JOYSTICK::IButtonMap& buttonMap) const; + + /*! + * \brief Deinitialize the joystick object + * + * GetEvents() will not be called after deinitialization. + */ + void Deinitialize(); + + /*! + * \brief Processes the given input event. + */ + bool ProcessEvent(const AInputEvent* event); + + /*! + * \brief Get events that have occurred since the last call to GetEvents() + */ + void GetEvents(std::vector<kodi::addon::PeripheralEvent>& events); + +private: + bool SetButtonValue(int axisId, JOYSTICK_STATE_BUTTON buttonValue); + bool SetAxisValue(const std::vector<int>& axisIds, JOYSTICK_STATE_AXIS axisValue); + + void GetButtonEvents(std::vector<kodi::addon::PeripheralEvent>& events); + void GetAxisEvents(std::vector<kodi::addon::PeripheralEvent>& events) const; + + bool MapButton(KODI::JOYSTICK::IButtonMap& buttonMap, int buttonKeycode) const; + bool MapTrigger(KODI::JOYSTICK::IButtonMap& buttonMap, + int axisId, + const std::string& triggerName) const; + bool MapDpad(KODI::JOYSTICK::IButtonMap& buttonMap, int horizAxisId, int vertAxisId) const; + bool MapAnalogStick(KODI::JOYSTICK::IButtonMap& buttonMap, + int horizAxisId, + int vertAxisId, + const std::string& analogStickName) const; + + static float Contain(float value, float min, float max); + static float Scale(float value, float max, float scaledMax); + static float Deadzone(float value, float deadzone); + + struct JoystickAxis { - public: - CAndroidJoystickState() = default; - CAndroidJoystickState(CAndroidJoystickState&& other) noexcept; - virtual ~CAndroidJoystickState(); - - int GetDeviceId() const { return m_deviceId; } - - unsigned int GetButtonCount() const { return static_cast<unsigned int>(m_buttons.size()); } - unsigned int GetAxisCount() const { return static_cast<unsigned int>(m_axes.size()); } - - /*! - * Initialize the joystick object. Joystick will be initialized before the - * first call to GetEvents(). - */ - bool Initialize(const CJNIViewInputDevice& inputDevice); - - /*! - * Deinitialize the joystick object. GetEvents() will not be called after - * deinitialization. - */ - void Deinitialize(); - - /*! - * Processes the given input event. - */ - bool ProcessEvent(const AInputEvent* event); - - /*! - * Get events that have occurred since the last call to GetEvents() - */ - void GetEvents(std::vector<kodi::addon::PeripheralEvent>& events); - - private: - bool SetButtonValue(int axisId, JOYSTICK_STATE_BUTTON buttonValue); - bool SetAxisValue(const std::vector<int>& axisIds, JOYSTICK_STATE_AXIS axisValue); - - void GetButtonEvents(std::vector<kodi::addon::PeripheralEvent>& events); - void GetAxisEvents(std::vector<kodi::addon::PeripheralEvent>& events) const; - - static float Contain(float value, float min, float max); - static float Scale(float value, float max, float scaledMax); - static float Deadzone(float value, float deadzone); - - struct JoystickAxis - { - std::vector<int> ids; - float flat = 0.0f; - float fuzz = 0.0f; - float min = 0.0f; - float max = 0.0f; - float range = 0.0f; - float resolution = 0.0f; - }; - - using JoystickAxes = std::vector<JoystickAxis>; - - static JoystickAxes::const_iterator GetAxis(const std::vector<int>& axisIds, const JoystickAxes& axes); - static bool ContainsAxis(int axisId, const JoystickAxes& axes); - static bool GetAxesIndex(const std::vector<int>& axisIds, const JoystickAxes& axes, size_t& axesIndex); - - int m_deviceId = -1; - - JoystickAxes m_buttons; - JoystickAxes m_axes; - - std::vector<JOYSTICK_STATE_AXIS> m_analogState; - - CCriticalSection m_eventMutex; - std::vector<kodi::addon::PeripheralEvent> m_digitalEvents; + std::vector<int> ids; + float flat = 0.0f; + float fuzz = 0.0f; + float min = 0.0f; + float max = 0.0f; + float range = 0.0f; + float resolution = 0.0f; }; -} + + using JoystickAxes = std::vector<JoystickAxis>; + + static JoystickAxes::const_iterator GetAxis(const std::vector<int>& axisIds, + const JoystickAxes& axes); + static bool ContainsAxis(int axisId, const JoystickAxes& axes); + static bool GetAxesIndex(const std::vector<int>& axisIds, + const JoystickAxes& axes, + size_t& axesIndex); + + int m_deviceId = -1; + + JoystickAxes m_buttons; + JoystickAxes m_axes; + + std::vector<JOYSTICK_STATE_AXIS> m_analogState; + + CCriticalSection m_eventMutex; + std::vector<kodi::addon::PeripheralEvent> m_digitalEvents; +}; +} // namespace PERIPHERALS diff --git a/xbmc/platform/android/peripherals/AndroidJoystickTranslator.cpp b/xbmc/platform/android/peripherals/AndroidJoystickTranslator.cpp index 4be930710e..e39050a0c4 100644 --- a/xbmc/platform/android/peripherals/AndroidJoystickTranslator.cpp +++ b/xbmc/platform/android/peripherals/AndroidJoystickTranslator.cpp @@ -8,327 +8,740 @@ #include "AndroidJoystickTranslator.h" +#include "games/controllers/DefaultController.h" + #include <android/input.h> #include <android/keycodes.h> +using namespace KODI; using namespace PERIPHERALS; -const char *CAndroidJoystickTranslator::TranslateAxis(int axisId) +const char* CAndroidJoystickTranslator::TranslateAxis(int axisId) { switch (axisId) { - case AMOTION_EVENT_AXIS_X: return "AMOTION_EVENT_AXIS_X"; - case AMOTION_EVENT_AXIS_Y: return "AMOTION_EVENT_AXIS_Y"; - case AMOTION_EVENT_AXIS_PRESSURE: return "AMOTION_EVENT_AXIS_PRESSURE"; - case AMOTION_EVENT_AXIS_SIZE: return "AMOTION_EVENT_AXIS_SIZE"; - case AMOTION_EVENT_AXIS_TOUCH_MAJOR: return "AMOTION_EVENT_AXIS_TOUCH_MAJOR"; - case AMOTION_EVENT_AXIS_TOUCH_MINOR: return "AMOTION_EVENT_AXIS_TOUCH_MINOR"; - case AMOTION_EVENT_AXIS_TOOL_MAJOR: return "AMOTION_EVENT_AXIS_TOOL_MAJOR"; - case AMOTION_EVENT_AXIS_TOOL_MINOR: return "AMOTION_EVENT_AXIS_TOOL_MINOR"; - case AMOTION_EVENT_AXIS_ORIENTATION: return "AMOTION_EVENT_AXIS_ORIENTATION"; - case AMOTION_EVENT_AXIS_VSCROLL: return "AMOTION_EVENT_AXIS_VSCROLL"; - case AMOTION_EVENT_AXIS_HSCROLL: return "AMOTION_EVENT_AXIS_HSCROLL"; - case AMOTION_EVENT_AXIS_Z: return "AMOTION_EVENT_AXIS_Z"; - case AMOTION_EVENT_AXIS_RX: return "AMOTION_EVENT_AXIS_RX"; - case AMOTION_EVENT_AXIS_RY: return "AMOTION_EVENT_AXIS_RY"; - case AMOTION_EVENT_AXIS_RZ: return "AMOTION_EVENT_AXIS_RZ"; - case AMOTION_EVENT_AXIS_HAT_X: return "AMOTION_EVENT_AXIS_HAT_X"; - case AMOTION_EVENT_AXIS_HAT_Y: return "AMOTION_EVENT_AXIS_HAT_Y"; - case AMOTION_EVENT_AXIS_LTRIGGER: return "AMOTION_EVENT_AXIS_LTRIGGER"; - case AMOTION_EVENT_AXIS_RTRIGGER: return "AMOTION_EVENT_AXIS_RTRIGGER"; - case AMOTION_EVENT_AXIS_THROTTLE: return "AMOTION_EVENT_AXIS_THROTTLE"; - case AMOTION_EVENT_AXIS_RUDDER: return "AMOTION_EVENT_AXIS_RUDDER"; - case AMOTION_EVENT_AXIS_WHEEL: return "AMOTION_EVENT_AXIS_WHEEL"; - case AMOTION_EVENT_AXIS_GAS: return "AMOTION_EVENT_AXIS_GAS"; - case AMOTION_EVENT_AXIS_BRAKE: return "AMOTION_EVENT_AXIS_BRAKE"; - case AMOTION_EVENT_AXIS_DISTANCE: return "AMOTION_EVENT_AXIS_DISTANCE"; - case AMOTION_EVENT_AXIS_TILT: return "AMOTION_EVENT_AXIS_TILT"; - case AMOTION_EVENT_AXIS_GENERIC_1: return "AMOTION_EVENT_AXIS_GENERIC_1"; - case AMOTION_EVENT_AXIS_GENERIC_2: return "AMOTION_EVENT_AXIS_GENERIC_2"; - case AMOTION_EVENT_AXIS_GENERIC_3: return "AMOTION_EVENT_AXIS_GENERIC_3"; - case AMOTION_EVENT_AXIS_GENERIC_4: return "AMOTION_EVENT_AXIS_GENERIC_4"; - case AMOTION_EVENT_AXIS_GENERIC_5: return "AMOTION_EVENT_AXIS_GENERIC_5"; - case AMOTION_EVENT_AXIS_GENERIC_6: return "AMOTION_EVENT_AXIS_GENERIC_6"; - case AMOTION_EVENT_AXIS_GENERIC_7: return "AMOTION_EVENT_AXIS_GENERIC_7"; - case AMOTION_EVENT_AXIS_GENERIC_8: return "AMOTION_EVENT_AXIS_GENERIC_8"; - case AMOTION_EVENT_AXIS_GENERIC_9: return "AMOTION_EVENT_AXIS_GENERIC_9"; - case AMOTION_EVENT_AXIS_GENERIC_10: return "AMOTION_EVENT_AXIS_GENERIC_10"; - case AMOTION_EVENT_AXIS_GENERIC_11: return "AMOTION_EVENT_AXIS_GENERIC_11"; - case AMOTION_EVENT_AXIS_GENERIC_12: return "AMOTION_EVENT_AXIS_GENERIC_12"; - case AMOTION_EVENT_AXIS_GENERIC_13: return "AMOTION_EVENT_AXIS_GENERIC_13"; - case AMOTION_EVENT_AXIS_GENERIC_14: return "AMOTION_EVENT_AXIS_GENERIC_14"; - case AMOTION_EVENT_AXIS_GENERIC_15: return "AMOTION_EVENT_AXIS_GENERIC_15"; - case AMOTION_EVENT_AXIS_GENERIC_16: return "AMOTION_EVENT_AXIS_GENERIC_16"; + case AMOTION_EVENT_AXIS_X: + return "AMOTION_EVENT_AXIS_X"; + case AMOTION_EVENT_AXIS_Y: + return "AMOTION_EVENT_AXIS_Y"; + case AMOTION_EVENT_AXIS_PRESSURE: + return "AMOTION_EVENT_AXIS_PRESSURE"; + case AMOTION_EVENT_AXIS_SIZE: + return "AMOTION_EVENT_AXIS_SIZE"; + case AMOTION_EVENT_AXIS_TOUCH_MAJOR: + return "AMOTION_EVENT_AXIS_TOUCH_MAJOR"; + case AMOTION_EVENT_AXIS_TOUCH_MINOR: + return "AMOTION_EVENT_AXIS_TOUCH_MINOR"; + case AMOTION_EVENT_AXIS_TOOL_MAJOR: + return "AMOTION_EVENT_AXIS_TOOL_MAJOR"; + case AMOTION_EVENT_AXIS_TOOL_MINOR: + return "AMOTION_EVENT_AXIS_TOOL_MINOR"; + case AMOTION_EVENT_AXIS_ORIENTATION: + return "AMOTION_EVENT_AXIS_ORIENTATION"; + case AMOTION_EVENT_AXIS_VSCROLL: + return "AMOTION_EVENT_AXIS_VSCROLL"; + case AMOTION_EVENT_AXIS_HSCROLL: + return "AMOTION_EVENT_AXIS_HSCROLL"; + case AMOTION_EVENT_AXIS_Z: + return "AMOTION_EVENT_AXIS_Z"; + case AMOTION_EVENT_AXIS_RX: + return "AMOTION_EVENT_AXIS_RX"; + case AMOTION_EVENT_AXIS_RY: + return "AMOTION_EVENT_AXIS_RY"; + case AMOTION_EVENT_AXIS_RZ: + return "AMOTION_EVENT_AXIS_RZ"; + case AMOTION_EVENT_AXIS_HAT_X: + return "AMOTION_EVENT_AXIS_HAT_X"; + case AMOTION_EVENT_AXIS_HAT_Y: + return "AMOTION_EVENT_AXIS_HAT_Y"; + case AMOTION_EVENT_AXIS_LTRIGGER: + return "AMOTION_EVENT_AXIS_LTRIGGER"; + case AMOTION_EVENT_AXIS_RTRIGGER: + return "AMOTION_EVENT_AXIS_RTRIGGER"; + case AMOTION_EVENT_AXIS_THROTTLE: + return "AMOTION_EVENT_AXIS_THROTTLE"; + case AMOTION_EVENT_AXIS_RUDDER: + return "AMOTION_EVENT_AXIS_RUDDER"; + case AMOTION_EVENT_AXIS_WHEEL: + return "AMOTION_EVENT_AXIS_WHEEL"; + case AMOTION_EVENT_AXIS_GAS: + return "AMOTION_EVENT_AXIS_GAS"; + case AMOTION_EVENT_AXIS_BRAKE: + return "AMOTION_EVENT_AXIS_BRAKE"; + case AMOTION_EVENT_AXIS_DISTANCE: + return "AMOTION_EVENT_AXIS_DISTANCE"; + case AMOTION_EVENT_AXIS_TILT: + return "AMOTION_EVENT_AXIS_TILT"; + case AMOTION_EVENT_AXIS_GENERIC_1: + return "AMOTION_EVENT_AXIS_GENERIC_1"; + case AMOTION_EVENT_AXIS_GENERIC_2: + return "AMOTION_EVENT_AXIS_GENERIC_2"; + case AMOTION_EVENT_AXIS_GENERIC_3: + return "AMOTION_EVENT_AXIS_GENERIC_3"; + case AMOTION_EVENT_AXIS_GENERIC_4: + return "AMOTION_EVENT_AXIS_GENERIC_4"; + case AMOTION_EVENT_AXIS_GENERIC_5: + return "AMOTION_EVENT_AXIS_GENERIC_5"; + case AMOTION_EVENT_AXIS_GENERIC_6: + return "AMOTION_EVENT_AXIS_GENERIC_6"; + case AMOTION_EVENT_AXIS_GENERIC_7: + return "AMOTION_EVENT_AXIS_GENERIC_7"; + case AMOTION_EVENT_AXIS_GENERIC_8: + return "AMOTION_EVENT_AXIS_GENERIC_8"; + case AMOTION_EVENT_AXIS_GENERIC_9: + return "AMOTION_EVENT_AXIS_GENERIC_9"; + case AMOTION_EVENT_AXIS_GENERIC_10: + return "AMOTION_EVENT_AXIS_GENERIC_10"; + case AMOTION_EVENT_AXIS_GENERIC_11: + return "AMOTION_EVENT_AXIS_GENERIC_11"; + case AMOTION_EVENT_AXIS_GENERIC_12: + return "AMOTION_EVENT_AXIS_GENERIC_12"; + case AMOTION_EVENT_AXIS_GENERIC_13: + return "AMOTION_EVENT_AXIS_GENERIC_13"; + case AMOTION_EVENT_AXIS_GENERIC_14: + return "AMOTION_EVENT_AXIS_GENERIC_14"; + case AMOTION_EVENT_AXIS_GENERIC_15: + return "AMOTION_EVENT_AXIS_GENERIC_15"; + case AMOTION_EVENT_AXIS_GENERIC_16: + return "AMOTION_EVENT_AXIS_GENERIC_16"; } return "unknown"; } -const char *CAndroidJoystickTranslator::TranslateKeyCode(int keyCode) +const char* CAndroidJoystickTranslator::TranslateKeyCode(int keyCode) { switch (keyCode) { - case AKEYCODE_UNKNOWN: return "AKEYCODE_UNKNOWN"; - case AKEYCODE_SOFT_LEFT: return "AKEYCODE_SOFT_LEFT"; - case AKEYCODE_SOFT_RIGHT: return "AKEYCODE_SOFT_RIGHT"; - case AKEYCODE_HOME: return "AKEYCODE_HOME"; - case AKEYCODE_BACK: return "AKEYCODE_BACK"; - case AKEYCODE_CALL: return "AKEYCODE_CALL"; - case AKEYCODE_ENDCALL: return "AKEYCODE_ENDCALL"; - case AKEYCODE_0: return "AKEYCODE_0"; - case AKEYCODE_1: return "AKEYCODE_1"; - case AKEYCODE_2: return "AKEYCODE_2"; - case AKEYCODE_3: return "AKEYCODE_3"; - case AKEYCODE_4: return "AKEYCODE_4"; - case AKEYCODE_5: return "AKEYCODE_5"; - case AKEYCODE_6: return "AKEYCODE_6"; - case AKEYCODE_7: return "AKEYCODE_7"; - case AKEYCODE_8: return "AKEYCODE_8"; - case AKEYCODE_9: return "AKEYCODE_9"; - case AKEYCODE_STAR: return "AKEYCODE_STAR"; - case AKEYCODE_POUND: return "AKEYCODE_POUND"; - case AKEYCODE_DPAD_UP: return "AKEYCODE_DPAD_UP"; - case AKEYCODE_DPAD_DOWN: return "AKEYCODE_DPAD_DOWN"; - case AKEYCODE_DPAD_LEFT: return "AKEYCODE_DPAD_LEFT"; - case AKEYCODE_DPAD_RIGHT: return "AKEYCODE_DPAD_RIGHT"; - case AKEYCODE_DPAD_CENTER: return "AKEYCODE_DPAD_CENTER"; - case AKEYCODE_VOLUME_UP: return "AKEYCODE_VOLUME_UP"; - case AKEYCODE_VOLUME_DOWN: return "AKEYCODE_VOLUME_DOWN"; - case AKEYCODE_POWER: return "AKEYCODE_POWER"; - case AKEYCODE_CAMERA: return "AKEYCODE_CAMERA"; - case AKEYCODE_CLEAR: return "AKEYCODE_CLEAR"; - case AKEYCODE_A: return "AKEYCODE_A"; - case AKEYCODE_B: return "AKEYCODE_B"; - case AKEYCODE_C: return "AKEYCODE_C"; - case AKEYCODE_D: return "AKEYCODE_D"; - case AKEYCODE_E: return "AKEYCODE_E"; - case AKEYCODE_F: return "AKEYCODE_F"; - case AKEYCODE_G: return "AKEYCODE_G"; - case AKEYCODE_H: return "AKEYCODE_H"; - case AKEYCODE_I: return "AKEYCODE_I"; - case AKEYCODE_J: return "AKEYCODE_J"; - case AKEYCODE_K: return "AKEYCODE_K"; - case AKEYCODE_L: return "AKEYCODE_L"; - case AKEYCODE_M: return "AKEYCODE_M"; - case AKEYCODE_N: return "AKEYCODE_N"; - case AKEYCODE_O: return "AKEYCODE_O"; - case AKEYCODE_P: return "AKEYCODE_P"; - case AKEYCODE_Q: return "AKEYCODE_Q"; - case AKEYCODE_R: return "AKEYCODE_R"; - case AKEYCODE_S: return "AKEYCODE_S"; - case AKEYCODE_T: return "AKEYCODE_T"; - case AKEYCODE_U: return "AKEYCODE_U"; - case AKEYCODE_V: return "AKEYCODE_V"; - case AKEYCODE_W: return "AKEYCODE_W"; - case AKEYCODE_X: return "AKEYCODE_X"; - case AKEYCODE_Y: return "AKEYCODE_Y"; - case AKEYCODE_Z: return "AKEYCODE_Z"; - case AKEYCODE_COMMA: return "AKEYCODE_COMMA"; - case AKEYCODE_PERIOD: return "AKEYCODE_PERIOD"; - case AKEYCODE_ALT_LEFT: return "AKEYCODE_ALT_LEFT"; - case AKEYCODE_ALT_RIGHT: return "AKEYCODE_ALT_RIGHT"; - case AKEYCODE_SHIFT_LEFT: return "AKEYCODE_SHIFT_LEFT"; - case AKEYCODE_SHIFT_RIGHT: return "AKEYCODE_SHIFT_RIGHT"; - case AKEYCODE_TAB: return "AKEYCODE_TAB"; - case AKEYCODE_SPACE: return "AKEYCODE_SPACE"; - case AKEYCODE_SYM: return "AKEYCODE_SYM"; - case AKEYCODE_EXPLORER: return "AKEYCODE_EXPLORER"; - case AKEYCODE_ENVELOPE: return "AKEYCODE_ENVELOPE"; - case AKEYCODE_ENTER: return "AKEYCODE_ENTER"; - case AKEYCODE_DEL: return "AKEYCODE_DEL"; - case AKEYCODE_GRAVE: return "AKEYCODE_GRAVE"; - case AKEYCODE_MINUS: return "AKEYCODE_MINUS"; - case AKEYCODE_EQUALS: return "AKEYCODE_EQUALS"; - case AKEYCODE_LEFT_BRACKET: return "AKEYCODE_LEFT_BRACKET"; - case AKEYCODE_RIGHT_BRACKET: return "AKEYCODE_RIGHT_BRACKET"; - case AKEYCODE_BACKSLASH: return "AKEYCODE_BACKSLASH"; - case AKEYCODE_SEMICOLON: return "AKEYCODE_SEMICOLON"; - case AKEYCODE_APOSTROPHE: return "AKEYCODE_APOSTROPHE"; - case AKEYCODE_SLASH: return "AKEYCODE_SLASH"; - case AKEYCODE_AT: return "AKEYCODE_AT"; - case AKEYCODE_NUM: return "AKEYCODE_NUM"; - case AKEYCODE_HEADSETHOOK: return "AKEYCODE_HEADSETHOOK"; - case AKEYCODE_FOCUS: return "AKEYCODE_FOCUS"; - case AKEYCODE_PLUS: return "AKEYCODE_PLUS"; - case AKEYCODE_MENU: return "AKEYCODE_MENU"; - case AKEYCODE_NOTIFICATION: return "AKEYCODE_NOTIFICATION"; - case AKEYCODE_SEARCH: return "AKEYCODE_SEARCH"; - case AKEYCODE_MEDIA_PLAY_PAUSE: return "AKEYCODE_MEDIA_PLAY_PAUSE"; - case AKEYCODE_MEDIA_STOP: return "AKEYCODE_MEDIA_STOP"; - case AKEYCODE_MEDIA_NEXT: return "AKEYCODE_MEDIA_NEXT"; - case AKEYCODE_MEDIA_PREVIOUS: return "AKEYCODE_MEDIA_PREVIOUS"; - case AKEYCODE_MEDIA_REWIND: return "AKEYCODE_MEDIA_REWIND"; - case AKEYCODE_MEDIA_FAST_FORWARD: return "AKEYCODE_MEDIA_FAST_FORWARD"; - case AKEYCODE_MUTE: return "AKEYCODE_MUTE"; - case AKEYCODE_PAGE_UP: return "AKEYCODE_PAGE_UP"; - case AKEYCODE_PAGE_DOWN: return "AKEYCODE_PAGE_DOWN"; - case AKEYCODE_PICTSYMBOLS: return "AKEYCODE_PICTSYMBOLS"; - case AKEYCODE_SWITCH_CHARSET: return "AKEYCODE_SWITCH_CHARSET"; - case AKEYCODE_BUTTON_A: return "AKEYCODE_BUTTON_A"; - case AKEYCODE_BUTTON_B: return "AKEYCODE_BUTTON_B"; - case AKEYCODE_BUTTON_C: return "AKEYCODE_BUTTON_C"; - case AKEYCODE_BUTTON_X: return "AKEYCODE_BUTTON_X"; - case AKEYCODE_BUTTON_Y: return "AKEYCODE_BUTTON_Y"; - case AKEYCODE_BUTTON_Z: return "AKEYCODE_BUTTON_Z"; - case AKEYCODE_BUTTON_L1: return "AKEYCODE_BUTTON_L1"; - case AKEYCODE_BUTTON_R1: return "AKEYCODE_BUTTON_R1"; - case AKEYCODE_BUTTON_L2: return "AKEYCODE_BUTTON_L2"; - case AKEYCODE_BUTTON_R2: return "AKEYCODE_BUTTON_R2"; - case AKEYCODE_BUTTON_THUMBL: return "AKEYCODE_BUTTON_THUMBL"; - case AKEYCODE_BUTTON_THUMBR: return "AKEYCODE_BUTTON_THUMBR"; - case AKEYCODE_BUTTON_START: return "AKEYCODE_BUTTON_START"; - case AKEYCODE_BUTTON_SELECT: return "AKEYCODE_BUTTON_SELECT"; - case AKEYCODE_BUTTON_MODE: return "AKEYCODE_BUTTON_MODE"; - case AKEYCODE_ESCAPE: return "AKEYCODE_ESCAPE"; - case AKEYCODE_FORWARD_DEL: return "AKEYCODE_FORWARD_DEL"; - case AKEYCODE_CTRL_LEFT: return "AKEYCODE_CTRL_LEFT"; - case AKEYCODE_CTRL_RIGHT: return "AKEYCODE_CTRL_RIGHT"; - case AKEYCODE_CAPS_LOCK: return "AKEYCODE_CAPS_LOCK"; - case AKEYCODE_SCROLL_LOCK: return "AKEYCODE_SCROLL_LOCK"; - case AKEYCODE_META_LEFT: return "AKEYCODE_META_LEFT"; - case AKEYCODE_META_RIGHT: return "AKEYCODE_META_RIGHT"; - case AKEYCODE_FUNCTION: return "AKEYCODE_FUNCTION"; - case AKEYCODE_SYSRQ: return "AKEYCODE_SYSRQ"; - case AKEYCODE_BREAK: return "AKEYCODE_BREAK"; - case AKEYCODE_MOVE_HOME: return "AKEYCODE_MOVE_HOME"; - case AKEYCODE_MOVE_END: return "AKEYCODE_MOVE_END"; - case AKEYCODE_INSERT: return "AKEYCODE_INSERT"; - case AKEYCODE_FORWARD: return "AKEYCODE_FORWARD"; - case AKEYCODE_MEDIA_PLAY: return "AKEYCODE_MEDIA_PLAY"; - case AKEYCODE_MEDIA_PAUSE: return "AKEYCODE_MEDIA_PAUSE"; - case AKEYCODE_MEDIA_CLOSE: return "AKEYCODE_MEDIA_CLOSE"; - case AKEYCODE_MEDIA_EJECT: return "AKEYCODE_MEDIA_EJECT"; - case AKEYCODE_MEDIA_RECORD: return "AKEYCODE_MEDIA_RECORD"; - case AKEYCODE_F1: return "AKEYCODE_F1"; - case AKEYCODE_F2: return "AKEYCODE_F2"; - case AKEYCODE_F3: return "AKEYCODE_F3"; - case AKEYCODE_F4: return "AKEYCODE_F4"; - case AKEYCODE_F5: return "AKEYCODE_F5"; - case AKEYCODE_F6: return "AKEYCODE_F6"; - case AKEYCODE_F7: return "AKEYCODE_F7"; - case AKEYCODE_F8: return "AKEYCODE_F8"; - case AKEYCODE_F9: return "AKEYCODE_F9"; - case AKEYCODE_F10: return "AKEYCODE_F10"; - case AKEYCODE_F11: return "AKEYCODE_F11"; - case AKEYCODE_F12: return "AKEYCODE_F12"; - case AKEYCODE_NUM_LOCK: return "AKEYCODE_NUM_LOCK"; - case AKEYCODE_NUMPAD_0: return "AKEYCODE_NUMPAD_0"; - case AKEYCODE_NUMPAD_1: return "AKEYCODE_NUMPAD_1"; - case AKEYCODE_NUMPAD_2: return "AKEYCODE_NUMPAD_2"; - case AKEYCODE_NUMPAD_3: return "AKEYCODE_NUMPAD_3"; - case AKEYCODE_NUMPAD_4: return "AKEYCODE_NUMPAD_4"; - case AKEYCODE_NUMPAD_5: return "AKEYCODE_NUMPAD_5"; - case AKEYCODE_NUMPAD_6: return "AKEYCODE_NUMPAD_6"; - case AKEYCODE_NUMPAD_7: return "AKEYCODE_NUMPAD_7"; - case AKEYCODE_NUMPAD_8: return "AKEYCODE_NUMPAD_8"; - case AKEYCODE_NUMPAD_9: return "AKEYCODE_NUMPAD_9"; - case AKEYCODE_NUMPAD_DIVIDE: return "AKEYCODE_NUMPAD_DIVIDE"; - case AKEYCODE_NUMPAD_MULTIPLY: return "AKEYCODE_NUMPAD_MULTIPLY"; - case AKEYCODE_NUMPAD_SUBTRACT: return "AKEYCODE_NUMPAD_SUBTRACT"; - case AKEYCODE_NUMPAD_ADD: return "AKEYCODE_NUMPAD_ADD"; - case AKEYCODE_NUMPAD_DOT: return "AKEYCODE_NUMPAD_DOT"; - case AKEYCODE_NUMPAD_COMMA: return "AKEYCODE_NUMPAD_COMMA"; - case AKEYCODE_NUMPAD_ENTER: return "AKEYCODE_NUMPAD_ENTER"; - case AKEYCODE_NUMPAD_EQUALS: return "AKEYCODE_NUMPAD_EQUALS"; - case AKEYCODE_NUMPAD_LEFT_PAREN: return "AKEYCODE_NUMPAD_LEFT_PAREN"; - case AKEYCODE_NUMPAD_RIGHT_PAREN: return "AKEYCODE_NUMPAD_RIGHT_PAREN"; - case AKEYCODE_VOLUME_MUTE: return "AKEYCODE_VOLUME_MUTE"; - case AKEYCODE_INFO: return "AKEYCODE_INFO"; - case AKEYCODE_CHANNEL_UP: return "AKEYCODE_CHANNEL_UP"; - case AKEYCODE_CHANNEL_DOWN: return "AKEYCODE_CHANNEL_DOWN"; - case AKEYCODE_ZOOM_IN: return "AKEYCODE_ZOOM_IN"; - case AKEYCODE_ZOOM_OUT: return "AKEYCODE_ZOOM_OUT"; - case AKEYCODE_TV: return "AKEYCODE_TV"; - case AKEYCODE_WINDOW: return "AKEYCODE_WINDOW"; - case AKEYCODE_GUIDE: return "AKEYCODE_GUIDE"; - case AKEYCODE_DVR: return "AKEYCODE_DVR"; - case AKEYCODE_BOOKMARK: return "AKEYCODE_BOOKMARK"; - case AKEYCODE_CAPTIONS: return "AKEYCODE_CAPTIONS"; - case AKEYCODE_SETTINGS: return "AKEYCODE_SETTINGS"; - case AKEYCODE_TV_POWER: return "AKEYCODE_TV_POWER"; - case AKEYCODE_TV_INPUT: return "AKEYCODE_TV_INPUT"; - case AKEYCODE_STB_POWER: return "AKEYCODE_STB_POWER"; - case AKEYCODE_STB_INPUT: return "AKEYCODE_STB_INPUT"; - case AKEYCODE_AVR_POWER: return "AKEYCODE_AVR_POWER"; - case AKEYCODE_AVR_INPUT: return "AKEYCODE_AVR_INPUT"; - case AKEYCODE_PROG_RED: return "AKEYCODE_PROG_RED"; - case AKEYCODE_PROG_GREEN: return "AKEYCODE_PROG_GREEN"; - case AKEYCODE_PROG_YELLOW: return "AKEYCODE_PROG_YELLOW"; - case AKEYCODE_PROG_BLUE: return "AKEYCODE_PROG_BLUE"; - case AKEYCODE_APP_SWITCH: return "AKEYCODE_APP_SWITCH"; - case AKEYCODE_BUTTON_1: return "AKEYCODE_BUTTON_1"; - case AKEYCODE_BUTTON_2: return "AKEYCODE_BUTTON_2"; - case AKEYCODE_BUTTON_3: return "AKEYCODE_BUTTON_3"; - case AKEYCODE_BUTTON_4: return "AKEYCODE_BUTTON_4"; - case AKEYCODE_BUTTON_5: return "AKEYCODE_BUTTON_5"; - case AKEYCODE_BUTTON_6: return "AKEYCODE_BUTTON_6"; - case AKEYCODE_BUTTON_7: return "AKEYCODE_BUTTON_7"; - case AKEYCODE_BUTTON_8: return "AKEYCODE_BUTTON_8"; - case AKEYCODE_BUTTON_9: return "AKEYCODE_BUTTON_9"; - case AKEYCODE_BUTTON_10: return "AKEYCODE_BUTTON_10"; - case AKEYCODE_BUTTON_11: return "AKEYCODE_BUTTON_11"; - case AKEYCODE_BUTTON_12: return "AKEYCODE_BUTTON_12"; - case AKEYCODE_BUTTON_13: return "AKEYCODE_BUTTON_13"; - case AKEYCODE_BUTTON_14: return "AKEYCODE_BUTTON_14"; - case AKEYCODE_BUTTON_15: return "AKEYCODE_BUTTON_15"; - case AKEYCODE_BUTTON_16: return "AKEYCODE_BUTTON_16"; - case AKEYCODE_LANGUAGE_SWITCH: return "AKEYCODE_LANGUAGE_SWITCH"; - case AKEYCODE_MANNER_MODE: return "AKEYCODE_MANNER_MODE"; - case AKEYCODE_3D_MODE: return "AKEYCODE_3D_MODE"; - case AKEYCODE_CONTACTS: return "AKEYCODE_CONTACTS"; - case AKEYCODE_CALENDAR: return "AKEYCODE_CALENDAR"; - case AKEYCODE_MUSIC: return "AKEYCODE_MUSIC"; - case AKEYCODE_CALCULATOR: return "AKEYCODE_CALCULATOR"; - case AKEYCODE_ZENKAKU_HANKAKU: return "AKEYCODE_ZENKAKU_HANKAKU"; - case AKEYCODE_EISU: return "AKEYCODE_EISU"; - case AKEYCODE_MUHENKAN: return "AKEYCODE_MUHENKAN"; - case AKEYCODE_HENKAN: return "AKEYCODE_HENKAN"; - case AKEYCODE_KATAKANA_HIRAGANA: return "AKEYCODE_KATAKANA_HIRAGANA"; - case AKEYCODE_YEN: return "AKEYCODE_YEN"; - case AKEYCODE_RO: return "AKEYCODE_RO"; - case AKEYCODE_KANA: return "AKEYCODE_KANA"; - case AKEYCODE_ASSIST: return "AKEYCODE_ASSIST"; - case AKEYCODE_BRIGHTNESS_DOWN: return "AKEYCODE_BRIGHTNESS_DOWN"; - case AKEYCODE_BRIGHTNESS_UP: return "AKEYCODE_BRIGHTNESS_UP"; - case AKEYCODE_MEDIA_AUDIO_TRACK: return "AKEYCODE_MEDIA_AUDIO_TRACK"; - case AKEYCODE_SLEEP: return "AKEYCODE_SLEEP"; - case AKEYCODE_WAKEUP: return "AKEYCODE_WAKEUP"; - case AKEYCODE_PAIRING: return "AKEYCODE_PAIRING"; - case AKEYCODE_MEDIA_TOP_MENU: return "AKEYCODE_MEDIA_TOP_MENU"; - case AKEYCODE_11: return "AKEYCODE_11"; - case AKEYCODE_12: return "AKEYCODE_12"; - case AKEYCODE_LAST_CHANNEL: return "AKEYCODE_LAST_CHANNEL"; - case AKEYCODE_TV_DATA_SERVICE: return "AKEYCODE_TV_DATA_SERVICE"; - case AKEYCODE_VOICE_ASSIST: return "AKEYCODE_VOICE_ASSIST"; - case AKEYCODE_TV_RADIO_SERVICE: return "AKEYCODE_TV_RADIO_SERVICE"; - case AKEYCODE_TV_TELETEXT: return "AKEYCODE_TV_TELETEXT"; - case AKEYCODE_TV_NUMBER_ENTRY: return "AKEYCODE_TV_NUMBER_ENTRY"; - case AKEYCODE_TV_TERRESTRIAL_ANALOG: return "AKEYCODE_TV_TERRESTRIAL_ANALOG"; - case AKEYCODE_TV_TERRESTRIAL_DIGITAL: return "AKEYCODE_TV_TERRESTRIAL_DIGITAL"; - case AKEYCODE_TV_SATELLITE: return "AKEYCODE_TV_SATELLITE"; - case AKEYCODE_TV_SATELLITE_BS: return "AKEYCODE_TV_SATELLITE_BS"; - case AKEYCODE_TV_SATELLITE_CS: return "AKEYCODE_TV_SATELLITE_CS"; - case AKEYCODE_TV_SATELLITE_SERVICE: return "AKEYCODE_TV_SATELLITE_SERVICE"; - case AKEYCODE_TV_NETWORK: return "AKEYCODE_TV_NETWORK"; - case AKEYCODE_TV_ANTENNA_CABLE: return "AKEYCODE_TV_ANTENNA_CABLE"; - case AKEYCODE_TV_INPUT_HDMI_1: return "AKEYCODE_TV_INPUT_HDMI_1"; - case AKEYCODE_TV_INPUT_HDMI_2: return "AKEYCODE_TV_INPUT_HDMI_2"; - case AKEYCODE_TV_INPUT_HDMI_3: return "AKEYCODE_TV_INPUT_HDMI_3"; - case AKEYCODE_TV_INPUT_HDMI_4: return "AKEYCODE_TV_INPUT_HDMI_4"; - case AKEYCODE_TV_INPUT_COMPOSITE_1: return "AKEYCODE_TV_INPUT_COMPOSITE_1"; - case AKEYCODE_TV_INPUT_COMPOSITE_2: return "AKEYCODE_TV_INPUT_COMPOSITE_2"; - case AKEYCODE_TV_INPUT_COMPONENT_1: return "AKEYCODE_TV_INPUT_COMPONENT_1"; - case AKEYCODE_TV_INPUT_COMPONENT_2: return "AKEYCODE_TV_INPUT_COMPONENT_2"; - case AKEYCODE_TV_INPUT_VGA_1: return "AKEYCODE_TV_INPUT_VGA_1"; - case AKEYCODE_TV_AUDIO_DESCRIPTION: return "AKEYCODE_TV_AUDIO_DESCRIPTION"; - case AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP: return "AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP"; - case AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN: return "AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN"; - case AKEYCODE_TV_ZOOM_MODE: return "AKEYCODE_TV_ZOOM_MODE"; - case AKEYCODE_TV_CONTENTS_MENU: return "AKEYCODE_TV_CONTENTS_MENU"; - case AKEYCODE_TV_MEDIA_CONTEXT_MENU: return "AKEYCODE_TV_MEDIA_CONTEXT_MENU"; - case AKEYCODE_TV_TIMER_PROGRAMMING: return "AKEYCODE_TV_TIMER_PROGRAMMING"; - case AKEYCODE_HELP: return "AKEYCODE_HELP"; + case AKEYCODE_UNKNOWN: + return "AKEYCODE_UNKNOWN"; + case AKEYCODE_SOFT_LEFT: + return "AKEYCODE_SOFT_LEFT"; + case AKEYCODE_SOFT_RIGHT: + return "AKEYCODE_SOFT_RIGHT"; + case AKEYCODE_HOME: + return "AKEYCODE_HOME"; + case AKEYCODE_BACK: + return "AKEYCODE_BACK"; + case AKEYCODE_CALL: + return "AKEYCODE_CALL"; + case AKEYCODE_ENDCALL: + return "AKEYCODE_ENDCALL"; + case AKEYCODE_0: + return "AKEYCODE_0"; + case AKEYCODE_1: + return "AKEYCODE_1"; + case AKEYCODE_2: + return "AKEYCODE_2"; + case AKEYCODE_3: + return "AKEYCODE_3"; + case AKEYCODE_4: + return "AKEYCODE_4"; + case AKEYCODE_5: + return "AKEYCODE_5"; + case AKEYCODE_6: + return "AKEYCODE_6"; + case AKEYCODE_7: + return "AKEYCODE_7"; + case AKEYCODE_8: + return "AKEYCODE_8"; + case AKEYCODE_9: + return "AKEYCODE_9"; + case AKEYCODE_STAR: + return "AKEYCODE_STAR"; + case AKEYCODE_POUND: + return "AKEYCODE_POUND"; + case AKEYCODE_DPAD_UP: + return "AKEYCODE_DPAD_UP"; + case AKEYCODE_DPAD_DOWN: + return "AKEYCODE_DPAD_DOWN"; + case AKEYCODE_DPAD_LEFT: + return "AKEYCODE_DPAD_LEFT"; + case AKEYCODE_DPAD_RIGHT: + return "AKEYCODE_DPAD_RIGHT"; + case AKEYCODE_DPAD_CENTER: + return "AKEYCODE_DPAD_CENTER"; + case AKEYCODE_VOLUME_UP: + return "AKEYCODE_VOLUME_UP"; + case AKEYCODE_VOLUME_DOWN: + return "AKEYCODE_VOLUME_DOWN"; + case AKEYCODE_POWER: + return "AKEYCODE_POWER"; + case AKEYCODE_CAMERA: + return "AKEYCODE_CAMERA"; + case AKEYCODE_CLEAR: + return "AKEYCODE_CLEAR"; + case AKEYCODE_A: + return "AKEYCODE_A"; + case AKEYCODE_B: + return "AKEYCODE_B"; + case AKEYCODE_C: + return "AKEYCODE_C"; + case AKEYCODE_D: + return "AKEYCODE_D"; + case AKEYCODE_E: + return "AKEYCODE_E"; + case AKEYCODE_F: + return "AKEYCODE_F"; + case AKEYCODE_G: + return "AKEYCODE_G"; + case AKEYCODE_H: + return "AKEYCODE_H"; + case AKEYCODE_I: + return "AKEYCODE_I"; + case AKEYCODE_J: + return "AKEYCODE_J"; + case AKEYCODE_K: + return "AKEYCODE_K"; + case AKEYCODE_L: + return "AKEYCODE_L"; + case AKEYCODE_M: + return "AKEYCODE_M"; + case AKEYCODE_N: + return "AKEYCODE_N"; + case AKEYCODE_O: + return "AKEYCODE_O"; + case AKEYCODE_P: + return "AKEYCODE_P"; + case AKEYCODE_Q: + return "AKEYCODE_Q"; + case AKEYCODE_R: + return "AKEYCODE_R"; + case AKEYCODE_S: + return "AKEYCODE_S"; + case AKEYCODE_T: + return "AKEYCODE_T"; + case AKEYCODE_U: + return "AKEYCODE_U"; + case AKEYCODE_V: + return "AKEYCODE_V"; + case AKEYCODE_W: + return "AKEYCODE_W"; + case AKEYCODE_X: + return "AKEYCODE_X"; + case AKEYCODE_Y: + return "AKEYCODE_Y"; + case AKEYCODE_Z: + return "AKEYCODE_Z"; + case AKEYCODE_COMMA: + return "AKEYCODE_COMMA"; + case AKEYCODE_PERIOD: + return "AKEYCODE_PERIOD"; + case AKEYCODE_ALT_LEFT: + return "AKEYCODE_ALT_LEFT"; + case AKEYCODE_ALT_RIGHT: + return "AKEYCODE_ALT_RIGHT"; + case AKEYCODE_SHIFT_LEFT: + return "AKEYCODE_SHIFT_LEFT"; + case AKEYCODE_SHIFT_RIGHT: + return "AKEYCODE_SHIFT_RIGHT"; + case AKEYCODE_TAB: + return "AKEYCODE_TAB"; + case AKEYCODE_SPACE: + return "AKEYCODE_SPACE"; + case AKEYCODE_SYM: + return "AKEYCODE_SYM"; + case AKEYCODE_EXPLORER: + return "AKEYCODE_EXPLORER"; + case AKEYCODE_ENVELOPE: + return "AKEYCODE_ENVELOPE"; + case AKEYCODE_ENTER: + return "AKEYCODE_ENTER"; + case AKEYCODE_DEL: + return "AKEYCODE_DEL"; + case AKEYCODE_GRAVE: + return "AKEYCODE_GRAVE"; + case AKEYCODE_MINUS: + return "AKEYCODE_MINUS"; + case AKEYCODE_EQUALS: + return "AKEYCODE_EQUALS"; + case AKEYCODE_LEFT_BRACKET: + return "AKEYCODE_LEFT_BRACKET"; + case AKEYCODE_RIGHT_BRACKET: + return "AKEYCODE_RIGHT_BRACKET"; + case AKEYCODE_BACKSLASH: + return "AKEYCODE_BACKSLASH"; + case AKEYCODE_SEMICOLON: + return "AKEYCODE_SEMICOLON"; + case AKEYCODE_APOSTROPHE: + return "AKEYCODE_APOSTROPHE"; + case AKEYCODE_SLASH: + return "AKEYCODE_SLASH"; + case AKEYCODE_AT: + return "AKEYCODE_AT"; + case AKEYCODE_NUM: + return "AKEYCODE_NUM"; + case AKEYCODE_HEADSETHOOK: + return "AKEYCODE_HEADSETHOOK"; + case AKEYCODE_FOCUS: + return "AKEYCODE_FOCUS"; + case AKEYCODE_PLUS: + return "AKEYCODE_PLUS"; + case AKEYCODE_MENU: + return "AKEYCODE_MENU"; + case AKEYCODE_NOTIFICATION: + return "AKEYCODE_NOTIFICATION"; + case AKEYCODE_SEARCH: + return "AKEYCODE_SEARCH"; + case AKEYCODE_MEDIA_PLAY_PAUSE: + return "AKEYCODE_MEDIA_PLAY_PAUSE"; + case AKEYCODE_MEDIA_STOP: + return "AKEYCODE_MEDIA_STOP"; + case AKEYCODE_MEDIA_NEXT: + return "AKEYCODE_MEDIA_NEXT"; + case AKEYCODE_MEDIA_PREVIOUS: + return "AKEYCODE_MEDIA_PREVIOUS"; + case AKEYCODE_MEDIA_REWIND: + return "AKEYCODE_MEDIA_REWIND"; + case AKEYCODE_MEDIA_FAST_FORWARD: + return "AKEYCODE_MEDIA_FAST_FORWARD"; + case AKEYCODE_MUTE: + return "AKEYCODE_MUTE"; + case AKEYCODE_PAGE_UP: + return "AKEYCODE_PAGE_UP"; + case AKEYCODE_PAGE_DOWN: + return "AKEYCODE_PAGE_DOWN"; + case AKEYCODE_PICTSYMBOLS: + return "AKEYCODE_PICTSYMBOLS"; + case AKEYCODE_SWITCH_CHARSET: + return "AKEYCODE_SWITCH_CHARSET"; + case AKEYCODE_BUTTON_A: + return "AKEYCODE_BUTTON_A"; + case AKEYCODE_BUTTON_B: + return "AKEYCODE_BUTTON_B"; + case AKEYCODE_BUTTON_C: + return "AKEYCODE_BUTTON_C"; + case AKEYCODE_BUTTON_X: + return "AKEYCODE_BUTTON_X"; + case AKEYCODE_BUTTON_Y: + return "AKEYCODE_BUTTON_Y"; + case AKEYCODE_BUTTON_Z: + return "AKEYCODE_BUTTON_Z"; + case AKEYCODE_BUTTON_L1: + return "AKEYCODE_BUTTON_L1"; + case AKEYCODE_BUTTON_R1: + return "AKEYCODE_BUTTON_R1"; + case AKEYCODE_BUTTON_L2: + return "AKEYCODE_BUTTON_L2"; + case AKEYCODE_BUTTON_R2: + return "AKEYCODE_BUTTON_R2"; + case AKEYCODE_BUTTON_THUMBL: + return "AKEYCODE_BUTTON_THUMBL"; + case AKEYCODE_BUTTON_THUMBR: + return "AKEYCODE_BUTTON_THUMBR"; + case AKEYCODE_BUTTON_START: + return "AKEYCODE_BUTTON_START"; + case AKEYCODE_BUTTON_SELECT: + return "AKEYCODE_BUTTON_SELECT"; + case AKEYCODE_BUTTON_MODE: + return "AKEYCODE_BUTTON_MODE"; + case AKEYCODE_ESCAPE: + return "AKEYCODE_ESCAPE"; + case AKEYCODE_FORWARD_DEL: + return "AKEYCODE_FORWARD_DEL"; + case AKEYCODE_CTRL_LEFT: + return "AKEYCODE_CTRL_LEFT"; + case AKEYCODE_CTRL_RIGHT: + return "AKEYCODE_CTRL_RIGHT"; + case AKEYCODE_CAPS_LOCK: + return "AKEYCODE_CAPS_LOCK"; + case AKEYCODE_SCROLL_LOCK: + return "AKEYCODE_SCROLL_LOCK"; + case AKEYCODE_META_LEFT: + return "AKEYCODE_META_LEFT"; + case AKEYCODE_META_RIGHT: + return "AKEYCODE_META_RIGHT"; + case AKEYCODE_FUNCTION: + return "AKEYCODE_FUNCTION"; + case AKEYCODE_SYSRQ: + return "AKEYCODE_SYSRQ"; + case AKEYCODE_BREAK: + return "AKEYCODE_BREAK"; + case AKEYCODE_MOVE_HOME: + return "AKEYCODE_MOVE_HOME"; + case AKEYCODE_MOVE_END: + return "AKEYCODE_MOVE_END"; + case AKEYCODE_INSERT: + return "AKEYCODE_INSERT"; + case AKEYCODE_FORWARD: + return "AKEYCODE_FORWARD"; + case AKEYCODE_MEDIA_PLAY: + return "AKEYCODE_MEDIA_PLAY"; + case AKEYCODE_MEDIA_PAUSE: + return "AKEYCODE_MEDIA_PAUSE"; + case AKEYCODE_MEDIA_CLOSE: + return "AKEYCODE_MEDIA_CLOSE"; + case AKEYCODE_MEDIA_EJECT: + return "AKEYCODE_MEDIA_EJECT"; + case AKEYCODE_MEDIA_RECORD: + return "AKEYCODE_MEDIA_RECORD"; + case AKEYCODE_F1: + return "AKEYCODE_F1"; + case AKEYCODE_F2: + return "AKEYCODE_F2"; + case AKEYCODE_F3: + return "AKEYCODE_F3"; + case AKEYCODE_F4: + return "AKEYCODE_F4"; + case AKEYCODE_F5: + return "AKEYCODE_F5"; + case AKEYCODE_F6: + return "AKEYCODE_F6"; + case AKEYCODE_F7: + return "AKEYCODE_F7"; + case AKEYCODE_F8: + return "AKEYCODE_F8"; + case AKEYCODE_F9: + return "AKEYCODE_F9"; + case AKEYCODE_F10: + return "AKEYCODE_F10"; + case AKEYCODE_F11: + return "AKEYCODE_F11"; + case AKEYCODE_F12: + return "AKEYCODE_F12"; + case AKEYCODE_NUM_LOCK: + return "AKEYCODE_NUM_LOCK"; + case AKEYCODE_NUMPAD_0: + return "AKEYCODE_NUMPAD_0"; + case AKEYCODE_NUMPAD_1: + return "AKEYCODE_NUMPAD_1"; + case AKEYCODE_NUMPAD_2: + return "AKEYCODE_NUMPAD_2"; + case AKEYCODE_NUMPAD_3: + return "AKEYCODE_NUMPAD_3"; + case AKEYCODE_NUMPAD_4: + return "AKEYCODE_NUMPAD_4"; + case AKEYCODE_NUMPAD_5: + return "AKEYCODE_NUMPAD_5"; + case AKEYCODE_NUMPAD_6: + return "AKEYCODE_NUMPAD_6"; + case AKEYCODE_NUMPAD_7: + return "AKEYCODE_NUMPAD_7"; + case AKEYCODE_NUMPAD_8: + return "AKEYCODE_NUMPAD_8"; + case AKEYCODE_NUMPAD_9: + return "AKEYCODE_NUMPAD_9"; + case AKEYCODE_NUMPAD_DIVIDE: + return "AKEYCODE_NUMPAD_DIVIDE"; + case AKEYCODE_NUMPAD_MULTIPLY: + return "AKEYCODE_NUMPAD_MULTIPLY"; + case AKEYCODE_NUMPAD_SUBTRACT: + return "AKEYCODE_NUMPAD_SUBTRACT"; + case AKEYCODE_NUMPAD_ADD: + return "AKEYCODE_NUMPAD_ADD"; + case AKEYCODE_NUMPAD_DOT: + return "AKEYCODE_NUMPAD_DOT"; + case AKEYCODE_NUMPAD_COMMA: + return "AKEYCODE_NUMPAD_COMMA"; + case AKEYCODE_NUMPAD_ENTER: + return "AKEYCODE_NUMPAD_ENTER"; + case AKEYCODE_NUMPAD_EQUALS: + return "AKEYCODE_NUMPAD_EQUALS"; + case AKEYCODE_NUMPAD_LEFT_PAREN: + return "AKEYCODE_NUMPAD_LEFT_PAREN"; + case AKEYCODE_NUMPAD_RIGHT_PAREN: + return "AKEYCODE_NUMPAD_RIGHT_PAREN"; + case AKEYCODE_VOLUME_MUTE: + return "AKEYCODE_VOLUME_MUTE"; + case AKEYCODE_INFO: + return "AKEYCODE_INFO"; + case AKEYCODE_CHANNEL_UP: + return "AKEYCODE_CHANNEL_UP"; + case AKEYCODE_CHANNEL_DOWN: + return "AKEYCODE_CHANNEL_DOWN"; + case AKEYCODE_ZOOM_IN: + return "AKEYCODE_ZOOM_IN"; + case AKEYCODE_ZOOM_OUT: + return "AKEYCODE_ZOOM_OUT"; + case AKEYCODE_TV: + return "AKEYCODE_TV"; + case AKEYCODE_WINDOW: + return "AKEYCODE_WINDOW"; + case AKEYCODE_GUIDE: + return "AKEYCODE_GUIDE"; + case AKEYCODE_DVR: + return "AKEYCODE_DVR"; + case AKEYCODE_BOOKMARK: + return "AKEYCODE_BOOKMARK"; + case AKEYCODE_CAPTIONS: + return "AKEYCODE_CAPTIONS"; + case AKEYCODE_SETTINGS: + return "AKEYCODE_SETTINGS"; + case AKEYCODE_TV_POWER: + return "AKEYCODE_TV_POWER"; + case AKEYCODE_TV_INPUT: + return "AKEYCODE_TV_INPUT"; + case AKEYCODE_STB_POWER: + return "AKEYCODE_STB_POWER"; + case AKEYCODE_STB_INPUT: + return "AKEYCODE_STB_INPUT"; + case AKEYCODE_AVR_POWER: + return "AKEYCODE_AVR_POWER"; + case AKEYCODE_AVR_INPUT: + return "AKEYCODE_AVR_INPUT"; + case AKEYCODE_PROG_RED: + return "AKEYCODE_PROG_RED"; + case AKEYCODE_PROG_GREEN: + return "AKEYCODE_PROG_GREEN"; + case AKEYCODE_PROG_YELLOW: + return "AKEYCODE_PROG_YELLOW"; + case AKEYCODE_PROG_BLUE: + return "AKEYCODE_PROG_BLUE"; + case AKEYCODE_APP_SWITCH: + return "AKEYCODE_APP_SWITCH"; + case AKEYCODE_BUTTON_1: + return "AKEYCODE_BUTTON_1"; + case AKEYCODE_BUTTON_2: + return "AKEYCODE_BUTTON_2"; + case AKEYCODE_BUTTON_3: + return "AKEYCODE_BUTTON_3"; + case AKEYCODE_BUTTON_4: + return "AKEYCODE_BUTTON_4"; + case AKEYCODE_BUTTON_5: + return "AKEYCODE_BUTTON_5"; + case AKEYCODE_BUTTON_6: + return "AKEYCODE_BUTTON_6"; + case AKEYCODE_BUTTON_7: + return "AKEYCODE_BUTTON_7"; + case AKEYCODE_BUTTON_8: + return "AKEYCODE_BUTTON_8"; + case AKEYCODE_BUTTON_9: + return "AKEYCODE_BUTTON_9"; + case AKEYCODE_BUTTON_10: + return "AKEYCODE_BUTTON_10"; + case AKEYCODE_BUTTON_11: + return "AKEYCODE_BUTTON_11"; + case AKEYCODE_BUTTON_12: + return "AKEYCODE_BUTTON_12"; + case AKEYCODE_BUTTON_13: + return "AKEYCODE_BUTTON_13"; + case AKEYCODE_BUTTON_14: + return "AKEYCODE_BUTTON_14"; + case AKEYCODE_BUTTON_15: + return "AKEYCODE_BUTTON_15"; + case AKEYCODE_BUTTON_16: + return "AKEYCODE_BUTTON_16"; + case AKEYCODE_LANGUAGE_SWITCH: + return "AKEYCODE_LANGUAGE_SWITCH"; + case AKEYCODE_MANNER_MODE: + return "AKEYCODE_MANNER_MODE"; + case AKEYCODE_3D_MODE: + return "AKEYCODE_3D_MODE"; + case AKEYCODE_CONTACTS: + return "AKEYCODE_CONTACTS"; + case AKEYCODE_CALENDAR: + return "AKEYCODE_CALENDAR"; + case AKEYCODE_MUSIC: + return "AKEYCODE_MUSIC"; + case AKEYCODE_CALCULATOR: + return "AKEYCODE_CALCULATOR"; + case AKEYCODE_ZENKAKU_HANKAKU: + return "AKEYCODE_ZENKAKU_HANKAKU"; + case AKEYCODE_EISU: + return "AKEYCODE_EISU"; + case AKEYCODE_MUHENKAN: + return "AKEYCODE_MUHENKAN"; + case AKEYCODE_HENKAN: + return "AKEYCODE_HENKAN"; + case AKEYCODE_KATAKANA_HIRAGANA: + return "AKEYCODE_KATAKANA_HIRAGANA"; + case AKEYCODE_YEN: + return "AKEYCODE_YEN"; + case AKEYCODE_RO: + return "AKEYCODE_RO"; + case AKEYCODE_KANA: + return "AKEYCODE_KANA"; + case AKEYCODE_ASSIST: + return "AKEYCODE_ASSIST"; + case AKEYCODE_BRIGHTNESS_DOWN: + return "AKEYCODE_BRIGHTNESS_DOWN"; + case AKEYCODE_BRIGHTNESS_UP: + return "AKEYCODE_BRIGHTNESS_UP"; + case AKEYCODE_MEDIA_AUDIO_TRACK: + return "AKEYCODE_MEDIA_AUDIO_TRACK"; + case AKEYCODE_SLEEP: + return "AKEYCODE_SLEEP"; + case AKEYCODE_WAKEUP: + return "AKEYCODE_WAKEUP"; + case AKEYCODE_PAIRING: + return "AKEYCODE_PAIRING"; + case AKEYCODE_MEDIA_TOP_MENU: + return "AKEYCODE_MEDIA_TOP_MENU"; + case AKEYCODE_11: + return "AKEYCODE_11"; + case AKEYCODE_12: + return "AKEYCODE_12"; + case AKEYCODE_LAST_CHANNEL: + return "AKEYCODE_LAST_CHANNEL"; + case AKEYCODE_TV_DATA_SERVICE: + return "AKEYCODE_TV_DATA_SERVICE"; + case AKEYCODE_VOICE_ASSIST: + return "AKEYCODE_VOICE_ASSIST"; + case AKEYCODE_TV_RADIO_SERVICE: + return "AKEYCODE_TV_RADIO_SERVICE"; + case AKEYCODE_TV_TELETEXT: + return "AKEYCODE_TV_TELETEXT"; + case AKEYCODE_TV_NUMBER_ENTRY: + return "AKEYCODE_TV_NUMBER_ENTRY"; + case AKEYCODE_TV_TERRESTRIAL_ANALOG: + return "AKEYCODE_TV_TERRESTRIAL_ANALOG"; + case AKEYCODE_TV_TERRESTRIAL_DIGITAL: + return "AKEYCODE_TV_TERRESTRIAL_DIGITAL"; + case AKEYCODE_TV_SATELLITE: + return "AKEYCODE_TV_SATELLITE"; + case AKEYCODE_TV_SATELLITE_BS: + return "AKEYCODE_TV_SATELLITE_BS"; + case AKEYCODE_TV_SATELLITE_CS: + return "AKEYCODE_TV_SATELLITE_CS"; + case AKEYCODE_TV_SATELLITE_SERVICE: + return "AKEYCODE_TV_SATELLITE_SERVICE"; + case AKEYCODE_TV_NETWORK: + return "AKEYCODE_TV_NETWORK"; + case AKEYCODE_TV_ANTENNA_CABLE: + return "AKEYCODE_TV_ANTENNA_CABLE"; + case AKEYCODE_TV_INPUT_HDMI_1: + return "AKEYCODE_TV_INPUT_HDMI_1"; + case AKEYCODE_TV_INPUT_HDMI_2: + return "AKEYCODE_TV_INPUT_HDMI_2"; + case AKEYCODE_TV_INPUT_HDMI_3: + return "AKEYCODE_TV_INPUT_HDMI_3"; + case AKEYCODE_TV_INPUT_HDMI_4: + return "AKEYCODE_TV_INPUT_HDMI_4"; + case AKEYCODE_TV_INPUT_COMPOSITE_1: + return "AKEYCODE_TV_INPUT_COMPOSITE_1"; + case AKEYCODE_TV_INPUT_COMPOSITE_2: + return "AKEYCODE_TV_INPUT_COMPOSITE_2"; + case AKEYCODE_TV_INPUT_COMPONENT_1: + return "AKEYCODE_TV_INPUT_COMPONENT_1"; + case AKEYCODE_TV_INPUT_COMPONENT_2: + return "AKEYCODE_TV_INPUT_COMPONENT_2"; + case AKEYCODE_TV_INPUT_VGA_1: + return "AKEYCODE_TV_INPUT_VGA_1"; + case AKEYCODE_TV_AUDIO_DESCRIPTION: + return "AKEYCODE_TV_AUDIO_DESCRIPTION"; + case AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP: + return "AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP"; + case AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN: + return "AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN"; + case AKEYCODE_TV_ZOOM_MODE: + return "AKEYCODE_TV_ZOOM_MODE"; + case AKEYCODE_TV_CONTENTS_MENU: + return "AKEYCODE_TV_CONTENTS_MENU"; + case AKEYCODE_TV_MEDIA_CONTEXT_MENU: + return "AKEYCODE_TV_MEDIA_CONTEXT_MENU"; + case AKEYCODE_TV_TIMER_PROGRAMMING: + return "AKEYCODE_TV_TIMER_PROGRAMMING"; + case AKEYCODE_HELP: + return "AKEYCODE_HELP"; + case AKEYCODE_NAVIGATE_PREVIOUS: + return "AKEYCODE_NAVIGATE_PREVIOUS"; + case AKEYCODE_NAVIGATE_NEXT: + return "AKEYCODE_NAVIGATE_NEXT"; + case AKEYCODE_NAVIGATE_IN: + return "AKEYCODE_NAVIGATE_IN"; + case AKEYCODE_NAVIGATE_OUT: + return "AKEYCODE_NAVIGATE_OUT"; + case AKEYCODE_STEM_PRIMARY: + return "AKEYCODE_STEM_PRIMARY"; + case AKEYCODE_STEM_1: + return "AKEYCODE_STEM_1"; + case AKEYCODE_STEM_2: + return "AKEYCODE_STEM_2"; + case AKEYCODE_STEM_3: + return "AKEYCODE_STEM_3"; + case AKEYCODE_DPAD_UP_LEFT: + return "AKEYCODE_DPAD_UP_LEFT"; + case AKEYCODE_DPAD_DOWN_LEFT: + return "AKEYCODE_DPAD_DOWN_LEFT"; + case AKEYCODE_DPAD_UP_RIGHT: + return "AKEYCODE_DPAD_UP_RIGHT"; + case AKEYCODE_DPAD_DOWN_RIGHT: + return "AKEYCODE_DPAD_DOWN_RIGHT"; + case AKEYCODE_MEDIA_SKIP_FORWARD: + return "AKEYCODE_MEDIA_SKIP_FORWARD"; + case AKEYCODE_MEDIA_SKIP_BACKWARD: + return "AKEYCODE_MEDIA_SKIP_BACKWARD"; + case AKEYCODE_MEDIA_STEP_FORWARD: + return "AKEYCODE_MEDIA_STEP_FORWARD"; + case AKEYCODE_MEDIA_STEP_BACKWARD: + return "AKEYCODE_MEDIA_STEP_BACKWARD"; + case AKEYCODE_SOFT_SLEEP: + return "AKEYCODE_SOFT_SLEEP"; + case AKEYCODE_CUT: + return "AKEYCODE_CUT"; + case AKEYCODE_COPY: + return "AKEYCODE_COPY"; + case AKEYCODE_PASTE: + return "AKEYCODE_PASTE"; + case AKEYCODE_SYSTEM_NAVIGATION_UP: + return "AKEYCODE_SYSTEM_NAVIGATION_UP"; + case AKEYCODE_SYSTEM_NAVIGATION_DOWN: + return "AKEYCODE_SYSTEM_NAVIGATION_DOWN"; + case AKEYCODE_SYSTEM_NAVIGATION_LEFT: + return "AKEYCODE_SYSTEM_NAVIGATION_LEFT"; + case AKEYCODE_SYSTEM_NAVIGATION_RIGHT: + return "AKEYCODE_SYSTEM_NAVIGATION_RIGHT"; + case AKEYCODE_ALL_APPS: + return "AKEYCODE_ALL_APPS"; + case AKEYCODE_REFRESH: + return "AKEYCODE_REFRESH"; + case AKEYCODE_THUMBS_UP: + return "AKEYCODE_THUMBS_UP"; + case AKEYCODE_THUMBS_DOWN: + return "AKEYCODE_THUMBS_DOWN"; + case AKEYCODE_PROFILE_SWITCH: + return "AKEYCODE_PROFILE_SWITCH"; + default: + break; } return "unknown"; } + +const char* CAndroidJoystickTranslator::TranslateJoystickButton(int buttonKeycode) +{ + switch (buttonKeycode) + { + case AKEYCODE_BUTTON_A: + return GAME::CDefaultController::FEATURE_A; + case AKEYCODE_BUTTON_B: + return GAME::CDefaultController::FEATURE_B; + case AKEYCODE_BUTTON_X: + return GAME::CDefaultController::FEATURE_X; + case AKEYCODE_BUTTON_Y: + return GAME::CDefaultController::FEATURE_Y; + case AKEYCODE_BUTTON_START: + case AKEYCODE_MENU: + return GAME::CDefaultController::FEATURE_START; + case AKEYCODE_BUTTON_SELECT: + case AKEYCODE_BACK: + return GAME::CDefaultController::FEATURE_BACK; + case AKEYCODE_BUTTON_MODE: + case AKEYCODE_HOME: + return GAME::CDefaultController::FEATURE_GUIDE; + case AKEYCODE_DPAD_UP: + return GAME::CDefaultController::FEATURE_UP; + case AKEYCODE_DPAD_RIGHT: + return GAME::CDefaultController::FEATURE_RIGHT; + case AKEYCODE_DPAD_DOWN: + return GAME::CDefaultController::FEATURE_DOWN; + case AKEYCODE_DPAD_LEFT: + return GAME::CDefaultController::FEATURE_LEFT; + case AKEYCODE_BUTTON_L1: + return GAME::CDefaultController::FEATURE_LEFT_BUMPER; + case AKEYCODE_BUTTON_R1: + return GAME::CDefaultController::FEATURE_RIGHT_BUMPER; + case AKEYCODE_BUTTON_L2: + return GAME::CDefaultController::FEATURE_LEFT_TRIGGER; + case AKEYCODE_BUTTON_R2: + return GAME::CDefaultController::FEATURE_RIGHT_TRIGGER; + case AKEYCODE_BUTTON_THUMBL: + return GAME::CDefaultController::FEATURE_LEFT_THUMB; + case AKEYCODE_BUTTON_THUMBR: + return GAME::CDefaultController::FEATURE_RIGHT_THUMB; + default: + break; + } + + return ""; +} diff --git a/xbmc/platform/android/peripherals/AndroidJoystickTranslator.h b/xbmc/platform/android/peripherals/AndroidJoystickTranslator.h index cc622ed166..8681de0c12 100644 --- a/xbmc/platform/android/peripherals/AndroidJoystickTranslator.h +++ b/xbmc/platform/android/peripherals/AndroidJoystickTranslator.h @@ -10,25 +10,34 @@ namespace PERIPHERALS { - class CAndroidJoystickTranslator - { - public: - /*! - * \brief Translate an axis ID to an Android enum suitable for logging - * - * \param axisId The axis ID given in <android/input.h> - * - * \return The translated enum label, or "unknown" if unknown - */ - static const char *TranslateAxis(int axisId); +class CAndroidJoystickTranslator +{ +public: + /*! + * \brief Translate an axis ID to an Android enum suitable for logging + * + * \param axisId The axis ID given in <android/input.h> + * + * \return The translated enum label, or "unknown" if unknown + */ + static const char* TranslateAxis(int axisId); + + /*! + * \brief Translate a key code to an Android enum suitable for logging + * + * \param keyCode The key code given in <android/keycodes.h> + * + * \return The translated enum label, or "unknown" if unknown + */ + static const char* TranslateKeyCode(int keyCode); - /*! - * \brief Translate a key code to an Android enum suitable for logging - * - * \param keyCode The key code given in <android/keycodes.h> - * - * \return The translated enum label, or "unknown" if unknown - */ - static const char *TranslateKeyCode(int keyCode); - }; -} + /*! + * \brief Translate a button key code to a feature on the default controller + * + * \param buttonKeycode The key code given in <android/keycodes.h> + * + * \return The translated feature, or "" if unknown + */ + static const char* TranslateJoystickButton(int buttonKeycode); +}; +} // namespace PERIPHERALS diff --git a/xbmc/platform/android/peripherals/PeripheralBusAndroid.cpp b/xbmc/platform/android/peripherals/PeripheralBusAndroid.cpp index 8a72cc0acf..3f269472ec 100644 --- a/xbmc/platform/android/peripherals/PeripheralBusAndroid.cpp +++ b/xbmc/platform/android/peripherals/PeripheralBusAndroid.cpp @@ -16,6 +16,7 @@ #include "utils/log.h" #include "platform/android/activity/XBMCApp.h" +#include "platform/android/peripherals/AndroidJoystickState.h" #include <algorithm> #include <mutex> @@ -28,15 +29,15 @@ using namespace KODI; using namespace PERIPHERALS; -#define JOYSTICK_PROVIDER_ANDROID "android" +#define JOYSTICK_PROVIDER_ANDROID "android" // Set this to the final key code in android/keycodes.h -const unsigned int KEY_CODE_FINAL = AKEYCODE_HELP; +const unsigned int KEY_CODE_FINAL = AKEYCODE_PROFILE_SWITCH; static const std::string DeviceLocationPrefix = "android/inputdevice/"; -CPeripheralBusAndroid::CPeripheralBusAndroid(CPeripherals& manager) : - CPeripheralBus("PeripBusAndroid", manager, PERIPHERAL_BUS_ANDROID) +CPeripheralBusAndroid::CPeripheralBusAndroid(CPeripherals& manager) + : CPeripheralBus("PeripBusAndroid", manager, PERIPHERAL_BUS_ANDROID) { // we don't need polling as we get notified through the IInputDeviceCallbacks interface m_bNeedsPolling = false; @@ -90,7 +91,7 @@ bool CPeripheralBusAndroid::InitializeProperties(CPeripheral& peripheral) CPeripheralJoystick& joystick = static_cast<CPeripheralJoystick&>(peripheral); if (device.getControllerNumber() > 0) - joystick.SetRequestedPort(device.getControllerNumber() - 1); + joystick.SetRequestedPort(device.getControllerNumber() - 1); joystick.SetProvider(JOYSTICK_PROVIDER_ANDROID); CLog::Log(LOGDEBUG, "CPeripheralBusAndroid: Initializing device {} \"{}\"", deviceId, @@ -120,6 +121,50 @@ bool CPeripheralBusAndroid::InitializeProperties(CPeripheral& peripheral) return true; } +bool CPeripheralBusAndroid::InitializeButtonMap(const CPeripheral& peripheral, + KODI::JOYSTICK::IButtonMap& buttonMap) const +{ + int deviceId; + if (!GetDeviceId(peripheral.Location(), deviceId)) + { + CLog::Log(LOGWARNING, + "CPeripheralBusAndroid: failed to initialize buttonmap due to unknown device ID for " + "peripheral \"{}\"", + peripheral.Location()); + return false; + } + + // get the joystick state + auto it = m_joystickStates.find(deviceId); + if (it == m_joystickStates.end()) + { + CLog::Log(LOGWARNING, + "CPeripheralBusAndroid: joystick with device ID {} not found for peripheral \"{}\"", + deviceId, peripheral.Location()); + return false; + } + + const CAndroidJoystickState& joystick = it->second; + if (joystick.GetButtonCount() == 0 && joystick.GetAxisCount() == 0) + { + CLog::Log(LOGDEBUG, + "CPeripheralBusAndroid: joystick has no buttons or axes for peripheral \"{}\"", + peripheral.Location()); + return false; + } + + if (!joystick.InitializeButtonMap(buttonMap)) + { + CLog::Log( + LOGDEBUG, + "CPeripheralBusAndroid: failed to initialize joystick buttonmap for peripheral \"{}\"", + peripheral.Location()); + return false; + } + + return true; +} + void CPeripheralBusAndroid::Initialise(void) { CPeripheralBus::Initialise(); @@ -180,7 +225,8 @@ void CPeripheralBusAndroid::OnInputDeviceAdded(int deviceId) std::unique_lock<CCriticalSection> lock(m_critSectionResults); // add the device to the cached result list const auto& it = std::find_if(m_scanResults.m_results.cbegin(), m_scanResults.m_results.cend(), - [&deviceLocation](const PeripheralScanResult& scanResult) { return scanResult.m_strLocation == deviceLocation; }); + [&deviceLocation](const PeripheralScanResult& scanResult) + { return scanResult.m_strLocation == deviceLocation; }); if (it != m_scanResults.m_results.cend()) { @@ -207,7 +253,7 @@ void CPeripheralBusAndroid::OnInputDeviceAdded(int deviceId) PeripheralScanResult result; if (!ConvertToPeripheralScanResult(device, result)) return; - m_scanResults.m_results.push_back(result); + m_scanResults.m_results.emplace_back(std::move(result)); } CLog::Log(LOGDEBUG, "CPeripheralBusAndroid: input device with ID {} added", deviceId); @@ -221,7 +267,8 @@ void CPeripheralBusAndroid::OnInputDeviceChanged(int deviceId) { std::unique_lock<CCriticalSection> lock(m_critSectionResults); // change the device in the cached result list - for (auto result = m_scanResults.m_results.begin(); result != m_scanResults.m_results.end(); ++result) + for (auto result = m_scanResults.m_results.begin(); result != m_scanResults.m_results.end(); + ++result) { if (result->m_strLocation == deviceLocation) { @@ -262,7 +309,8 @@ void CPeripheralBusAndroid::OnInputDeviceRemoved(int deviceId) { std::unique_lock<CCriticalSection> lock(m_critSectionResults); // remove the device from the cached result list - for (auto result = m_scanResults.m_results.begin(); result != m_scanResults.m_results.end(); ++result) + for (auto result = m_scanResults.m_results.begin(); result != m_scanResults.m_results.end(); + ++result) { if (result->m_strLocation == deviceLocation) { @@ -310,7 +358,7 @@ bool CPeripheralBusAndroid::OnInputDeviceEvent(const AInputEvent* event) return joystickState->second.ProcessEvent(event); } -bool CPeripheralBusAndroid::PerformDeviceScan(PeripheralScanResults &results) +bool CPeripheralBusAndroid::PerformDeviceScan(PeripheralScanResults& results) { std::unique_lock<CCriticalSection> lock(m_critSectionResults); results = m_scanResults; @@ -342,7 +390,7 @@ PeripheralScanResults CPeripheralBusAndroid::GetInputDevices() continue; CLog::Log(LOGINFO, "CPeripheralBusAndroid: added input device"); - results.m_results.push_back(result); + results.m_results.emplace_back(std::move(result)); } return results; @@ -355,8 +403,7 @@ std::string CPeripheralBusAndroid::GetDeviceLocation(int deviceId) bool CPeripheralBusAndroid::GetDeviceId(const std::string& deviceLocation, int& deviceId) { - if (deviceLocation.empty() || - !StringUtils::StartsWith(deviceLocation, DeviceLocationPrefix) || + if (deviceLocation.empty() || !StringUtils::StartsWith(deviceLocation, DeviceLocationPrefix) || deviceLocation.size() <= DeviceLocationPrefix.size()) return false; @@ -368,7 +415,8 @@ bool CPeripheralBusAndroid::GetDeviceId(const std::string& deviceLocation, int& return true; } -bool CPeripheralBusAndroid::ConvertToPeripheralScanResult(const CJNIViewInputDevice& inputDevice, PeripheralScanResult& peripheralScanResult) +bool CPeripheralBusAndroid::ConvertToPeripheralScanResult( + const CJNIViewInputDevice& inputDevice, PeripheralScanResult& peripheralScanResult) { if (inputDevice.isVirtual()) { @@ -376,10 +424,62 @@ bool CPeripheralBusAndroid::ConvertToPeripheralScanResult(const CJNIViewInputDev return false; } - if (!inputDevice.supportsSource(CJNIViewInputDevice::SOURCE_JOYSTICK) && !inputDevice.supportsSource(CJNIViewInputDevice::SOURCE_GAMEPAD)) + if (!inputDevice.supportsSource(CJNIViewInputDevice::SOURCE_JOYSTICK) && + !inputDevice.supportsSource(CJNIViewInputDevice::SOURCE_GAMEPAD)) { - CLog::Log(LOGDEBUG, "CPeripheralBusAndroid: ignoring non-joystick device"); - return false; + // Observed an anomylous PS4 controller with only SOURCE_MOUSE + if (!inputDevice.supportsSource(CJNIViewInputDevice::SOURCE_MOUSE)) + { + CLog::Log(LOGDEBUG, "CPeripheralBusAndroid: ignoring non-joystick device"); + return false; + } + + // Make sure the anomylous controller has buttons + // clang-format off + std::vector<int> buttons{ + AKEYCODE_BUTTON_A, + AKEYCODE_BUTTON_B, + AKEYCODE_BUTTON_C, + AKEYCODE_BUTTON_X, + AKEYCODE_BUTTON_Y, + AKEYCODE_BUTTON_Z, + AKEYCODE_BUTTON_L1, + AKEYCODE_BUTTON_R1, + AKEYCODE_BUTTON_L2, + AKEYCODE_BUTTON_R2, + AKEYCODE_BUTTON_THUMBL, + AKEYCODE_BUTTON_THUMBR, + AKEYCODE_BUTTON_START, + AKEYCODE_BUTTON_SELECT, + AKEYCODE_BUTTON_MODE, + AKEYCODE_BUTTON_1, + AKEYCODE_BUTTON_2, + AKEYCODE_BUTTON_3, + AKEYCODE_BUTTON_4, + AKEYCODE_BUTTON_5, + AKEYCODE_BUTTON_6, + AKEYCODE_BUTTON_7, + AKEYCODE_BUTTON_8, + AKEYCODE_BUTTON_9, + AKEYCODE_BUTTON_10, + AKEYCODE_BUTTON_11, + AKEYCODE_BUTTON_12, + AKEYCODE_BUTTON_13, + AKEYCODE_BUTTON_14, + AKEYCODE_BUTTON_15, + AKEYCODE_BUTTON_16, + }; + // clang-format on + + auto result = inputDevice.hasKeys(buttons); + + if (std::find(result.begin(), result.end(), true) == result.end()) + { + CLog::Log(LOGDEBUG, "CPeripheralBusAndroid: ignoring non-joystick device with mouse source"); + return false; + } + + CLog::Log(LOGDEBUG, "CPeripheralBusAndroid: adding non-joystick device with mouse source"); } peripheralScanResult.m_type = PERIPHERAL_JOYSTICK; @@ -395,7 +495,7 @@ bool CPeripheralBusAndroid::ConvertToPeripheralScanResult(const CJNIViewInputDev return true; } -void CPeripheralBusAndroid::LogInputDevice(const CJNIViewInputDevice &device) +void CPeripheralBusAndroid::LogInputDevice(const CJNIViewInputDevice& device) { // Log device properties CLog::Log(LOGDEBUG, " Name: \"{}\"", device.getName()); @@ -413,7 +513,7 @@ void CPeripheralBusAndroid::LogInputDevice(const CJNIViewInputDevice &device) // Log device sources CLog::Log(LOGDEBUG, " Source flags: {:#08x}", device.getSources()); - for (const auto &source : GetInputSources()) + for (const auto& source : GetInputSources()) { if (device.supportsSource(source.first)) CLog::Log(LOGDEBUG, " Has source: {} ({:#08x})", source.second, source.first); @@ -458,26 +558,25 @@ void CPeripheralBusAndroid::LogInputDevice(const CJNIViewInputDevice &device) std::vector<std::pair<int, const char*>> CPeripheralBusAndroid::GetInputSources() { std::vector<std::pair<int, const char*>> sources = { - { CJNIViewInputDevice::SOURCE_DPAD, "SOURCE_DPAD" }, - { CJNIViewInputDevice::SOURCE_GAMEPAD, "SOURCE_GAMEPAD" }, - { CJNIViewInputDevice::SOURCE_HDMI, "SOURCE_HDMI" }, - { CJNIViewInputDevice::SOURCE_JOYSTICK, "SOURCE_JOYSTICK" }, - { CJNIViewInputDevice::SOURCE_KEYBOARD, "SOURCE_KEYBOARD" }, - { CJNIViewInputDevice::SOURCE_MOUSE, "SOURCE_MOUSE" }, - { CJNIViewInputDevice::SOURCE_MOUSE_RELATIVE, "SOURCE_MOUSE_RELATIVE" }, - { CJNIViewInputDevice::SOURCE_ROTARY_ENCODER, "SOURCE_ROTARY_ENCODER" }, - { CJNIViewInputDevice::SOURCE_STYLUS, "SOURCE_STYLUS" }, - { CJNIViewInputDevice::SOURCE_TOUCHPAD, "SOURCE_TOUCHPAD" }, - { CJNIViewInputDevice::SOURCE_TOUCHSCREEN, "SOURCE_TOUCHSCREEN" }, - { CJNIViewInputDevice::SOURCE_TOUCH_NAVIGATION, "SOURCE_TOUCH_NAVIGATION" }, - { CJNIViewInputDevice::SOURCE_TRACKBALL, "SOURCE_TRACKBALL" }, + {CJNIViewInputDevice::SOURCE_DPAD, "SOURCE_DPAD"}, + {CJNIViewInputDevice::SOURCE_GAMEPAD, "SOURCE_GAMEPAD"}, + {CJNIViewInputDevice::SOURCE_HDMI, "SOURCE_HDMI"}, + {CJNIViewInputDevice::SOURCE_JOYSTICK, "SOURCE_JOYSTICK"}, + {CJNIViewInputDevice::SOURCE_KEYBOARD, "SOURCE_KEYBOARD"}, + {CJNIViewInputDevice::SOURCE_MOUSE, "SOURCE_MOUSE"}, + {CJNIViewInputDevice::SOURCE_MOUSE_RELATIVE, "SOURCE_MOUSE_RELATIVE"}, + {CJNIViewInputDevice::SOURCE_ROTARY_ENCODER, "SOURCE_ROTARY_ENCODER"}, + {CJNIViewInputDevice::SOURCE_STYLUS, "SOURCE_STYLUS"}, + {CJNIViewInputDevice::SOURCE_TOUCHPAD, "SOURCE_TOUCHPAD"}, + {CJNIViewInputDevice::SOURCE_TOUCHSCREEN, "SOURCE_TOUCHSCREEN"}, + {CJNIViewInputDevice::SOURCE_TOUCH_NAVIGATION, "SOURCE_TOUCH_NAVIGATION"}, + {CJNIViewInputDevice::SOURCE_TRACKBALL, "SOURCE_TRACKBALL"}, }; sources.erase(std::remove_if(sources.begin(), sources.end(), - [](const std::pair<int, const char*> &source) - { - return source.first == 0; - }), sources.end()); + [](const std::pair<int, const char*>& source) + { return source.first == 0; }), + sources.end()); return sources; } diff --git a/xbmc/platform/android/peripherals/PeripheralBusAndroid.h b/xbmc/platform/android/peripherals/PeripheralBusAndroid.h index 439d741344..5ee9480970 100644 --- a/xbmc/platform/android/peripherals/PeripheralBusAndroid.h +++ b/xbmc/platform/android/peripherals/PeripheralBusAndroid.h @@ -25,46 +25,49 @@ class CJNIViewInputDevice; namespace PERIPHERALS { - class CPeripheralBusAndroid : public CPeripheralBus, - public IInputDeviceCallbacks, - public IInputDeviceEventHandler - { - public: - explicit CPeripheralBusAndroid(CPeripherals& manager); - ~CPeripheralBusAndroid() override; +class CPeripheralBusAndroid : public CPeripheralBus, + public IInputDeviceCallbacks, + public IInputDeviceEventHandler +{ +public: + explicit CPeripheralBusAndroid(CPeripherals& manager); + ~CPeripheralBusAndroid() override; - // specialisation of CPeripheralBus - bool InitializeProperties(CPeripheral& peripheral) override; - void Initialise(void) override; - void ProcessEvents() override; + // specialisation of CPeripheralBus + bool InitializeProperties(CPeripheral& peripheral) override; + bool InitializeButtonMap(const CPeripheral& peripheral, + KODI::JOYSTICK::IButtonMap& buttonMap) const override; + void Initialise(void) override; + void ProcessEvents() override; - // implementations of IInputDeviceCallbacks - void OnInputDeviceAdded(int deviceId) override; - void OnInputDeviceChanged(int deviceId) override; - void OnInputDeviceRemoved(int deviceId) override; + // implementations of IInputDeviceCallbacks + void OnInputDeviceAdded(int deviceId) override; + void OnInputDeviceChanged(int deviceId) override; + void OnInputDeviceRemoved(int deviceId) override; - // implementation of IInputDeviceEventHandler - bool OnInputDeviceEvent(const AInputEvent* event) override; + // implementation of IInputDeviceEventHandler + bool OnInputDeviceEvent(const AInputEvent* event) override; - protected: - // implementation of CPeripheralBus - bool PerformDeviceScan(PeripheralScanResults &results) override; +protected: + // implementation of CPeripheralBus + bool PerformDeviceScan(PeripheralScanResults& results) override; - private: - static PeripheralScanResults GetInputDevices(); +private: + static PeripheralScanResults GetInputDevices(); - static std::string GetDeviceLocation(int deviceId); - static bool GetDeviceId(const std::string& deviceLocation, int& deviceId); + static std::string GetDeviceLocation(int deviceId); + static bool GetDeviceId(const std::string& deviceLocation, int& deviceId); - static bool ConvertToPeripheralScanResult(const CJNIViewInputDevice& inputDevice, PeripheralScanResult& peripheralScanResult); + static bool ConvertToPeripheralScanResult(const CJNIViewInputDevice& inputDevice, + PeripheralScanResult& peripheralScanResult); - static void LogInputDevice(const CJNIViewInputDevice &device); - static std::vector<std::pair<int, const char*>> GetInputSources(); + static void LogInputDevice(const CJNIViewInputDevice& device); + static std::vector<std::pair<int, const char*>> GetInputSources(); - mutable std::map<int, CAndroidJoystickState> m_joystickStates; - PeripheralScanResults m_scanResults; - CCriticalSection m_critSectionStates; - CCriticalSection m_critSectionResults; - }; - using PeripheralBusAndroidPtr = std::shared_ptr<CPeripheralBusAndroid>; -} + mutable std::map<int, CAndroidJoystickState> m_joystickStates; + PeripheralScanResults m_scanResults; + CCriticalSection m_critSectionStates; + CCriticalSection m_critSectionResults; +}; +using PeripheralBusAndroidPtr = std::shared_ptr<CPeripheralBusAndroid>; +} // namespace PERIPHERALS |