GNU/Linux -- это интересно

Запуск игр в новой X-сессии

Рубрика: Hужное/полезное
Метки: | |
Четверг, 9 апреля 2009 г.
Просмотров: 4544
Подписаться на комментарии по RSS

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

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

 

В общем, мотивация ясна, но как же это сделать просто, чтобы оно стоило того? Как-то на просторах Интернет попался простенький скрипт на Python. Простенький и достаточно гениальный. Всё, что требуется теперь, что написать:

 

$ game ЧТО_ВЫПОЛНИТЬ
где game - название скрипта, а за ним следует то, что нужно запускать в отдельных иксах. Скажем:

 

$ game wine heroes3.exe

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

#!/usr/bin/python
import os, sys, time, signal      
XORG_DELAY = 0
if len(sys.argv) == 1 or (len(sys.argv)==2 and sys.argv[1].startswith('-x:')):
        print >>sys.stderr, "Usage: %s [-x:id] app [args]" % sys.argv[0]
        sys.exit(2)
if sys.argv[1].startswith('-x:'):
        xid = int(sys.argv[1].split(':')[1])
        argv = sys.argv[2:]
else:
        xid = 1
        argv = sys.argv[1:]
pid = os.fork()
if pid == 0:
        # Xorg child
        print " * Staring X11 on :%d" % xid
        sys.stdin.close()
        sys.stdout.close()
        sys.stderr.close()
        os.execvp('Xorg', ['/usr/bin/Xorg', ':%d' % xid])
else:
        print " * Waiting for X11 to finish starting (%d seconds)" % XORG_DELAY
        time.sleep(XORG_DELAY)
        cmd = 'env DISPLAY=":' + str(xid) + '" ' + ' '.join(argv)
        print " * Starting %s" % cmd
        os.system(cmd)
        print " * Application done, terminating spawned X11"   
        os.kill(pid, signal.SIGTERM)
        os.wait()
Что он делает? Открывает Х-сессию (номер которой можно задавать через -x:№), выжидает время, указанное в XORG_DELAY (в оригинальном скрипте стояло 8 секунда!! Зачем??) и запускает то, что передаётся ему в виде параметров. Если ничего не запускается или игра при запуске падает, то и иксы тут же захлопываются. Выходите вы из игры и иксы сами завершают свою работу. Довольно удобно!

 

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

$ sudo chmod +s /usr/bin/Xorg

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

Автор: vovans, xmpp: xmpp
Добавить страницу в закладки:
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us
Комментариев: 3
  1. А что бы не менять права на Xorg?

  2. Прекрасно работает и без изменения прав на хорг.

  3. Этот скрипт позволил обойти регрессию с xinput2 на новых версиях wine`а (старше 1.3.16 где-то) бага тут: http://bugs.winehq.org/show_bug.cgi?id=27419. Мод HD для 3-х хиросов, 1920x1080, фулскрин - все замечательно работает

Оставьте комментарий!
Используйте нормальные имена.
Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)




Войти через loginza

 
captcha