2012-11-06

Еще один камень в сторону криворуких программеров

Еще одна веселая проблема.
Проявляется во многих "кросс-платфоменных" ява-приложениях, но больнее всего меня поразила в такой штуке как NX.
Мне приходится постоянно с ним работать в удаленных лабах.
Вот так он должен выглядеть:
В конфигурации терминальной сессии для удобства вшито разрешение 1024х768, это удобно, его хватает (разрешение можно поменять на сервере лаб, и оно опять таки вшивается в настройки сессии NX).
Все бы супер, но, все работает нормально только если у меня подключен один монитор. Как только мониторов два, картинка становится такой:
Как вам такое?
Вы можете подумать что у меня два огромных 40" монитора, но фиг там! Это окошко по ширине "почти" помещается на два монитора!
И долбаный NX плюет с колокольни на то что в сессию вшито разрешение экрана(при одном мониторе эти опции работают идеально):

И внутри терминальной сессии сменить разрешение невозможно.

Решение нашел здесь
Написать библиотеку подменяющую функции Xinerama возвращающие размер дисплея и перезагрузить ее с помощью LD_PRELOAD!!!
ОФИГЕТЬ

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

Теперь воркараунд.
1) скрипт nestify, запускающий одну программу под Xephyr:
#!/bin/bash
RESOLUTION="1024x768"
while [[ $1 =~ - ]]; do
        case $1 in
                -r)
                        RESOLUTION=$2
                        shift 2
                        ;;
        esac
done
for i in `seq 30`; do
        [[ -a /tmp/.X$i-lock ]] && continue
        Xephyr -ac -screen ${RESOLUTION} -br :$i > /tmp/xephyr.$PID.out 2>&1 &
        export DISPLAY=:$i
        sleep 1
        exec $*
        exit
done
Большая часть скрипта - грязный хак перебирающий свободные десктопы что б можно было запустить одновременно несколько таких сессий.
2) скрипт-оболочка для nxclient:
#!/bin/bash
nestify -r "1024x768" /usr/NX/bin/nxclient $*

Теперь вместо порнографии со второго скриншота у меня получается такая картинка:
Есть конечно недостатки: пока не придумал как изменить заголовок окна на более информативный, но намеки нашел здесь, но патчить и пересобирать ради этого не готов :(

P.S. За моральную и техническую помощь спасибо Илье :)

Немає коментарів: