2015-03-25 3 views
4

По умолчанию xmonad обрабатывает every display separately. Я могу переключиться на каждый дисплей и разместить на нем рабочее пространство. Это прекрасно работает и имеет смысл.Сделайте Xmonad обработкой нескольких мониторов как один

Теперь у меня возникла проблема в том, что дисплей 4k, подключенный через DisplayPort 1.2 с графической картой NVidia, представлен в виде двух дисплеев для системы, по одному дисплею для каждой половины монитора. Я могу объединить их снова с помощью xrandr, но xmonad по-прежнему рассматривает их как два дисплея, а это означает, что я не могу поместить одно окно на весь экран (кроме случаев, когда он плавает).

Я уже пытался изменить метод rescreen в Operations.hs в источнике xmonad, чтобы всегда возвращать фиксированный макет вместо макета, возвращаемого системой, но это ничего не меняло. Реквизиты:

ghc -e "Graphics.X11.openDisplay [] >>= Graphics.X11.Xinerama.getScreenInfo" 

restults в

[Rectangle {rect_x = 4080, rect_y = 584, rect_width = 1920, rect_height = 2160}, -- D, DP-4.9 
    Rectangle {rect_x = 2160, rect_y = 584, rect_width = 1920, rect_height = 2160}, -- C, DP-4.8 
    Rectangle {rect_x = 0, rect_y = 1920, rect_width = 2160, rect_height = 1920}, -- B, DP-2.8 
    Rectangle {rect_x = 0, rect_y = 0, rect_width = 2160, rect_height = 1920}] -- A, DP-2.9 

Что соответствует с макетом, сообщенные XRandR:

A 
    C D 
B 

C: DP-4.8 connected primary 1920x2160+4080+584 (normal left inverted right x axis y axis) 527mm x 296mm 
D: DP-4.9 connected 1920x2160+2160+584 (normal left inverted right x axis y axis) 527mm x 296mm 
B: DP-2.8 connected 2160x1920+0+1920 left (normal left inverted right x axis y axis) 527mm x 296mm 
A: DP-2.9 connected 2160x1920+0+0 left (normal left inverted right x axis y axis) 527mm x 296mm 

(я добавил физическое расположение для ясности)

Я пытался дайте функции rescreen фиксированную прямоугольную компоновку, где каждый прямоугольник охватывает обе стороны дисплея:

myFixed = [Rectangle {rect_x = 2160, rect_y = 584, rect_width = 3840, rect_height = 2160}, -- C, D 
     Rectangle {rect_x = 0, rect_y = 0, rect_width = 2160, rect_height = 3840}] -- A, B 

-- | Cleans the list of screens according to the rules documented for 
-- nubScreens. 
getCleanedScreenInfo :: MonadIO m => Display -> m [Rectangle] 
getCleanedScreenInfo = io . fmap nubScreens . (const $ return myFixed) 

Но это ничего не меняло.

Есть ли вариант конфигурации для этого? Я также был бы рад изменить исходный код, мой макет не изменится какое-то время.

ответ

3

Я решил проблему, воспользовавшись опцией переопределения информации о экране, предоставленной драйвером nvidia, с именем TwinViewXineramaInfoOverride. Это позволяет добиться того, что я попытался, изменив источник XMonad. В моем xorg.conf имеются соответствующие варианты:

Option "TwinView" 
Option "NoTwinViewXineramaInfo" "0" 
Option "TwinViewXineramaInfoOverride" "2160x3840+0+0, 3840x2160+2160+584" 
# explicitly tell which monitors are connected: 
Option "ConnectedMonitor" "DFP-4.9, DFP-4.8, DFP-2.8, DFP-2.9" 
Option "TwinViewOrientation" "RightOf" 

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