Using Xephyr/ru

На этой странице приведено краткое руководство по запуску вложенных X-серверов (т.е. запуск X-сессии в клиентском окне другой X-сессии) при помощи Xephyr. Это может оказаться полезным для тестирования, например, конфигурационных файлов, не затрагивая работающий Awesome.

Лучше всего запускать Xephyr и Awesome в эмуляторах терминала, чтобы можно было следить за стандартными потоками вывода и ошибок в реальном времени.

Archlinux
/usr/bin/Xephyr находится в пакете xorg-server-xephyr. Установить его можно следующим образом:

pacman -S xorg-server-xephyr

Gentoo
/usr/bin/Xephyr находится в пакете x11-base/xorg-server. Для успешной сборки Xephyr в списке USE-флагов должен присутствовать kdrive.

Debian/Ubuntu
/usr/bin/Xephyr находится в пакете xserver-xephyr. Его можно установить командой:

# apt-get install xserver-xephyr

Fedora
/usr/bin/Xephyr находится в пакете xorg-x11-server-Xephyr.

Запуск Xephyr
Следующая команда запускает новый X-сервер в клиентском окне текущего:

$ Xephyr -ac -br -noreset -screen 800x600 :1


 * -ac : disable access control restrictions
 * -br : create root window with black background
 * -noreset : don't reset after last client exists
 * -screen 800x600 : Specify screen characteristics

Теперь можно запускать приложения внутри клиентской X-сессии, изменяя значение переменной окружения DISPLAY на :1.0:

$ DISPLAY=:1.0 $ xterm

Новое окно xterm появится внутри клиентской X-сессии.

Запуск Awesome в Xephyr
Установите переменную DISPLAY:

$ DISPLAY=:1.0

И запустите Awesome в клиентской X-сессии:

$ awesome -c ~/.config/awesome/rc.lua.new

Этот способ хорошо подходит для тестирования изменений в rc.lua. В случае наличия каких-либо ошибок Вы не испортите работающий Awesome и не останетесь перед пустым корневым окном, не реагирующим на нажатия каких-либо клавиш.

Вы также можете создать shell скрипт для быстрого запуска:

Xephyr -ac -br -noreset -screen 1024x768 :1.0 & ZEPHYR_PID=$! sleep 1 DISPLAY=:1.0 awesome -c rc.lua kill $ZEPHYR_PID

(вызывает awesome использующий оригинальный файл или его копию)

Получение фокуса ввода Xephyr и передача ввода
Одна вещь, которую вы быстро заметите, заключается в том, что Awesome не обрабатывает нажатия клавиш для сессии Xephyr. Для исрпавления этой проблеммы, сессия Xephir, должна перехватывать клавиатуру. Пока окно Xephyr имеет фокус ввода, нажмите Control-mod3-shift для захвата Xephyr фокуса ввода. Теперь вы увидите, что мышь не сможет покинуть это окно. Если вы хотите, чтобы Xephyr отключил фокус ввода, нажмите control-shift (примечание: на некоторых системах, это может быть ПРАВЫЙ control-shift). Если ваши модификаторы по прежнему не работают, что ж, на некоторых системах Xephir может глючить. Вы можете использовать xmodmap и xev чтобы увидеть в чем ошибка. В моем случае, не была определена "windows key" как Super_L. Я привязал ее для сессии Xephyr испльзуя xmodmap:

$ xmodmap - keycode 133 = Super_L   # Ваш keycode может отличаться. Проверьте код используя xev. # Нажмите Control-D для завершения ввода в xmodmap.

Также возможно, что вы не используете раскладку клавиатуры по уполчанию в вашей системе. Поэтому вам придется переделать также и ее.

$ setxkbmap us dvorak

Удалённый перезапуск Awesome
Получите идентификатор процесса (pid) вторичного Awesome и отправьте ему сигнал SIGHUP:

$ pgrep awesome $ kill -s SIGHUP <идентификатор_awesome_в_xephyr>

Учитывая то, что ваш основной awesome всегда запускался до xephyr, вы можете записать эти команду в одну строку и оформить ее в виде скрипта.

$ pgrep awesome | tail -1 | xargs kill -s SIGHUP

Или, если Вы предпочитаете использовать awesome-client:

$ export DISPLAY=:1.0 $ echo 'awesome.restart' | awesome-client

Скрипт для отладки rc.lua
Xephyr -ac -br -noreset -screen 800x600 :1 & sleep 1 DISPLAY=:1.0 awesome -c ~/.config/awesome/rc.lua.new
 * 1) !/bin/bash
 * 2) script xepyhr-awesome
 * 3) author: dante4d 

Другой скрипт
# # # # # # # #  #  function usage {  cat <<USAGE awesome_test start|stop|restart|run start   Start nested Awesome in Xephyr stop    Stop Xephyr restart Reload nested Awesome configuration run     Run command in nested Awesome USAGE exit 0 } function awesome_pid {  /bin/pidof awesome | cut -d\  -f1 } function xephyr_pid {  /bin/pidof Xephyr | cut -d\  -f1 } [ $# -lt 1 ] && usage RC_LUA=~/.config/awesome/rc.lua.new test -f $RC_LUA || /bin/cp /etc/xdg/awesome/rc.lua $RC_LUA AWESOME=`which awesome` XEPHYR=`which Xephyr` test -x $AWESOME || { echo "Awesome executable not found. Please install Awesome"; exit 1; } test -x $XEPHYR || { echo "Xephyr executable not found. Please install Xephyr"; exit 1; } case "$1" in  start)     $XEPHYR -ac -br -noreset -screen 800x600 :1 &     sleep 1     DISPLAY=:1.0 $AWESOME -c $RC_LUA &     sleep 1     echo Awesome ready for tests. PID is $(awesome_pid)     ;;   stop) echo -n "Stopping Nested Awesome... " if [ -z $(xephyr_pid) ]; then echo "Not running: not stopped :)"      exit 0     else       kill $(xephyr_pid)       echo "Done."     fi     ;;   restart) echo -n "Restarting Awesome... " kill -s SIGHUP $(awesome_pid) ;;  run)     shift     DISPLAY=:1.0 "$@" &     ;;   *) usage ;; esac # #{ #} # # # # #
 * 1) !/bin/bash
 * 2) Run Awesome in a nested server for tests
 * 1) Requirements: (Debian)
 * 1)  apt-get install xserver-xephyr
 * 2)  apt-get install -t unstable awesome
 * 1) Based on original script by dante4d 
 * 2) See: http://awesome.naquadah.org/wiki/index.php?title=Using_Xephyr
 * 1) URL: http://hellekin.cepheide.org/awesome/awesome_test
 * 1) Copyright (c) 2009 Hellekin O. Wolf 
 * 1) This program is free software: you can redistribute it and/or modify
 * 2) it under the terms of the GNU General Public License as published by
 * 3) the Free Software Foundation, either version 3 of the License, or
 * 4) (at your option) any later version.
 * 1) This program is distributed in the hope that it will be useful,
 * 2) but WITHOUT ANY WARRANTY; without even the implied warranty of
 * 3) MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * 4) GNU General Public License for more details.
 * 1) You should have received a copy of the GNU General Public License
 * 2) along with this program.  If not, see .
 * 1) WARNING: the following two functions expect that you only run one instance
 * 2) of Xephyr and the last launched Awesome runs in it
 * 1) If rc.lua.new is missing, make a default one.
 * 1) Just in case we're not running from /usr/bin
 * 1)  /bin/pidof Xephyr | cut -d\  -f1
 * 1) [ $# -lt 1 ] && usage
 * 1) If rc.lua.new is missing, make a default one.
 * 2) RC_LUA=~/.config/awesome/rc.lua.new
 * 3) test -f $RC_LUA || /bin/cp /etc/xdg/awesome/rc.lua $RC_LUA
 * 1) Just in case we're not running from /usr/bin
 * 2) AWESOME=`which awesome`
 * 3) XEPHYR=`which Xephyr`
 * 1) test -x $AWESOME || { echo "Awesome executable not found. Please install Awesome"; exit 1; }
 * 2) test -x $XEPHYR || { echo "Xephyr executable not found. Please install Xephyr"; exit 1; }
 * 1) case "$1" in
 * 2)  start)
 * 3)    $XEPHYR -ac -br -noreset -screen 800x600 :1 &
 * 4)    sleep 1
 * 5)    DISPLAY=:1.0 $AWESOME -c $RC_LUA &
 * 6)    sleep 1
 * 7)    echo Awesome ready for tests. PID is $(awesome_pid)
 * 8)  stop)
 * 9)    echo -n "Stopping Nested Awesome... "
 * 10)    if [ -z $(xephyr_pid) ]; then
 * 11)      echo "Not running: not stopped :)"
 * 12)      exit 0
 * 13)    else
 * 14)      kill $(xephyr_pid)
 * 15)      echo "Done."
 * 16)    fi
 * 17)  restart)
 * 18)    echo -n "Restarting Awesome... "
 * 19)    kill -s SIGHUP $(awesome_pid)
 * 20)  run)
 * 21)    shift
 * 22)    DISPLAY=:1.0 "$@" &
 * 23)    usage
 * 24) esac
 * 1)    DISPLAY=:1.0 "$@" &
 * 2)    usage
 * 3) esac
 * 1)    usage
 * 2) esac
 * 1) esac

Затем:

awesome_test start|stop|restart|run

start   Запуск вложенного Awesome в Xephyr stop    Завершение Xephyr restart Перезапуск вложенного Awesome run     Запуск команд во вложенном Awesome

Еще один скрипт
Этот скрипт базируется на работе dante4d. Он содержит дополнительную функциональность для запуска нескольких экземпляров Xephyr с помощью флага -D, использования нескольких конфигураций (-C) и размеров окон (-S). Вы также можете использовать его для смены тем, но корректность работы не гарантируется.

Скрипт находится здесь: https://github.com/mikar/awmtt