X11 — получить активный дисплей
Дано: запущено от 0 до n X servers
Требуется: получить название активного дисплея или выяснить, что активна консоль
Пока разобрался лишь как получить активный tty: /sys/class/tty/tty0/active.
не подходит, это выдает дисплей на котором запущена программа.
она может быть запущена в любом иксовом сеансе или в текстовой консоли даже до запуска иксов.
Требуется: получить название активного дисплея или выяснить, что активна консоль
типа такого пойдет как временная заглушка, но вдруг какие изменения в формате ps и приплыли. так что хочется найти вариант понадежнее
если нужно конкретно :screen.display (или как там оно правильно) то нужно (при таком подходе) грепать еще и сессии запущенные в тех иксах
т.к. подозреваю что:
* при запуске по проядку нескольких иксов без параметров будут назначаться автоматом
* не обязательно должен начинаться с vt7
ткчто припахать еще /tmp/.X?-lock , /var/log/Xorg. log, .
/tmp/.X?-lock в моей убунте вообще нету)
а с /var/log/Xorg. log та же проблема: небольшие изменения в формате и все.
Требуется: получить название активного дисплея или выяснить, что активна консоль
Представь себе multiseat конфигурацию. Задай себе вопрос о том, ищешь ли ты решения в общем виде или для каких-то специфических условий. Соответствующим образом откорректируй свой вопрос в топике.
меня устроит решение, которое будет игнорировать возможность мультисита.
меня устроит решение, которое будет игнорировать возможность мультисита.
имелось в виду «для чего это нужно?»
если на своей машине — решение с ps и grep вполне подойдет и можешь быть уверен что в ближайшем будущем формат выхлопа не поменяется, просто запускай все свои иксы с указанием дисплея
если по ssh ходить и юзеру месаджи писать в текущий Х или терминал, чтоб заметил — тут другое дело
Ну попробуй, например, что-нибудь типа этого:
если на своей машине — решение с ps и grep вполне подойдет и можешь быть уверен что в ближайшем будущем формат выхлопа не поменяется, просто запускай все свои иксы с указанием дисплея
нужно это для себя, но хочется основательного решения, чтобы не сломалось внезапно.
придумал более менее стабильный костыль:
по таймеру в несколько секунд для каждого иксового дисплея, кроме текущего активного, проверяем позицию курсора — если для какого либо дисплея она изменилась — считаем его новым активным.
костыль более костыльный чем с ps, но зато основательный — фиг сломаешь) хотя все же попробую придумать более красивый костыль способ
А что такое «активный дисплей» у тебя? Из того, что ты написал, я четко этого и не понял. Где мышка в данный момент гуляет? Где клавиатура что-то набирает? Какой критерий?
Я так понимаю, его интересует то, что в данный момент светится на экране локальной машины, без всяких наворотов типа несколько экранов, рабочих мест или вложенных Х-ов.
тот, в чей XGetInputFocus пойдет ввод клавиатуры. «дисплей», в смысле «сеанс иксов», который echo $DISPLAY
вообще изначальная задача — получить окно, которое имеет фокус ввода, но при нескольких запущенных сеансах иксов XGetInputFocus, для каждого из них, выдает валидное окно, но ввод идет только в окно активного сеанса, именно оно мне и нужно.
Так правильно выше говорят, что не рассматриваем случаи Xephyr/Xnest, не рассматриваем случай multiseat, не рассматриваем случай удаленных дисплеев и т .д.?
У тебя то, о чем выше говорят? То есть один монитор, там запущено много серверов на разных vt. Ты переключаешь vt. На одном vt есть иксы, на другом нет. Тебе надо получить активный tty, узнать, есть ли там иксы. Если есть, то они и активные. Так?
вообще изначальная задача — получить окно, которое имеет фокус ввода, но при нескольких запущенных сеансах иксов XGetInputFocus, для каждого из них, выдает валидное окно, но ввод идет только в окно активного сеанса, именно оно мне и нужно.
И также XQueryPointer не сработает — будет сообщать, где был указатель перед переключением на другой сервер.
Не может быть. Это скрытый файл. Посмотри еще раз. ls -a /tmp
Можно в cd /tmp/.X11-unix узнать, кстати. Зайди в этот каталог — там будут X1, X2.
Еще интересное. которое может пригодиться. Сервер Xorg выставляет у root window свойство XFree86_VT с номером терминала, на котором запущен сервер. Вытащить свойство можно через xprop
То есть ты можешь узнать из сервера, на каком терминале он запущен. Указав -display или вместо него DISPLAY=, ты сможешь узнать VT и для других серверов.
Так правильно выше говорят, что не рассматриваем случаи Xephyr/Xnest, не рассматриваем случай multiseat, не рассматриваем случай удаленных дисплеев и т .д.?
в теории интересно было бы получить решение и для таких случаев(кроме удаленного дисплея — это точно не пригодится), но так как я это сейчас не использую, то пока и не рассматриваю эти варианты
У тебя то, о чем выше говорят? То есть один монитор, там запущено много серверов на разных vt. Ты переключаешь vt. На одном vt есть иксы, на другом нет. Тебе надо получить активный tty, узнать, есть ли там иксы. Если есть, то они и активные. Так?
все так, но мониторов 2, естественно на обоих всегда одинаковый сеанс иксов
Не может быть. Это скрытый файл. Посмотри еще раз. ls -a /tmp
действительно, сейчас вижу. вчера ночью просто темно было вот и не заметил)
И также XQueryPointer не сработает — будет сообщать, где был указатель перед переключением на другой сервер.
а тут все работает нормально: в том то и дело, что если мы переключились на другой сервер, то на старом позиция указателя не меняется, а на новом, как только мы пошевелили мышью координаты изменились и мы поняли, что этот дисплей активен. то что нужно пошевелить мышью после переключения — не проблема
Можно в cd /tmp/.X11-unix узнать, кстати. Зайди в этот каталог — там будут X1, X2
я таким образом и получаю все запущенные сеансы. Правда и тут приходится использовать небольшой костыль: если мы запустили новый сервер, но находимся в меню дисплей менеджера и не выбрали сеанс DE/WM, то в .X11-unix новый сокет уже появился, но XOpenDisplay возврашает 0, поэтому приходится использовать костыль: по таймеру проверять XOpenDisplay пока он не вернет подключение.
а вот что-то такое я и искал. спасибо, буду пробовать.
Но тут тоже надо дожидаться дисплея, так как до авторизации его не будет. С другой стороны, и окон, у которых можно фокус проверить, там тоже не будет.
Правда и тут приходится использовать небольшой костыль: если мы запустили новый сервер, но находимся в меню дисплей менеджера и не выбрали сеанс DE/WM, то в .X11-unix новый сокет уже появился, но XOpenDisplay возврашает 0, поэтому приходится использовать костыль: по таймеру проверять XOpenDisplay пока он не вернет подключение.
Вообще, это правильное поведение. Дело в том, что у тебя нет в момент подключения cookie. Поэтому ты не можешь подсоединиться. А появятся cookie у тебя только после подсоединения. Однако cookie эти есть в системе, лежат они у разных DM в разных местах (наверное, так как я на всех не проверял). Вот у меня, например, есть /var/lib/xdm/authdir/ , но она доступкна только root. Если твой скрипт запускает от root, то ты можешь туда пролезть и скопировать cookie к себе в
/.Xauthority. Или же переменную XAUTHORITY установить в тот файл. Показываю:
Ситуация: запускаю xdm, но не логинюсь, перехожу в консоль, логинюсь root, пробую:
irdkwmnsb / howto.md
Как подготовить свою шинду к плюсам
Если ты собираешься устанавливать VCXsrv (а скорее всего это так), то поставь его скачиваться сейчас. (общажным лучше качать по зеркало 2 — точно работает)
[тык] [зеркало 1 (моё)] [зеркало 2 (тоже моё)]
WSL1 (Windows subsystem for Linux (как то неправильно имхо они её назвали, по идее должно быть наоборот)) — прослойка между ядром линукса и виндой чтобы можно было запускать linux-овские программы.
WSL2 — то же самое, только теперь линукс работает полностью виртуально. (см. виртуальные машины)
- Поставить качать это
- Проверить что ваш компьютер совместим. А совместим он если
- У вас установлена windows версии 2004 (проверить можно в окне «Система»). (А лучше просто обновить винду, если вы давно этого не делали. Возможно микромягкие запатчили какой нить зиродей, но об этом не сказали.)
- Компьютер поддерживает Hyper-V (виртуализация какой её видит microsoft). Проверить это можно в диспетчере задач ( Производительность -> ЦП -> Снизу справа строка «Виртуализация») См Заметка о Hyper-V
- Включаем WSL — прописать в PowerShell (просто найти в поиске винды) с правами администратора следующее:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
Не закрывайте консоль — она вам ещё понадобится. - Туда-же пишем
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart - Теперь пишем
shutdown /r /f /t 0 - Доброе утро.
Помнишь ту штуку из 0 шага? Запускай её. - Пишем wsl —set-default-version 2 в PowerShell от имени администратора
- тык
Регаемся в microsoft store или вводим учётку — ждём пока установится - Открываем и ждём. WSL распаковывается и устанавливается, так будет только один раз. Дальше она будет запускаться моментально.
- Linux спросит нас — как назвать пользователя. Можно писать что угодно. Например, можно использовать никнейм с гитхаба.
Дальше нужно придумать пароль. Это важный шаг, потому что то что вы сейчас придумаете, останется с вами на долгое время, поэтому лучше позаботиться о том чтобы ваш пароль был хорошим и запоминаемым.
Если вы не уверены в вашем текущем пароле (например используете его в больше чем 5 местах или не считаете его достаточно важным), то лучше сгенерить новый.
Я рекомендую вот этот генератор, его можно настроить под свой вкус. (по мотивам одного комикса)
Когда вы будете вводить пароль линукс не покажет то что вы печатаете — это нормально. Это делается, чтобы пароль не светился на экране. - Если всё прошло хорошо, то вас поприветствует следующая строка (или что-то похожее на это)
(для любознательных) Давайте разберёмся в том что мы видем.
Всё кроме последней строки называется MOTD (Message of the day) и так он выглядит на дистрибутивах ubuntu.
Последняя строка состоит из нескольких вещей
irdkwmnsb — имя текущего пользователя linux.
У всего что запускается в линуксе есть пользователь который это запустил. Есть один специальный пользователь которому дозволено делать всё что угодно — root . У него UID (user id) = 0. Чтобы выполнять команды от имени рута, нужно использовать утилиту sudo (если коротко, то эта штука позволяет некоторым пользователям запускать некоторые программы под некоторыми другими пользователями. Настройки у неё в /etc/sudoers (я не буду сейчас углубляться про то как работают пользователи, но отмечу что помимо пользователей есть группы, это немного другое, и если очень интересно почитать про это, то гугл — твой друг)).
Существует так же другя утилита которая называется su. Она позволяет логиниться под другим пользователем (логиниться — открывать shell (оболчку команд для компьютера)). Если запускать su без аргументов, то она откроет оболочку для » владельца» этого процесса.
Соответствено сочитание sudo su говорит ОС — пожалуйста, запусти su как будто это делает root . Что происходит? su даёт нам оболочку под пользователем root . Попробуйте написать sudo su в консоль и убедиться что имя пользователя действительно сменится на root . Так же, пока мы тут, обратите внимание, что $ сменился # . Об этом позже.
@ — знак разделения между именем пользователя и именем хоста.
irdkwmnsb-laptop — имя хоста текущего компьютера (так же известный как hostname)
: — знак разделения между именем хоста и текущем путём
/mnt/c/Users/me — путь до текущей папки.
Если путь начинается с / , то это абсолютный путь.
В линуксе все файлы имеют абсолютный путь. Попробуйте сделать ls / (list (перечислить) / (root directory (корневая директория))).
Если вдруг внезапно напало желание преисполниться в сознании, то можно гуглить ‘What does
Рано или поздно вы наткнётесь на директорию /proc и вам скажут что это особая директория, файлы которой не находятся на диске. На самом деле, эти файлы «виртуальные». Их действительно нет на диске — операционная система делает их на лету. Всё потому что в линуксе — всё это файл. Про это тоже можно погуглить.
Если путь начинается с . , то это относительный путь
В любой директории вам гарантируется две директории — . и .. , что соответствует текущей директории и директории родителя. Значит cd .. (change directory (поменять директорию)) поменяет текущую директорию на директорию родителя. Можно попробовать это сделать и увидеть, что теперь мы оказались в родительской директории.
Если путь начинается с
, то это тоже относительный путь, но относительно домашней папки текущего пользователя.
У каждого пользователя есть домашняя папка. Это всё что можно знать. Несколько моментов:
В отличие от винды в линуксе директории разделяются слешем, а не бэкслешем, но это не так важно. Если файл начинается с точки, то он считается скрытым. Именно поэтому когда мы делаем ls мы не видим директории . и .. . Чтобы ls писал все файлы нужно добавить параметр -a ( ls -a )
Некоторые программы могут сохранять настройки в своей домашней директории, поэтому если вы внезапно увидите файлы или директории которые начинаются с точки в вашей домашней директории, не удивляйтесь если что то сломается когда вы их удалите (не удаляйте их).
И последняя часть — $ — так называемый prompt — компьютер сообщает нам, что можно вводить команду. Если вместо $ стоит # , то команда будет выполнена от имени суперпользователя (root-а)
- Пишем sudo su , чтобы войти в суперпользователя (нужно будет ввести пароль).
- Пишем
можно я сейчас не буду объяснять что это делает бажожда
но если коротко, то мы просим менеджер пакетов сначала обновиться, а затем установить X11 utils. Это нужно чтобы проверить работоспособность X сервера
- Запускаем то что мы скачивали в самом начале. Прожимаем Далее (не установит яндекс браузер, не бойтесь.)
- Проверяем что оно работает двумя командами
- В меню пуск ищем «выполнить» и запускаем от имени администратора. Пишем
«C:\Program Files\VcXsrv\vcxsrv.exe» :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl -dpi auto Файервол попросит разрешение. Даём. - Пишем в терминал WSL DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk ‘
‘):0 xmessage -center «almost there»
Если всё установилось окэй, то мы должны увидеть окошко с сообщением «almost there»
- В меню пуск ищем «выполнить» и запускаем от имени администратора. Пишем
Делаем так чтобы это работало всегда
- Нажимаем Windows + R (выполнить) и пишем shell:startup
Создаём ярлык на «C:\Program Files\VcXsrv\vcxsrv.exe» :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl -dpi auto - В WSl пишем
echo «export DISPLAY=\$(cat /etc/resolv.conf | grep nameserver | awk ‘‘):0″ | sudo tee /etc/profile.d/xsetup.sh - Проверим.
Закрываем консоль ubuntu и снова открываем.
Пишем xmessage -center «stil works» .
Если открылось окошко, то всё всё ещё работает и скорее всего будет работать.
Поздравляю! Вы восхитительны
Можно перезапустить компьютер ещё раз и ещё раз всё проверить.
Устанавливаем Windows Terminal
С этим терминалом вы получите наилучший опыт использования WSL и Windows Powershell. Он очень гибко настраивается и вообще крутой парень.
Да собственно всё. Просто установите и пользуйтесь. Работает из коробки очень хорошо.
Чтобы открыть Ubuntu, нажмите на стрелочку вниз которая находится наверху. Там будет Ubuntu 20.04
Можно закрепить его в панели быстрого доступа, чтобы каждый раз не искать его.
Дальше по инструкции от преподавателей
Заметка об Hyper-V
Современные игры очень хотят чтобы в них небыло читеров. Поэтому многие из них помимо самой игры устанавливают античиты, которые въедаются в систему достаточно глубоко. Поэтому, иногда античиты просят выключить Hyper-V (точно знаю, что так делает Face it, а ещё вроде античит от valorant-а), и если вы это сделали, то вот как сохранить возможность гамать и решать домашки.
- Качаем EasyBCD (ссылка на моё зеркало)