Наличие нескольких открытых дисплеев усложняет задачу.В этом случае у вас есть несколько отдельных сокетов и потоков команд / событий на X-сервере, и вы видите на X-сервере несколько разных приложений (разных клиентов).
Порядок обработки запросов и событий не определенчерез два разных соединения.Например, если пользователь нажимает клавишу, а затем перемещает мышь, вы получите их в том же порядке на том же дисплее, но в любом порядке на двух разных дисплеях.
Один приемустановка, подобная этой, заключается в том, что любые ресурсы X (окна, GC и т. д.), которые вы создаете на одном дисплее, НЕ обязательно будут видны для другого соединения дисплея, пока вы не выполните XSync ().Это связано с тем, что идентификаторы создаются на стороне клиента, а затем сбрасываются на X-сервер.XSync () сбрасывает запрос на создание ресурса и гарантирует, что X-сервер обработал запрос.(Точнее: любой запрос туда-обратно - тот, который должен ждать ответа - будет делать это; XSync внутренне просто выполняет XGetInputFocus (), который является произвольно выбранным запросом туда-обратно. Так что, если вы знаете, какие запросы являются обходамипосле этого вам не нужно синхронизироваться.)
Хитрость указателя и клавиатуры также сложны.Захват привязывает указатель или клавиатуру к определенному соединению.Таким образом, всякий раз, когда вы захватываете, ваш другой Дисплей не будет получать события, охватываемые захватом, пока вы не снимите захват.
XGrabServer () еще сложнее;этот запрос просит X-сервер прекратить обработку запросов и отправку событий для всех дисплеев, кроме экрана с захватом сервера.Поэтому, если один из ваших дисплеев захватывает сервер, любая попытка использовать другой, вероятно, заблокирует вашу программу.
Наконец, ваши входные маски (здесь передаются в XCreateWindow, но см. XSelectInput) для каждого display-подключение.Я думаю, что это может быть вашей реальной проблемой;некоторые из ваших дисплеев не запрашивали необходимые события в окне.Но я не проверял это.
Я бы предложил один раз вызвать XOpenDisplay (), а затем передать один экран другому вашему другому коду.Это сделает вещи намного менее сложными и, возможно, даже решит проблему.