OpenSuSe 13.1, ноутбук с видеокартой Nvidia и старые игры в wine

Так получилось, что ранее я ругал карты ATI Radeon здесь, тут и там. И для разнообразия у меня появился ноутбук Lenovo Z560 с карточкой Nvidia на борту. Пропиетарные дрова с сайта Nvidia ставятся без проблем, все работает хорошо — за исключением одного маленького нюанса.

Почему-то разработчики драйверов перешли на новую версию протокола randr, и теперь в системе для экрана ноутбука определяется только одно единственное разрешение экрана:

> xrandr -q
Screen 0: minimum 8 x 8, current 1366 x 768, maximum 8192 x 8192
VGA-0 disconnected (normal left inverted right x axis y axis)
LVDS-0 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 344mm x 194mm
   1366x768       60.0*+   50.0  
HDMI-0 disconnected (normal left inverted right x axis y axis)

В старой версии протокола разрешений экрана можно было получить гораздо больше:

> xrandr --q1
 SZ:    Pixels          Physical       Refresh
*0   1366 x 768    ( 340mm x 191mm )  *50   51  
 1   1280 x 720    ( 318mm x 179mm )   52  
 2   1024 x 768    ( 254mm x 191mm )   53  
 3    800 x 600    ( 199mm x 149mm )   54  
 4    640 x 480    ( 159mm x 119mm )   55  
Current rotation - normal
Current reflection - none
Rotations possible - normal left inverted right 
Reflections possible - X Axis Y Axis

Если надо кодить, или править документ какой-нибудь, то проблемы это не вызывает. Но если решил порубиться в старую игрушку с древним разрешением экрана (например, 640×480), то игра вполне себе может ругаться на разрешение экрана. Например, у меня fallout не запускался, и появлялось сообщение Error initializing video mode 640×480, и в консоли при этом был виден текст ошибки такого вот содержания:

err:x11settings:X11DRV_ChangeDisplaySettingsEx No matching mode found 640x480x8 @0! (XRandR 1.2)

Оказывается, проблему победить можно. Надо лишь наваять 2 скрипта и поместить их куда-нибудь в пути. Первый скрипт позволяет менять разрешение экрана из командной строки:

> cat setres.sh
#!/bin/bash
RESOLUTION=$1
nvidia-settings --assign CurrentMetaMode="LVDS-0: nvidia-auto-select @$RESOLUTION +0 +0 {ViewPortIn=$RESOLUTION, ViewPortOut=$RESOLUTION}"

Второй скрипт собственно меняет разрешение экрана на правильное, запускает fallout в десктопе со «правильным» разрешением экрана, ну и возвращает настройки разрешения обратно по завершении игры:

> cat fallout1.sh
#!/bin/sh
cd /home/username/.wine/drive_c/Program Files/GOG.com/Fallout
/usr/local/bin/setres.sh 640x480
wine explorer /desktop=foo,640x480 falloutw.exe
/usr/local/bin/setres.sh 1366x768
cd $HOME

Смена разрешения на 640×480 — необязательный шаг, и если его не сделать, можно играть в оконном режиме. А вот для полноэкранного режима без смены разрешения не обойтись.