Голанг обнаруживает, находится ли в фокусе или минимизирован - PullRequest
0 голосов
/ 10 мая 2019

Как мне определить, находится ли моя программа CLI в фокусе или свернута?

Текущая программа основана на https://github.com/jroimartin/gocui

Мне нужна функциональность, так как это программа чата, и я хотел бы отправлять уведомления ОС, но только когда программа не в фокусе или свернута.

Ваша помощь / направление очень ценится, так как сейчас не уверены, с чего начать.

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Это невозможно из самой библиотеки. Программа командной строки теперь имеет фокус, но программа терминала, в которой она запущена.

Реализация этого (если вообще возможно) будет зависеть от ОС, оконного менеджера и т. Д.

2 голосов
/ 10 мая 2019

Чтобы уточнить ответ , предоставленный @ mbuechmann , я предлагаю ФП не пытаться прибегать к API и т. Д.

Аргументация проста. «Современные» пользователи привыкли запускать программы в эмуляторах терминала, которые обычно представлены в виде отдельных окон, , и поэтому пользователи, естественно, думают, что эти программы не очень отличаются от приложений с графическим интерфейсом.

Но реальность другая: эмулятор терминала - графический или нет (например, так называемые «виртуальные консоли», предоставляемые ядром Linux, работающим на оборудовании x86 / amd64 , являются эмуляторами терминала как хорошо) - действительно эмулирует типичную рабочую сессию на реальном аппаратном терминале , и там программа будет работать только на переднем плане, и единственным средством «переключения» на другую программу было использование оболочки управление заданиями (эти команды jobs, bg и fg).

Другими словами, вся концепция программы, работающей в терминале, имеет встроенное предположение, что терминал всегда «передний план» - поскольку во время разработки концепции терминал был физическим устройством.

Теперь, пожалуйста, учтите также, что «эмуляция терминала» может быть более распространенной в современной системе, чем вы думаете: screen и tmux в Unix-подобной ОС являются мультиплексными эмуляторами терминала - которые сами могут быть запущены в эмулятор терминала и консольное окно в Windows ™ также можно рассматривать как эмулятор терминала.

Итак, «обращение к API» имеет несколько технических проблем:

  • Эмуляция терминала пытается фактически отделить программу, которая использует это средство, от знания того, как средство фактически предоставляется.

    Проще говоря, в X Window System, скажем, нет простого способа узнать, какое окно используется эмулятором терминала, выполняющим вашу программу.

  • Вам нужно будет охватить разнообразный набор API, чтобы ваша программа оставалась полезной: X Window System в Unix-подобных системах, Mac OS, Windows ™. А современные стеки с графическим интерфейсом, работающие на Linux, как правило, переключаются на Wayland вместо X.

  • В некоторых случаях, например, запуск программы в «вложенных» сеансах эмуляции терминала (например, панель в «окне» tmux, запущенного в xterm), выяснение таких фактов о среда может быть почти невозможной.

И все же ключевая проблема заключается в том, что если вашей программе действительно нужно , чтобы узнать, нацелена она или нет, то на самом деле хочет, чтобы знали о концепциях, которые в настоящее время едва доступны для нее. Я имею в виду, это хочет быть GUI. И если так, просто сделайте это GUI.

На самом деле, это может быть проще, чем вы думаете. Ядром вашей программы по-прежнему может быть приложение CLI с тонкой оболочкой GUI, которая использует любой тип IPC для связи с приложением (которое может быть двусторонним, если это необходимо). Самое простое - записать некоторые (обычно построчные) данные на стандартный ввод программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...