Вопрос или проблема
Я пишу программное обеспечение для автоматизации рабочего стола, которое управляет графическим интерфейсом на Linux. Оно работает довольно хорошо, но Wayland блокирует межокно communication, особенно при вводе не-ASCII символов в текстовые поля.
Для сравнения, на Windows я использовал API “sendkeys”, и большинство программ подчинялись.
В системах X есть pyautogui, xdotool и другие средства, так как нет изоляции между окнами.
Программные решения, которые я тестировал для управления и имитации пользовательского ввода:
- uinput (python-uinput)
- pyAutoGui –
- ydotool игнорирует не ASCII (официально). Однако он запускает свой собственный демон, поэтому он медленнее, чем любой прямой API или dbus вариант.
- wtype не работает на KDE и Gnome.
- dotool не работает для emoji, искажает не ASCII.
- kdotool не может вводить символы.
Существует строгая проблема с разрешениями в Wayland и тем, как он (не) разрешает межокно communication. Но даже с root эти инструменты не позволяют вводить не-ASCII.
Я знаю несколько неудачных обходных путей, но все они имеют свою цену, например, использование буфера обмена и вызов события Ctrl+V.
Идеи, как отправить или эмулировать событие клавиатуры для юникода не-ASCII?
(я использую производные от Arch с KDE, но то же самое применимо и к Gnome, и возможно к другим рабочим окружениям)
Ответ или решение
Отправка нажатий клавиш программным способом в окружениях Wayland Linux (таких как KDE и GNOME) представляет собой сложную задачу, связанную с ограничениями безопасности и изоляцией приложений. В отличие от X-систем, где существует множество инструментов для эмуляции нажатий клавиш, таких как xdotool
или pyautogui
, Wayland вводит серьезные ограничения для межоконного взаимодействия, что усложняет разработку автоматизации рабочего стола.
Общие проблемы
Ваша проблема, связанная с отправкой не-ASCII символов, обостряется особенностями архитектуры Wayland. Эти ограничения обеспечивают более высокий уровень безопасности, но в то же время мешают таким инструментам, как ydotool
, wtype
, и даже kdotool
, успешно эмулировать клавиатурный ввод для не-ASCII символов. Давайте рассмотрим предлагаемые вами решения и варианты, а затем перейдем к возможным обходным путям для вашей проблемы.
Решения и обходные пути
-
uinput: Использование библиотеки
python-uinput
может быть полезно для создания пользовательского устройства ввода, однако она не всегда будет работать с определенными графическими окружениями Wayland. -
Клипборд: Хотя это не является идеальным решением, использование буфера обмена в качестве временного хранилища для текста — один из наиболее реалистичных подходов. Вы можете скопировать ваш текст с помощью вызовов DBus и затем запустить эмуляцию нажатия клавиш, таких как
Ctrl+V
, для вставки. -
DBus: Работая с окружениями KDE и GNOME, вы можете использовать DBus для взаимодействия с приложениями. Вы можете вызвать методы определённых приложений через DBus, если они предоставляют такую возможность. Это даст вам доступ к функциям, которые могут позволить вам вводить текст.
-
Создание собственного сервиса: Если вы хотите иметь гораздо больше контроля, вы можете попробовать написать собственный сервис на основе Wayland, используя библиотеки, такие как
libwayland
илиlibinput
. Это может быть сложно, но в перспективе обеспечит наилучший результат. -
Использование GTK/Qt решений: Если ваше приложение имеет GUI на базе GTK или Qt, вы можете использовать внутренние механизмы этих библиотек для эмуляции ввода. Например, это можно делать с помощью вызовов событий, которые будут инициировать ввод.
Советы по разработке
-
Исследуйте существующие библиотеки и API: Убедитесь, что вы исследовали все доступные библиотеки, такие как
Wayland
,libinput
,GTK+
иQt
, поскольку они часто обеспечивают уровень абстракции, который может облегчить вам задачу отправки символов. -
Обсуждение с сообществом: Вы можете внедрять свои идеи и получать советы от сообщества разработчиков через тематические форумы или каналы обсуждений, такие как Stack Overflow или Reddit. Там можно найти мнения разработчиков, которые столкнулись с аналогичными проблемами.
-
Тестирование и отладка: Убедитесь, что вы проводите тщательное тестирование вашей программы в различных окружениях. Иногда решение может оказаться специфичным для конкретной версии сред, с которыми вы работаете.
Вместо того чтобы полагаться на устаревшие методы автоматизации, вам может понадобиться переформулировать подход к созданию своего решения в соответствии с современными стандартами безопасности и дизайна интерфейсов под Wayland.