LINUX.ORG.RU

Ответ на: комментарий от anTaRes

не подходит, это выдает дисплей на котором запущена программа.

она может быть запущена в любом иксовом сеансе или в текстовой консоли даже до запуска иксов.

Ower
() автор топика
Ответ на: комментарий от Ower

все по ТЗ ;)

Требуется: получить название активного дисплея или выяснить, что активна консоль

anTaRes ★★★★
()
Ответ на: комментарий от anTaRes

типа такого пойдет как временная заглушка, но вдруг какие изменения в формате ps и приплыли. так что хочется найти вариант понадежнее

ps aux | grep $(cat /sys/class/tty/tty0/active) | grep /X | sed 's|.*/X\s*\(.*\)\s*vt.*|\1|'
Ower
() автор топика
Ответ на: комментарий от Ower
$ ps aux | grep $(cat /sys/class/tty/tty0/active) | grep /X | sed 's|.*/X\s*\(.*\)\s*vt.*|\1|'

-nolisten tcp -br -deferglyphs 16

если нужно конкретно :screen.display (или как там оно правильно) то нужно (при таком подходе) грепать еще и сессии запущенные в тех иксах

т.к. подозреваю что:
* при запуске по проядку нескольких иксов без параметров будут назначаться автоматом
* не обязательно должен начинаться с vt7

ткчто припахать еще /tmp/.X?-lock , /var/log/Xorg.?.log, ...

anTaRes ★★★★
()
Ответ на: комментарий от anTaRes

/tmp/.X?-lock в моей убунте вообще нету)
а с /var/log/Xorg.?.log та же проблема: небольшие изменения в формате и все.

Ower
() автор топика

Требуется: получить название активного дисплея или выяснить, что активна консоль

Представь себе multiseat конфигурацию. Задай себе вопрос о том, ищешь ли ты решения в общем виде или для каких-то специфических условий. Соответствующим образом откорректируй свой вопрос в топике.

anonymous
()
Ответ на: комментарий от Ower

меня устроит решение, которое будет игнорировать возможность мультисита.

имелось в виду «для чего это нужно?»
если на своей машине - решение с ps и grep вполне подойдет и можешь быть уверен что в ближайшем будущем формат выхлопа не поменяется, просто запускай все свои иксы с указанием дисплея
если по ssh ходить и юзеру месаджи писать в текущий Х или терминал, чтоб заметил - тут другое дело

anTaRes ★★★★
()
Последнее исправление: anTaRes (всего исправлений: 1)
Ответ на: комментарий от Ower

Ну попробуй, например, что-нибудь типа этого:

ps -f --tty=`cat /sys/class/tty/tty0/active` | grep Xorg.bin | sed -n 's/.*\ \(:[0-9]\+\).*/\1/p'

anonymous
()
Ответ на: комментарий от anTaRes

если на своей машине - решение с ps и grep вполне подойдет и можешь быть уверен что в ближайшем будущем формат выхлопа не поменяется, просто запускай все свои иксы с указанием дисплея

нужно это для себя, но хочется основательного решения, чтобы не сломалось внезапно.

придумал более менее стабильный костыль:

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

костыль более костыльный чем с ps, но зато основательный - фиг сломаешь) хотя все же попробую придумать более красивый костыль способ

Ower
() автор топика

А что такое «активный дисплей» у тебя? Из того, что ты написал, я четко этого и не понял. Где мышка в данный момент гуляет? Где клавиатура что-то набирает? Какой критерий?

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

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

anonymous
()
Ответ на: комментарий от Zubok

тот, в чей XGetInputFocus пойдет ввод клавиатуры. «дисплей», в смысле «сеанс иксов», который echo $DISPLAY

Ower
() автор топика
Ответ на: комментарий от Zubok

вообще изначальная задача - получить окно, которое имеет фокус ввода, но при нескольких запущенных сеансах иксов XGetInputFocus, для каждого из них, выдает валидное окно, но ввод идет только в окно активного сеанса, именно оно мне и нужно.

Ower
() автор топика
Ответ на: комментарий от Ower

Так правильно выше говорят, что не рассматриваем случаи Xephyr/Xnest, не рассматриваем случай multiseat, не рассматриваем случай удаленных дисплеев и т .д.?

У тебя то, о чем выше говорят? То есть один монитор, там запущено много серверов на разных vt. Ты переключаешь vt. На одном vt есть иксы, на другом нет. Тебе надо получить активный tty, узнать, есть ли там иксы. Если есть, то они и активные. Так?

вообще изначальная задача - получить окно, которое имеет фокус ввода, но при нескольких запущенных сеансах иксов XGetInputFocus, для каждого из них, выдает валидное окно, но ввод идет только в окно активного сеанса, именно оно мне и нужно.

И также XQueryPointer не сработает - будет сообщать, где был указатель перед переключением на другой сервер.

/tmp/.X?-lock в моей убунте вообще нету)

Не может быть. Это скрытый файл. Посмотри еще раз. ls -a /tmp

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Ower

/tmp/.X?-lock в моей убунте вообще нету)

Можно в cd /tmp/.X11-unix узнать, кстати. Зайди в этот каталог - там будут X1, X2,...

Еще интересное. которое может пригодиться. Сервер Xorg выставляет у root window свойство XFree86_VT с номером терминала, на котором запущен сервер. Вытащить свойство можно через xprop

$ xprop -display ... -root XFree86_VT

То есть ты можешь узнать из сервера, на каком терминале он запущен. Указав -display или вместо него DISPLAY=, ты сможешь узнать VT и для других серверов.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Так правильно выше говорят, что не рассматриваем случаи 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 пока он не вернет подключение.

xprop -display ... -root XFree86_VT

а вот что-то такое я и искал. спасибо, буду пробовать.

Ower
() автор топика
Ответ на: комментарий от Ower

xprop -display ... -root XFree86_VT

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

Zubok ★★★★★
()
Ответ на: комментарий от Ower

Правда и тут приходится использовать небольшой костыль: если мы запустили новый сервер, но находимся в меню дисплей менеджера и не выбрали сеанс DE/WM, то в .X11-unix новый сокет уже появился, но XOpenDisplay возврашает 0, поэтому приходится использовать костыль: по таймеру проверять XOpenDisplay пока он не вернет подключение.

Вообще, это правильное поведение. Дело в том, что у тебя нет в момент подключения cookie. Поэтому ты не можешь подсоединиться. А появятся cookie у тебя только после подсоединения. Однако cookie эти есть в системе, лежат они у разных DM в разных местах (наверное, так как я на всех не проверял). Вот у меня, например, есть /var/lib/xdm/authdir/ , но она доступкна только root. Если твой скрипт запускает от root, то ты можешь туда пролезть и скопировать cookie к себе в ~/.Xauthority. Или же переменную XAUTHORITY установить в тот файл. Показываю:

Ситуация: запускаю xdm, но не логинюсь, перехожу в консоль, логинюсь root, пробую:

# xprop -display :0 -root XFree86_VT
xprop:  unable to open display ':0'

# XAUTHORITY=/var/lib/xdm/authdir/authfiles/A\:0-cJtzmz xprop \ > -display :0 -root XFree86_VT
XFree86_VT(INTEGER) = 7
Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.