Перейти к содержанию

Ввод и диалоги: пульт, клавиши, текст, экранная клавиатура и контролы

2026-11-01: справочник по контролам вынесен в guide/controls-reference.md. Глава (2026-10-31), дополнена материалом варианта D. Как PHP-плагин Dune HD получает нажатия пульта, где и с какой прошивки ему доступны клавиши, как показать диалог, папку с контролами, меню или сообщение об ошибке, как запросить у пользователя текст и почему клавиша может не дойти до плагина. Источники: SDK плагинов (doc; платформа и версия документа не указаны — any-documented); документ IP Control (doc, версии — по протоколам); код tv188b 260827_0003_r24 и 261021_0117_r25 (code, android-dune-fw); наблюдения на tv188b r25 (device); код плагинов Widget Ext 1.5.6, GlobalTV 260130_1351, screenshoter 1.0.6, Dune Backup 2.9.2, altIPTV 5.2.9, ProIPTV 9.1.1938, Torrent Center 2.0.4, Remote Control 5.1.52 (code, платформа не установлена) и dune-voice (commit d6c6188, code, android); одно сообщение форума (forum). Фактов о вводе на не-Android прошивках в базе нет. Каждое фактическое предложение ссылается на claim id.

Нажатия и текст снаружи — guide/ip-control.md §5–§6. Рядом: события VOD и ТВ, OSD и позиция — guide/playback.md §4; IP Control — guide/ip-control.md §1; очередь операций и тайм-ауты — guide/plugin-operations.md; сводка по прошивкам — guide/compat-matrix.md; каталог приёмов плагинов — guide/plugin-recipes.md.

Коротко: вопрос → ответ

Вопрос Ответ Где
Как получить ввод в своём коде? действие HANDLE_USER_INPUT вызывает handle_user_input() и исполняет то, что она вернёт (SDK)1 §1
Что приходит в обработчик из контрола? selected_control_id и текущие значения combobox и текстовых полей под их именами (SDK)2 §1
Как назначить действие на кнопку пульта? константа GuiEventKind (строка key_*) в карте actions (код r24, SDK)3 §2.1, §3.2
Почему клавиша не доходит до плагина? в регулярной папке ENTER, PLAY, INFO, POPUP_MENU, B_GREEN, C_YELLOW и D_BLUE без действия игнорируются (SDK)4; в общей папке Dune переопределяются только ENTER и PLAY (SDK)5; ENTER в диалоге не меняется (SDK)6 §2.2
С какой прошивки клавиши в диалогах и папках? 120902 — стрелки, P_PLUS/P_MINUS, NEXT/PREV и цифры в диалогах, 130819_b8 — регулярные папки (SDK)7 §3.1
Как показать диалог с контролами? ShowDialogAction с defs и необязательными actions/timer (SDK)8 §2.3, §3.3
Как закрыть диалог и выполнить действие? CloseDialogAndRunAction: его post_action становится результатом SHOW_DIALOG (SDK)9 §2.3
Как обновить контролы, не закрывая диалог? ResetControlsAction с новыми defs (SDK)10 §2.3
Как запросить текст с экранной клавиатурой? GuiTextFieldDef::has_osk = true плюс VGap под полем (SDK)11 §2.5
Какие клавиши приходят в VOD? r25, device: цветные — как ev_key_* (устройство r25)12, нецветные key_pause, key_play, стрелки, key_subtitle, key_audio, key_next, key_1, key_info, key_popup_menu — если зарегистрированы в actions (устройство r25)13 §2.6
Где задаётся карта actions? у точки входа в манифесте, у папок, диалогов, ТВ и VOD; ChangeBehaviour заменяет её на лету (код r24, SDK)14 §1
Как нажать кнопку пульта снаружи? IP Control cmd=ir_code с NEC-кодом (SDK)15 ip-control.md §5
Как ввести текст в поле с компьютера? IP Control cmd=set_text&text=… при активном редакторе (SDK)16 ip-control.md §5
Как задать первый фокус? initial_sel_ndx среди фокусируемых контролов: combobox, кнопок, текстовых полей (SDK)17 §2.9
Как показать меню по POPUP_MENU? вернуть ShowPopupMenuAction со списком GuiMenuItemDef (код r24, SDK)18 §2.10
Как показать ошибку? PluginShowErrorAction (fatal, title, msg_lines) (SDK)19 §2.11
Как сделать свою клавиатуру с подсказками? диалог с контролами, как AdvKeyboard из Widget Ext 1.5.6 (код)20 §4.5

1. Как устроен ввод в плагине

Объект: PHP-плагин Dune HD; SDK плагинов (doc, any-documented, версия документа не указана), dune_api.php tv188b r24 (code, android-dune-fw, 260827_0003_r24), наблюдения на tv188b r25 (device, 261021_0117_r25).

Этот раздел — модель, на которую опираются все задачи главы. Главное ограничение: PHP API не даёт плагину рисовать произвольный телевизионный интерфейс и произвольно обрабатывать события пульта — доступен только высокоуровневый GUI-фреймворк с фиксированным набором возможностей (SDK)21. Поэтому плагин не «слушает» пульт, а заранее говорит оболочке, что делать на какое событие.

Это делается двумя связанными механизмами. Первый — карта actions: плагин назначает GuiAction на событие GuiEventKind, и большинство таких событий соответствует кнопкам пульта (SDK)22; такие карты есть, например, у диалога и у VOD (устройство r25, SDK)23. Второй — действие HANDLE_USER_INPUT: у него нет своих данных, оно вызывает операцию handle_user_input с GuiAction::$params и возвращает её результат как post action (SDK)24. Операция вызывается во время исполнения этого действия (SDK)25 и может вернуть другой GuiAction, который исполняется сразу (SDK)26. На практике механизмы соединяют: на клавишу вешают HANDLE_USER_INPUT, а решение принимает код плагина в handle_user_input (SDK)27 (пример — §4.4).

В PHP GUI-действие — массив с handler_string_id (тип) и data (параметры) (SDK)28. Строковый id HANDLE_USER_INPUT в dune_api.php r24 — plugin_handle_user_input (код r24)29; остальные id — §3.8. В r24 у handle_user_input по ссылке передаются и $user_input, и $plugin_cookies (код r24)30. Что лежит в data этого действия, SDK и код описывают по-разному — §5. Сколько оболочка ждёт ответа и что бывает по тайм-ауту — guide/plugin-operations.md.

На tv188b r25 (device, 261021_0117_r25) строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: test_plugin5->handle_user_input(kbp5.native): start (timeout=60.0s)» (устройство r25)31.

Где задаётся карта actions. Карту «событие → действие» задают в нескольких местах: в r24 поле actions типа GuiActionMap есть у классов папок, диалогов и воспроизведения, а SDK описывает часть из них.

Где Поле Что известно Claim
Точка входа в манифесте actions, popup_menu событие (клавиша) → GUI-действие при фокусе на точке входа; popup_menu добавляет пункты в её контекстное меню (§2.10) (SDK)32
Регулярная папка PluginRegularFolderView::actions тип GuiActionMap в r24 (код r24)33
Папка с контролами PluginControlsFolderView::actions тип GuiActionMap в r24; в описании класса в SDK поля нет (§5) (код r24)34
Rows- и GComps-папка PluginRowsFolderView::actions, PluginGCompsFolderView::actions тип GuiActionMap в r24 (код r24)35
Диалог с контролами ShowDialogActionData::actions действия на клавиши и событие таймера; ENTER не переопределяется (код r24, SDK)36
GComps-диалог ShowGCompsDialogActionData::actions тип GuiActionMap в r24 (код r24)37
ТВ-воспроизведение PluginTvInfo::actions тип GuiActionMap в r24 (код r24)38
VOD-воспроизведение PluginVodInfo::actions тип GuiActionMap в r24; что доходит на r25 — §2.6 (код r24)39
Замена на лету ChangeBehaviourActionData::actions заданное actions заменяет существующую карту (SDK)40

ChangeBehaviour по SDK поддерживает регулярную папку, диалог с контролами и VOD-воспроизведение, а папки с контролами и с фильмом, ТВ- и обычное воспроизведение обещаны в будущем (SDK)41.

Где живёт ввод. SDK называет три сценария handle_user_input: регулярные папки с HANDLE_USER_INPUT на клавишах, экраны настроек с confirm/apply у текстового поля и combobox или кнопкой «Apply», и диалоги с произвольным набором контролов, которые ведут себя почти как control-папки (SDK)27. Control-папка поддерживает контролы button, combobox и text field, а изменения применяются и сохраняются через HANDLE_USER_INPUT (SDK)42. Четвёртый контекст — воспроизведение плагина (§2.6). Какие клавиши доступны в каком контексте, зависит от прошивки (§3.1), а чего оболочка не отдаёт плагину через PHP — в §2.2.

Что приходит в обработчик. Действие, исполняемое из контрола, получает в params поле selected_control_id со значением GuiControlDef::name контрола, который его вызвал (SDK)43. Для каждого combobox и текстового поля контейнера в params лежит ключ с именем контрола и его текущим значением — выбранным choice_value или редактируемым текстом (SDK)44. Чтобы обработчик понял, откуда пришёл вызов, SDK советует заранее добавлять в params свои метки контекста и контейнера (SDK)45. На tv188b r25 handler_id и control_id из params действия plugin_handle_user_input на key_enter точки входа приходят одноимёнными полями в input_data операции (устройство r25)46. Там же при ENTER на точке входа есть selected_media_url и orig_selected_media_url, равные media_url точки входа, а также play_mode=none и topmenu_root_id=section:applications (устройство r25)47. В коде Widget Ext 1.5.6 значение контрола читается как $user_input->{control_id}, а родительский media_url — как $user_input->parent_media_url (код)48. Если плагин построен по образцу фреймворка shell_ext, обработчик выбирается по handler_id — см. §4.1.

2. Задачи

2.1. Назначить действие на клавишу пульта

Объект: события GuiEventKind в SDK плагинов (doc, any-documented) и их строки в dune_api.php tv188b r24 (code, android-dune-fw, 260827_0003_r24).

Кнопка пульта становится функциональной, когда на её константу GuiEventKind назначен GuiAction (SDK)22. В PHP константы — строки: GUI_EVENT_KEY_ENTER='key_enter', GUI_EVENT_KEY_PLAY='key_play' и так далее, полный перечень — §3.2 (код r24)49. Минимальный пример — screenshoter 1.0.6: в обеих точках входа он вешает key_enter и key_play на plugin_handle_user_input с handler_id = entry (код)50.

Без пометки версии SDK называет восемь клавишных событий: ENTER, PLAY, A_RED, B_GREEN, C_YELLOW, D_BLUE, POPUP_MENU и INFO (SDK)51. Дальше набор расширялся по прошивкам: с 120902 стрелки, P_PLUS/P_MINUS, NEXT/PREV и цифры появились только в диалогах с контролами, а с 130819_b8 все прежние клавишные события стали доступны и в регулярных папках (SDK)7. Смотрите таблицу §3.1, прежде чем назначать, например, стрелки в регулярной папке. Если назначенное действие не срабатывает, пройдите по списку §2.2.

2.2. Почему клавиша не доходит до плагина

Объект: ограничения на переопределение клавиш в SDK плагинов (doc, any-documented, версия документа не указана) и диспетчер shell_ext tv188b r24/r25 (code, android-dune-fw).

Здесь собраны все известные причины, по которым нажатие не превращается в действие плагина. Проверяйте по порядку: контекст, перехват контролом, прошивка, затем собственный диспетчер.

Где Что происходит Claim
Регулярная папка плагина ENTER, PLAY, INFO, POPUP_MENU, B_GREEN, C_YELLOW, D_BLUE без назначенного действия игнорируются; A_RED переключает варианты отображения папки (SDK)4
Регулярная папка плагина по A_RED GUI вызывает get_next_folder_view(), если PluginFolderView::multiple_views_supported == true (SDK)52
Пустая регулярная папка ENTER переопределить нельзя (SDK)53
Регулярная папка ZOOM, POWER и EJECT переопределить нельзя (SDK)54
Общие папки Dune (точка входа плагина) плагин переопределяет только ENTER и PLAY (SDK)5
Диалог с контролами поведение ENTER картой actions изменить нельзя (SDK)6
Активный текстовый редактор или раскрытый combobox в диалоге часть кнопок имеет особое значение и картой actions диалога не переопределяется (SDK)55
Текстовое поле в active перехватывает стрелки, ENTER, RETURN и некоторые другие клавиши (SDK)56
Combobox в active перехватывает стрелки, ENTER и RETURN (SDK)57
ТВ-воспроизведение с PluginTvInfo::favorites_supported по B_GREEN, C_YELLOW, D_BLUE GUI вызывает change_tv_favorites() (SDK)58
Пульт без нужной кнопки по сообщениям пользователей, на комплектном (новом) пульте Dune Android нет кнопки Eject; тип пульта — §2.7 (форум)59
Прошивка старше нужной клавиша в этом контексте ещё не поддержана — см. §3.1 (SDK)7
Диспетчер shell_ext (r24, r25) без handler_id или с незарегистрированным handler_id результат null (код)60

Если нужна обработка пульта, которую не даёт ни одна строка таблицы, через PHP её не получить (SDK)21; Android-приложение в составе плагина может перехватывать клавиши через accessibility-сервис (§4.6), а веб-приложение получает их как события DOM (§2.12). Как ведут себя клавиши в VOD и ТВ — §2.6. Код AdvKeyboard назначает ENTER в карте своего диалога вопреки строке «Диалог с контролами» — §5.

2.3. Показать диалог с контролами и получить результат

Объект: ShowDialogAction и связанные действия в SDK плагинов (doc, any-documented, версия документа не указана; отдельные поля и действия — с пометками прошивок); фабрика shell_ext tv188b r24 (code, 260827_0003_r24), плагин downloads на tv188b r25 (device).

Диалог — способ задать пользователю вопрос из нескольких контролов: ShowDialogAction показывает контролы вертикальным списком и взаимодействует с пользователем, пока диалог не закрыт; у контрола может быть заголовок в одну или две колонки, полоса прокрутки появляется при необходимости (SDK)61. Жизненный цикл диалога — четыре шага.

  1. Открыть. Соберите список GuiControlDef (controls-reference.md §3.5) в defs и передайте его в ShowDialogActionData; поля данных — в §3.3 (SDK)8.
  2. Обработать нажатия. Кнопка исполняет push_action по ENTER (SDK)62; это может быть HANDLE_USER_INPUT (SDK)24, и тогда обработчик получает значения контролов (§1). Клавиши и таймер диалога задаются картой actions, но ENTER ею не переопределить (SDK)6. Таймер срабатывает один раз; новый обычно задают действием ChangeBehaviour (SDK)63 (подробнее — после списка).
  3. Обновить без закрытия. ResetControlsAction заменяет состояние текущего диалога или папки с контролами (SDK)10 — так перерисовывают диалог после каждого нажатия (§4.3, §4.5).
  4. Закрыть и вернуть результат. CloseDialogAndRunAction закрывает диалог и отдаёт свой post_action как результат вызвавшего SHOW_DIALOG (SDK)9; иначе ShowDialogAction возвращает статус ok (SDK)64. Закрытие кнопкой RETURN включается close_by_return (SDK)65, а с прошивки 130904_b8 — ещё и последовательностью событий exit_seq (SDK)66. Кнопку «закрыть и применить» shell_ext r24 строит add_close_dialog_and_apply_button: action_type=apply, а push_action обёрнут в close_dialog_and_run (код r24)67. Если RETURN должен делать своё, ставят close_by_return = false и назначают GUI_EVENT_KEY_RETURN в actions — так сделаны EditListDialog GlobalTV (§4.3) и диалог настроек AdvKeyboard (код)68.

Диалог, который обновляется сам. GUI_EVENT_TIMER генерируется один раз по истечении GuiTimerDef::delay_ms (SDK)69. В ChangeBehaviour (данные actions, timer, post_action) заданный таймер перезапускается от текущего момента, а заданное actions заменяет карту (SDK)40. Отсюда схема периодического обновления: timer в ShowDialogActionData и ChangeBehaviour с новым timer в ответ на событие таймера (SDK)70. На tv188b r25 (device) встроенный плагин downloads после open_magnet показывает show_dialog с опросом entry.dialog_open_dl раз в ~1 с (устройство r25)71; другой приём — переоткрывать диалог по таймеру (§4.7).

CloseAndRunAction (с прошивки 121114) при активном диалоге с контролами работает как CloseDialogAndRunAction, при другом диалоге ничего не делает, а без диалогов закрывает активную папку (переход вверх) и возвращает post_action (SDK)72. С прошивки 131029_b9 оно же, вызванное из ТВ- или VOD-воспроизведения плагина без активного диалога, работает как остановка воспроизведения (SDK)73.

Если нужен только выбор из списка, достаточно всплывающего меню ShowPopupMenuAction (SDK)74 (§2.10). Готовые диалоги OK, Yes/No и ожидания в shell_ext r24 — controls-reference.md §3.9; строковые id действий — §3.8.

Действие Данные Что делает Вне контейнера Claim
ShowDialogAction ShowDialogActionData (§3.3) показывает диалог до закрытия; возвращает ok или post_action из CloseDialogAndRun — (SDK)75
CloseDialogAndRunAction post_action (необязательно) закрывает текущий диалог с контролами; post_action — результат SHOW_DIALOG игнорируется вне диалога с контролами (SDK)76
CloseAndRunAction (121114+) post_action (необязательно) в диалоге с контролами — как CloseDialogAndRunAction при другом диалоге ничего; без диалогов закрывает активную папку (SDK)72
ChangeBehaviour actions, timer, post_action (все необязательны) заменяет карту actions, перезапускает таймер поддержка контейнеров — §1 (SDK)77
ResetControlsAction defs, initial_sel_ndx (−1 — выбор не менять), post_action (необязательно) заменяет состояние диалога или папки с контролами игнорируется вне них (SDK)78
ShowPopupMenuAction menu_items (List<GuiMenuItemDef>), selected_menu_item_index (по умолчанию 0) показывает меню до закрытия; действие выбранного пункта возвращается как post action — (SDK)79
PluginHandleUserInputAction нет вызывает handle_user_input(params), результат — post action — (SDK)24

2.4. Экран настроек: папка с контролами

Объект: PluginControlsFolderView в SDK плагинов (doc, any-documented, версия документа не указана) и в dune_api.php / shell_ext tv188b r24 (code, android-dune-fw, 260827_0003_r24).

Папка с контролами — второй контейнер для тех же контролов. В отличие от диалога, это обычная папка в навигации Dune: она закрывается кнопками RETURN и TOP_MENU, как другие папки (SDK)80. Папки плагина открывает PluginOpenFolderAction: оно вызывает get_folder_view($media_url) и показывает результат (SDK)81. Тип PluginFolderView::data зависит от view_kind: для control-папки это PluginControlsFolderView (SDK)82 с полями defs, initial_sel_ndx и params (SDK)83; defs — список определений контролов (SDK)84, initial_sel_ndx — индекс контрола, получающего фокус первым, −1 — первый (SDK)85, а params — PluginFolderViewParams с полями paint_path_box, paint_content_box_background и background_url (SDK)86. В dune_api.php r24 у класса ещё есть actions и timer (код r24)87, и AbstractControlsScreen::get_folder_view из shell_ext r24 отдаёт PLUGIN_FOLDER_VIEW_CONTROLS со всеми пятью полями и multiple_views_supported=false (код r24)88; расхождение с SDK — §5.

Изменения в такой папке применяются и сохраняются через HANDLE_USER_INPUT (SDK)42: либо confirm/apply у текстового поля и combobox, либо отдельная кнопка «Apply» (SDK)27. Обновить набор контролов можно тем же ResetControlsAction, что и в диалоге (§2.3) (SDK)10. Чем папка отличается от диалога по полям — §3.4.

2.5. Запросить текст: текстовое поле и экранная клавиатура

Объект: GuiTextFieldDef и встроенная клавиатура has_osk в SDK плагинов (doc, any-documented, версия документа не указана); пример VodSearchScreen tv188b r25 (code, android-dune-fw, 261021_0117_r25); строки и фабрики r24 (code, 260827_0003_r24); GlobalTV 260130_1351 (code).

