x11 / xlib XCreateSimpleWindow на нескольких X-серверах - PullRequest
0 голосов
/ 15 февраля 2011

Я пытаюсь следовать этому руководству по программированию с помощью xlib http://tronche.com/gui/x/xlib/

, это код, который я написал до сих пор

  display = XOpenDisplay(NULL);
  screen  = XDefaultScreen(display);
  width   = 640;
  height  = 480;

  XLockDisplay(display);
  fullscreen = 0;
  window[0] = XCreateSimpleWindow(display, XDefaultRootWindow(display),
                                  0, 0, width, height, 0, 0, 0);
  window[1] = XCreateSimpleWindow(display, XDefaultRootWindow(display),
                                  0, 0, width, height, 0, 0, 0);

однако я не понимаю этого: в системе с двумя серверами X11 (два gpus) без xinerama, если я хочу, чтобы окно [0] переходило к первому xserver и второму xserver, какие функции я должен вызывать?Я думаю, что я запутался насчет отображения, экрана, окна ....

спасибо за любую помощь

Ответы [ 3 ]

3 голосов
/ 15 февраля 2011

Вложенность выглядит следующим образом:

  • X-сервер (также известный как дисплей) - это то, с чем вы общаетесь по протоколу X11.XID (такой как идентификатор окна, идентификатор GC, идентификатор растрового изображения и т. Д.) Будет уникальным на дисплее.Традиционно дисплей имеет одну клавиатуру и одну мышь, хотя в наши дни это более сложно.

  • экран X соответствует 1: 1 с корневым окном.Корневое окно - это окно без родителя (корень дерева окон).Все некорневые окна являются дочерними (или дочерними от дочерних и т. Д.) Корневого окна.

  • окно - это прямоугольная область на экране.Окна расположены в иерархическом дереве, в котором родительские окна обрезают своих дочерних окон (дочерние окна могут располагаться полностью или частично за пределами родительского окна, но видна только часть внутри родительского окна).(«Прямоугольный» - это легкая ложь, вы действительно можете применить маску формы, но пока забудьте об этом.)

  • физический монитор может соответствовать или не соответствовать экрануTwinView и Xinerama - это названия функций, которые расширяют один экран на два или более монитора.Каждый монитор может быть отдельным экраном или частью экрана с несколькими мониторами.

Традиционно окна нельзя перемещать на другой экран, поскольку экраны могут иметь различные аппаратные свойства (такие как разные битовые глубины).С TwinView или Xinerama вы можете перемещать окна между мониторами, с экраном на монитор вы не можете.Все экраны на дисплее имеют одни и те же устройства ввода (мышь и клавиатура).

2 голосов
/ 15 февраля 2011

Если это действительно два разных X-сервера (см. Объяснение Havoc для этого), то вам нужно будет сделать что-то вроде:

Display displays[2];

displays[0] = XOpenDisplay(":0.0");
displays[1] = XOpenDisplay(":1.0");

[...]

window[0] = XCreateSimpleWindow(displays[0], XDefaultRootWindow(displays[0]),
                                0, 0, width, height, 0, 0, 0);
window[1] = XCreateSimpleWindow(displays[1], XDefaultRootWindow(displays[1]),
                                0, 0, width, height, 0, 0, 0);

Если это разные X-экраны на одном и том же X-сервере, вместо них отображаются :0.0 и :0.1. (И все это при условии простейшего случая только этих X-серверов без дополнительных X-серверов на других VT или виртуальных X-серверах, таких как Xvfb, Xnest или Xephyr.)

Конечно, любое серьезное программирование в графическом интерфейсе будет выполняться с помощью такого инструментария, как GTK + или Qt, не необработанные вызовы Xlib.

1 голос
/ 16 февраля 2011

Над приведенными ответами взгляните на DMX (распределенный мульти-заголовок), который позволяет объединять несколько X-серверов / экранов в один большой экран, обслуживаемый отдельным X-сервером, который отправляет команды на подчиненные серверы.

http://dmx.sourceforge.net/

...