flutter-tizen / engine

The Flutter engine
https://flutter.dev
BSD 3-Clause "New" or "Revised" License
6 stars 19 forks source link

[VD]TV의 리모컨 키값 관련 문의 #273

Closed yman-son closed 2 years ago

yman-son commented 2 years ago

안녕하세요.

키보드 및 리모컨 에서 발생하는 키값에 대해 아래 URL내에 있는 sample을 통해 발생되는 몇가지 키를 확인해 봤습니다. https://api.flutter.dev/flutter/services/LogicalKeyboardKey-class.htm

리모컨의 상하좌우 키는 Arrow Up, Down, Left, Right로 logicalKey, pysicalKey에 매칭이 잘되어 있는 것을 확인했고 X86AudioPlay의 경우 키보드로 매칭되는 값이 없어서 "Media Play"로 신규로 정의 된 것도 확인했습니다.

이외에 채널 업/다운/Mute, Red, Blue,Green과 같은 키는 F1~12사이의 function키로 매칭이 되는 것으로 확인이 되는데요. 이것은 어떤 기준으로 이렇게 매칭이 됐는지 잘 모르겠네요.

지원되는 리모컨 키가 아래와 같이 다수 있는데요. 이 값들이 logicalKey, pysicalKey에서 어떤 값으로 전달 되는지 정리된 자료가 있으시면 공유 부탁 드립니다.

https://github.com/flutter-tizen/engine/blob/flutter-2.10.1-tizen/shell/platform/tizen/key_event_handler.cc const std::vector kBindableSystemKeys = { "XF86Menu", "XF86Back", "XF86AudioPlay", "XF86AudioPause", "XF86AudioStop", "XF86AudioNext", "XF86AudioPrev", "XF86AudioRewind", "XF86AudioForward", "XF86AudioPlayPause", "XF86AudioRecord", "XF86LowerChannel", "XF86RaiseChannel", "XF86ChannelList", "XF86PreviousChannel", "XF86SysMenu", "XF86SimpleMenu", "XF86History", "XF86Favorites", "XF86Info", "XF86Red", "XF86Green", "XF86Yellow", "XF86Blue", "XF86Subtitle", "XF86PlayBack", "XF86ChannelGuide", "XF86Caption", "XF86Exit", };

http://wiki.vd.sec.samsung.net/pages/viewpage.action?pageId=174034907 내의 그림 참고

swift-kim commented 2 years ago

안녕하세요.

이외에 채널 업/다운/Mute, Red, Blue,Green과 같은 키는 F1~12사이의 function키로 매칭이 되는 것으로 확인이 되는데요. 이것은 어떤 기준으로 이렇게 매칭이 됐는지 잘 모르겠네요.

이것은 저희가 따로 매핑한 것이 아니라 TV 시스템이 제공하는 코드 값을 그대로 사용합니다. Embedder가 받는 물리 키 코드 자체가 F1-F12에 해당하는 값으로 되어있기 때문에 논리 키 코드 역시 그에 해당하는 값을 가지게 됩니다. TV 에뮬레이터를 켜고 키보드의 F1-F12를 눌러보시면 리모콘과 동일한 동작이 수행되는 것을 확인하실 수 있을 겁니다. 아래 코멘트를 참고해주세요.

https://github.com/flutter-tizen/flutter-tizen/issues/319#issuecomment-1099791766

지원되는 리모컨 키가 아래와 같이 다수 있는데요. 이 값들이 logicalKey, pysicalKey에서 어떤 값으로 전달 되는지 정리된 자료가 있으시면 공유 부탁 드립니다.

kBindableSystemKeys 관련 부분은 크게 신경쓰실 필요가 없습니다. 해당 코드는 앱이 키를 처리하기 전에 시스템이 처리하는 경우가 있기 때문에 이를 방지하고자 특수한 키들에 대해서만 안전장치로 넣어둔 것이며, 키 매핑에 영향을 주지는 않습니다. 물리 키 코드는 위에서 말씀드린 것처럼 시스템이 제공한 값을 그대로 사용하며, 이를 논리 키 코드로 매핑하는 건 아래를 참고하시면 될 것 같습니다.

  1. 물리 키 코드 → GTK 키 코드

    https://github.com/flutter-tizen/engine/blob/f6a2e2efab13553e82232343d52da5b66208942b/shell/platform/tizen/channels/key_event_channel.cc#L46-L222

  2. GTK 키 코드 → 논리 키 (LogicalKeyboardKey)

    https://github.com/flutter/flutter/blob/d05d43431edf7917a9c979386ea502e6828a26c8/packages/flutter/lib/src/services/keyboard_maps.dart#L1715-L1888

만약 특정 키 매핑이 존재하지 않는다면 Flutter framework (LogicalKeyboardKey 또는 kGtkToLogicalKey 둘 중 하나)에서 해당 키를 정의하지 않는 경우입니다. 향후에는 중간 과정(GTK 매핑)을 제거할 예정이어서 약간의 개선의 여지가 있습니다.

yman-son commented 2 years ago

답변 감사드립니다.

"향후에는 중간 과정(GTK 매핑)을 제거할 예정" 이 부분 변경시 제게도 좀 알려주세요!

swift-kim commented 2 years ago

이 부분 변경시 제게도 좀 알려주세요!

@yman-son 네, 혹시 제가 기억 못하면 https://github.com/flutter-tizen/engine/issues/221 이슈를 트래킹하고 계시면 됩니다 (Subscribe 버튼).

swift-kim commented 2 years ago

@yman-son #221 관련 패치 반영되었습니다. https://github.com/flutter-tizen/flutter-tizen/pull/391이 머지되면 최종 적용될 예정입니다.

기존 앱에서 RawKeyboard 관련 API를 사용 중이시면 HardwareKeyboard API로 변경해주시고, 혹시 logical key 매핑이 누락되거나 작동이 이상한 부분이 있다면 말씀해주세요.