Уж не знаю, актуальна ли ещё эта тема, наброски писал ещё полтора года назад...
И вот наконец-то решил это опубликовать в более законченном виде и чтобы всегда можно было легко найти. Ибо время от времени нужно сие повторить, а память имеет свойство забыть...

00gamex


Так вот, более менее решил собрать в одном месте то, что знаю по запуску игр в Linux. Один из важных моментов, который часто хочется легко осуществлять - запуск игры в отдельных иксах. Это бывает очень удобно. Легко вернуться в рабочие иксы и продолжить работу или ответить в jabber/icq, не проблема, если зависнут иксы с игрой, да и бывает что глюки всякие всплываю, чего не наблюдается в чистых иксах. Ещё мне жутко не нравится, когда колбасит панель и хлам на раб столе из-за смены разрешения.
 
В общем, мотивация ясна, но как же это сделать просто, чтобы оно стоило того? Как-то на просторах Интернет попался простенький скрипт на Python. Простенький и достаточно гениальный. Всё, что требуется теперь, что написать:

 

<br>$ game ЧТО_ВЫПОЛНИТЬ<br>

где game - название скрипта, а за ним следует то, что нужно запускать в отдельных иксах. Скажем:


<br>$ game wine heroes3.exe<br>

Вот код скрипта game:

#!/usr/bin/python<br><br>import os, sys, time, signal      <br><br>XORG_DELAY = 0<br><br>if len(sys.argv) == 1 or (len(sys.argv)==2 and sys.argv[1].startswith('-x:')):<br>        print >>sys.stderr, "Usage: %s [-x:id] app [args]" % sys.argv[0]<br>        sys.exit(2)<br><br>if sys.argv[1].startswith('-x:'):<br>        xid = int(sys.argv[1].split(':')[1])<br>        argv = sys.argv[2:]<br>else:<br>        xid = 1<br>        argv = sys.argv[1:]<br><br>pid = os.fork()<br>if pid == 0:<br>        # Xorg child<br>        print " * Staring X11 on :%d" % xid<br>        sys.stdin.close()<br>        sys.stdout.close()<br>        sys.stderr.close()<br>        os.execvp('Xorg', ['/usr/bin/Xorg', ':%d' % xid])<br>else:<br>        print " * Waiting for X11 to finish starting (%d seconds)" % XORG_DELAY<br>        time.sleep(XORG_DELAY)<br>        cmd = 'env DISPLAY=":' + str(xid) + '" ' + ' '.join(argv)<br>        print " * Starting %s" % cmd<br>        os.system(cmd)<br>        print " * Application done, terminating spawned X11"   <br>        os.kill(pid, signal.SIGTERM)<br>        os.wait()

 

Что он делает? Открывает Х-сессию (номер которой можно задавать через -x:№), выжидает время, указанное в XORG_DELAY (в оригинальном скрипте стояло 8 секунда!! Зачем??) и запускает то, что передаётся ему в виде параметров. Если ничего не запускается или игра при запуске падает, то и иксы тут же захлопываются. Выходите вы из игры и иксы сами завершают свою работу. Довольно удобно!


Для работы скрипта потребовалось сделать:

<br>$ sudo chmod +s /usr/bin/Xorg<br>

И так после кажого обновления иксов.