Использование Xephyr

From awesome
Jump to: navigation, search


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

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

Установка Xephyr[edit]

Archlinux[edit]

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

pacman -S xorg-server-xephyr

Gentoo[edit]

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

Debian/Ubuntu[edit]

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

 # apt-get install xserver-xephyr

Fedora[edit]

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

Запуск Xephyr[edit]

Следующая команда запускает новый 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[edit]

Установите переменную 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 использующий оригинальный файл или его копию)

Дополнительно[edit]

Получение фокуса ввода Xephyr и передача ввода[edit]

Одна вещь, которую вы быстро заметите, заключается в том, что 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[edit]

Получите идентификатор процесса (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[edit]

#!/bin/bash
# script xepyhr-awesome
# author: dante4d <dante4d@gmail.com>
Xephyr -ac -br -noreset -screen 800x600 :1 &
sleep 1
DISPLAY=:1.0 awesome -c ~/.config/awesome/rc.lua.new

Другой скрипт[edit]

#!/bin/bash
# Run Awesome in a nested server for tests
#
# Requirements: (Debian)
#
#  apt-get install xserver-xephyr
#  apt-get install -t unstable awesome
#
# Based on original script by dante4d <dante4d@gmail.com>
# See: http://awesome.naquadah.org/wiki/index.php?title=Using_Xephyr
#
# URL: http://hellekin.cepheide.org/awesome/awesome_test
#
# Copyright (c) 2009 Hellekin O. Wolf <hellekin@cepheide.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
# 

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
}

# WARNING: the following two functions expect that you only run one instance
# of Xephyr and the last launched Awesome runs in it

function awesome_pid() 
{
  /bin/pidof awesome | cut -d\  -f1
}
 
function xephyr_pid()

{
  /bin/pidof Xephyr | cut -d\  -f1
}

[ $# -lt 1 ] && usage

# If rc.lua.new is missing, make a default one.
RC_LUA=~/.config/awesome/rc.lua.new
test -f $RC_LUA || /bin/cp /etc/xdg/awesome/rc.lua $RC_LUA

# Just in case we're not running from /usr/bin
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
#
#{
#  /bin/pidof Xephyr | cut -d\  -f1
#}
#
#[ $# -lt 1 ] && usage
#
## If rc.lua.new is missing, make a default one.
#RC_LUA=~/.config/awesome/rc.lua.new
#test -f $RC_LUA || /bin/cp /etc/xdg/awesome/rc.lua $RC_LUA
#
## Just in case we're not running from /usr/bin
#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

Затем:

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

Еще один скрипт[edit]

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

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