Код отслеживания Google Analytics.

Oct 25, 2007

XServer под Cygwin

XServer - это программа, в которой другие программы могут "рисовать". Они, другие программы, назваются XClient-ами и ничего не знают о технических особенностях Вашей системы. Они просто соединются с XServer-ом по одну из многих путей (TCP/IP, Unix-Socket, IPX или даже по COM-порту) и "просят" его что-либо нарисовать. Таким образом, вы с лекостью сможете запускать графические программы на других компьютерах, если у Вас, будет функционировать XServer. Одна из самых известных freeware реализаций этой программы представлена в наборе Cygwin - XWin.exe(XWin_GL.exe).



Вы можете запустить ее или скрипты startxwin.sh, startxwin.bat, startx. Я предпочитаю использовать свой скрипт, который является модификацией одного из официальных:

#! /bin/sh
export DISPLAY=127.0.0.1:0.0
export PATH=/usr/X11R6/bin:"$PATH"
export XAPPLRESDIR=/usr/X11R6/lib/X11/app-defaults
export XCMSDB=/usr/X11R6/lib/X11/Xcms.txt
export XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
export XNLSPATH=/usr/X11R6/lib/X11/locale
export CYGWIN=server
export LANG=ru_RU.KOI8-R


# Cleanup from last run.
rm -rf /tmp/.X11-unix


# The error "Fatal server error: could not open default font 'fixed'" is
# caused by using a DOS mode mount for the mount that the Cygwin/X
# fonts are accessed through.  See the Cygwin/X FAQ for more
# information:
# http://x.cygwin.com/docs/faq/cygwin-x-faq.html#q-error-font-eof


# Brief descriptions of XWin-specific options:
#
# -screen scr_num [width height]
#      Enable screen scr_num and optionally specify a width and
#      height for that screen.
#      Most importantly, any parameters specified before the first -screen
#      parameter apply to all screens.  Any options after the first -screen
#      parameter apply only to the screen that precedes the parameter.
#      Example:
#          XWin -fullscreen -screen 0 -screen 1 -depth 8 -screen 2
#      All screens will be fullscreen, but screen 2 will be depth 8, while
#      screens 0 and 1 will be the default depth (whatever depth Windows
#      is currently running at).
# -multiwindow
#      Start an integrated Windows-based window manager.  Not to be used
#      with -rootless nor -fullscreen.
# -rootless
#      Use a transparent root window with an external window manager
#      (such as twm).  Not to be used with -multiwindow nor
#      with -fullscreen.
# -fullscreen
#      Use a window as large as possible on the primary monitor.
# -multiplemonitors
#      Create a root window that covers all monitors on a
#      system with multiple monitors.
# -clipboard
#      Enable the integrated version of xwinclip.  Do not use in
#      conjunction with the xwinclip program.
# -depth bits_per_pixel
#      Specify the screen depth to run at (in bits per pixel) using a
#      DirectDraw-based engine in conjunction with the -fullscreen
#      option, ignored if the -fullscreen option is not specified.
#      By default, you will be using a DirectDraw based engine on any
#      system that supports it.
# -unixkill
#      Trap Ctrl+Alt+Backspace as a server shutdown key combination.
# -nounixkill
#      Disable Ctrl+Alt+Backspace as a server shutdown key combination (default).
#      Example:
#          XWin -unixkill -screen 0 -screen 1 -screen 2 -nounixkill
#      Screens 0 and 1 will allow Ctrl+Alt+Backspace, but screen 2 will not.
# -winkill
#      Trap Alt+F4 as a server shutdown key combination (default).
# -nowinkill
#      Disable Alt+F4 as a server shutdown key combination.
# -scrollbars
#      Enable resizing of the server display window.  Do not use in conjunction
#      with -multiwindow nor with -rootless.
# -nodecoration
#      Draw the server root window without a title bar or border.
#      Do not use with -mutliwindow nor with -rootless.
# -lesspointer
#      Hide the Windows mouse cursor anytime it is over any part of the
#      window, even if Cygwin/X is not the window with the focus.
# -refresh rate_in_Hz
#      Specify a refresh rate to use when used with the -fullscreen option.
# -trayicon
#      Enable the tray icon (default).
# -notrayicon
#      Disable the tray icon.
#      Example:
#          XWin -notrayicon -screen 0 -screen 1 -screen 2 -trayicon
#      Screens 0 and 1 will not have tray icons, but screen 2 will.
# -emulate3buttons [timeout]
#      Emulate 3 button mouse with an optional timeout in milliseconds.
# -xf86config
#      Specify an XF86Config-style configuration file.
# -keyboard
#      Specify a keyboard device from the configuration file.


