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

Так вот, более менее решил собрать в одном месте то, что знаю по запуску игр в 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>
И так после кажого обновления иксов.
Комментарии (12)
А что бы не менять права на Xorg?
А что бы не менять права на Xorg?
Прекрасно работает и без изменения прав на хорг.
Прекрасно работает и без изменения прав на хорг.
Этот скрипт позволил обойти регрессию с xinput2 на новых версиях wine`а (старше 1.3.16 где-то) бага тут: http://bugs.winehq.org/show_bug.cgi?id=27419. Мод HD для 3-х хиросов, 1920x1080, фулскрин - все замечательно работает
Этот скрипт позволил обойти регрессию с xinput2 на новых версиях wine`а (старше 1.3.16 где-то) бага тут: http://bugs.winehq.org/show_bug.cgi?id=27419. Мод HD для 3-х хиросов, 1920x1080, фулскрин - все замечательно работает
А это вообще безопасно suid в Xorg? Но у меня без него не взлетело.
А это вообще безопасно suid в Xorg? Но у меня без него не взлетело.
эта инструкция была актуальна 5 и более лет назад,какие могут быть замечания? ))
Но как пример имеет право на жизнь и до сих пор.
эта инструкция была актуальна 5 и более лет назад,какие могут быть замечания? ))
Но как пример имеет право на жизнь и до сих пор.
Весьма полезно и... РА-БО-ТА-ЕТ !
Весьма полезно и... РА-БО-ТА-ЕТ !
Сообщает:
game firefox
File "/usr/local/bin/game", line 16
print " * Staring X11 on :%d" % xid
^
SyntaxError: Missing parentheses in call to 'print'
- что можно/нужно сделать ?
Спасибо.
Сообщает:
game firefox
File "/usr/local/bin/game", line 16
print " * Staring X11 on :%d" % xid
^
SyntaxError: Missing parentheses in call to 'print'
- что можно/нужно сделать ?
Спасибо.
Нужно выполнять сей скрипт под вторым питоном.
То есть, в самом начале указывать примерно так:
В третьем питоне вывод print заворачивается в скобки, то есть 16-я строка должна выглядеть примерно так:
print(" * Staring X11 on :%d") % xidВообще, можно попробовать поудалять строки с print, но сомневаюсь я что-то, что это без прочих правок будет работать на python 3.
Нужно выполнять сей скрипт под вторым питоном.
То есть, в самом начале указывать примерно так:
В третьем питоне вывод print заворачивается в скобки, то есть 16-я строка должна выглядеть примерно так:
print(" * Staring X11 on :%d") % xidВообще, можно попробовать поудалять строки с print, но сомневаюсь я что-то, что это без прочих правок будет работать на python 3.
Благодаря за отзывчивость, попробовал дописать "2" и получил:
SyntaxError: Non-ASCII character '\xc2' in file /usr/local/bin/game on line 30, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
--- ежели помнить, что строк в скрипте лишь 29 - забавно
Эх...
Благодаря за отзывчивость, попробовал дописать "2" и получил:
SyntaxError: Non-ASCII character '\xc2' in file /usr/local/bin/game on line 30, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
--- ежели помнить, что строк в скрипте лишь 29 - забавно
Эх...
Basil, где-то чёто лишнее вставил, вероятно в строке 29, возможно русский символ в комментарии или типа того
как вариант использовать # -*- coding: utf-8 -*- в заголовке, но в данном скрипте оно не нужно и лучше найти проблему, а ещё лучше переписать на питон3
Basil, где-то чёто лишнее вставил, вероятно в строке 29, возможно русский символ в комментарии или типа того
как вариант использовать # -*- coding: utf-8 -*- в заголовке, но в данном скрипте оно не нужно и лучше найти проблему, а ещё лучше переписать на питон3
"а ещё лучше переписать на питон3" --- золотые слова :) только вот не писатель я :(
И совет: "использовать # -*- coding: utf-8 -*- в заголовке" я уже испробовал - ФигВам называется...
"а ещё лучше переписать на питон3" --- золотые слова :) только вот не писатель я :(
И совет: "использовать # -*- coding: utf-8 -*- в заголовке" я уже испробовал - ФигВам называется...
Ну, я всё же попробовал бы всё удалить после последнего символа. Мало ли, может мусор тка какой, которого не видно. И сделал бы одну пустую строку. Хотя, подозреваю, всё это уже проделано. Не знаю, к сожалению нет возможности сейчас проверить работоспособность скрипта. Но раньше я его точно использовал и играл таким образом )
Ну, я всё же попробовал бы всё удалить после последнего символа. Мало ли, может мусор тка какой, которого не видно. И сделал бы одну пустую строку. Хотя, подозреваю, всё это уже проделано. Не знаю, к сожалению нет возможности сейчас проверить работоспособность скрипта. Но раньше я его точно использовал и играл таким образом )