Есть два пути. Встроенный — текстовое поле GuiTextFieldDef в диалоге или папке с контролами; его поля — в controls-reference.md §3.6 (SDK)89. Свой — диалог-клавиатура из обычных контролов, как AdvKeyboard (§4.5) (код)20; он нужен, если требуются подсказки (код)90 или своя раскладка (код)91.

Для встроенного пути решения такие. Экранную клавиатуру под полем включает has_osk = true; её высота при раскладке не учитывается, поэтому SDK предлагает добавить под полем VGap (SDK)11, который увеличивает расстояние до следующего контрола (SDK)92. Чтобы пользователь сразу печатал, а не нажимал ENTER для входа в редактор (SDK)56, ставят always_active = true: поле при фокусе сразу переходит в active (SDK)93. Проверку ввода делают в confirm_action: он исполняется по ENTER до применения, и статус не OK откатывает изменения и оставляет поле в active (SDK)94. Сохранение — в apply_action, который исполняется после применения и чей статус игнорируется (SDK)95. Введённый текст приходит в params под именем контрола (SDK)44 (§1).

Пример r25. VodSearchScreen в shell_ext r25 строит текстовое поле pattern с начальным значением из cookie vod_search_pattern и флагами has_osk=true, always_active=true, need_confirm=true, need_apply=true (код r25)96. По confirm с пустым pattern он показывает ошибку vod_search_pattern_should_not_be_empty, а по apply сохраняет шаблон в cookie и возвращает reset_controls с открытием папки поиска (код r25)97. Это образец всей связки: встроенная клавиатура, always_active, проверка в confirm, сохранение в apply и запоминание последнего ввода.

Параметры клавиатуры. Экранную клавиатуру включает только флаг has_osk; раскладки или языка среди восьми полей GuiTextFieldDef нет (SDK)89. GlobalTV 260130_1351 для кода родительского контроля передаёт в params поля недокументированный ключ fixed_osk_id='numeric' (код)98; имя fixed_osk_id есть и в libduneshell.so r24 среди ключей ktv_params манифеста (код r24)99. Что делает этот ключ, в базе не установлено. В GComps-интерфейсе текстовое поле строит GCompsFactory::text_field r24: оно заполняет GuiTextFieldDef (initial_value, numeric, password, has_osk, width, apply_action) внутри GComponentDef (код r24)100.

Снаружи текст активного редактора можно прочитать и заменить через IP Control — ip-control.md §5 (SDK)101.

2.6. Клавиши во время воспроизведения (VOD, ТВ)

Объект: клавиши в VOD-воспроизведении плагина на tv188b r25 (device, 261021_0117_r25) и событие таймера в ТВ по SDK (doc, any-documented).

В VOD плагин регистрирует клавиши в PluginVodInfo::actions под теми же строками key_*, что и в папках (key_a_red, key_b_green) (устройство r25, код r24)102. На tv188b r25 цветная кнопка приходит в handle_user_input с control_id ev_key_a_red, ev_key_b_green, ev_key_c_yellow или ev_key_d_blue и полями plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx, но без playback_position; позиция есть у ev_timer (устройство r25)12. Нецветные клавиши на r25 тоже доставляются, если они зарегистрированы в actions: key_pause, key_play, стрелки, key_subtitle, key_audio, key_next, key_1, key_info и key_popup_menu (устройство r25)13. Назначенное действие на key_pause перехватывает PAUSE: плагин получает событие, а воспроизведение продолжает идти (устройство r25)103. Позицию для действия по клавише берите из ev_timer (устройство r25)12. В input_data события цветной клавиши есть ещё handler_id, control_id, play_mode, topmenu_root_id и playback_browser_activated (устройство r25)104. Через те же actions на r25 приходят и неклавишные события playback_user_action, playback_switched, playback_state_changed и playback_going_to_switch (устройство r25)105. SDK описывает клавиши в VOD иначе — §5.

В ТВ-воспроизведении плагина событие таймера доступно с прошивки 131029_b9 (SDK)106; доставка клавиш в ТВ в базе не наблюдалась. Остальные события воспроизведения и их порядок — guide/playback.md §4.1.

2.7. Учесть тип пульта: few_buttons_remote_type (r24, r25)

Объект: dune_config.php tv188b r24 и экран фильма shell_ext r25 (code, android-dune-fw, 260827_0003_r24, 261021_0117_r25); меню настроек r24 (code).

На tv188b r24 фреймворк прошивки учитывает, что не у всех пультов есть цветные кнопки (код r24)107. dune_config.php задаёт константы FEW_BUTTONS_REMOTE_TYPE_NONE=0, _OVAL=1, _SMALL=2, _ARROWS=3 (код r24)108, а dune_config_get_few_buttons_remote_type() возвращает свойство few_buttons_remote_type (код r24)109. dune_config_with_color_buttons() возвращает false для пультов SMALL и ARROWS и true для остальных, а dune_config_show_pop_up_icon_only() — true для OVAL, SMALL и ARROWS (код r24)107. Это код r24. В r25 оболочка по dune_config_show_pop_up_icon_only() выбирает иконку подсказки POPUP на экране фильма: popup_icon_only.png вместо popup.png (код r25)110.

Повтор клавиш упоминается в меню настроек: на экране appearance_control в menu_config.xml r24 есть пункты key_repeat_rate и delay_before_key_repeat (код r24)111. Автоповтор у веб-приложений r25 — §2.12.

2.8. Нажать клавишу или ввести текст снаружи: IP Control

Команды ir_code, ui_action_*, get_text и set_text, коды кнопок NEC и строки key_action — в guide/ip-control.md §5.

2.9. Задать и сохранить фокус

Объект: фокус в диалогах, папках и меню по SDK плагинов (doc, any-documented); наблюдения на tv188b r25 (device); GComps- и rows-структуры dune_api.php и shell_ext r24, экран EPG r25 (code, android-dune-fw).

В диалоге фокус переходит между фокусируемыми контролами — combobox, кнопками и текстовыми полями (SDK)17; в папке с контролами первый фокус задаёт initial_sel_ndx (SDK)85. Плагин задаёт начальную позицию фокуса и может переставить её при перерисовке.

Где Как задать фокус Claim
Диалог initial_sel_ndx среди фокусируемых; −1 — авто (SDK)112
Папка с контролами initial_sel_ndx с 0; −1 — первый контрол (SDK)85
Перерисовка диалога или папки ResetControlsAction::initial_sel_ndx; −1 — выбор не менять (SDK)113
Регулярная папка PluginUpdateFolderAction::sel_ndx >= 0 переводит фокус на элемент с этим индексом (SDK)114
Всплывающее меню selected_menu_item_index (по умолчанию 0) (SDK)115
Главный экран is_default_section точки входа (с 120901) делает её фокусной при первом входе (SDK)116

AdvKeyboard после смены цвета переоткрывает настройки с прежним initial_sel_ndx (код)117. Кроме фокуса, у полей ввода и combobox есть состояние active — controls-reference.md §3.7.

На tv188b r25 (device) в диалоге обновления плагина в фокусе по умолчанию кнопка «Обновить» (устройство r25)118, а в диалоге downloads для торрента — кнопка «Воспроизвести» (устройство r25)119. В обоих случаях эта кнопка названа в claim первой; общего правила база не записывает.

В GComps- и rows-интерфейсе фокус описывается данными, а не контролами: в dune_api.php r24 у GComponentDef есть focusable_def и focused_variant_def (код r24)120, а у PluginRowsPane — focus типа GCompFocusDef и коэффициенты horizontal_focus_freedom_factor, vertical_focus_freedom_factor, vertical_focus_gravity (код r24)121. RowsFactory::focus r24 ставит type=GCOMP_FOCUS_SYSTEM, type2=GCOMP_FOCUS_NONE (код r24)122. Навигацию по своему GComps-списку библиотека ведёт сама: экран программы EPG r25 связывает стрелки и P+/P− с control_id=change и op (left/right/up/down/page_up/page_down) (код r25)123, а GCompList::handle_op r24 принимает page_up/page_down/up/down/left/right/sel:<n> с шагом страницы floor((page_size+1)/2) (код r24)124. Подробный разбор GComps и rows в эту главу не входит.

2.10. Всплывающее меню: ShowPopupMenuAction и GuiMenuItemDef

Объект: ShowPopupMenuAction в SDK плагинов (doc, any-documented), GuiMenuItemDef и фабрики меню в dune_api.php и shell_ext tv188b r24 (code, android-dune-fw, 260827_0003_r24).

Меню по POPUP_MENU плагин показывает сам: назначает на клавишу действие, которое возвращает ShowPopupMenuAction. Данные — menu_items (List<GuiMenuItemDef>) и selected_menu_item_index (по умолчанию 0) (SDK)115; меню показывается до закрытия, а действие выбранного пункта возвращается как post action (SDK)74. Строковый id действия — show_popup_menu (код r24)125.

GuiMenuItemDef в dune_api.php r24 имеет ключи is_separator, id, caption, icon_url, marked, action, is_shown_action (код r24)126; action и is_shown_action — типа GuiAction (код r24)127. Фабрики shell_ext r24: get_menu_item заполняет caption, action и icon_url (последний — только если задан) (код r24)128, get_menu_separator ставит is_separator=1 (код r24)129.

Списки GuiMenuItemDef встречаются и в других местах:

Где Что Claim
Контекстное меню точки входа popup_menu в манифесте; встроенные манифесты r24 пишут его как popup_menu/menu_items/menu_item с caption и action (о форме item из примера SDK — §6) (код r24, SDK)130
VOD-воспроизведение PluginVodInfo::extra_menu_items в r24 (код r24)131
Добавить пункты в меню AddMenuItemsActionData::menu_items (действие add_menu_items) в r24 (код r24)132

GlobalTV 260130_1351 отвечает действием add_menu_items на событие topmenu_popup, читая из user_input selected_topmenu_item_id и topmenu_pcode_entered (код)133.

2.11. Сообщить об ошибке: PluginShowErrorAction

Объект: PluginShowErrorAction в SDK плагинов (doc, any-documented, версия документа не указана).

PluginShowErrorAction (данные fatal, title, msg_lines; msg_lines необязателен) (SDK)19 в меню Dune показывает диалог с заголовком и строками сообщения, а в режиме воспроизведения — одну строку текста в центре экрана (SDK)134. При fatal == true действие планирует выход из плагина: воспроизведение останавливается, браузер Dune переходит в верхнее меню (SDK)135. Действие всегда возвращает статус ошибки и никогда — post action (SDK)136; строковый id в r24 — plugin_show_error (код r24)29. На tv188b r25 (device) тот же строковый id в ответе handle_user_input принят: shell.log пишет result action plugin_show_error (устройство r25)137. В коде прошивки и плагинов отказ в неверном вводе встречается как вызов show_error: VodSearchScreen r25 на confirm с пустым pattern возвращает show_error(false, vod_search_pattern_should_not_be_empty) (§2.5) (код r25)97, а EditListDialog GlobalTV так же отклоняет пустой набор (§4.3).

2.12. Клавиши вне PHP-API: веб-приложения в StbWebView (r25)

Объект: StbWebView и JS-объект Stb прошивки tv188b r25 (code, android-dune-fw, 261021_0117_r25).

Веб-приложению клавиши приходят не через карту actions, а как события DOM: StbWebView r25 передаёт сопоставленные клавиши событиями keydown/keyup с одинаковыми keyCode и which через document.body.dispatchEvent (код r25)138. Метод Stb.setRcAutoRepeatKeys там — заглушка «not implemented», возвращающая ERROR даже после успешного разбора массива (код r25)139. Перехват клавиш Android-приложением в составе плагина — §4.6.

3. Справочник

3.1. Клавишные события по прошивкам

Объект: события GuiEventKind в SDK плагинов (doc, any-documented; версии — из пометок в тексте SDK).

Таблица отвечает на вопрос «можно ли назначить эту клавишу здесь на этой прошивке». Клавиши в ТВ и VOD с 131029_b9 SDK описывает противоречиво — эти строки вынесены в §5 и §6.

Прошивка Что стало доступно Где Claim
без пометки ENTER, PLAY, A_RED, B_GREEN, C_YELLOW, D_BLUE, POPUP_MENU, INFO не уточнено (SDK)51
120902+ LEFT, RIGHT, UP, DOWN, P_PLUS, P_MINUS, NEXT, PREV, цифры 0–9 только диалоги с контролами (SDK)140
130819_b8+ все прежние клавишные события добавились регулярные папки плагина (SDK)141
130819_b8+ SETUP, RETURN, SELECT, CLEAR диалоги с контролами и регулярные папки (SDK)142
130904_b8+ PAUSE диалоги с контролами и регулярные папки (SDK)143
131029_b9+ событие GUI_EVENT_TIMER ТВ-воспроизведение плагина (как в VOD) (SDK)106
150529+ GUI_EVENT_PLAYBACK_SWITCHED, GUI_EVENT_PLAYBACK_GOING_TO_SWITCH воспроизведение; события переключения, не клавиши (SDK)144

3.2. Строки GuiEventKind в dune_api.php (r24)

Объект: dune_api.php tv188b r24 (code, android-dune-fw, 260827_0003_r24).

Ниже — строки констант GuiEventKind, которые становятся ключами карты actions (код r24)49. Константы перечисления, не показанные здесь, — в api-reference.md §3.3. В VOD r25 цветные клавиши приходят в control_id с префиксом ev_, нецветные — без него — §2.6.

Группа Константа → строка
База GUI_EVENT_KEY_ENTER → key_enter, GUI_EVENT_KEY_PLAY → key_play, GUI_EVENT_KEY_A_RED → key_a_red, GUI_EVENT_KEY_B_GREEN → key_b_green, GUI_EVENT_KEY_C_YELLOW → key_c_yellow, GUI_EVENT_KEY_D_BLUE → key_d_blue, GUI_EVENT_KEY_POPUP_MENU → key_popup_menu, GUI_EVENT_KEY_INFO → key_info
Навигация GUI_EVENT_KEY_LEFT → key_left, GUI_EVENT_KEY_RIGHT → key_right, GUI_EVENT_KEY_UP → key_up, GUI_EVENT_KEY_DOWN → key_down, GUI_EVENT_KEY_P_PLUS → key_p_plus, GUI_EVENT_KEY_P_MINUS → key_p_minus, GUI_EVENT_KEY_NEXT → key_next, GUI_EVENT_KEY_PREV → key_prev, GUI_EVENT_KEY_FIP_NEXT → key_fip_next, GUI_EVENT_KEY_FIP_PREV → key_fip_prev
Служебные GUI_EVENT_KEY_SETUP → key_setup, GUI_EVENT_KEY_RETURN → key_return, GUI_EVENT_KEY_SELECT → key_select, GUI_EVENT_KEY_CLEAR → key_clear, GUI_EVENT_KEY_PAUSE → key_pause
Медиа и прочее GUI_EVENT_KEY_FWD → key_fwd, GUI_EVENT_KEY_REW → key_rew, GUI_EVENT_KEY_SLOW → key_slow, GUI_EVENT_KEY_STOP → key_stop, GUI_EVENT_KEY_TOP_MENU → key_top_menu, GUI_EVENT_KEY_POWER → key_power, GUI_EVENT_KEY_EJECT → key_eject, GUI_EVENT_KEY_MODE → key_mode, GUI_EVENT_KEY_VENDOR → key_vendor, GUI_EVENT_KEY_SHUFFLE → key_shuffle, GUI_EVENT_KEY_MUSIC → key_music, GUI_EVENT_KEY_MUTE → key_mute, GUI_EVENT_KEY_V_PLUS → key_v_plus, GUI_EVENT_KEY_V_MINUS → key_v_minus, GUI_EVENT_KEY_SEARCH → key_search, GUI_EVENT_KEY_ZOOM → key_zoom, GUI_EVENT_KEY_SUBTITLE → key_subtitle, GUI_EVENT_KEY_REPEAT → key_repeat, GUI_EVENT_KEY_AUDIO → key_audio, GUI_EVENT_KEY_REC → key_rec, GUI_EVENT_KEY_DUNE → key_dune, GUI_EVENT_KEY_FAVORITES → key_favorites, GUI_EVENT_KEY_URL → key_url
Цифры GUI_EVENT_KEY_0 → key_0, GUI_EVENT_KEY_1 → key_1, GUI_EVENT_KEY_2 → key_2, GUI_EVENT_KEY_3 → key_3, GUI_EVENT_KEY_4 → key_4, GUI_EVENT_KEY_5 → key_5, GUI_EVENT_KEY_6 → key_6, GUI_EVENT_KEY_7 → key_7, GUI_EVENT_KEY_8 → key_8, GUI_EVENT_KEY_9 → key_9
Не клавиши GUI_EVENT_UI_ACTION → ui_action, GUI_EVENT_TIMER → timer, GUI_EVENT_PLUGIN_ROWS_INFO_UPDATE → plugin_rows_info_update, GUI_EVENT_PLAYBACK_STOP → playback_stop, GUI_EVENT_PLAYBACK_GOING_TO_SWITCH → playback_going_to_switch, GUI_EVENT_PLAYBACK_SWITCHED → playback_switched, GUI_EVENT_PLAYBACK_USER_ACTION → playback_user_action, GUI_EVENT_PLAYBACK_STATE_CHANGED → playback_state_changed; остальные события перечисления (folder_enter, boot, gui_start, network_change и т. п.) — в том же claim

3.3. ShowDialogActionData: поля диалога

Объект: ShowDialogActionData в SDK плагинов (doc, any-documented; версии — из пометок SDK).

Состав полей — (SDK)8; класс ShowDialogActionData в dune_api.php r24 перечисляет те же десять ключей (код r24)145, строковый id действия — show_dialog (код r24)125. Значения по умолчанию в фабрике shell_ext r24 — controls-reference.md §3.9. Назначение и версии — в столбце claim каждой строки. Пометка 120531_2200_beta означает, что поле перечислено в разделе изменений этой прошивки (SDK)146.

Поле Тип, по умолчанию Назначение С прошивки Claim
title — — — (SDK)8
defs List<GuiControlDef> контролы диалога, вертикальным списком — (SDK)147
actions GuiActionMap, необязательно действия на клавиши и таймер; ENTER не переопределяется 120531_2200_beta (SDK)148
timer GuiTimerDef, необязательно однократный таймер; delay_ms может быть 0 120531_2200_beta (и GuiTimerDef::delay_ms) (SDK)149
close_by_return false закрывается ли диалог кнопкой RETURN — (SDK)150
preferred_width необязательно 0 — ширина по предпочтительной ширине контролов — (SDK)150
max_height необязательно — 120531_2200_beta (SDK)151
min_item_title_width 0 — авто минимальная ширина под заголовки контролов 121201 (SDK)152
initial_sel_ndx −1 — авто индекс первого выбранного контрола среди фокусируемых: combobox, кнопок, текстовых полей 120531_2200_beta (SDK)153
params Map<String,String> ключи ниже — (SDK)8
params.frame_style default | glass (DIALOG_FRAME_STYLE_DEFAULT, DIALOG_FRAME_STYLE_GLASS) стиль рамки 130824_b8 (SDK)154
params.exit_seq виды GUI-событий через запятую последовательность для закрытия диалога 130904_b8 (SDK)66

3.4. Диалог и папка с контролами: сравнение

Объект: ShowDialogAction и PluginControlsFolderView в SDK плагинов (doc, any-documented).

Что Диалог ShowDialogAction Папка PluginControlsFolderView Claim
Список контролов defs defs (SDK)155
Первый фокус initial_sel_ndx, −1 — авто initial_sel_ndx, −1 — первый (SDK)156
Закрытие RETURN только при close_by_return как обычная папка: RETURN и TOP_MENU (SDK)157
Свои клавиши и таймер карта actions, timer в SDK нет; в классе dune_api.php r24 есть actions и timer (§5) (код r24, SDK)158
params Map<String,String>: frame_style, exit_seq PluginFolderViewParams: paint_path_box, paint_content_box_background, background_url (SDK)159
Замена контролов ResetControlsAction ResetControlsAction (SDK)10
Закрыть и выполнить действие CloseDialogAndRunAction — (игнорируется вне диалога) (SDK)160