fontPath="-fp /usr/X11R6/lib/X11/fonts/misc/,/usr/X11R6/lib/X11/fonts/TTF/,/usr/X11R6/lib/X11/fonts/Type1/,/usr/X11R6/lib/X11/fonts/CID/,/usr/X11R6/lib/X11/fonts/75dpi/,/usr/X11R6/lib/X11/fonts/100dpi/,/cygdrive/c/WINDOWS/Fonts/"
#query="-query "
#from="-from "
number=":0"
export DISPLAY=127.0.0.1${number}.0
#nodecoration="-nodecoration"
#multywindow="-multiwindow"
#screen="-screen 0 1280x1020"
clipboard="-clipboard"
keyboard="-xkbrules xfree86 -xkbmodel pc105 -xkblayout "us,ru" -xkbvariant winkeys -xkboptions grp:ctrl_shift_toggle"
logFile="/var/log/localX.log"
#XServer="XWin"
XServer="XWin_GL"

# Startup the X Server with the integrated Windows-based window manager.
# WARNING: Do not use 'xwinclip' in conjunction with the ``-clipboard''
# command-line parameter for XWin.  Doing so would start two clipboard
# managers, which is never supposed to happen.

${XServer} ${number} ${nodecoration} ${multywindow} ${clipboard} ${screen} ${keyboard}  ${fontPath} ${query} ${from} $* > "${logFile}" 2>&1 &

# Startup an xterm, using bash as the shell.

[ -e  ~/.Xresources ] && xrdb -merge ~/.Xresources
xterm  -e /usr/bin/bash -l &
# Set a background color.  Only needed when not using -multwindow for XWin.
xsetroot -solid aquamarine4 &


#
# Startup the window manager.
# WARNING: Do not use an external window manager in conjunction with
# the ``-multiwindow'' command-line parameter for XWin.  Doing so
# would start two window managers, which is never supposed to happen.
#

#exec twm  
#exec wmaker
#exec openbox
#exec fvwm2


Этот скрипт запускается у меня как ярлык с командой

C:\cygwin\usr\X11R6\bin\run.exe /bin/bash -e ~/bin/localX.sh


