Чтобы уточнить ответ , предоставленный @ 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 для связи с приложением (которое может быть двусторонним, если это необходимо).
Самое простое - записать некоторые (обычно построчные) данные на стандартный ввод программы.