3.5. GuiControlDef и виды контролов

Виды контролов, их specific_def и поля — в guide/controls-reference.md §3.5.

3.6. Поля контролов: text field, combobox, button, label, VGap

Поля каждого вида контрола и их значения по умолчанию — в guide/controls-reference.md §3.6.

3.7. Состояния контролов: focused и active

Вход в active, перехват клавиш и выход из состояния — в guide/controls-reference.md §3.7.

3.8. Строковые id действий ввода и диалогов (r24)

Объект: раздел «GUI-action ids» в dune_api.php tv188b r24 (code, android-dune-fw, 260827_0003_r24).

В PHP тип действия — строка в handler_string_id (§1). Ниже — id действий, о которых идёт речь в этой главе; полный перечень — в тех же claims.

Константа Строка Действие в SDK Где в главе Claim
PLUGIN_HANDLE_USER_INPUT_ACTION_ID plugin_handle_user_input PluginHandleUserInputAction §1 (код r24)29
SHOW_DIALOG_ACTION_ID show_dialog ShowDialogAction §2.3 (код r24)125
CLOSE_DIALOG_AND_RUN_ACTION_ID close_dialog_and_run CloseDialogAndRunAction §2.3 (код r24)161
CLOSE_AND_RUN_ACTION_ID close_and_run CloseAndRunAction §2.3 (код r24)162
RESET_CONTROLS_ACTION_ID reset_controls ResetControlsAction §2.3 (код r24)125
CHANGE_BEHAVIOUR_ACTION_ID change_behaviour ChangeBehaviour §1, §2.3 (код r24)162
SHOW_POPUP_MENU_ACTION_ID show_popup_menu ShowPopupMenuAction §2.10 (код r24)125
ADD_MENU_ITEMS_ACTION_ID add_menu_items — §2.10 (код r24)162
PLUGIN_SHOW_ERROR_ACTION_ID plugin_show_error PluginShowErrorAction §2.11 (код r24)29
PLUGIN_OPEN_FOLDER_ACTION_ID plugin_open_folder PluginOpenFolderAction §2.4 (код r24)29
SHOW_GCOMPS_DIALOG_ACTION_ID show_gcomps — §1 (код r24)125

На tv188b r25 (device, 261021_0117_r25) оболочка выполнила строковые id plugin_run_native_code и change_settings в ответе handle_user_input: ответ с plugin_run_native_code вызвал plugin_run_native_code(/flashdata/plugins/test_plugin5, kbp5_native) и передал native_code.so в [native_plugins_handler] open plugin (устройство r25)163, а ответ с change_settings — action D: (general) run test_plugin5->change_settings() (устройство r25)164.

3.9. Фабрики ControlFactory и ActionFactory в shell_ext (r24)

Что строит каждый метод фабрик — в guide/controls-reference.md §3.9.

3.10. С какой прошивки что есть: действия, поля и IP Control

Объект: пометки «available in firmware …» в SDK плагинов и версии протоколов в документе IP Control (doc, any-documented). Клавишные события — §3.1, поля ShowDialogActionData с 120531_2200_beta — §3.3.

Версии ниже — пометки в документах; на устройствах эти границы в базе не проверялись.

Прошивка Что появилось Claim
110127_2105_beta IP Control ir_code (протокол 1) (SDK)15
120531_2200_beta IP Control get_text, set_text (протокол 3) (SDK)101
120901 is_default_section точки входа (SDK)116
121114 CloseAndRunAction (SDK)72
121201 min_item_title_width в ShowDialogActionData (SDK)152
130820_b8 smart, max_lines, lines_vgap, pars_vgap у Label (SDK)165
130824_b8 params.frame_style диалога (SDK)154
130904_b8 params.exit_seq диалога (SDK)66
131029_b9 CloseAndRunAction из ТВ- или VOD-воспроизведения без диалога останавливает воспроизведение (SDK)73
181228_0252_r13 IP Control ui_action_return, ui_action_enter, ui_action_popup_menu (протокол 5) (SDK)166

4. Как это делают плагины и shell_ext

Объект: фреймворк shell_ext прошивки tv188b r24/r25 (code, android-dune-fw) и плагины Widget Ext 1.5.6, GlobalTV 260130_1351, screenshoter 1.0.6, Dune Backup 2.9.2, altIPTV 5.2.9, ProIPTV 9.1.1938, Torrent Center 2.0.4, Remote Control 5.1.52 (code; платформа и прошивка исполнения не установлены) и dune-voice (commit d6c6188, code, android). Это факты кода, а не поведение прошивки.

Приёмы ниже — образцы того, как собирать контролы, диалоги и обработчики, и их ограничения. Детали реализации — в разборах плагинов и guide/plugin-recipes.md.

4.1. Фреймворк shell_ext прошивки: диспетчер, фабрики, тайм-ауты (r24, r25)

Объект: DefaultDunePlugin, UserInputHandlerRegistry, ControlFactory в shell_ext tv188b r24 и r25 (code, android-dune-fw, 260827_0003_r24 и 261021_0117_r25).

shell_ext — каркас обработки ввода в прошивке, и его схема удобна как образец. Все действия контролов приходят в одну handle_user_input() (§1), поэтому каркас кладёт в params каждого действия handler_id и control_id: UserInputHandlerRegistry::create_action() r24 строит plugin_handle_user_input с этими параметрами и с данными operation_timeout (по умолчанию 60000) и show_dialog_delay (по умолчанию 20000) (код r24)167. handle_user_input() в DefaultDunePlugin r24 выбирает обработчик по $user_input->handler_id среди зарегистрированных через register_handler(); без handler_id или с неизвестным id результат null (код r24)168.

В r25 так же: UserInputHandlerRegistry возвращает обработчик по handler_id либо null (код r25)169; DefaultDunePlugin::handle_user_input сначала ищет обработчик, без него печатает «E: handler not found…» и возвращает null, затем логирует ввод и сохраняет last_user_input (код r25)170. Перед вызовом обработчика r25 сбрасывает накопленные result_action и smart_close_dialog и сохраняет последний ввод и обработчик (код r25)171, которые потом отдают get_last_user_input и get_last_user_input_handler (код r25)172. При smart_close_dialog внутри диалога r25 вставляет накопленный result_action перед post_action нового close_dialog_and_run (код r25)173. В r24 handle_user_input шести TV/VOD-экранов печатал все поля user_input; в r25 этого блока нет (код r25)174.

Контролы и диалоги каркас строит фабриками ControlFactory и ActionFactory; что пишет каждый метод — controls-reference.md §3.9. Тайм-ауты действий из контролов задаются там же: в r24 ControlFactory::add_button ставит timeout=60000 и delay=20000 (код r24)175, а в r25 UserInputHandlerRegistry::create_action при null подставляет timeout_ms=60000 и show_dialog_delay_ms=20000 и пишет их в data.operation_timeout и data.show_dialog_delay (код r25)176. Что значат эти поля — guide/plugin-operations.md; расхождение с SDK — §5.

4.2. Библиотеки плагинов: фабрики контролов и копии shell_ext (Widget Ext, GlobalTV, ProIPTV, altIPTV)

Объект: ControlFactory, ActionFactory, UserInputHandlerRegistry в Widget Ext 1.5.6, GlobalTV 260130_1351, ProIPTV 9.1.1938 и altIPTV 5.2.9 (code; платформа и прошивка не установлены).

Сторонние плагины повторяют ту же маршрутизацию по handler_id: GlobalTV (код)177, Widget Ext (id обработчика экрана — 'controls_' . id экрана) (код)178, altIPTV (controls_<id>) (код)179 и ProIPTV, где неизвестный handler_id даёт null (код)180. Ограничение: register_handler в Widget Ext записывает обработчик по handler_id без проверки предыдущей регистрации (код)181.

Фабрики контролов. В Widget Ext UserInputHandlerRegistry::create_action формирует handler_id/control_id и сливает их с add_params, причём одноимённые ключи берутся из add_params (код)182; add_button строит push_action через create_action с action_type = apply (код)183. add_text_field приводит initial_value через strval, а флаги и width — через intval (код)184, тогда как add_combobox переносит поля без приведений (код)185. Метод «закрыть и применить» в Widget Ext называется add_custom_close_dialog_and_apply_buffon — так записано в исходнике (код)186, в r24 — add_custom_close_dialog_and_apply_button (код r24)187. GlobalTV пишет общий набор name/title/kind/specific_def/params (код)188 и создаёт apply/confirm только при need_apply/need_confirm, иначе оставляет действия null (код)189; по action_type (apply или confirm) обработчик отличает подтверждение от применения, как VodSearchScreen (§2.5) (код r25)97.

Копия библиотеки в GlobalTV расходится с shell_ext r24:

Что В GlobalTV В r24 Claim
UserInputHandlerRegistry::create_action data=null timeout_ms/show_dialog_delay_ms с подстановкой 60000/20000 при null (код r24)190
ControlFactory::add_button create_action без тайм-аутов timeout_ms=60000, show_dialog_delay_ms=20000 (код r24)191
ActionFactory::show_dialog max_height — только при defined без проверки (код r24)192
ActionFactory::show_title_dialog принимает attrs только title/post_action (код r24)193
Методы ControlFactory ещё add_button_close, add_close_dialog_and_apply_button_title, add_img_label, add_multiline_label, add_smart_label ещё add_progress_bar (код r24)194
DefaultDunePlugin::handle_user_input прямо возвращает результат реестра OpHooks::fire_before_handle и связывание через set_post_action (код r24)195

4.3. Свой диалог-список с RETURN как «применить»: GlobalTV

Объект: EditListDialog в GlobalTV 260130_1351 (code; платформа и прошивка не установлены).

Приём — диалог, где RETURN не закрывает, а применяет выбор. EditListDialog открывает show_dialog с close_by_return=false и своей картой actions (код)196 и назначает D_BLUE и RETURN на собственное действие apply (код)197; в тех же данных диалога — max_height=870 и params.page_size=11 (код)196. Список — это кнопки: defs идут в порядке apply, группы group:<gid>, элементы item:<id>, а подпись кнопки сериализуется как JSON из текста, промежутков и иконки 48×48 (код)198. Каждое нажатие на группу или элемент меняет отметку и возвращает reset_controls с новыми defs (код)199. apply отклоняет пустой набор через show_error(empty_list_not_allowed), иначе закрывает диалог через close_dialog_and_run (код)200; cancel закрывает диалог без apply_action (код)201.

4.4. Клавиши в папке, поиск, пароль, PIN: GlobalTV, ProIPTV, screenshoter

Объект: TvRowsScreen, диалог поиска и код родительского контроля GlobalTV 260130_1351, поиск и пароль настроек ProIPTV 9.1.1938, точки входа screenshoter 1.0.6 (code; платформа и прошивка не установлены).

В регулярном экране GlobalTV TvRowsScreen связывает ENTER с enter, D_BLUE с fav, CLEAR с fav_remove, POPUP_MENU с popup и событие PLUGIN_ROWS_INFO_UPDATE с plugin_rows_info_update через custom_action (код)202. Его диалог поиска заполняет поле search_channels_text из cookie last_search_channels_text (код)203 и создаёт кнопки «ОК» (search_channels_submit_dialog) и «Отмена» (add_close_dialog_button) (код)204; при отправке он делает trim, отклоняет пустую строку и закрывает диалог с запуском поиска (код)205 — та же схема «запомнить ввод, проверить, применить», что у VodSearchScreen (§2.5). Код родительского контроля GlobalTV вводится полем с numeric=true, has_osk=false, always_active=true (код)98 (ключ fixed_osk_id — §2.5).

ProIPTV делает так же: поиск каналов открывает поле с OSK, подставляет последний запрос, а do_search сохраняет непустой запрос обратно (код)206. Пароль настроек — диалог с полем pass, который обработчик сверяет с параметром и при неверном значении возвращает err_bad_pass (код)207.

Самый короткий пример передачи клавиш в свой обработчик — screenshoter 1.0.6: key_enter и key_play → plugin_handle_user_input с handler_id = entry (код)50.

4.5. Своя экранная клавиатура: AdvKeyboard (Widget Ext 1.5.6)

Объект: AdvKeyboard в Widget Ext 1.5.6 (code; платформа unknown, прошивка исполнения не установлена).

Приём — клавиатура как диалог с контролами, перерисовываемый на каждое нажатие; так делают подсказки и свои раскладки. AdvKeyboard реализует UserInputHandler и регистрируется под id adv_text_keyboard (код)208. startup_kbrd() открывает show_dialog с close_by_return = true и таймером ActionFactory::timer(1) (код)20, а по таймеру загружает конфигурацию и показывает раскладку или, при первом запуске, настройку языков (код)209. Перерисовка идёт через reset_controls с новыми defs (код)210. Подсказки даёт подключаемый поставщик с пятью методами, в том числе признаком «искать только по подсказке» (код)90. Текст правится собственными функциями mb_insert_str и mb_delete_chr на mb_strlen/mb_substr в UTF-8 (код)211, а строка поиска уходит родителю через close_dialog_and_run (код)212. Раскладки — текстовые файлы adv_keyboard_<lang>.txt; если файла нет, берётся adv_keyboard_english.txt (код)91.

Карта клавиш показывает, сколько клавиш можно занять в диалоге: CLEAR, цветные и AUDIO управляют вводом (clear_left, clear_all, alt_onoff, shift_onoff, change_keyboard) (код)213; TOP_MENU, PLAY, ENTER, SELECT, SETUP и TIMER — open_normal_search, do_search, selection_enter, space, config_lang и timed_startup (код)214; цифры вставляют цифру в позицию курсора (код)215; стрелки — selection_up/down/left/right, P_PLUS/P_MINUS — p_plus/p_minus (код)216. Назначение ENTER в карте диалога расходится с SDK — §5. Ограничение: в режиме searchAndSelectMode обычная отправка строки и open_normal_search возвращают null, а do_search на выбранной подсказке обрабатывается раньше этой проверки (код)217. Раскладки, поставщики подсказок и настройки — в разборе plg-dc-widget-ext--adv-keyboard; возможная ошибка с устаревшими подсказками — в §6.

4.6. Перехват клавиш Android-приложением: dune-voice

Объект: accessibility-сервис RemoteKeys в плагине dune-voice (commit d6c6188; code, платформа android).

Когда PHP-фреймворка не хватает, Android-приложение в составе плагина может перехватывать клавиши само. dune-voice регистрирует accessibility-сервис RemoteKeys с правом BIND_ACCESSIBILITY_SERVICE (код)218; сервис перехватывает KEYCODE_SEARCH, KEYCODE_ASSIST и KEYCODE_VOICE_ASSIST и по первому нажатию открывает VoiceActivity (код)219. Для этого remote_keys.xml включает flagRequestFilterKeyEvents и canRequestFilterKeyEvents=true при canRetrieveWindowContent=false (код)220. Это путь только для Android-приложения, к PHP-экранам он не относится.

4.7. Многостраничные настройки и самообновляющиеся диалоги: altIPTV, AdvKeyboard

Объект: DemoSetupScreen и диалог info_back_scan altIPTV 5.2.9, настройки AdvKeyboard Widget Ext 1.5.6 (code; платформа и прошивка не установлены).

Приём — не открывать новый экран, а перестраивать текущий. DemoSetupScreen altIPTV листает четыре страницы настроек, отвечая reset_controls с заново построенными контролами (код)221. Его диалог info_back_scan использует timer(1000) и GUI_EVENT_TIMER → close_dialog_and_run, чтобы переоткрыть обновлённую информацию (код)222 — другой способ обновлять диалог по таймеру (ср. §2.3). При переоткрытии фокус сохраняют явно: так делает AdvKeyboard (§2.9).

4.8. Карта клавиш по состоянию и скрытые комбинации: Dune Backup 2.9.2

Объект: экран Dune Backup 2.9.2 (code; платформа и прошивка не установлены).

Приём — собирать карту actions заново по состоянию плагина. get_action_map экрана всегда назначает POPUP_MENU, INFO, SELECT, D_BLUE и TIMER, а ENTER, PLAY, CLEAR, A_RED, B_GREEN и C_YELLOW — только при определённых условиях (код)223. На SELECT назначено действие change_mode_key_push_count (код)223: семь нажатий SELECT в базовом режиме открывают диалог смены режима (код)224, а семь нажатий CLEAR или SELECT при своих условиях — скрытый раздел users (код)225. Пункты цветных кнопок A/B/C/D в popup_menu плагин добавляет, только если не flag_apk, не flag_new и intval(firmware_version) < 240619 (код)226.

4.9. Нажать кнопку пульта из плагина: IP Control и /proc/ir/button

Как плагины нажимают кнопки через локальный IP Control и запись в /proc/ir/button — в guide/ip-control.md §6.

5. Расхождения

Объект: противоречия и неполнота по вводу; SDK плагинов (doc, any-documented) против tv188b r24/r25 (code, device, android-dune-fw). Противоречия связаны conflicts_with; неполнота описания отмечена отдельно.

  • Клавиши в VOD. SDK в описании PluginVodInfo::actions называет из клавиш только цветные A_RED/B_GREEN/C_YELLOW/D_BLUE, а перечень обрывает на «- playback» (SDK)227; в разделе событий тот же SDK с 131029_b9 разрешает в ТВ и VOD все ранее перечисленные клавиши (SDK)228 и отдельно добавляет FWD, REW, …, URL (SDK)229. На tv188b r25 (device) нецветные клавиши в VOD доставляются, если зарегистрированы в actions (устройство r25)13. Все три SDK-утверждения помечены disputed, поэтому они есть и в §6; что видно на r25 — §2.6, события VOD — guide/playback.md §4.1 и §6.
  • Данные PluginHandleUserInputAction. SDK: у действия нет данных, оно выполняет Handle_user_input(GuiAction::$params) и возвращает результат как post action (SDK)24. Код r24: в dune_api.php есть класс PluginHandleUserInputActionData с operation_timeout, show_dialog_delay и dialog_title (код r24)230, а ActionFactory::handle_user_input при заданном timeout_ms пишет operation_timeout в data (код r24)231. Код r25: ActionFactory::handle_user_input при переданных timeout_ms/show_dialog_delay_ms пишет operation_timeout/show_dialog_delay (код r25)232, а при обоих null оставляет data=null; UserInputHandlerRegistry::create_action подставляет их по умолчанию (код r25)176. На tv188b r25 (device) operation_timeout в данных действия задаётся в миллисекундах и перекрывает значение из манифеста (устройство r25)233. С SDK через conflicts_with связаны все перечисленные claims: ActionFactory::handle_user_input r24 и r25, create_action r25, класс PluginHandleUserInputActionData r24 и наблюдение на устройстве. Вывод о типе данных действия — гипотеза в §6.
  • actions и timer у папки с контролами. SDK: у PluginControlsFolderView поля defs, initial_sel_ndx, params (SDK)83, а ChangeBehaviour для папок с контролами обещан «в будущем» (SDK)41. Код r24: в классе ещё actions и timer (код r24)87, и AbstractControlsScreen отдаёт их в виде папки (код r24)88. Работают ли они на устройстве, в базе не проверено; поля класса r24 связаны с SDK через conflicts_with.
  • ENTER в карте диалога. SDK: поведение GUI_EVENT_KEY_ENTER в ShowDialogAction изменить нельзя (SDK)6. Код AdvKeyboard: ENTER назначен на selection_enter в карте диалога (код)214. Код показывает только назначение; срабатывает ли оно — не проверено; conflicts_with нет.
  • lines_vgap против lines_vgab. SDK называет ключи Label lines_vgap и pars_vgap (SDK)165; ControlFactory::add_img_label в GlobalTV пишет lines_vgab/pars_vgab (код)234. Это расхождение имён в коде плагина; conflicts_with нет.
  • Перечитать плагины кнопкой ANGLE/ROTATE. SDK советует перечитать плагины по IP Control cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00 (SDK)235 (disputed, §6); на tv188b r25 (device) обе команды ответили ok, но новые плагины не подхватились (устройство r25)236, а удалённые в одном прогоне (collect6) остались в меню (устройство r25)237, в другом (collect5) после перечитывания пропали из installed_plugins.xml (устройство r25)238. Стороны связаны conflicts_with.
  • Имя цветной клавиши. В PluginVodInfo::actions r25 событие называется key_a_red/key_b_green (устройство r25)104, а в handle_user_input приходит control_id=ev_key_a_red/ev_key_b_green (устройство r25)12. Это не противоречие: одна сторона — ключ карты действий, другая — поле доставки. Но правило преобразования в базе не описано, conflicts_with нет.
  • progress_bar. SDK перечисляет виды контролов через GuiControlKind и не описывает progress_bar (SDK)239, а в r24 константа GUI_CONTROL_PROGRESS_BAR='progress_bar' есть (код r24)240 и ControlFactory строит такой элемент (код r24)241. Это неполнота SDK, а не доказанное расхождение поведения.
  • playback_going_to_switch в конце последней серии. SDK: событие не генерируется при остановке и выключении (SDK)242; r25 (device): приходит в конце последней серии, когда переключения нет и плеер закрывается (устройство r25)243. Стороны связаны conflicts_with; подробнее — guide/playback.md §6.
  • Событие GUI_EVENT_PLAYBACK_STOP. SDK: при назначенном действии плеер сначала приостанавливается, исполняет действие и ждёт цепочку, только потом останавливается (SDK)244 (disputed, §6); r25 (device): при ручном STOP действие playback_stop запускается после перехода плеера в STOPPED (устройство r25)245. Стороны связаны conflicts_with; подробнее — guide/playback.md §6. Для ввода важно, что событие входит в GuiEventKind (SDK)22 и имеет строку playback_stop (код r24)49.

6. Не проверено

Объект: гипотезы (inference) и disputed по вводу и диалогам; SDK плагинов (doc, any-documented), tv188b r24/r25 (code/device, android-dune-fw), плагины (code). Кандидаты на проверку на устройстве или в коде.

Утверждение Статус Claim
Команда key_action r24, вероятно, принимает параметр key (имя действия клавиши) и без него завершается ошибкой; допустимые значения неизвестны inference (вывод r24)246
cmd=ir_code в r24, вероятно, реализован записью кода в /proc/ir/button inference (вывод r24)247
Запись IR-кода в /proc/ir/button, вероятно, эмулирует нажатие кнопки пульта; A15EBF00 — вероятно, код кнопки питания inference (вывод)248
ef10bf00, вероятно, — кнопка пульта «скриншот», по которой прошивка сама сохраняет снимок inference (вывод)249
Действие plugin_handle_user_input в r24, предположительно, принимает data типа PluginHandleUserInputActionData (operation_timeout, show_dialog_delay, dialog_title) inference (вывод r24)250
Пункты контекстного меню точки входа: пример SDK кладёт их в popup_menu/menu_items/item, встроенные манифесты r24 — в menu_item; принимает ли парсер r24 item, не установлено inference (вывод r24)251
SDK: перечитать плагины кнопкой ANGLE/ROTATE или по IP Control main_screen + ir_code=B24DBF00; на r25 не подтвердилось (§5) doc, disputed (SDK)235
После сокращения или очистки строки в AdvKeyboard старые подсказки, вероятно, могут остаться доступными: короткая строка не обновляет suggestions, а рендер не очищает отсутствующие элементы scrBuff inference (вывод)252
SDK: GUI_EVENT_PLAYBACK_STOP генерируется при остановке, выключении питания или перед переключением doc, disputed (SDK)253
SDK: при назначенном на GUI_EVENT_PLAYBACK_STOP действии плеер сначала приостанавливается, исполняет действие, ждёт цепочку и только потом останавливается doc, disputed (SDK)244
SDK: в PluginVodInfo::actions из клавиш поддержаны только цветные; перечень обрывается doc, disputed (SDK)227
SDK: с 131029_b9 все клавишные события работают в ТВ- и VOD-воспроизведении doc, disputed (SDK)228
SDK: с 131029_b9 добавлены FWD, REW, SLOW, STOP, TOP_MENU, POWER, EJECT и другие клавиши для диалогов, папок, ТВ и VOD doc, disputed (SDK)229

    • doc-sdk-plugins--gui-actions.c042 · doc · any-documented; прошивка — · PluginHandleUserInputAction не имеет данных; выполняет операцию Handle_user_input(GuiAction::$params) и возвращает её результат как post action
    • doc-sdk-plugins--operations.c118 · doc · any-documented; прошивка — · handle_user_input() может вернуть другой объект GuiAction, который исполняется немедленно

    ↩

    • doc-sdk-plugins--controls-playback.c034 · doc · any-documented; прошивка — · Действие, исполняемое из контрола, получает в params selected_control_id со значением GuiControlDef::name выбранного контрола — производителя действия.
    • doc-sdk-plugins--controls-playback.c035 · doc · any-documented; прошивка — · В params действия из контейнера для каждого combobox и текстового поля ключ с именем GuiControlDef::name содержит текущее значение контрола: выбранный choice_value или редактируемый текст.

    ↩

    • doc-sdk-plugins--gui-actions.c001 · doc · any-documented; прошивка — · Константы GuiEventKind позволяют назначить GuiAction на GUI-событие; большинство из них соответствует кнопкам пульта
    • fw-tv188b-260827-0003-r24--php-framework.c105 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GuiEventKind строковыми константами: GUI_EVENT_KEY_ENTER='key_enter', GUI_EVENT_KEY_PLAY='key_play', GUI_EVENT_KEY_A_RED='key_a_red', GUI_EVENT_KEY_B_GREEN='key_b_green', GUI_EVENT_KEY_C_YELLOW='key_c_yellow', GUI_EVENT_KEY_D_BLUE='key_d_blue', GUI_EVENT_KEY_POPUP_MENU='key_popup_menu', GUI_EVENT_KEY_INFO='key_info', GUI_EVENT_KEY_LEFT='key_left', GUI_EVENT_KEY_RIGHT='key_right', GUI_EVENT_KEY_UP='key_up', GUI_EVENT_KEY_DOWN='key_down', GUI_EVENT_KEY_P_PLUS='key_p_plus', GUI_EVENT_KEY_P_MINUS='key_p_minus', GUI_EVENT_KEY_NEXT='key_next', GUI_EVENT_KEY_PREV='key_prev', GUI_EVENT_KEY_FIP_NEXT='key_fip_next', GUI_EVENT_KEY_FIP_PREV='key_fip_prev', GUI_EVENT_KEY_SETUP='key_setup', GUI_EVENT_KEY_RETURN='key_return', GUI_EVENT_KEY_SELECT='key_select', GUI_EVENT_KEY_CLEAR='key_clear', GUI_EVENT_KEY_PAUSE='key_pause', GUI_EVENT_KEY_FWD='key_fwd', GUI_EVENT_KEY_REW='key_rew', GUI_EVENT_KEY_SLOW='key_slow', GUI_EVENT_KEY_STOP='key_stop', GUI_EVENT_KEY_TOP_MENU='key_top_menu', GUI_EVENT_KEY_POWER='key_power', GUI_EVENT_KEY_EJECT='key_eject', GUI_EVENT_KEY_MODE='key_mode', GUI_EVENT_KEY_VENDOR='key_vendor', GUI_EVENT_KEY_SHUFFLE='key_shuffle', GUI_EVENT_KEY_MUSIC='key_music', GUI_EVENT_KEY_MUTE='key_mute', GUI_EVENT_KEY_V_PLUS='key_v_plus', GUI_EVENT_KEY_V_MINUS='key_v_minus', GUI_EVENT_KEY_SEARCH='key_search', GUI_EVENT_KEY_ZOOM='key_zoom', GUI_EVENT_KEY_SUBTITLE='key_subtitle', GUI_EVENT_KEY_REPEAT='key_repeat', GUI_EVENT_KEY_AUDIO='key_audio', GUI_EVENT_KEY_REC='key_rec', GUI_EVENT_KEY_DUNE='key_dune', GUI_EVENT_KEY_FAVORITES='key_favorites', GUI_EVENT_KEY_URL='key_url', GUI_EVENT_KEY_0='key_0', GUI_EVENT_KEY_1='key_1', GUI_EVENT_KEY_2='key_2', GUI_EVENT_KEY_3='key_3', GUI_EVENT_KEY_4='key_4', GUI_EVENT_KEY_5='key_5', GUI_EVENT_KEY_6='key_6', GUI_EVENT_KEY_7='key_7', GUI_EVENT_KEY_8='key_8', GUI_EVENT_KEY_9='key_9', GUI_EVENT_UI_ACTION='ui_action', GUI_EVENT_TIMER='timer', GUI_EVENT_PLUGIN_ROWS_INFO_UPDATE='plugin_rows_info_update', GUI_EVENT_FOLDER_LEAVE='folder_leave', GUI_EVENT_FOLDER_ENTER='folder_enter', GUI_EVENT_FOLDER_RETURN_BACK='folder_return_back', GUI_EVENT_PLAYBACK_STOP='playback_stop', GUI_EVENT_PLAYBACK_GOING_TO_SWITCH='playback_going_to_switch', GUI_EVENT_PLAYBACK_SWITCHED='playback_switched', GUI_EVENT_PLAYBACK_USER_ACTION='playback_user_action', GUI_EVENT_PLAYBACK_STATE_CHANGED='playback_state_changed', GUI_EVENT_MENU_PLAYBACK_OSD_CLOSED='menu_playback_osd_closed', GUI_EVENT_MENU_PLAYBACK_OSD_GOING_TO_OPEN='menu_playback_osd_going_to_open', GUI_EVENT_MENU_PLAYBACK_FINISH='menu_playback_finish', GUI_EVENT_MENU_EXT_APP_FINISH='menu_ext_app_finish', GUI_EVENT_WEB_BROWSER_FINISH='web_browser_finish', GUI_EVENT_BOOT='boot', GUI_EVENT_BOOT_END='boot_end', GUI_EVENT_INSTALL='install', GUI_EVENT_UPDATE='update', GUI_EVENT_UNINSTALL='uninstall', GUI_EVENT_GOING_TO_UPDATE='going_to_update', GUI_EVENT_GOING_TO_STOP='going_to_stop', GUI_EVENT_GUI_START='gui_start', GUI_EVENT_EARLY_GUI_START='early_gui_start', GUI_EVENT_STORAGE_DETECTED_MENU='storage_detected_menu', GUI_EVENT_FILE_POPUP_MENU='file_popup_menu', GUI_EVENT_TOPMENU_POPUP_MENU='topmenu_popup_menu', GUI_EVENT_TOPMENU_REFRESH='topmenu_refresh', GUI_EVENT_GOING_TO_RELOAD_ALL_FOLDERS='going_to_reload_all_folders', GUI_EVENT_FAVORITES_UPDATED='favorites_updated', GUI_EVENT_NETWORK_CHANGE='network_change', GUI_EVENT_SETTINGS_UPDATED='settings_updated', GUI_EVENT_CONFIRM_UPDATE='confirm_update', GUI_EVENT_SHUTDOWN='shutdown'

    ↩

  1. doc-sdk-plugins.c072 · doc · any-documented; прошивка — · В регулярной папке плагина клавиши ENTER, PLAY, INFO, POPUP_MENU, B_GREEN, C_YELLOW, D_BLUE игнорируются, если плагин не назначил им действия; A_RED переключает варианты отображения (folder view) ↩↩

  2. doc-sdk-plugins.c069 · doc · any-documented; прошивка — · В общих папках Dune плагин может переопределить на своей точке входа только клавиши ENTER и PLAY ↩↩

  3. doc-sdk-plugins--gui-actions.c053 · doc · any-documented; прошивка — · Поле actions в ShowDialogAction задаёт действия на нажатия клавиш и событие таймера; поведение GUI_EVENT_KEY_ENTER изменить нельзя ↩↩↩↩

    • doc-sdk-plugins--gui-actions.c007 · doc · any-documented; прошивка — · С прошивки 120902 добавлены клавишные события, доступные только в диалогах с контролами: GUI_EVENT_KEY_LEFT, GUI_EVENT_KEY_RIGHT, GUI_EVENT_KEY_UP, GUI_EVENT_KEY_DOWN, GUI_EVENT_KEY_P_PLUS, GUI_EVENT_KEY_P_MINUS, GUI_EVENT_KEY_NEXT, GUI_EVENT_KEY_PREV, GUI_EVENT_KEY_0, GUI_EVENT_KEY_1, GUI_EVENT_KEY_2, GUI_EVENT_KEY_3, GUI_EVENT_KEY_4, GUI_EVENT_KEY_5, GUI_EVENT_KEY_6, GUI_EVENT_KEY_7, GUI_EVENT_KEY_8, GUI_EVENT_KEY_9
    • doc-sdk-plugins--gui-actions.c009 · doc · any-documented; прошивка — · С прошивки 130819_b8 все ранее перечисленные клавишные события можно использовать и в регулярных папках плагина

    ↩↩↩

  4. doc-sdk-plugins--gui-actions.c050 · doc · any-documented; прошивка — · Данные ShowDialogAction — класс ShowDialogActionData: title, defs (List) и необязательные actions (GuiActionMap), timer (GuiTimerDef), close_by_return (false), preferred_width, max_height, min_item_title_width (0 — авто), initial_sel_ndx (−1 — авто), params (Map) ↩↩↩↩↩

  5. doc-sdk-plugins--gui-actions.c061 · doc · any-documented; прошивка — · CloseDialogAndRunAction (данные CloseDialogAndRunActionData с необязательным post_action) закрывает текущий диалог с контролами и возвращает post_action как результат вызвавшего действия SHOW_DIALOG ↩↩

  6. doc-sdk-plugins--gui-actions.c064 · doc · any-documented; прошивка — · ResetControlsAction заменяет состояние текущего диалога с контролами или папки с контролами; вне их игнорируется ↩↩↩↩

  7. doc-sdk-plugins--controls-playback.c024 · doc · any-documented; прошивка — · У текстового поля has_osk = true рисует экранную клавиатуру под полем (по умолчанию false); её высота не учитывается при раскладке, поэтому SDK предлагает добавлять VGap. ↩↩

  8. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 цветные клавиши пульта во время plugin VOD приходят плагину как handle_user_input с control_id ev_key_a_red, ev_key_b_green, ev_key_c_yellow, ev_key_d_blue и полями plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx, но без playback_position; playback_position есть у ev_timer. ↩↩↩↩

  9. fw-tv188b-261021-0117-r25--media-player.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при регистрации actions в plugin VOD плагину доставляются key_pause, key_play, стрелки, key_subtitle, key_audio, key_next, key_1, key_info и key_popup_menu. ↩↩↩

    • doc-sdk-plugins.c038 · doc · any-documented; прошивка — · actions точки входа — соответствие событие (клавиша) → GUI-действие при фокусе на точке входа; popup_menu добавляет пункты в контекстное меню точки входа
    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c087 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginRegularFolderView::{actions} имеют C-тип (GuiActionMap *).
    • doc-sdk-plugins--gui-actions.c096 · doc · any-documented; прошивка — · В ChangeBehaviour заданное actions заменяет существующую карту действий, а заданный таймер перезапускается от текущего момента

    ↩

  10. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c021 · doc · any-documented; прошивка — · Параметр ir_code команды ir_code — 4-байтный NEC-код кнопки пульта с байтами в обратном порядке: кнопка RIGHT 00 BF 18 E7 → ir_code=E718BF00 ↩↩

  11. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c036 · doc · any-documented; прошивка — · cmd=set_text&text=… заменяет редактируемую строку заданной (UTF-8); без активного редактора — failed ↩

  12. doc-sdk-plugins--gui-actions.c057 · doc · any-documented; прошивка — · initial_sel_ndx в ShowDialogAction — индекс первого выбранного контрола среди фокусируемых (combobox, кнопки, текстовые поля) ↩↩

    • doc-sdk-plugins--gui-actions.c065 · doc · any-documented; прошивка — · Данные ShowPopupMenuAction — класс ShowPopupMenuActionData: menu_items (List), selected_menu_item_index (необязательно, по умолчанию 0)
    • fw-tv188b-260827-0003-r24--php-framework.c185 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiMenuItemDef с ключами (7): is_separator, id, caption, icon_url, marked, action, is_shown_action

    ↩

  13. doc-sdk-plugins--gui-actions.c043 · doc · any-documented; прошивка — · Данные PluginShowErrorAction — класс PluginShowErrorActionData: fatal (Boolean), title (String), msg_lines (List, необязательно) ↩↩

  14. plg-dc-widget-ext--adv-keyboard.c005 · code · unknown; прошивка — · startup_kbrd вызывает ActionFactory::show_dialog с close_by_return = true, шириной 1500, картой действий и таймером ActionFactory::timer(1). ↩↩↩

  15. doc-sdk-plugins.c013 · doc · any-documented; прошивка — · PHP API не позволяет плагину рисовать произвольный ТВ-интерфейс и произвольно обрабатывать события пульта — только через высокоуровневый GUI-фреймворк с фиксированным набором возможностей ↩↩

  16. doc-sdk-plugins--gui-actions.c001 · doc · any-documented; прошивка — · Константы GuiEventKind позволяют назначить GuiAction на GUI-событие; большинство из них соответствует кнопкам пульта ↩↩↩

    • doc-sdk-plugins--gui-actions.c053 · doc · any-documented; прошивка — · Поле actions в ShowDialogAction задаёт действия на нажатия клавиш и событие таймера; поведение GUI_EVENT_KEY_ENTER изменить нельзя
    • fw-tv188b-261021-0117-r25.c266 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие цветной клавиши в VOD (key_a_red, key_b_green из PluginVodInfo::actions) приходит в input_data без playback_position — с полями handler_id, control_id, play_mode, topmenu_root_id, playback_browser_activated, plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx.

    ↩

  17. doc-sdk-plugins--gui-actions.c042 · doc · any-documented; прошивка — · PluginHandleUserInputAction не имеет данных; выполняет операцию Handle_user_input(GuiAction::$params) и возвращает её результат как post action ↩↩↩↩

  18. doc-sdk-plugins--operations.c117 · doc · any-documented; прошивка — · handle_user_input() вызывается во время исполнения GUI-действия HANDLE_USER_INPUT ↩

  19. doc-sdk-plugins--operations.c118 · doc · any-documented; прошивка — · handle_user_input() может вернуть другой объект GuiAction, который исполняется немедленно ↩

  20. doc-sdk-plugins--operations.c119 · doc · any-documented; прошивка — · Сценарии handle_user_input(): регулярные папки с элементами разных типов (HANDLE_USER_INPUT на клавишах), экраны настроек (confirm/apply у text field/combobox или кнопка «Apply») и control dialogs — диалоги с произвольным набором контролов, ведущие себя почти как control-папки ↩↩↩

  21. doc-sdk-plugins.c070 · doc · any-documented; прошивка — · GUI-действие в PHP — массив с handler_string_id (тип) и data (параметры); среди типов PLUGIN_OPEN_FOLDER, PLUGIN_TV_PLAY, PLUGIN_VOD_PLAY и особый HANDLE_USER_INPUT, чей результат handle_user_input() исполняется как следующее действие ↩

  22. fw-tv188b-260827-0003-r24--php-framework.c116 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: LAUNCH_EXT_APP_ACTION_ID='launch_ext_app', LAUNCH_MEDIA_URL_ACTION_ID='launch_media_url', OPEN_FOLDER_ACTION_ID='open_folder', PLAYLIST_PLAY_ACTION_ID='playlist_play', PLUGIN_CLEAR_ARCHIVE_CACHE_ACTION_ID='plugin_clear_archive_cache', PLUGIN_EXIT_FOLDERS_ACTION_ID='plugin_exit_folders', PLUGIN_HANDLE_USER_INPUT_ACTION_ID='plugin_handle_user_input', PLUGIN_INVALIDATE_FOLDERS_ACTION_ID='plugin_invalidate_folders', PLUGIN_OPEN_FOLDER_ACTION_ID='plugin_open_folder', PLUGIN_REFRESH_ENTRY_POINTS_ACTION_ID='plugin_refresh_entry_points', PLUGIN_REPLACE_PATH_ACTION_ID='plugin_replace_path', PLUGIN_RUN_NATIVE_CODE_ACTION_ID='plugin_run_native_code', PLUGIN_SHOW_ERROR_ACTION_ID='plugin_show_error', PLUGIN_SYSTEM_ACTION_ID='plugin_system', PLUGIN_TV_PLAY_ACTION_ID='plugin_tv_play' ↩↩↩↩↩

  23. fw-tv188b-260827-0003-r24--php-framework.c015 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Во всех методах DunePlugin $plugin_cookies передаётся по ссылке и описан как [inout] Map: Key -> Value; у handle_user_input по ссылке передаётся и $user_input ↩

  24. fw-tv188b-261021-0117-r25.c336 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: test_plugin5->handle_user_input(kbp5.native): start (timeout=60.0s)». ↩

  25. doc-sdk-plugins.c038 · doc · any-documented; прошивка — · actions точки входа — соответствие событие (клавиша) → GUI-действие при фокусе на точке входа; popup_menu добавляет пункты в контекстное меню точки входа ↩

  26. fw-tv188b-260827-0003-r24--php-framework--dune-api.c087 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginRegularFolderView::{actions} имеют C-тип (GuiActionMap *). ↩

  27. fw-tv188b-260827-0003-r24--php-framework--dune-api.c062 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginControlsFolderView::{actions} имеют C-тип (GuiActionMap *). ↩

    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c100 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginRowsFolderView::{actions} имеют C-тип (GuiActionMap *).
    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c069 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginGCompsFolderView::{actions} имеют C-тип (GuiActionMap *).

    ↩

    • doc-sdk-plugins--gui-actions.c053 · doc · any-documented; прошивка — · Поле actions в ShowDialogAction задаёт действия на нажатия клавиш и событие таймера; поведение GUI_EVENT_KEY_ENTER изменить нельзя
    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c162 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля ShowDialogActionData::{actions} имеют C-тип (GuiActionMap *).

    ↩

  28. fw-tv188b-260827-0003-r24--php-framework--dune-api.c168 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля ShowGCompsDialogActionData::{actions} имеют C-тип (GuiActionMap *). ↩

  29. fw-tv188b-260827-0003-r24--php-framework--dune-api.c129 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginTvInfo::{actions} имеют C-тип (GuiActionMap *). ↩

  30. fw-tv188b-260827-0003-r24--php-framework--dune-api.c149 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginVodInfo::{actions} имеют C-тип (GuiActionMap *). ↩

    • doc-sdk-plugins--gui-actions.c094 · doc · any-documented; прошивка — · Данные ChangeBehaviour — класс ChangeBehaviourActionData с необязательными полями actions (GuiActionMap), timer (GuiTimerDef), post_action
    • doc-sdk-plugins--gui-actions.c096 · doc · any-documented; прошивка — · В ChangeBehaviour заданное actions заменяет существующую карту действий, а заданный таймер перезапускается от текущего момента

    ↩↩

  31. doc-sdk-plugins--gui-actions.c095 · doc · any-documented; прошивка — · ChangeBehaviour меняет поведение в текущем GUI-контейнере; поддерживаются регулярная папка, диалог с контролами и VOD-воспроизведение, а папки с контролами/фильмом, TV- и обычное воспроизведение обещаны в будущем ↩↩

  32. doc-sdk-plugins.c074 · doc · any-documented; прошивка — · Control-папка поддерживает контролы button, combobox, text field; изменения применяются/сохраняются через действие HANDLE_USER_INPUT ↩↩

  33. doc-sdk-plugins--controls-playback.c034 · doc · any-documented; прошивка — · Действие, исполняемое из контрола, получает в params selected_control_id со значением GuiControlDef::name выбранного контрола — производителя действия. ↩

  34. doc-sdk-plugins--controls-playback.c035 · doc · any-documented; прошивка — · В params действия из контейнера для каждого combobox и текстового поля ключ с именем GuiControlDef::name содержит текущее значение контрола: выбранный choice_value или редактируемый текст. ↩↩

  35. doc-sdk-plugins--controls-playback.c036 · doc · any-documented; прошивка — · При назначении HANDLE_USER_INPUT контролу плагину следует заранее добавить в params метки, позволяющие Handle_user_input() распознать контекст вызова и контейнер. ↩

  36. fw-tv188b-261021-0117-r25.c262 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 params (handler_id, control_id) действия plugin_handle_user_input из key_enter точки входа в манифесте приходят полями handler_id и control_id в input_data операции handle_user_input. ↩

  37. fw-tv188b-261021-0117-r25.c261 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при ENTER на точке входа (key_enter → plugin_handle_user_input) input_data операции handle_user_input содержит selected_media_url и orig_selected_media_url, равные media_url этой точки входа, а также play_mode none и topmenu_root_id section:applications. ↩

  38. plg-dc-widget-ext.c092 · code · unknown; прошивка — · Значение элемента управления приходит в handle_user_input как свойство $user_input->{control_id}; родительский media_url — $user_input->parent_media_url ↩

  39. fw-tv188b-260827-0003-r24--php-framework.c105 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GuiEventKind строковыми константами: GUI_EVENT_KEY_ENTER='key_enter', GUI_EVENT_KEY_PLAY='key_play', GUI_EVENT_KEY_A_RED='key_a_red', GUI_EVENT_KEY_B_GREEN='key_b_green', GUI_EVENT_KEY_C_YELLOW='key_c_yellow', GUI_EVENT_KEY_D_BLUE='key_d_blue', GUI_EVENT_KEY_POPUP_MENU='key_popup_menu', GUI_EVENT_KEY_INFO='key_info', GUI_EVENT_KEY_LEFT='key_left', GUI_EVENT_KEY_RIGHT='key_right', GUI_EVENT_KEY_UP='key_up', GUI_EVENT_KEY_DOWN='key_down', GUI_EVENT_KEY_P_PLUS='key_p_plus', GUI_EVENT_KEY_P_MINUS='key_p_minus', GUI_EVENT_KEY_NEXT='key_next', GUI_EVENT_KEY_PREV='key_prev', GUI_EVENT_KEY_FIP_NEXT='key_fip_next', GUI_EVENT_KEY_FIP_PREV='key_fip_prev', GUI_EVENT_KEY_SETUP='key_setup', GUI_EVENT_KEY_RETURN='key_return', GUI_EVENT_KEY_SELECT='key_select', GUI_EVENT_KEY_CLEAR='key_clear', GUI_EVENT_KEY_PAUSE='key_pause', GUI_EVENT_KEY_FWD='key_fwd', GUI_EVENT_KEY_REW='key_rew', GUI_EVENT_KEY_SLOW='key_slow', GUI_EVENT_KEY_STOP='key_stop', GUI_EVENT_KEY_TOP_MENU='key_top_menu', GUI_EVENT_KEY_POWER='key_power', GUI_EVENT_KEY_EJECT='key_eject', GUI_EVENT_KEY_MODE='key_mode', GUI_EVENT_KEY_VENDOR='key_vendor', GUI_EVENT_KEY_SHUFFLE='key_shuffle', GUI_EVENT_KEY_MUSIC='key_music', GUI_EVENT_KEY_MUTE='key_mute', GUI_EVENT_KEY_V_PLUS='key_v_plus', GUI_EVENT_KEY_V_MINUS='key_v_minus', GUI_EVENT_KEY_SEARCH='key_search', GUI_EVENT_KEY_ZOOM='key_zoom', GUI_EVENT_KEY_SUBTITLE='key_subtitle', GUI_EVENT_KEY_REPEAT='key_repeat', GUI_EVENT_KEY_AUDIO='key_audio', GUI_EVENT_KEY_REC='key_rec', GUI_EVENT_KEY_DUNE='key_dune', GUI_EVENT_KEY_FAVORITES='key_favorites', GUI_EVENT_KEY_URL='key_url', GUI_EVENT_KEY_0='key_0', GUI_EVENT_KEY_1='key_1', GUI_EVENT_KEY_2='key_2', GUI_EVENT_KEY_3='key_3', GUI_EVENT_KEY_4='key_4', GUI_EVENT_KEY_5='key_5', GUI_EVENT_KEY_6='key_6', GUI_EVENT_KEY_7='key_7', GUI_EVENT_KEY_8='key_8', GUI_EVENT_KEY_9='key_9', GUI_EVENT_UI_ACTION='ui_action', GUI_EVENT_TIMER='timer', GUI_EVENT_PLUGIN_ROWS_INFO_UPDATE='plugin_rows_info_update', GUI_EVENT_FOLDER_LEAVE='folder_leave', GUI_EVENT_FOLDER_ENTER='folder_enter', GUI_EVENT_FOLDER_RETURN_BACK='folder_return_back', GUI_EVENT_PLAYBACK_STOP='playback_stop', GUI_EVENT_PLAYBACK_GOING_TO_SWITCH='playback_going_to_switch', GUI_EVENT_PLAYBACK_SWITCHED='playback_switched', GUI_EVENT_PLAYBACK_USER_ACTION='playback_user_action', GUI_EVENT_PLAYBACK_STATE_CHANGED='playback_state_changed', GUI_EVENT_MENU_PLAYBACK_OSD_CLOSED='menu_playback_osd_closed', GUI_EVENT_MENU_PLAYBACK_OSD_GOING_TO_OPEN='menu_playback_osd_going_to_open', GUI_EVENT_MENU_PLAYBACK_FINISH='menu_playback_finish', GUI_EVENT_MENU_EXT_APP_FINISH='menu_ext_app_finish', GUI_EVENT_WEB_BROWSER_FINISH='web_browser_finish', GUI_EVENT_BOOT='boot', GUI_EVENT_BOOT_END='boot_end', GUI_EVENT_INSTALL='install', GUI_EVENT_UPDATE='update', GUI_EVENT_UNINSTALL='uninstall', GUI_EVENT_GOING_TO_UPDATE='going_to_update', GUI_EVENT_GOING_TO_STOP='going_to_stop', GUI_EVENT_GUI_START='gui_start', GUI_EVENT_EARLY_GUI_START='early_gui_start', GUI_EVENT_STORAGE_DETECTED_MENU='storage_detected_menu', GUI_EVENT_FILE_POPUP_MENU='file_popup_menu', GUI_EVENT_TOPMENU_POPUP_MENU='topmenu_popup_menu', GUI_EVENT_TOPMENU_REFRESH='topmenu_refresh', GUI_EVENT_GOING_TO_RELOAD_ALL_FOLDERS='going_to_reload_all_folders', GUI_EVENT_FAVORITES_UPDATED='favorites_updated', GUI_EVENT_NETWORK_CHANGE='network_change', GUI_EVENT_SETTINGS_UPDATED='settings_updated', GUI_EVENT_CONFIRM_UPDATE='confirm_update', GUI_EVENT_SHUTDOWN='shutdown' ↩↩↩

  40. plg-dc-screenshoter.c014 · code · unknown; прошивка — · В обеих точках входа клавиши key_enter и key_play вызывают действие plugin_handle_user_input с handler_id = entry ↩↩

  41. doc-sdk-plugins--gui-actions.c002 · doc · any-documented; прошивка — · Исходный (без пометки версии) список клавишных событий GuiEventKind: GUI_EVENT_KEY_ENTER, GUI_EVENT_KEY_PLAY, GUI_EVENT_KEY_A_RED, GUI_EVENT_KEY_B_GREEN, GUI_EVENT_KEY_C_YELLOW, GUI_EVENT_KEY_D_BLUE, GUI_EVENT_KEY_POPUP_MENU, GUI_EVENT_KEY_INFO ↩↩

  42. doc-sdk-plugins--operations.c033 · doc · any-documented; прошивка — · get_next_folder_view() возвращает следующий вид папки; GUI вызывает его по A_RED, если плагин задал PluginFolderView::multiple_views_supported == true ↩

  43. doc-sdk-plugins--gui-actions.c010 · doc · any-documented; прошивка — · GUI_EVENT_KEY_ENTER нельзя переопределить для пустой регулярной папки плагина ↩

  44. doc-sdk-plugins--gui-actions.c019 · doc · any-documented; прошивка — · В регулярных папках плагина нельзя переопределить события ZOOM, POWER, EJECT ↩

  45. doc-sdk-plugins--gui-actions.c020 · doc · any-documented; прошивка — · В диалогах с контролами часть кнопок пульта имеет особое значение, когда активен текстовый редактор или раскрыт список combobox, и не может быть переопределена картой actions диалога ↩

  46. doc-sdk-plugins--controls-playback.c021 · doc · any-documented; прошивка — · У текстового поля из состояния focused ENTER включает active; активный редактор перехватывает стрелки, ENTER, RETURN и некоторые другие клавиши. ↩↩

  47. doc-sdk-plugins--controls-playback.c015 · doc · any-documented; прошивка — · У combobox из состояния focused клавиша ENTER открывает активное раскрытое меню; в active перехватываются стрелки, ENTER и RETURN. ↩

    • doc-sdk-plugins--operations.c045 · doc · any-documented; прошивка — · PluginTvInfo::favorites_supported включает избранное: особую группу «favorites» и обработку клавиш, по которым GUI вызывает change_tv_favorites() (D_BLUE, B_GREEN, C_YELLOW)
    • doc-sdk-plugins--operations.c082 · doc · any-documented; прошивка — · change_tv_favorites() обновляет список избранных каналов; вызывается в режиме ТВ-воспроизведения по B_GREEN, C_YELLOW, D_BLUE

    ↩

  48. thr-hdtv-19055.c027 · forum · Dune Android (Neo/Sky/Pro), android; прошивка — · На комплектном (новом) пульте Dune Android нет кнопки Eject; для Eject-скриншота нужен, например, IP-пульт ↩

    • fw-tv188b-260827-0003-r24--shell-ext.c052 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · handle_user_input() в DefaultDunePlugin передаёт ввод в UserInputHandlerRegistry: обработчик выбирается по $user_input->handler_id среди зарегистрированных register_handler(); без handler_id или с неизвестным id результат null
    • fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c043 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · UserInputHandlerRegistry::get_user_input_handler возвращает зарегистрированный handlers[handler_id] либо null, если handler_id отсутствует или неизвестен.

    ↩

  49. doc-sdk-plugins--gui-actions.c052 · doc · any-documented; прошивка — · ShowDialogAction показывает диалог с контролами и взаимодействует с пользователем, пока диалог не закрыт; контролы идут вертикальным списком, у каждого может быть заголовок (1 или 2 колонки), полоса прокрутки появляется при необходимости ↩

  50. doc-sdk-plugins--controls-playback.c030 · doc · any-documented; прошивка — · push_action кнопки, если задан, исполняется по ENTER на кнопке с фокусом. ↩

    • doc-sdk-plugins--gui-actions.c054 · doc · any-documented; прошивка — · Таймер ShowDialogAction срабатывает один раз; перезапустить его можно действием ChangeBehaviour
    • doc-sdk-plugins--gui-actions.c004 · doc · any-documented; прошивка — · Новый таймер (GUI_EVENT_TIMER) обычно задаётся GUI-действием ChangeBehaviour

    ↩

  51. doc-sdk-plugins--gui-actions.c060 · doc · any-documented; прошивка — · ShowDialogAction возвращает статус ok, а если диалог закрыт действием CloseDialogAndRun — его CloseDialogAndRunActionData::post_action как post action ↩

  52. doc-sdk-plugins--gui-actions.c055 · doc · any-documented; прошивка — · close_by_return в ShowDialogAction определяет, закрывается ли диалог кнопкой RETURN; preferred_width = 0 означает автоматический расчёт ширины по предпочтительной ширине контролов ↩

  53. doc-sdk-plugins--gui-actions.c059 · doc · any-documented; прошивка — · Ключ exit_seq в params ShowDialogAction — последовательность для закрытия диалога: список видов GUI-событий через запятую; доступен с прошивки 130904_b8 ↩↩↩

  54. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c085 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ControlFactory::add_close_dialog_and_apply_button строит GUI-элемент типа button; схема заполнения использует GuiControlDef::{name, title, kind, specific_def, params}; GuiButtonDef::{caption, width, push_action}. action_type=apply; push_action обёрнут в close_dialog_and_run. ↩

  55. plg-dc-widget-ext--adv-keyboard.c063 · code · unknown; прошивка — · Диалог настроек клавиатуры задаёт ширину 1100 и close_by_return = false; RETURN переназначен на close_dialog с флагом close_config_dialog_kbrd_q21. ↩

  56. doc-sdk-plugins--gui-actions.c003 · doc · any-documented; прошивка — · GUI_EVENT_TIMER — особое событие периодической активности; генерируется один раз по истечении тайм-аута GuiTimerDef::delay_ms ↩

  57. doc-sdk-plugins--gui-actions.c054 · doc · any-documented; прошивка — · Таймер ShowDialogAction срабатывает один раз; перезапустить его можно действием ChangeBehaviour ↩

  58. fw-tv188b-261021-0117-r25--downloads.c072 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 действие open_magnet плагина downloads с непустым magnet_url прошло цепочку entry.open_magnet → entry.ensure_ts (~11 с, запуск TorrServer) → entry.open_dl → show_dialog с опросом entry.dialog_open_dl раз в ~1 с (три вызова) → close_dialog_and_run → entry.show_open_magnet → show_dialog; тайм-аут open_magnet и dialog_open_dl — 300 с, остальных шагов — 60 с. ↩

  59. doc-sdk-plugins--gui-actions.c099 · doc · any-documented; прошивка — · CloseAndRunAction (данные CloseAndRunActionData с необязательным post_action): при активном диалоге с контролами работает как CloseDialogAndRunAction, при другом диалоге ничего не делает, а без диалогов в активной папке закрывает её (переход вверх) и возвращает post_action; доступно с прошивки 121114 ↩↩↩

  60. doc-sdk-plugins--gui-actions.c100 · doc · any-documented; прошивка — · С прошивки 131029_b9 CloseAndRunAction, вызванное из TV-воспроизведения или VOD-воспроизведения плагина без активного диалога, работает как остановка воспроизведения ↩↩

  61. doc-sdk-plugins--gui-actions.c066 · doc · any-documented; прошивка — · ShowPopupMenuAction показывает всплывающее меню до его закрытия; действие выбранного пользователем пункта возвращается как post action ↩↩

    • doc-sdk-plugins--gui-actions.c052 · doc · any-documented; прошивка — · ShowDialogAction показывает диалог с контролами и взаимодействует с пользователем, пока диалог не закрыт; контролы идут вертикальным списком, у каждого может быть заголовок (1 или 2 колонки), полоса прокрутки появляется при необходимости
    • doc-sdk-plugins--gui-actions.c060 · doc · any-documented; прошивка — · ShowDialogAction возвращает статус ok, а если диалог закрыт действием CloseDialogAndRun — его CloseDialogAndRunActionData::post_action как post action

    ↩

    • doc-sdk-plugins--gui-actions.c061 · doc · any-documented; прошивка — · CloseDialogAndRunAction (данные CloseDialogAndRunActionData с необязательным post_action) закрывает текущий диалог с контролами и возвращает post_action как результат вызвавшего действия SHOW_DIALOG
    • doc-sdk-plugins--gui-actions.c062 · doc · any-documented; прошивка — · Вне диалога с контролами CloseDialogAndRunAction игнорируется

    ↩

    • doc-sdk-plugins--gui-actions.c094 · doc · any-documented; прошивка — · Данные ChangeBehaviour — класс ChangeBehaviourActionData с необязательными полями actions (GuiActionMap), timer (GuiTimerDef), post_action
    • doc-sdk-plugins--gui-actions.c095 · doc · any-documented; прошивка — · ChangeBehaviour меняет поведение в текущем GUI-контейнере; поддерживаются регулярная папка, диалог с контролами и VOD-воспроизведение, а папки с контролами/фильмом, TV- и обычное воспроизведение обещаны в будущем
    • doc-sdk-plugins--gui-actions.c096 · doc · any-documented; прошивка — · В ChangeBehaviour заданное actions заменяет существующую карту действий, а заданный таймер перезапускается от текущего момента

    ↩

    • doc-sdk-plugins--gui-actions.c063 · doc · any-documented; прошивка — · Данные ResetControlsAction — класс ResetControlsActionData: defs (List), initial_sel_ndx (по умолчанию −1 — выбор не менять), post_action (необязательно)
    • doc-sdk-plugins--gui-actions.c064 · doc · any-documented; прошивка — · ResetControlsAction заменяет состояние текущего диалога с контролами или папки с контролами; вне их игнорируется

    ↩

    • doc-sdk-plugins--gui-actions.c065 · doc · any-documented; прошивка — · Данные ShowPopupMenuAction — класс ShowPopupMenuActionData: menu_items (List), selected_menu_item_index (необязательно, по умолчанию 0)
    • doc-sdk-plugins--gui-actions.c066 · doc · any-documented; прошивка — · ShowPopupMenuAction показывает всплывающее меню до его закрытия; действие выбранного пользователем пункта возвращается как post action

    ↩

  62. doc-sdk-plugins--controls-playback.c004 · doc · any-documented; прошивка — · Папка с контролами закрывается кнопками RETURN и TOP_MENU так же, как другие папки Dune. ↩

  63. doc-sdk-plugins--gui-actions.c033 · doc · any-documented; прошивка — · PluginOpenFolderAction открывает папку плагина: caption добавляется в блок пути, выполняется операция Get_folder_view($media_url), её результат показывается как содержимое папки ↩

  64. doc-sdk-plugins--operations.c008 · doc · any-documented; прошивка — · Тип PluginFolderView::data зависит от view_kind: регулярная папка — PluginRegularFolderView, control-папка — PluginControlsFolderView, movie-папка — PluginMovieFolderView ↩

  65. doc-sdk-plugins--operations.c020 · doc · any-documented; прошивка — · Класс PluginControlsFolderView имеет поля defs (Array), initial_sel_ndx (int), params (PluginFolderViewParams) ↩↩

  66. doc-sdk-plugins--operations.c022 · doc · any-documented; прошивка — · PluginControlsFolderView::defs — список определений GUI-контролов (см. раздел «GUI controls») ↩

  67. doc-sdk-plugins--operations.c023 · doc · any-documented; прошивка — · PluginControlsFolderView::initial_sel_ndx — индекс (с 0) контрола, получающего фокус первым; -1 означает контрол по умолчанию (первый) ↩↩↩

  68. doc-sdk-plugins--operations.c021 · doc · any-documented; прошивка — · Класс PluginFolderViewParams (параметры control- и movie-папок) в документе имеет поля paint_path_box, paint_content_box_background (Boolean) и background_url (String) ↩

  69. fw-tv188b-260827-0003-r24--php-framework.c199 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginControlsFolderView с ключами (5): defs, actions, timer, initial_sel_ndx, params ↩↩

  70. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c186 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · AbstractControlsScreen::get_folder_view возвращает PluginFolderView вида PLUGIN_FOLDER_VIEW_CONTROLS с данными PluginControlsFolderView (defs, actions, timer, initial_sel_ndx, params) и multiple_views_supported=false. ↩↩

  71. doc-sdk-plugins--controls-playback.c020 · doc · any-documented; прошивка — · GuiTextFieldDef описывает текстовое поле восемью полями: initial_value, numeric, password, has_osk, always_active, width, confirm_action, apply_action. ↩↩

  72. plg-dc-widget-ext--adv-keyboard.c044 · code · unknown; прошивка — · SuggestionsProvider задаёт пять методов: получение подсказок, их представления, поискового текста, дополнительных параметров действия и признака поиска только по подсказке. ↩↩

  73. plg-dc-widget-ext--adv-keyboard.c022 · code · unknown; прошивка — · load_keyboard читает adv_keyboard_.txt без пустых строк и переводов строк; если файл отсутствует, пробует adv_keyboard_english.txt. ↩↩

  74. doc-sdk-plugins--controls-playback.c033 · doc · any-documented; прошивка — · Нерисуемый псевдоконтрол VGap с GuiVGapDef::vgap изменяет стандартное расстояние между соседними контролами: положительное значение увеличивает его, отрицательное уменьшает. ↩

  75. doc-sdk-plugins--controls-playback.c025 · doc · any-documented; прошивка — · У текстового поля always_active = true пропускает состояние focused: при получении фокуса контрол сразу переходит в active; по умолчанию always_active = false. ↩

  76. doc-sdk-plugins--controls-playback.c027 · doc · any-documented; прошивка — · confirm_action текстового поля исполняется по ENTER в active до применения изменений: OK применяет текст и переводит поле в focused, иной статус откатывает изменения и оставляет поле в active. ↩

  77. doc-sdk-plugins--controls-playback.c028 · doc · any-documented; прошивка — · apply_action текстового поля исполняется после применения изменений; статус исполнения действия игнорируется. ↩

  78. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c065 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · VodSearchScreen расширяет AbstractControlsScreen и в do_get_control_defs читает cookie vod_search_pattern, добавляет label vod_enter_search_pattern и текстовое поле pattern с начальным значением из cookie, numeric=false, password=false, has_osk=true, always_active=true, width=500, need_confirm=true, need_apply=true; get_control_defs сначала вызывает vod->folder_entered. ↩

  79. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · VodSearchScreen::handle_user_input при action_type=apply и control_id=pattern берёт pattern из user_input, сохраняет в cookie vod_search_pattern, печатает 'Vod search: applying pattern', перестраивает defs и возвращает reset_controls с open_folder(get_search_media_url_str(pattern), pattern); при action_type=confirm, control_id=pattern и пустом pattern возвращает show_error(false, vod_search_pattern_should_not_be_empty), при непустом ничего не возвращает. ↩↩↩

  80. plg-dc-globaltv.c167 · code · unknown; прошивка — · Для ввода кода родительского контроля GlobalTvTvSectionListScreen вызывает ControlFactory::add_text_field с numeric=true, has_osk=false, always_active=true и params fixed_osk_id='numeric'. ↩↩

  81. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c036 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит ключ ktv_params (подобласть parse_plugin_manifest()/ktv_params) и следом имена server_address, softid, softid_h265, fixed_osk_id, best_stream_server_url, ad_server_address, private_enabled, info_url, kiosk_url, use_catchup_api, catchup_api_without_gui, ext_epg_url, account_changed_action; рядом в блоке — ad.kartina.tv, http://dune.kartina.tv/releases/Info/info_splash.1.png и kartina_tv_launcher ↩

  82. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c093 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::text_field строит GUI-элемент типа text_field; схема заполнения использует GuiTextFieldDef::{initial_value, numeric, password, has_osk, width, apply_action}; GComponentDef::{id, geom_def, margins_def, kind, specific_def}; GCompTextFieldDef::{def, params}. other_params: numeric/password/has_osk=false, width=null, apply_action=null. ↩

    • fw-tv188b-260827-0003-r24--http-api--ext-command-params.c035 · doc · any-documented; прошивка — · cmd=get_text возвращает редактируемую сейчас строку в параметре text; без активного редактора текста — command_status failed
    • fw-tv188b-260827-0003-r24--http-api--ext-command-params.c036 · doc · any-documented; прошивка — · cmd=set_text&text=… заменяет редактируемую строку заданной (UTF-8); без активного редактора — failed

    ↩↩

    • fw-tv188b-261021-0117-r25.c266 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие цветной клавиши в VOD (key_a_red, key_b_green из PluginVodInfo::actions) приходит в input_data без playback_position — с полями handler_id, control_id, play_mode, topmenu_root_id, playback_browser_activated, plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx.
    • fw-tv188b-260827-0003-r24--php-framework.c105 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GuiEventKind строковыми константами: GUI_EVENT_KEY_ENTER='key_enter', GUI_EVENT_KEY_PLAY='key_play', GUI_EVENT_KEY_A_RED='key_a_red', GUI_EVENT_KEY_B_GREEN='key_b_green', GUI_EVENT_KEY_C_YELLOW='key_c_yellow', GUI_EVENT_KEY_D_BLUE='key_d_blue', GUI_EVENT_KEY_POPUP_MENU='key_popup_menu', GUI_EVENT_KEY_INFO='key_info', GUI_EVENT_KEY_LEFT='key_left', GUI_EVENT_KEY_RIGHT='key_right', GUI_EVENT_KEY_UP='key_up', GUI_EVENT_KEY_DOWN='key_down', GUI_EVENT_KEY_P_PLUS='key_p_plus', GUI_EVENT_KEY_P_MINUS='key_p_minus', GUI_EVENT_KEY_NEXT='key_next', GUI_EVENT_KEY_PREV='key_prev', GUI_EVENT_KEY_FIP_NEXT='key_fip_next', GUI_EVENT_KEY_FIP_PREV='key_fip_prev', GUI_EVENT_KEY_SETUP='key_setup', GUI_EVENT_KEY_RETURN='key_return', GUI_EVENT_KEY_SELECT='key_select', GUI_EVENT_KEY_CLEAR='key_clear', GUI_EVENT_KEY_PAUSE='key_pause', GUI_EVENT_KEY_FWD='key_fwd', GUI_EVENT_KEY_REW='key_rew', GUI_EVENT_KEY_SLOW='key_slow', GUI_EVENT_KEY_STOP='key_stop', GUI_EVENT_KEY_TOP_MENU='key_top_menu', GUI_EVENT_KEY_POWER='key_power', GUI_EVENT_KEY_EJECT='key_eject', GUI_EVENT_KEY_MODE='key_mode', GUI_EVENT_KEY_VENDOR='key_vendor', GUI_EVENT_KEY_SHUFFLE='key_shuffle', GUI_EVENT_KEY_MUSIC='key_music', GUI_EVENT_KEY_MUTE='key_mute', GUI_EVENT_KEY_V_PLUS='key_v_plus', GUI_EVENT_KEY_V_MINUS='key_v_minus', GUI_EVENT_KEY_SEARCH='key_search', GUI_EVENT_KEY_ZOOM='key_zoom', GUI_EVENT_KEY_SUBTITLE='key_subtitle', GUI_EVENT_KEY_REPEAT='key_repeat', GUI_EVENT_KEY_AUDIO='key_audio', GUI_EVENT_KEY_REC='key_rec', GUI_EVENT_KEY_DUNE='key_dune', GUI_EVENT_KEY_FAVORITES='key_favorites', GUI_EVENT_KEY_URL='key_url', GUI_EVENT_KEY_0='key_0', GUI_EVENT_KEY_1='key_1', GUI_EVENT_KEY_2='key_2', GUI_EVENT_KEY_3='key_3', GUI_EVENT_KEY_4='key_4', GUI_EVENT_KEY_5='key_5', GUI_EVENT_KEY_6='key_6', GUI_EVENT_KEY_7='key_7', GUI_EVENT_KEY_8='key_8', GUI_EVENT_KEY_9='key_9', GUI_EVENT_UI_ACTION='ui_action', GUI_EVENT_TIMER='timer', GUI_EVENT_PLUGIN_ROWS_INFO_UPDATE='plugin_rows_info_update', GUI_EVENT_FOLDER_LEAVE='folder_leave', GUI_EVENT_FOLDER_ENTER='folder_enter', GUI_EVENT_FOLDER_RETURN_BACK='folder_return_back', GUI_EVENT_PLAYBACK_STOP='playback_stop', GUI_EVENT_PLAYBACK_GOING_TO_SWITCH='playback_going_to_switch', GUI_EVENT_PLAYBACK_SWITCHED='playback_switched', GUI_EVENT_PLAYBACK_USER_ACTION='playback_user_action', GUI_EVENT_PLAYBACK_STATE_CHANGED='playback_state_changed', GUI_EVENT_MENU_PLAYBACK_OSD_CLOSED='menu_playback_osd_closed', GUI_EVENT_MENU_PLAYBACK_OSD_GOING_TO_OPEN='menu_playback_osd_going_to_open', GUI_EVENT_MENU_PLAYBACK_FINISH='menu_playback_finish', GUI_EVENT_MENU_EXT_APP_FINISH='menu_ext_app_finish', GUI_EVENT_WEB_BROWSER_FINISH='web_browser_finish', GUI_EVENT_BOOT='boot', GUI_EVENT_BOOT_END='boot_end', GUI_EVENT_INSTALL='install', GUI_EVENT_UPDATE='update', GUI_EVENT_UNINSTALL='uninstall', GUI_EVENT_GOING_TO_UPDATE='going_to_update', GUI_EVENT_GOING_TO_STOP='going_to_stop', GUI_EVENT_GUI_START='gui_start', GUI_EVENT_EARLY_GUI_START='early_gui_start', GUI_EVENT_STORAGE_DETECTED_MENU='storage_detected_menu', GUI_EVENT_FILE_POPUP_MENU='file_popup_menu', GUI_EVENT_TOPMENU_POPUP_MENU='topmenu_popup_menu', GUI_EVENT_TOPMENU_REFRESH='topmenu_refresh', GUI_EVENT_GOING_TO_RELOAD_ALL_FOLDERS='going_to_reload_all_folders', GUI_EVENT_FAVORITES_UPDATED='favorites_updated', GUI_EVENT_NETWORK_CHANGE='network_change', GUI_EVENT_SETTINGS_UPDATED='settings_updated', GUI_EVENT_CONFIRM_UPDATE='confirm_update', GUI_EVENT_SHUTDOWN='shutdown'

    ↩

  83. fw-tv188b-261021-0117-r25--media-player.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 назначенное в PluginVodInfo::actions действие key_pause перехватывает PAUSE: плагин получает событие, а воспроизведение продолжает идти. ↩

  84. fw-tv188b-261021-0117-r25.c266 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие цветной клавиши в VOD (key_a_red, key_b_green из PluginVodInfo::actions) приходит в input_data без playback_position — с полями handler_id, control_id, play_mode, topmenu_root_id, playback_browser_activated, plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx. ↩↩

  85. fw-tv188b-261021-0117-r25.c265 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 через PluginVodInfo::actions при VOD приходят не только события цветных клавиш, таймера и остановки, но и playback_user_action, playback_switched, playback_state_changed и playback_going_to_switch — оболочка исполняет назначенное на них действие plugin_handle_user_input. ↩

  86. doc-sdk-plugins--gui-actions.c014 · doc · any-documented; прошивка — · С прошивки 131029_b9 событие таймера можно использовать и в TV-воспроизведении плагина (так же, как в VOD-воспроизведении) ↩↩

  87. fw-tv188b-260827-0003-r24--php-framework.c030 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_config_with_color_buttons() возвращает false для пультов SMALL и ARROWS и true для остальных; dune_config_show_pop_up_icon_only() возвращает true для OVAL, SMALL, ARROWS и false для остальных ↩↩

  88. fw-tv188b-260827-0003-r24--php-framework.c028 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_config.php определяет константы типа пульта FEW_BUTTONS_REMOTE_TYPE_NONE=0, _OVAL=1, _SMALL=2, _ARROWS=3 ↩

  89. fw-tv188b-260827-0003-r24--php-framework.c029 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_config_get_few_buttons_remote_type() возвращает DuneSystem::$properties['few_buttons_remote_type'] ↩

  90. fw-tv188b-261021-0117-r25--shell-ext--entry-handler--movie-screen--panels.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · hints_pane показывает иконку popup.png (или popup_icon_only.png, если dune_config_show_pop_up_icon_only() истинна) и подпись controls_button_popup только при включённом cur_movie_search_association_enabled или cur_movie_choose_playback_type_enabled; для первой кнопки и desc base добавляет p_plus_p_minus.png с action_scroll и up_down.png. ↩

  91. fw-tv188b-260827-0003-r24--firmware-config.c044 · code · android-dune-fw; прошивка 260827_0003_r24 · Экран appearance_control в menu_config.xml перечисляет setting id: animation_effects, animation_speed, key_repeat_rate, delay_before_key_repeat, animation_for_keyboard. ↩

    • doc-sdk-plugins--gui-actions.c057 · doc · any-documented; прошивка — · initial_sel_ndx в ShowDialogAction — индекс первого выбранного контрола среди фокусируемых (combobox, кнопки, текстовые поля)
    • doc-sdk-plugins--gui-actions.c050 · doc · any-documented; прошивка — · Данные ShowDialogAction — класс ShowDialogActionData: title, defs (List) и необязательные actions (GuiActionMap), timer (GuiTimerDef), close_by_return (false), preferred_width, max_height, min_item_title_width (0 — авто), initial_sel_ndx (−1 — авто), params (Map)

    ↩

  92. doc-sdk-plugins--gui-actions.c063 · doc · any-documented; прошивка — · Данные ResetControlsAction — класс ResetControlsActionData: defs (List), initial_sel_ndx (по умолчанию −1 — выбор не менять), post_action (необязательно) ↩

  93. doc-sdk-plugins--gui-actions.c069 · doc · any-documented; прошивка — · PluginUpdateFolderAction частично заменяет состояние текущей регулярной папки плагина: при need_refresh очищается кэш состояния папки, применяется переданный range, при sel_ndx >= 0 фокус переходит на элемент с этим индексом ↩

  94. doc-sdk-plugins--gui-actions.c065 · doc · any-documented; прошивка — · Данные ShowPopupMenuAction — класс ShowPopupMenuActionData: menu_items (List), selected_menu_item_index (необязательно, по умолчанию 0) ↩↩

  95. doc-sdk-plugins.c033 · doc · any-documented; прошивка — · section_index и is_default_section (с прошивки 120901) выводят точку входа как раздел главного экрана в стиле «Folders»; is_default_section делает её фокусной при первом входе ↩↩

  96. plg-dc-widget-ext--adv-keyboard.c036 · code · unknown; прошивка — · При наличии argColor обработчик сохраняет значение user_input->{control_id} в adv_kbrd_colors[argColor] и переоткрывает настройки с прежним initial_sel_ndx. ↩

  97. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c084 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при новой некритической версии проверка на запуске показывает диалог «Обновление приложения» с текстом «Приложение: . Текущая версия: . Новая версия: . Обновить приложение?» и кнопками «Обновить» (в фокусе по умолчанию) и «Напомнить позже». ↩

  98. fw-tv188b-261021-0117-r25--downloads.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 show_open_magnet для торрента из трёх файлов показывает диалог «Выберите действие для торрента» с «Название торрента: <имя>», «Найдено файлов: 3» и кнопками «Воспроизвести» (в фокусе) и «Скачать все файлы». ↩

    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c043 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля GComponentDef::{focusable_def} имеют C-тип (GCompFocusableDef *).
    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c044 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля GComponentDef::{focused_variant_def} имеют C-тип (GCompVariantDef *).

    ↩

    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c105 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginRowsPane::{focus} имеют C-тип (GCompFocusDef *).
    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c108 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginRowsPane::{horizontal_focus_freedom_factor, vertical_focus_freedom_factor, vertical_focus_gravity} имеют C-тип float.

    ↩

  99. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c126 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · RowsFactory::focus формирует или дополняет структуру с полями GCompFocusDef::{type, type2}. type=GCOMP_FOCUS_SYSTEM, type2=GCOMP_FOCUS_NONE. ↩

  100. fw-tv188b-261021-0117-r25--ext-epg.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ProgramScreen::get_action_map связывает INFO с close_and_run, направления и P+/P− с control_id=change и op=left/right/up/down/page_up/page_down. ↩

  101. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c200 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompList::handle_op принимает page_up/page_down/up/down/left/right/sel:; шаг страницы равен floor((page_size+1)/2). ↩

  102. fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' ↩↩↩↩↩↩

  103. fw-tv188b-260827-0003-r24--php-framework.c185 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiMenuItemDef с ключами (7): is_separator, id, caption, icon_url, marked, action, is_shown_action ↩

  104. fw-tv188b-260827-0003-r24--php-framework--dune-api.c055 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля GuiMenuItemDef::{action, is_shown_action} имеют C-тип (GuiAction *). ↩

  105. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::get_menu_item формирует или дополняет структуру с полями GuiMenuItemDef::{caption, action, icon_url}. icon_url только при истинности. ↩

  106. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c020 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::get_menu_separator формирует или дополняет структуру с полями GuiMenuItemDef::{is_separator}. is_separator=1. ↩

    • doc-sdk-plugins.c038 · doc · any-documented; прошивка — · actions точки входа — соответствие событие (клавиша) → GUI-действие при фокусе на точке входа; popup_menu добавляет пункты в контекстное меню точки входа
    • fw-tv188b-260827-0003-r24--plugin-loader--manifest.c016 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные манифесты r24 задают контекстное меню точки входа как popup_menu/menu_items/menu_item (с caption и action, у kartina_tv_launcher ещё is_shown_action) — в dunestore, kartina_tv_launcher, ktv_start, shell_ext

    ↩

  107. fw-tv188b-260827-0003-r24--php-framework--dune-api.c147 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginVodInfo::{extra_menu_items} имеют C-тип (GuiMenuItemDefList *). ↩

    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля AddMenuItemsActionData::{menu_items} имеют C-тип (GuiMenuItemDefList *).
    • fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run'

    ↩

  108. plg-dc-globaltv.c055 · code · unknown; прошивка — · Для topmenu_popup плагин читает из user_input selected_topmenu_item_id (формат plugin:<имя>:section_) и topmenu_pcode_entered и отвечает действием add_menu_items. ↩

  109. doc-sdk-plugins--gui-actions.c044 · doc · any-documented; прошивка — · PluginShowErrorAction в режиме воспроизведения показывает одну строку текста в центре экрана, а в меню Dune — диалог с заголовком и строками сообщения ↩

  110. doc-sdk-plugins--gui-actions.c045 · doc · any-documented; прошивка — · При fatal == true PluginShowErrorAction планирует выход из плагина по фатальной ошибке: воспроизведение останавливается, браузер Dune переходит в верхнее меню ↩

  111. doc-sdk-plugins--gui-actions.c046 · doc · any-documented; прошивка — · PluginShowErrorAction всегда возвращает статус ошибки (failed) и никогда не возвращает post action ↩

  112. fw-tv188b-261021-0117-r25.c339 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_show_error в ответе handle_user_input принят: shell.log пишет result action plugin_show_error. ↩

  113. fw-tv188b-261021-0117-r25--stbapi-js.c039 · code · android-dune-fw; прошивка 261021_0117_r25 · StbWebView передаёт сопоставленные клавиши в DOM как keydown/keyup с одинаковыми keyCode и which через document.body.dispatchEvent. ↩

  114. fw-tv188b-261021-0117-r25--stbapi-js.c040 · code · android-dune-fw; прошивка 261021_0117_r25 · Stb.setRcAutoRepeatKeys является заглушкой not implemented, возвращающей ERROR даже после успешного разбора массива Java-мостом. ↩

  115. doc-sdk-plugins--gui-actions.c007 · doc · any-documented; прошивка — · С прошивки 120902 добавлены клавишные события, доступные только в диалогах с контролами: GUI_EVENT_KEY_LEFT, GUI_EVENT_KEY_RIGHT, GUI_EVENT_KEY_UP, GUI_EVENT_KEY_DOWN, GUI_EVENT_KEY_P_PLUS, GUI_EVENT_KEY_P_MINUS, GUI_EVENT_KEY_NEXT, GUI_EVENT_KEY_PREV, GUI_EVENT_KEY_0, GUI_EVENT_KEY_1, GUI_EVENT_KEY_2, GUI_EVENT_KEY_3, GUI_EVENT_KEY_4, GUI_EVENT_KEY_5, GUI_EVENT_KEY_6, GUI_EVENT_KEY_7, GUI_EVENT_KEY_8, GUI_EVENT_KEY_9 ↩

  116. doc-sdk-plugins--gui-actions.c009 · doc · any-documented; прошивка — · С прошивки 130819_b8 все ранее перечисленные клавишные события можно использовать и в регулярных папках плагина ↩

  117. doc-sdk-plugins--gui-actions.c011 · doc · any-documented; прошивка — · С прошивки 130819_b8 для диалогов с контролами и регулярных папок плагина добавлены события GUI_EVENT_KEY_SETUP, GUI_EVENT_KEY_RETURN, GUI_EVENT_KEY_SELECT, GUI_EVENT_KEY_CLEAR ↩

  118. doc-sdk-plugins--gui-actions.c012 · doc · any-documented; прошивка — · С прошивки 130904_b8 для диалогов с контролами и регулярных папок плагина добавлено событие GUI_EVENT_KEY_PAUSE ↩

    • doc-sdk-plugins--gui-actions.c016 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_SWITCHED генерируется после переключения воспроизведения на новый media URL, включая самый первый
    • doc-sdk-plugins--gui-actions.c017 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_GOING_TO_SWITCH генерируется перед переключением на новый media URL; в отличие от GUI_EVENT_PLAYBACK_STOP, оно не генерируется при остановке и выключении

    ↩

  119. fw-tv188b-260827-0003-r24--php-framework.c266 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ShowDialogActionData с ключами (10): title, defs, actions, timer, close_by_return, preferred_width, max_height, min_item_title_width, initial_sel_ndx, params ↩

    • doc-sdk-plugins--controls-playback.c037 · doc · any-documented; прошивка — · Раздел изменений 120531_2200_beta перечисляет 22 новых свойства существовавших структур PHP API.
    • doc-sdk-plugins--controls-playback.c038 · doc · any-documented; прошивка — · Раздел изменений 120531_2200_beta перечисляет 17 свойств новых структур данных PHP API.

    ↩

    • doc-sdk-plugins--gui-actions.c050 · doc · any-documented; прошивка — · Данные ShowDialogAction — класс ShowDialogActionData: title, defs (List) и необязательные actions (GuiActionMap), timer (GuiTimerDef), close_by_return (false), preferred_width, max_height, min_item_title_width (0 — авто), initial_sel_ndx (−1 — авто), params (Map)
    • doc-sdk-plugins--gui-actions.c052 · doc · any-documented; прошивка — · ShowDialogAction показывает диалог с контролами и взаимодействует с пользователем, пока диалог не закрыт; контролы идут вертикальным списком, у каждого может быть заголовок (1 или 2 колонки), полоса прокрутки появляется при необходимости

    ↩

    • doc-sdk-plugins--gui-actions.c053 · doc · any-documented; прошивка — · Поле actions в ShowDialogAction задаёт действия на нажатия клавиш и событие таймера; поведение GUI_EVENT_KEY_ENTER изменить нельзя
    • doc-sdk-plugins--controls-playback.c037 · doc · any-documented; прошивка — · Раздел изменений 120531_2200_beta перечисляет 22 новых свойства существовавших структур PHP API.

    ↩

    • doc-sdk-plugins--gui-actions.c051 · doc · any-documented; прошивка — · В GuiTimerDef для ShowDialogAction задержка delay_ms (мс) может быть нулевой
    • doc-sdk-plugins--gui-actions.c054 · doc · any-documented; прошивка — · Таймер ShowDialogAction срабатывает один раз; перезапустить его можно действием ChangeBehaviour
    • doc-sdk-plugins--controls-playback.c037 · doc · any-documented; прошивка — · Раздел изменений 120531_2200_beta перечисляет 22 новых свойства существовавших структур PHP API.
    • doc-sdk-plugins--controls-playback.c038 · doc · any-documented; прошивка — · Раздел изменений 120531_2200_beta перечисляет 17 свойств новых структур данных PHP API.

    ↩

    • doc-sdk-plugins--gui-actions.c050 · doc · any-documented; прошивка — · Данные ShowDialogAction — класс ShowDialogActionData: title, defs (List) и необязательные actions (GuiActionMap), timer (GuiTimerDef), close_by_return (false), preferred_width, max_height, min_item_title_width (0 — авто), initial_sel_ndx (−1 — авто), params (Map)
    • doc-sdk-plugins--gui-actions.c055 · doc · any-documented; прошивка — · close_by_return в ShowDialogAction определяет, закрывается ли диалог кнопкой RETURN; preferred_width = 0 означает автоматический расчёт ширины по предпочтительной ширине контролов

    ↩↩

    • doc-sdk-plugins--gui-actions.c050 · doc · any-documented; прошивка — · Данные ShowDialogAction — класс ShowDialogActionData: title, defs (List) и необязательные actions (GuiActionMap), timer (GuiTimerDef), close_by_return (false), preferred_width, max_height, min_item_title_width (0 — авто), initial_sel_ndx (−1 — авто), params (Map)
    • doc-sdk-plugins--controls-playback.c037 · doc · any-documented; прошивка — · Раздел изменений 120531_2200_beta перечисляет 22 новых свойства существовавших структур PHP API.

    ↩

  120. doc-sdk-plugins--gui-actions.c056 · doc · any-documented; прошивка — · Поле min_item_title_width (минимальная ширина под заголовки контролов) в ShowDialogAction доступно с прошивки 121201 ↩↩

    • doc-sdk-plugins--gui-actions.c057 · doc · any-documented; прошивка — · initial_sel_ndx в ShowDialogAction — индекс первого выбранного контрола среди фокусируемых (combobox, кнопки, текстовые поля)
    • doc-sdk-plugins--gui-actions.c050 · doc · any-documented; прошивка — · Данные ShowDialogAction — класс ShowDialogActionData: title, defs (List) и необязательные actions (GuiActionMap), timer (GuiTimerDef), close_by_return (false), preferred_width, max_height, min_item_title_width (0 — авто), initial_sel_ndx (−1 — авто), params (Map)
    • doc-sdk-plugins--controls-playback.c037 · doc · any-documented; прошивка — · Раздел изменений 120531_2200_beta перечисляет 22 новых свойства существовавших структур PHP API.

    ↩

  121. doc-sdk-plugins--gui-actions.c058 · doc · any-documented; прошивка — · Ключ frame_style=default|glass в params ShowDialogAction (константы DIALOG_FRAME_STYLE_DEFAULT, DIALOG_FRAME_STYLE_GLASS) доступен с прошивки 130824_b8 ↩↩

    • doc-sdk-plugins--gui-actions.c050 · doc · any-documented; прошивка — · Данные ShowDialogAction — класс ShowDialogActionData: title, defs (List) и необязательные actions (GuiActionMap), timer (GuiTimerDef), close_by_return (false), preferred_width, max_height, min_item_title_width (0 — авто), initial_sel_ndx (−1 — авто), params (Map)
    • doc-sdk-plugins--operations.c020 · doc · any-documented; прошивка — · Класс PluginControlsFolderView имеет поля defs (Array), initial_sel_ndx (int), params (PluginFolderViewParams)

    ↩

    • doc-sdk-plugins--gui-actions.c057 · doc · any-documented; прошивка — · initial_sel_ndx в ShowDialogAction — индекс первого выбранного контрола среди фокусируемых (combobox, кнопки, текстовые поля)
    • doc-sdk-plugins--gui-actions.c050 · doc · any-documented; прошивка — · Данные ShowDialogAction — класс ShowDialogActionData: title, defs (List) и необязательные actions (GuiActionMap), timer (GuiTimerDef), close_by_return (false), preferred_width, max_height, min_item_title_width (0 — авто), initial_sel_ndx (−1 — авто), params (Map)
    • doc-sdk-plugins--operations.c023 · doc · any-documented; прошивка — · PluginControlsFolderView::initial_sel_ndx — индекс (с 0) контрола, получающего фокус первым; -1 означает контрол по умолчанию (первый)

    ↩

    • doc-sdk-plugins--gui-actions.c055 · doc · any-documented; прошивка — · close_by_return в ShowDialogAction определяет, закрывается ли диалог кнопкой RETURN; preferred_width = 0 означает автоматический расчёт ширины по предпочтительной ширине контролов
    • doc-sdk-plugins--controls-playback.c004 · doc · any-documented; прошивка — · Папка с контролами закрывается кнопками RETURN и TOP_MENU так же, как другие папки Dune.

    ↩

    • doc-sdk-plugins--gui-actions.c053 · doc · any-documented; прошивка — · Поле actions в ShowDialogAction задаёт действия на нажатия клавиш и событие таймера; поведение GUI_EVENT_KEY_ENTER изменить нельзя
    • doc-sdk-plugins--operations.c020 · doc · any-documented; прошивка — · Класс PluginControlsFolderView имеет поля defs (Array), initial_sel_ndx (int), params (PluginFolderViewParams)
    • fw-tv188b-260827-0003-r24--php-framework.c199 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginControlsFolderView с ключами (5): defs, actions, timer, initial_sel_ndx, params

    ↩

    • doc-sdk-plugins--gui-actions.c058 · doc · any-documented; прошивка — · Ключ frame_style=default|glass в params ShowDialogAction (константы DIALOG_FRAME_STYLE_DEFAULT, DIALOG_FRAME_STYLE_GLASS) доступен с прошивки 130824_b8
    • doc-sdk-plugins--gui-actions.c059 · doc · any-documented; прошивка — · Ключ exit_seq в params ShowDialogAction — последовательность для закрытия диалога: список видов GUI-событий через запятую; доступен с прошивки 130904_b8
    • doc-sdk-plugins--operations.c021 · doc · any-documented; прошивка — · Класс PluginFolderViewParams (параметры control- и movie-папок) в документе имеет поля paint_path_box, paint_content_box_background (Boolean) и background_url (String)

    ↩

  122. doc-sdk-plugins--gui-actions.c062 · doc · any-documented; прошивка — · Вне диалога с контролами CloseDialogAndRunAction игнорируется ↩

  123. fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' ↩

  124. fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' ↩↩↩

  125. fw-tv188b-261021-0117-r25.c337 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_run_native_code в ответе handle_user_input выполнен: shell.log пишет result action plugin_run_native_code, вызывает plugin_run_native_code(/flashdata/plugins/test_plugin5, kbp5_native) и передаёт native_code.so в [native_plugins_handler] open plugin. ↩

  126. fw-tv188b-261021-0117-r25.c338 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id change_settings в ответе handle_user_input выполнен: shell.log пишет result action change_settings и action D: (general) run test_plugin5->change_settings(). ↩

  127. doc-sdk-plugins--controls-playback.c008 · doc · any-documented; прошивка — · Для Label с прошивки 130820_b8+ поддержаны ключи smart, max_lines, lines_vgap и pars_vgap в GuiControlDef::params. ↩↩

    • fw-tv188b-260827-0003-r24--http-api--ext-command-params.c051 · doc · any-documented; прошивка — · cmd=ui_action_return[&count=-1|N] — как нажатие RETURN в TV UI: -1 — на главный экран, N — назад на N экранов (по умолчанию 1)
    • fw-tv188b-260827-0003-r24--http-api--ext-command-params.c052 · doc · any-documented; прошивка — · cmd=ui_action_enter&item_id=… — как выбор пункта с этим ID на текущем экране TV UI и нажатие ENTER
    • fw-tv188b-260827-0003-r24--http-api--ext-command-params.c053 · doc · any-documented; прошивка — · cmd=ui_action_popup_menu&item_id=… — как выбор пункта с этим ID на текущем экране TV UI и нажатие POP UP MENU

    ↩

  128. fw-tv188b-260827-0003-r24--shell-ext.c053 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · UserInputHandlerRegistry::create_action() строит действие PLUGIN_HANDLE_USER_INPUT_ACTION_ID с params handler_id/control_id и data operation_timeout (по умолчанию 60000) и show_dialog_delay (по умолчанию 20000) ↩

  129. fw-tv188b-260827-0003-r24--shell-ext.c052 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · handle_user_input() в DefaultDunePlugin передаёт ввод в UserInputHandlerRegistry: обработчик выбирается по $user_input->handler_id среди зарегистрированных register_handler(); без handler_id или с неизвестным id результат null ↩

    • fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c043 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · UserInputHandlerRegistry::get_user_input_handler возвращает зарегистрированный handlers[handler_id] либо null, если handler_id отсутствует или неизвестен.
    • fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c045 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · UserInputHandlerRegistry::handle_user_input принимает user_input и plugin_cookies без & и передаёт их найденному обработчику; при отсутствии обработчика возвращает null.

    ↩

  130. fw-tv188b-261021-0117-r25.c048 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DefaultDunePlugin::handle_user_input в shell_ext/lib r25 сначала ищет обработчик (UserInputHandlerRegistry::get_user_input_handler), при отсутствии печатает «E: handler not found…» и возвращает null, затем логирует ввод через log_user_input и сохраняет last_user_input ↩

  131. fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c047 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DefaultDunePlugin::handle_user_input после fire_before_handle сбрасывает накопленные result_action и smart_close_dialog, сохраняет user_input и handler, затем вызывает handle_user_input обработчика. ↩

  132. fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c042 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DefaultDunePlugin предоставляет get_last_user_input и get_last_user_input_handler, возвращающие сохранённые поля последнего ввода и обработчика. ↩

  133. fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c049 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При smart_close_dialog, истинном user_input.inside_dialog и верхнем CLOSE_DIALOG_AND_RUN_ACTION_ID DefaultDunePlugin::handle_user_input помещает накопленный result_action перед его post_action внутри нового close_dialog_and_run. ↩

  134. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c069 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r24 handle_user_input шести TV/VOD-экранов начинался с hd_print с подписью и foreach по всем полям user_input; в r25 этого блока нет. ↩

  135. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c082 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ControlFactory::add_button строит GUI-элемент типа button; схема заполнения использует GuiControlDef::{name, title, kind, specific_def, params}; GuiButtonDef::{caption, width, push_action}. button_caption_centered по умолчанию title==null; action_type=apply; timeout=60000, delay=20000. ↩

  136. fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · UserInputHandlerRegistry::create_action подставляет timeout_ms=60000 и show_dialog_delay_ms=20000 при null и записывает int-значения в data.operation_timeout и data.show_dialog_delay. ↩↩

  137. plg-dc-globaltv.c044 · code · unknown; прошивка — · DefaultDunePlugin::handle_user_input(&$user_input, &$plugin_cookies) передаёт ввод в UserInputHandlerRegistry, который выбирает обработчик по handler_id. ↩

  138. plg-dc-widget-ext.c021 · code · unknown; прошивка — · Обработка ввода: UserInputHandlerRegistry выбирает обработчик по $user_input->handler_id; id обработчика экрана — 'controls_' . id экрана ↩

  139. plg-gh-mdpuma-dune-plugin-altiptv.c119 · code · unknown; прошивка — · AbstractControlsScreen формирует PluginControlsFolderView с defs/initial_sel_ndx и идентификатором обработчика controls_. ↩

  140. plg-gh-kocourkuba-proiptv.c054 · code · unknown; прошивка — · Действия ввода описываются массивами GuiAction с handler_id и control_id: User_Input_Handler_Registry::create_action собирает их, create_screen_action ищет обработчик по '_handler', а Default_Dune_Plugin::handle_user_input передаёт user_input зарегистрированному обработчику; неизвестный handler_id даёт null. ↩

  141. plg-dc-widget-ext--lib.c046 · code · unknown; прошивка — · UserInputHandlerRegistry::register_handler записывает обработчик по handler_id без проверки предыдущей регистрации. ↩

  142. plg-dc-widget-ext--lib.c044 · code · unknown; прошивка — · UserInputHandlerRegistry::create_action формирует handler_id/control_id, затем объединяет их с add_params через array_merge; поздние одноимённые ключи приходят из add_params. ↩

  143. plg-dc-widget-ext--lib.c031 · code · unknown; прошивка — · ControlFactory::add_button строит push_action через UserInputHandlerRegistry::create_action и добавляет action_type = apply. ↩

  144. plg-dc-widget-ext--lib.c038 · code · unknown; прошивка — · ControlFactory::add_text_field преобразует initial_value через strval, а numeric, password, has_osk, always_active и width через intval. ↩

  145. plg-dc-widget-ext--lib.c039 · code · unknown; прошивка — · ControlFactory::add_combobox переносит initial_value, value_caption_pairs и width в GuiComboboxDef без приведений strval/intval. ↩

  146. plg-dc-widget-ext--lib.c037 · code · unknown; прошивка — · ControlFactory::add_custom_close_dialog_and_apply_buffon помещает переданный action в close_dialog_and_run; имя buffon записано так в исходнике. ↩

  147. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c086 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ControlFactory::add_custom_close_dialog_and_apply_button строит GUI-элемент типа button; схема заполнения использует GuiControlDef::{name, title, kind, specific_def, params}; GuiButtonDef::{caption, width, push_action}. push_action=close_dialog_and_run(action); центрирование по умолчанию true. ↩

  148. plg-dc-globaltv--gcomps-controls.c044 · code · unknown; прошивка — · ControlFactory::add_button, add_custom_button, add_text_field и add_combobox записывают общий набор GuiControlDef::name/title/kind/specific_def/params; name/title берутся из аргументов, params — из gui_params после обработки фабрикой. ↩

  149. plg-dc-globaltv--gcomps-controls.c037 · code · unknown; прошивка — · В add_text_field и add_combobox defaults need_apply=false и need_confirm=false оставляют соответствующие действия null; при истинном флаге фабрика создаёт callback с action_type=apply либо confirm. ↩

  150. plg-dc-globaltv--lib.c032 · code · android-dune-fw; прошивка 260827_0003_r24 · UserInputHandlerRegistry::create_action плагина задаёт data=null; r24 добавляет аргументы timeout_ms/show_dialog_delay_ms с подстановкой 60000/20000 при null и записывает целые operation_timeout/show_dialog_delay. ↩

  151. plg-dc-globaltv--lib.c036 · code · android-dune-fw; прошивка 260827_0003_r24 · ControlFactory::add_button плагина вызывает create_action без таймаутов, а r24 принимает timeout_ms=60000/show_dialog_delay_ms=20000 и передаёт их реестру. ↩

  152. plg-dc-globaltv--lib.c071 · code · android-dune-fw; прошивка 260827_0003_r24 · В ActionFactory::show_dialog плагина max_height добавляется при defined, а r24 записывает это поле без проверки. ↩

  153. plg-dc-globaltv--lib.c072 · code · android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::show_title_dialog плагина принимает attrs и передаёт их show_dialog, а r24 имеет только title/post_action и вызывает show_dialog с title/defs. ↩

  154. plg-dc-globaltv--lib.c077 · code · android-dune-fw; прошивка 260827_0003_r24 · Набор объявленных методов ControlFactory различается: только в копии плагина — add_button_close, add_close_dialog_and_apply_button_title, add_img_label, add_multiline_label, add_smart_label; только в копии r24 — add_progress_bar. ↩

  155. plg-dc-globaltv--lib.c027 · code · android-dune-fw; прошивка 260827_0003_r24 · DefaultDunePlugin::handle_user_input плагина прямо возвращает результат реестра, а r24 перед вызовом реестра выполняет OpHooks::fire_before_handle и затем связывает результат с накопленным действием через set_post_action. ↩

  156. plg-dc-globaltv--list-config.c035 · code · unknown; прошивка — · EditListDialog передаёт show_dialog close_by_return=false, ширину, attrs max_height=870, actions и params.page_size=11; фабрика записывает max_height только при defined его константы. ↩↩

  157. plg-dc-globaltv--list-config.c036 · code · unknown; прошивка — · EditListDialog назначает GUI_EVENT_KEY_D_BLUE и GUI_EVENT_KEY_RETURN на собственное действие apply. ↩

  158. plg-dc-globaltv--list-config.c049 · code · unknown; прошивка — · EditListDialog строит defs в порядке apply, группы group:, элементы item:; подпись кнопки сериализуется как JSON с items из текста, промежутков и иконки 48×48. ↩

    • plg-dc-globaltv--list-config.c038 · code · unknown; прошивка — · Для group: EditListDialog снимает все id группы, если get_group_checked=3, иначе отмечает все; затем ставит changed=true и возвращает reset_controls с новыми defs.
    • plg-dc-globaltv--list-config.c039 · code · unknown; прошивка — · Для item: EditListDialog инвертирует наличие id в checked_idset, ставит changed=true и возвращает reset_controls с новыми defs.

    ↩

  159. plg-dc-globaltv--list-config.c040 · code · unknown; прошивка — · apply в EditListDialog отклоняет пустой checked_idset через show_error(empty_list_not_allowed), иначе возвращает close_dialog_and_run с действием do_apply. ↩

  160. plg-dc-globaltv--list-config.c050 · code · unknown; прошивка — · Ветка cancel в EditListDialog возвращает ActionFactory::close_dialog() без вызова cleanup или apply_action. ↩

  161. plg-dc-globaltv--rows-epf.c041 · code · unknown; прошивка — · TvRowsScreen связывает ENTER→enter, D_BLUE→fav, CLEAR→fav_remove, POPUP_MENU→popup, PLUGIN_ROWS_INFO_UPDATE→plugin_rows_info_update через custom_action. ↩

  162. plg-dc-globaltv--rows-epf.c051 · code · unknown; прошивка — · Диалог поиска заполняет поле search_channels_text из cookie last_search_channels_text и передаёт section_id кнопке search_channels_submit_dialog. ↩

  163. plg-dc-globaltv.c168 · code · unknown; прошивка — · Диалог поиска каналов берёт начальный текст из plugin_cookies last_search_channels_text, создаёт поле search_channels_text и кнопки «ОК» (search_channels_submit_dialog с section_id в add_params) и «Отмена» (add_close_dialog_button). ↩

  164. plg-dc-globaltv--rows-epf.c052 · code · unknown; прошивка — · Обработчик отправки поиска применяет trim, отклоняет пустую строку, затем приводит текст к нижнему регистру UTF-8 и закрывает диалог с запуском поиска; section_id по умолчанию all. ↩

  165. plg-gh-kocourkuba-proiptv.c065 · code · unknown; прошивка — · Control_Factory::add_text_field строит GUI_CONTROL_TEXT_FIELD с флагами numeric, password, has_osk, always_active, шириной и необязательными apply/confirm-действиями; поиск каналов открывает такое поле с OSK, подставляет последний запрос из PARAM_LAST_TV_SEARCH, а do_search сохраняет непустой запрос обратно. ↩

  166. plg-gh-kocourkuba-proiptv.c070 · code · unknown; прошивка — · Если PARAM_SETTINGS_PASSWORD не пуст, entry handler перед открытием экранов настроек показывает диалог с полем pass (show_protect_settings_dialog); handle_protect_action сверяет введённый pass с параметром и при неверном возвращает err_bad_pass, а при верном открывает запрошенный экран. ↩

  167. plg-dc-widget-ext--adv-keyboard.c002 · code · unknown; прошивка — · AdvKeyboard реализует UserInputHandler, регистрирует себя в UserInputHandlerRegistry и возвращает идентификатор adv_text_keyboard. ↩

  168. plg-dc-widget-ext--adv-keyboard.c006 · code · unknown; прошивка — · Обработчик timed_startup сначала загружает конфигурацию; при firstRun открывает настройки языков, иначе вызывает change_keyboard(0). ↩

  169. plg-dc-widget-ext--adv-keyboard.c007 · code · unknown; прошивка — · screen_render перестраивает подписи через highlight_selected и add_screen_labels, а screen_refresh передаёт defs в ActionFactory::reset_controls. ↩

  170. plg-dc-widget-ext--adv-keyboard.c030 · code · unknown; прошивка — · AdvKeyboard использует UTF-8 по умолчанию в собственных функциях вставки mb_insert_str и удаления mb_delete_chr, построенных на mb_strlen и mb_substr. ↩

  171. plg-dc-widget-ext--adv-keyboard.c016 · code · unknown; прошивка — · Обычный do_search передаёт str родительскому postActionCtrlId под ключом searchTextActionParamKey через close_dialog_and_run. ↩

  172. plg-dc-widget-ext--adv-keyboard.c008 · code · unknown; прошивка — · Карта AdvKeyboard связывает CLEAR с clear_left, красную клавишу с clear_all, зелёную с alt_onoff, жёлтую с shift_onoff, синюю и AUDIO с change_keyboard. ↩

  173. plg-dc-widget-ext--adv-keyboard.c009 · code · unknown; прошивка — · Карта AdvKeyboard связывает TOP_MENU с open_normal_search, PLAY с do_search, ENTER с selection_enter, SELECT с space, SETUP с config_lang, TIMER с timed_startup. ↩↩

  174. plg-dc-widget-ext--adv-keyboard.c010 · code · unknown; прошивка — · Клавиши 0–9 создают add_num с num_key; обработчик вставляет эту цифру в str на cursPos и увеличивает позицию на один. ↩

  175. plg-dc-widget-ext--adv-keyboard.c011 · code · unknown; прошивка — · Карта AdvKeyboard связывает направления с selection_up/down/left/right, а P_PLUS и P_MINUS — с p_plus и p_minus. ↩

  176. plg-dc-widget-ext--adv-keyboard.c017 · code · unknown; прошивка — · В searchAndSelectMode обычная отправка строки через do_search, строку поиска, Enter раскладки и open_normal_search возвращает null; do_search на выбранной подсказке обрабатывается раньше этой проверки. ↩

  177. plg-gh-vladikshkwok-lampa-dune-plugins.c095 · code · android; прошивка — · dune-voice регистрирует accessibility-сервис RemoteKeys с правом BIND_ACCESSIBILITY_SERVICE и описанием @xml/remote_keys. ↩

  178. plg-gh-vladikshkwok-lampa-dune-plugins.c096 · code · android; прошивка — · RemoteKeys перехватывает KEYCODE_SEARCH, KEYCODE_ASSIST и KEYCODE_VOICE_ASSIST и по первому нажатию открывает VoiceActivity. ↩

  179. plg-gh-vladikshkwok-lampa-dune-plugins.c097 · code · android; прошивка — · remote_keys.xml настраивает accessibility-сервис на typeWindowStateChanged, flagRequestFilterKeyEvents и canRequestFilterKeyEvents=true при canRetrieveWindowContent=false. ↩

  180. plg-gh-mdpuma-dune-plugin-altiptv.c043 · code · unknown; прошивка — · DemoSetupScreen переключает page_num между четырьмя страницами и возвращает reset_controls с заново построенными контролами. ↩

  181. plg-gh-mdpuma-dune-plugin-altiptv.c090 · code · unknown; прошивка — · Диалог info_back_scan использует timer(1000) и GUI_EVENT_TIMER→close_dialog_and_run для повторного открытия обновлённой информации. ↩

  182. plg-dc-dune-backup.c024 · code · unknown; прошивка — · get_action_map всегда назначает POPUP_MENU — popup_menu, INFO — system_info, SELECT — change_mode_key_push_count, D_BLUE — info+ver и TIMER — timer; ENTER и PLAY — script_start_norm, CLEAR — script_stop — только при непустом Script_arr; A_RED — auto_start_show — при наличии файла автостарта; B_GREEN — setup_group — в полном режиме при более чем одной группе; C_YELLOW — chapter_run — в полном режиме при более чем одном подразделе. ↩↩

  183. plg-dc-dune-backup.c036 · code · unknown; прошивка — · Семь нажатий SELECT в базовом режиме открывают диалог смены режима (кнопка change_mode переключает файл settings/mode); в полном режиме при parent_media_url, отличном от main_menu, они открывают раздел users, иначе показывают диалог смены режима. ↩

  184. plg-dc-dune-backup.c037 · code · unknown; прошивка — · Раздел users открывается скрытно: семью нажатиями CLEAR, когда скрипт не работает и выбран не users, или семью нажатиями SELECT в полном режиме при parent_media_url, отличном от main_menu; fast_group_to_users включает группу users и запускает run. ↩

  185. plg-dc-dune-backup.c133 · code · unknown; прошивка — · Блок цветных кнопок A/B/C/D в popup_menu добавляется, только если не flag_apk, не flag_new и intval(firmware_version) < 240619; иначе пункты не показываются. ↩

  186. doc-sdk-plugins--operations.c108 · doc, disputed · any-documented; прошивка — · По тексту документа PluginVodInfo::actions при VOD-воспроизведении поддерживает из клавиш только цветные (GUI_EVENT_KEY_A_RED, GUI_EVENT_KEY_B_GREEN, GUI_EVENT_KEY_C_YELLOW, GUI_EVENT_KEY_D_BLUE); также описаны события таймера (GUI_EVENT_TIMER) и остановки (GUI_EVENT_PLAYBACK_STOP), но перечень в документе обрывается на «- playback» и не является исчерпывающим. ↩↩

  187. doc-sdk-plugins--gui-actions.c013 · doc, disputed · any-documented; прошивка — · С прошивки 131029_b9 все ранее перечисленные клавишные события можно использовать в TV-воспроизведении и VOD-воспроизведении плагина ↩↩

  188. doc-sdk-plugins--gui-actions.c015 · doc, disputed · any-documented; прошивка — · С прошивки 131029_b9 для диалогов с контролами, регулярных папок, TV- и VOD-воспроизведения плагина (с ограничениями) добавлены события GUI_EVENT_KEY_FWD, GUI_EVENT_KEY_REW, GUI_EVENT_KEY_SLOW, GUI_EVENT_KEY_STOP, GUI_EVENT_KEY_TOP_MENU, GUI_EVENT_KEY_POWER, GUI_EVENT_KEY_EJECT, GUI_EVENT_KEY_MODE, GUI_EVENT_KEY_VENDOR, GUI_EVENT_KEY_MUTE, GUI_EVENT_KEY_V_PLUS, GUI_EVENT_KEY_V_MINUS, GUI_EVENT_KEY_SEARCH, GUI_EVENT_KEY_ZOOM, GUI_EVENT_KEY_SUBTITLE, GUI_EVENT_KEY_REPEAT, GUI_EVENT_KEY_AUDIO, GUI_EVENT_KEY_REC, GUI_EVENT_KEY_DUNE, GUI_EVENT_KEY_URL ↩↩

  189. fw-tv188b-260827-0003-r24--php-framework.c206 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginHandleUserInputActionData с ключами (3): operation_timeout, show_dialog_delay, dialog_title ↩

  190. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c209 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В ActionFactory::handle_user_input ветка isset(timeout_ms) записывает в data поле operation_timeout, приведённое к int. ↩

  191. fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c040 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::handle_user_input при переданных timeout_ms или show_dialog_delay_ms записывает int-значения в operation_timeout или show_dialog_delay; при обоих null data остаётся null. ↩

  192. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ключ operation_timeout в данных действия plugin_handle_user_input задаётся в миллисекундах: 3000 дало «start (timeout=3.0s)» и отмену через 3,3 с, 3 — «timeout=0.0s» и отмену через 0,36 с, 60000 — «timeout=60.0s»; значение из данных действия перекрывает operation_timeout/default манифеста (5). ↩

  193. plg-dc-globaltv--gcomps-controls.c049 · code · unknown; прошивка — · ControlFactory содержит дополнительные методы add_smart_label (params smart=1), add_img_label (params max_lines/lines_vgab/pars_vgab), add_multiline_label (params max_lines, lines=2), add_button_close и add_close_dialog_and_apply_button_title. ↩

  194. doc-sdk-plugins.c142 · doc, disputed · any-documented; прошивка — · Перечитать плагины без перезапуска оболочки: в верхнем меню нажать ANGLE/ROTATE (или Refresh в POP UP MENU) либо по IP Control: cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00 ↩↩

  195. fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк test_plugin5, ни «Loading plugins from», ни populate_plugins, а test_plugin5 нет в /tmp/run/installed_plugins.xml. test_plugin5 и test_plugin5_sup зарегистрировались после am force-stop com.dunehd.app. ↩

  196. fw-tv188b-261021-0117-r25.c204 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect6) плагины, удалённые rm -rf из /data/data/com.dunehd.app/flashdata/plugins, после перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) остались в /tmp/run/installed_plugins.xml (grep -c test_plugin6 = 4) и в меню «Приложения»; исчезли они только после am force-stop com.dunehd.app. ↩

  197. fw-tv188b-261021-0117-r25.c205 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect5) после rm -rf каталогов тестовых плагинов test_plugin5* из /data/data/com.dunehd.app/flashdata/plugins и перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) в /tmp/run/installed_plugins.xml не было ни одной строки с test_plugin5 (grep -c = 0). ↩

  198. doc-sdk-plugins--controls-playback.c001 · doc · any-documented; прошивка — · Общая структура GuiControlDef содержит name, title, kind, specific_def и params; виды контролов перечислены в GuiControlKind. ↩

  199. fw-tv188b-260827-0003-r24--php-framework.c104 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GuiControlKind строковыми константами: GUI_CONTROL_LABEL='label', GUI_CONTROL_PROGRESS_BAR='progress_bar', GUI_CONTROL_COMBOBOX='combobox', GUI_CONTROL_TEXT_FIELD='text_field', GUI_CONTROL_BUTTON='button', GUI_CONTROL_VGAP='vgap' ↩

  200. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c089 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ControlFactory::add_progress_bar строит GUI-элемент типа progress_bar; схема заполнения использует GuiControlDef::{name, title, kind, specific_def, params}; GuiProgressBarDef::{width, progress}. title=null, width=0, progress=0. ↩

  201. doc-sdk-plugins--gui-actions.c017 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_GOING_TO_SWITCH генерируется перед переключением на новый media URL; в отличие от GUI_EVENT_PLAYBACK_STOP, оно не генерируется при остановке и выключении ↩

  202. fw-tv188b-261021-0117-r25.c283 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_going_to_switch приходит и в конце последней серии VOD, когда перехода на новый URL нет и плеер закрывается — после состояния stopped и непосредственно перед playback_stop с playback_end_of_stream=1. ↩

  203. doc-sdk-plugins--gui-actions.c006 · doc, disputed · any-documented; прошивка — · Если на GUI_EVENT_PLAYBACK_STOP назначено действие, плеер сначала приостанавливает воспроизведение, исполняет действие, ждёт завершения цепочки действий и только потом выполняет остановку, выключение или переключение ↩↩

  204. fw-tv188b-261021-0117-r25--media-player.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при ручном STOP в plugin VOD действие playback_stop запускается после перехода Android-плеера в STOPPED. ↩

  205. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c085 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Команда key_action r24, вероятно, принимает параметр key (имя действия клавиши) и без него завершается ошибкой ↩

  206. fw-tv188b-260827-0003-r24--http-api.c056 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В tv188b r24 cmd=ir_code, вероятно, реализован записью кода в /proc/ir/button ↩

    • plg-dc-screenshoter.c089 · inference · unknown; прошивка — · Запись IR-кода в /proc/ir/button, вероятно, эмулирует нажатие кнопки пульта (тот же файл использует команда ir_code HTTP-API прошивки)
    • plg-dc-screenshoter.c090 · inference · unknown; прошивка — · A15EBF00, вероятно, — IR-код кнопки питания: его пишет пункт меню с подписью t77 «Выключить Dune»; таблицы кодов в репозитории нет

    ↩

  207. plg-dc-screenshoter.c091 · inference · unknown; прошивка — · IR-код ef10bf00, вероятно, — кнопка пульта «скриншот», по которой прошивка сама сохраняет снимок в каталог screenshots (поэтому плагин не знает пути и отвечает screenPath = auto) ↩

  208. fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c058 · inference · android-dune-fw; прошивка 260827_0003_r24 · Действие plugin_handle_user_input в этой прошивке, предположительно, принимает data типа PluginHandleUserInputActionData с operation_timeout, show_dialog_delay и dialog_title. ↩

  209. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c017 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пример SDK кладёт пункты контекстного меню точки входа в popup_menu/menu_items/item, а встроенные манифесты r24 — в popup_menu/menu_items/menu_item; парсер r24 проверяет имя дочернего элемента menu_items («unexpected 'entry_point/popup_menu/menu_items/%s' element»), но принимает ли он item, по strings не установить: строка короче 6 символов не извлекается и может быть хвостом строки menu_item ↩

  210. plg-dc-widget-ext--adv-keyboard.c062 · inference · unknown; прошивка — · После сокращения или очистки строки старые подсказки, вероятно, могут остаться доступными: короткая строка не обновляет suggestions, а рендер не очищает отсутствующие элементы scrBuff. ↩

  211. doc-sdk-plugins--gui-actions.c005 · doc, disputed · any-documented; прошивка — · GUI_EVENT_PLAYBACK_STOP генерируется при остановке воспроизведения, при выключении питания или перед переключением воспроизведения ↩