Данный скрипт легко может быть модифицирован для самых разных конфигураций, поэтому я позволю себе прокомментировать его более подробно. Многочисленные export-ы в начале настраивают окружение, в котором будет жить X-Server. Обратите внимание на LANG - это одно из необходимых условий нормального функционирования xterm-а и ряда других программ. Так же имеет смысл "отрегулировать" значение переменной $HOME.
После удаления возможного мусора идет большая секция с комментариями о разных опциях XWin. Более полная информация может быть получена с помощью XWin --help или man XWin. К сожалению, XWin не поддерживает настроечный файл, поэтому придется прописывать чать из этих опций, что и делается в следующей секции. Тут задается целый набор переменных - комментируя одни и раскрывая другие, можно добиться нужных вам эффектов.

  • fontPath - это список каталогов в которых X-Server найдет шрифты. Интересно, что на удаленном сервере может и не быть установленных шрифтов - будут использоватся те, про которые "знает" ваш XServer. Если вы хотите использовать виндовые шрифты, то Вам нужно взять архив отсюда, распаковать и собрать под Cygwin. В принципе, в README все описано. Эта утилита нужна лишь для формирования fonts.scale и, если Вы не ожидаете, в скором времени, изменения набора шрифтов, то после использования, ее вполне можно удалить. Если же вы не хотите использовать шрифты из Windows, можно просто стереть последний каталог в списке.
  • query - определяет будет ли запущен удаленный window manager. Если Вы скажете что-то вроде XWin -query <some host="">, то увидите приглашение удаленного входа на этот сервер - нечто очень похожее на rdesktop. В этом случае вы не сможете запустить приложение на вашем локальном компьютере с выводом в это XServer. Разумеется на хосте должен функционировать сервис с XDMCP
  • from - иногда этот параметр нужно указать, если Вы испытываете проблемы с -query.
  • number - если Вы намерены запускать несколько XServer-ов одновременно, то этот параметр должен быть уникальным и в формате :число. В противном случае можете его не менять - по умолчанию он равен ":0" и с помощью него определяется переменная DISPLAY. Это число может быть использовано при запуске программы с выводом в заданный XServer.
  • nodecoration - раскомментируйте, если Вы хотите, что бы окно XServer-а было лишено рамки и заголовка
  • multywindow - раскомментируйте, если Вы хотите, чтобы в качестве window manager использовалась Windows. Подробнее ниже. Не стоит определять одновременно и multywindow и nodecoration.
  • screen - если Вы не используете multywindow, т.е. XServer будеть управлять своим собственным окном, то здесь можно задать его размер. Первый параметр - это номер экрана, на тот случай, если у Вас несколько дисплеев.
  • clipboard - объединяет clipboard XServer-а и Windows. Работает не без глюков, но удобно
  • keyboard - Это целый набор опций, который определяет стандартную клавиатуру. В данном случае, кроме всего прочего, определяется возможность переключения между русским и английской раскладкой по Ctrl+Shift. За более полной документацей Вам стит заглянуть сначала сюда, а потом сюда
  • logFile - это параметр данного скрипта, не имеющий отношения к настройкам XServer-а - просто полное имя файла, куда будут складываться логи. Определите его или измените строку запуска самого сервера, чтобы эта переменная не использовалась.
  • XServer - это переменная определяет какой именно XServer будет запускаться. XWin - более старый и более стабильный. XWin_GL - эксперементальный сервер с поддержкой GLX

Как я уже говорил некоторые опции не должны быть определены одновременно (в случае нашего скрипта - не должны быть определены переменные с этими опциями). Обычно это понятно интуитивно. Например query и multywindow - ведь query запускает удаленный window manager, а multywindow рекомендует использовать встроенный виндовый. В любом случае если что-то не работает прочтите внимательно log файл - это помогает :)

Далее в нашем скрипте осуществляется запуск XServera. Он запускается в фоне, чтобы можно было выполнить запуск и других приложений, если потребуется. Если Вы запускаете удаленный window manager, то все остальные команды нужно убрать (закомментировать).

Предположим, что Вы запускаете XServer для локальной работы(Это правда очень относительное заявление, так как никто не мешает нам во время этой "локальной" работы запустить удаленные приложения. Под локальной, в данном случае, я имею в виду работу без парметра -query). Тогда следующие несколько строк помогут нам сделать минимальную настройку окружения.

  • xrdb -merge ~/.Xresources - добавляет локальные определения в нашу базу ресурсов. Это нужно, например, для параметров по умолчанию для xterm или других программ.
  • xterm -e /usr/bin/bash -l & - запуск xterm-а в фоне.
  • xsetroot -solid aquamarine4 & - установим цвет фона.

Вполне возможно Вы захотите расширить этот список или будете запускать программы каким-либо другим способом. Более подробно о запуске программ под XServer я напишу позднее

Далее запускается один из window manager-ов. Вы можете запустить один из них или использовать внутренний (переменная multywindow).

Под Cygwin портирована масса программ для работы в X-ах. Среди них есть и еще один XServer - Xnest. С точки зрения XServer-а - это XClient, который "рисует" в нем. Однако сам по себе Xnest это полноценный XServer, который поддерживает большую часть стандартных опций. Иногда он бывает полезен, например для удаленного доступа (см. выше параметр -query). Помните однако, что парметр number для такого сервера уже обязателен и должен быть уникален.

No comments: