☰ Оглавление

Настройка Xorg

Сразу оговорюсь, я настраиваю Xorg руками и предпочитаю лёгкие оконные менеджеры. Я знаю, что большинство пользователей делает не так, но надеюсь, что и они найдут здесь что-нибудь полезное.

Информационные утилиты Xorg

При настройке оконного интерфейса (оконного менеджера) часто оказывается необходима информация об окнах того или иного приложения. Получить её можно двумя командами xwininfo и xprop.

При настройке обработки событий (клавиатура/мышь) очень полезна бывает утилита xev.

.Xresources

Xterm

.Xresources для древних систем. Тут используются древние шрифты, восьмибитная кодировка… Но это работает всегда:

Xft.rgba:       none
Xft.hinting:    true
Xft.autohint:   false
Xft.hintstyle:  hintfull
Xft.antialias:  true
Xft.dpi:        84
Rxvt*scrollBar: false
Rxvt*boldFont:  -*-fixed-*-*-*-*-*-*-*-*-*-*-koi8-r
Rxvt*geometry:  80x30
Rxvt*visualBell:        true
Rxvt*keysym.0xFF50:     \e[H
Rxvt*keysym.0xFF57:     \e[F
XTerm*font:     -*-fixed-*-*-*-*-*-*-*-*-*-*-koi8-r
XTerm*font2:    -*-fixed-*-*-*-*-6-*-*-*-*-*-koi8-*
XTerm*font3:    -misc-fixed-medium-*-*-*-8-*-*-*-*-*-koi8-r
XTerm*font4:    -misc-fixed-medium-*-*-*-10-*-*-*-*-*-koi8-r
XTerm*font5:    -misc-fixed-medium-*-*-*-15-*-*-*-*-*-koi8-r
XTerm*font6:    -sony_koi8_ru-fixed-medium-*-*-*-24-*-*-*-*-*-koi8-r
XTerm*color0:   #000000
XTerm*color1:   #9e1828
XTerm*color2:   #aece92
XTerm*color3:   #968a38
XTerm*color4:   #414171
XTerm*color5:   #963c59
XTerm*color6:   #418179
XTerm*color7:   #bebebe
XTerm*color8:   #666666
XTerm*color9:   #cf6171
XTerm*color10:  #c5f779
XTerm*color11:  #fff796
XTerm*color12:  #4186be
XTerm*color13:  #cf9ebe
XTerm*color14:  #71bebe
XTerm*color15:  #ffffff
XTerm*foreground:       #bebebe
XTerm*background:       #000000
XTerm*colorBDMode:      true
XTerm*colorBD:  #82cd00
XTerm*colorULMode:      true
XTerm*colorUL:  #d4cd00
XTerm*translations:    #override \n\
  ~Ctrl<Btn3Up>: insert-selection(CLIPBOARD, CUT_BUFFER1) \n\
  ~Ctrl<Btn3Down>: ignore()
XTerm*locale:   false
XTerm*allowC1Printable: true
XTerm*Background:       #000000
XTerm*Foreground:       #bebebe
XTerm*VisualBell:       true
XClock*width:   60
XClock*height:  60
XClock*hourColor:       #ffffff
XClock*minuteColor:     #ffffff
XClock*secondColor:     #ffffff
XClock*majorColor:      #ffffff
XClock*minorColor:      #696969
XClock*padding: 3
XClock*background:      #121212

Более современная настройка. Работает с UTF-8, сглаженными шрифтами и поддерживает изменение цветов налету. Последнюю фичу я использую постоянно в таком ключе: залогинился на другую систему — Alt-F5 (например) — подкрасили окошечко.

XTerm*faceName: "DejaVu Sans Mono:style=Book"
!XTerm*faceName: "Andale Mono"

XTerm*faceSize: 14
XTerm*faceSize1: 8
XTerm*faceSize2: 9
XTerm*faceSize3: 10
XTerm*faceSize4: 12
XTerm*faceSize5: 14
XTerm*faceSize6: 16

XTerm*color0: #000000
XTerm*color1: #9e1828
XTerm*color2: #aece92
XTerm*color3: #968a38
XTerm*color4: #414171
XTerm*color5: #963c59
XTerm*color6: #418179
XTerm*color7: #bebebe
XTerm*color8: #666666
XTerm*color9: #cf6171
XTerm*color10: #c5f779
XTerm*color11: #fff796
XTerm*color12: #4186be
XTerm*color13: #cf9ebe
XTerm*color14: #71bebe
XTerm*color15: #ffffff
!XTerm*colorAttrMode: true
! color 7 and 0
XTerm*foreground:             #bebebe
XTerm*background:             #000000
!XTerm*colorBDMode: true
!XTerm*colorBD: #82cd00
!XTerm*colorBL
!XTerm*colorRV
!XTerm*colorULMode: true
!XTerm*colorUL: #d4cd00

! на правой кнопке вставка из CLIPBOARD
*VT100*translations: #override \n\
     ~Ctrl<Btn3Up>: insert-selection(CLIPBOARD, CUT_BUFFER1) \n\
     ~Ctrl<Btn3Down>: ignore() \n\
  Meta<Key>F1: interpret("\033]111\007") \
               interpret("\033]112\007") \
               interpret("\033]113\007") \
               interpret("\033]114\007") \n\
  Meta<Key>F2: interpret("\033]12;#ff0000\007") \
               interpret("\033]13;#000000\007") \
               interpret("\033]14;#ff0000\007") \n\
  Meta<Key>F3: interpret("\033]12;#00ff00\007") \
               interpret("\033]13;#000000\007") \
               interpret("\033]14;#00ff00\007") \n\
  Meta<Key>F4: interpret("\033]12;#ffff00\007") \
               interpret("\033]13;#000000\007") \
               interpret("\033]14;#ffff00\007") \n\
  Meta<Key>F5: interpret("\033]11;#300000\007") \n\
  Meta<Key>F6: interpret("\033]11;#003000\007") \n\
  Meta<Key>F7: interpret("\033]11;#303000\007") \n\
  Meta<Key>F11: smaller-vt-font() \n\
  Meta<Key>F12: larger-vt-font()

XTerm*locale: false
!
XTerm*allowC1Printable: true
XTerm*Background: #000000
XTerm*Foreground: #bebebe
XTerm*VisualBell: true

TightVNC

vncviewer*grabKeyboard: true
vncviewer*encodings: tight
vncviewer*qualityLevel: 4
vncviewer*requestedDepth: 8

Шрифты

!Xft.rgba: none
!Xft.rgba: rgb
Xft.hinting: true
Xft.autohint: false
!Xft.hintstyle: hintslight
Xft.hintstyle: hintfull
Xft.antialias: true
Xft.dpi: 84

xfontsel

XFontSel*viewPort.sampleText.background: #000000
XFontSel*viewPort.sampleText.foreground: #cccccc

.fvwm2rc

Для FVWM 2.6. Используется m4.

# fvwm -c 'FvwmM4 ~/.fvwm/.fvwm2rc-m4-2.6'

############################################ M4 MACRO

define(`MOD_KEY',  `4')
define(`MMOD_KEY', `4M')
define(`CMOD_KEY', `4C')
define(`Window',   `WTSF124680')
define(`WindowI',  `WTSF124680I')
define(`WinRotCond', `(AcceptsFocus, CurrentPage, !Iconic, !Shaded, !FvwmPager)')

define(`jumpmap', `ifelse(`$#', `0', ,
                          `$#', `1', ,
                          `$#', `2', ,
                          `
Key `$3' A  MOD_KEY GotoPage `$1' `$2'
Key `$3' A CMOD_KEY GotoPage `$1' `$2'
Key `$3' A MMOD_KEY MoveAndGoToPage `$1' `$2'
jumpmap(shift(shift(shift($@))))')')

define(`RenewFunc', `
DestroyFunc `$1'
AddToFunc `$1'')

define(`RenewMenu', `
DestroyMenu `$1'
AddToMenu `$1'')

############################################ Functions

# open_icon_library-full
ImagePath /home/a/.fvwm/i

# UTIL

RenewFunc(RIconify)
# + I Layer 0 2
 + I Iconify true
 + I Raise

RenewFunc(RDeIconify)
 + I Iconify false
# + I Layer 0 4
# + I All (CurrentPage, Iconic) PlaceAgain Icon
 + I Raise

# START

RenewFunc(StartFunction)
 + I Module FvwmBacker

# UTIL

RenewFunc(normalization_of_the_cursor_position)
 + I WarpToWindow -5px -5px

# OPERATION

RenewFunc(MoveAndGoToPage)
 + I Raise
 + I MoveToPage $0 $1
 + I GotoPage $0 $1

RenewFunc(MoveAndGoToPagePrev)
 + I Raise
 + I MoveToPage prev
 + I GotoPage prev

RenewFunc(RaiseLowerOrMove)
 + C RaiseLower
 + M Raise
 + M Move

RenewFunc(RaiseLowerOrResize)
 + C RaiseLower
 + M Resize
 + D Stick

RenewFunc(RaiseAndResizeOrIconify)
 + I Raise
 + C RIconify
 + M Resize

RenewFunc(RaiseAndMoveOrIconify)
 + I Raise
 + D RIconify
 + M Move

RenewFunc(RaiseAndStick)
 + I Raise
 + I Stick

RenewFunc(SelectWindow)
 + I Focus
 + I RDeIconify
 + I normalization_of_the_cursor_position

RenewFunc(SelectNextWindow)
 + I Next WinRotCond SelectWindow

RenewFunc(SelectPrevWindow)
 + I Prev WinRotCond SelectWindow

RenewFunc(DeIconifyOrMove)
 + I Raise
 + C RDeIconify
 + D RDeIconify
 + M Move

RenewFunc(MoveAndGo)
 + I Move $0 $1
 + I normalization_of_the_cursor_position

RenewFunc(MaximizeAndGo)
 + I Maximize $0 $1
 + I normalization_of_the_cursor_position

############################################ Menu

RenewMenu(RDesktop)
 + "my"            Exec exec rdesktop # дописать своё

RenewMenu(Apps)
 + "Firefox"       Exec exec firefox
 + "Chromium"      Exec exec chromium
 + "GFtp"          Exec exec gftp
 + "Thunderbird"   Exec exec thunderbird
 + "Tkabber"       Exec exec tkabber
 + "GIMP"          Exec exec gimp
 + ""              Nop
 + "Xfontsel"      Exec exec xfontsel

#AddToMenu Browser
# + DynamicPopupAction PipeRead "fvwm-menu-directory -r -na Browser -d / -s"

#AddToFunc FuncFvwmMenuDirectory
# + I PipeRead "fvwm-menu-directory —command-title '' -d '$0'"

RenewMenu(Util)
 + "Utilities"     Title
 + "Xterm"         Exec exec xterm
 + "Root"          Exec exec xterm -bg \#180000 -e sudo bash
 + "Apps"          Popup Apps
 + "RDesktop"      Popup RDesktop
 + "Xkill"         Exec exec xkill
 + "`Window'"      Popup Window-Ops
 + ""              Nop
# + "My Browser" Menu Browser
# + MissingSubmenuFunction FuncFvwmMenuDirectory
# + "My Browser2" Popup /home
# + ""              Nop
 + "Exit"          Popup Quit-Verify

RenewMenu(Quit-Verify)
 + "Really Quit Fvwm?"   Title
 + "No, Don't Quit"      Nop
 + "Restart"             Restart —dont-preserve-state
 + ""                    Nop
 + "Yes, Really Quit"    Quit

RenewMenu(Window-Ops)
 + "Maximize"            MaximizeAndGo 100 100
 + "Maximize vertical"   MaximizeAndGo 0 100
 + "Maximize horizontal" MaximizeAndGo 100 0
 + ""                    Nop
 + "Iconify"             RIconify
 + "Stick"               RaiseAndStick
 + ""                    Nop
 + "StaysOnTop"          Layer 0 6
 + "StaysPut"            Layer 0 4
 + "StaysOnBottom"       Layer 0 2
 + ""                    Nop
 + "WindowShade"         WindowShade
 + ""                    Nop
 + "Close window"        Close
 + "Destroy window"      Destroy

############################################ Misc

DeskTopSize 12x3
EdgeResistance 10000
Style * EdgeMoveResistance 20
EdgeScroll 0 0 # do not scroll
Style * SnapAttraction 10 SameType
IgnoreModifiers L25 # ignore caps-lock num-lock scroll-lock

############################################ Window Title

# menu
ButtonStyle 1 Vector 5 \
  40x60@0 40x40@1 60x40@1 60x60@0 40x60@0
# trash
ButtonStyle 2 Vector 7 \
  20x20@0 80x20@1 80x30@0 \
  65x80@0 35x80@0 \
  20x30@1 20x20@1
# icon
ButtonStyle 4 Vector 4 \
  50x75@0 80x25@0 20x25@1 50x75@1
# max
ButtonStyle 6 Vector 5 \
  20x80@0 20x20@1 80x20@1 80x80@0 20x80@0
# stick
ButtonStyle 8 Vector 10 \
  20x20@0 80x20@1 \
  80x40@0 65x40@0 65x70@0 50x90@0 \
  35x70@0 35x40@1 20x40@0 20x20@1
# resize
ButtonStyle 0 Vector 10 \
  45x65@0 45x80@0 20x80@0 20x50@1 35x50@1 \
  35x65@1 35x20@1 80x20@1 80x65@0 35x65@0

ButtonStyle 1 - Clear
ButtonStyle 2 - Clear
ButtonStyle 4 - Clear
ButtonStyle 6 - Clear MwmDecorMax
ButtonStyle 8 - Clear MwmDecorStick
ButtonStyle 0 - Clear

############################################ Mouse

Mouse 1  1  A Menu Window-Ops Nop
Mouse 1  2  MOD_KEY Destroy
Mouse 1  2  A Close
Mouse 1  4  A RIconify
Mouse 1  6  A MaximizeAndGo 100 100
Mouse 1  8  A RaiseAndStick
Mouse 1  0  A Resize
Mouse 1  T  A RaiseAndMoveOrIconify
Mouse 2  T  A Lower
Mouse 3  T  A RaiseLowerOrResize
Mouse 4  T  A WindowShade True # up
Mouse 5  T  A WindowShade False # down

Mouse 1  R  A Menu Util
Mouse 3  R  A Menu Util
Mouse 2  R  A Module FvwmPager -transient 0 0
Mouse 1  I  A DeIconifyOrMove
Mouse 2  I  A Stick
Mouse 3  I  A Iconify off

Mouse 1  Window  MOD_KEY RaiseLowerOrMove
Mouse 2  Window  MOD_KEY Lower
Mouse 3  Window  MOD_KEY RaiseAndResizeOrIconify

Mouse 3  Window  MMOD_KEY StrokeFunc
Stroke 0    0 Window  MMOD_KEY Move
Stroke N357 0 Window  MMOD_KEY Move 0 0
Stroke N456 0 Window  MMOD_KEY Move -0 w
Stroke N654 0 Window  MMOD_KEY Move 0 w
Stroke N258 0 Window  MMOD_KEY Move w 0
Stroke N852 0 Window  MMOD_KEY Move w -0
Stroke N951 0 Window  MMOD_KEY Move 0 -0
Stroke N159 0 Window  MMOD_KEY Move -0 0
Stroke N753 0 Window  MMOD_KEY Move -0 -0

############################################ Hot Keys

Key Up        WindowI  MOD_KEY Raise
Key Up        R        MOD_KEY SelectNextWindow
Key Down      WindowI  MOD_KEY Lower
Key Down      R        MOD_KEY SelectNextWindow
Key Right     A        MOD_KEY GotoPage +1p +0p
Key Left      A        MOD_KEY GotoPage -1p +0p
Key Up        A       CMOD_KEY GotoPage +0p -1p
Key Down      A       CMOD_KEY GotoPage +0p +1p
Key Right     WindowI MMOD_KEY MoveAndGoToPage +1p +0p
Key Left      WindowI MMOD_KEY MoveAndGoToPage -1p +0p
Key Up        WindowI MMOD_KEY MoveAndGoToPage +0p -1p
Key Down      WindowI MMOD_KEY MoveAndGoToPage +0p +1p

Key grave     A        MOD_KEY GotoPage prev
Key grave     A       MMOD_KEY MoveAndGoToPagePrev

Key End       Window   MOD_KEY MaximizeAndGo 100 100
Key Page_Up   Window   MOD_KEY MaximizeAndGo 0 100
Key Page_Down Window   MOD_KEY MaximizeAndGo 100 0
Key Delete    Window   MOD_KEY RIconify
Key End       R        MOD_KEY SelectNextWindow
Key Page_Up   R        MOD_KEY SelectNextWindow
Key Page_Down R        MOD_KEY SelectNextWindow
Key Delete    R        MOD_KEY SelectNextWindow

Key Home      WindowI  MOD_KEY RaiseAndStick
Key Escape    WindowI  MOD_KEY Close
Key Escape    WindowI MMOD_KEY Destroy

Key Return    A        MOD_KEY Popup Util

Key Space     A       MMOD_KEY Exec xlock -mode swarm

Key Tab       A        MOD_KEY SelectNextWindow
Key BackSpace A        MOD_KEY SelectPrevWindow
Key KP_Add    A        MOD_KEY SelectNextWindow
Key KP_Subtract A      MOD_KEY SelectPrevWindow

Key KP_Home   Window   MOD_KEY MoveAndGo      0      0
Key KP_Up     Window   MOD_KEY MoveAndGo 50-50w      0
Key KP_Prior  Window   MOD_KEY MoveAndGo     -0      0
Key KP_Left   Window   MOD_KEY MoveAndGo      0 50-50w
Key KP_Begin  Window   MOD_KEY MoveAndGo 50-50w 50-50w
Key KP_Right  Window   MOD_KEY MoveAndGo     -0 50-50w
Key KP_End    Window   MOD_KEY MoveAndGo      0     -0
Key KP_Down   Window   MOD_KEY MoveAndGo 50-50w     -0
Key KP_Next   Window   MOD_KEY MoveAndGo     -0     -0

jumpmap(
 0, 0, 1,
 1, 0, 2,
 2, 0, 3,
 3, 0, 4,
 4, 0, 5,
 5, 0, 6,
 6, 0, 7,
 7, 0, 8,
 8, 0, 9,
 9, 0, 0,
10, 0, minus,
11, 0, equal,
 0, 1, q,
 1, 1, w,
 2, 1, e,
 3, 1, r,
 4, 1, t,
 5, 1, y,
 6, 1, u,
 7, 1, i,
 8, 1, o,
 9, 1, p,
10, 1, bracketleft,
11, 1, bracketright,
 0, 2, a,
 1, 2, s,
 2, 2, d,
 3, 2, f,
 4, 2, g,
 5, 2, h,
 6, 2, j,
 7, 2, k,
 8, 2, l,
 9, 2, semicolon,
10, 2, apostrophe,
11, 2, backslash)

Key  F1   A        MOD_KEY Exec amixer set Front,0 5%-,5%- unmute
Key  F2   A        MOD_KEY Exec amixer set Front,0 5%+,5%+ unmute

############################################

define(`COMMON_FONT', `"-*-helvetica-medium-r-*-*-14-*-*-*-*-*-koi8-*"')
define(`xstyle',`Style `$2' `$1'
ifelse($#,2,`',`xstyle(`$1',shift(shift($@)))')')

Colorset 0 fg #ff0000, bg #696969, hi #939393, sh #343434

Style * \
  BorderWidth 0, \
  HandleWidth 3, \
  Font COMMON_FONT, \
  MWMFunctions, \
  MWMDecor, \
  HintOverride, \
  MWMBorder, \
  MWMButtons, \
  IconFont COMMON_FONT, \
  IconBackgroundColorset 0, \
  IconBox 400x400+200-0, \
  IconFill Left Bottom, \
  IconBackgroundRelief 2, \
  IconBackgroundPadding 0, \
  Icon cameramonitor.png, \
  IconOverride
#, StickyIcon

# , IconBox 200x800-0+0, IconFill Right Top
xstyle(`IconBox 400x400+600-0, IconFill Right Bottom', xterm)
xstyle(`!Title', xterm, rxvt, xclock, pclock, display, FvwmPager, xmms)
xstyle(`BorderWidth 0, HandleWidth 0', xclock, display, FvwmPager, xmms)
xstyle(`Sticky', xclock, FvwmPager)

define(`seticons',`Style $1 Icon $2
ifelse($#,2,`',`seticons(shift(shift($@)))')')

seticons(
xterm,    konsole.png,
mplauer,  mplayer.png,
chromium, chromium-2.png,
firefox,  firefox_alt.png,
Firefox,  firefox_alt.png,
gimp,     gimp-3.png,
gqview,   graphics-2.png,
tkabber,  internet-chat-2.png,
googleearth-bin, internet-web-browser-7.png,
xmms,     juk-2.png,
Licq,     licq-2.png,
Thunderbird, internet-mail-2.png
)

# xprop xwininfo

MenuStyle * Font COMMON_FONT

############################################

define(`WP_PATH', `/home/a/.fvwm/bg5')

define(`loop_row', `ifelse($#,3,`loop_row($1,$2,$3,0)',`dnl
Colorset $2 TiledPixmap WP_PATH/bg-$4-$3.xpm
*FvwmBacker: Command (Desk *, Page $3 $4) Colorset $2
ifelse(eval($4<$1),1,`loop_row($1,incr($2),$3,incr($4))')dnl
')')

define(`loop_line',`ifelse($#,2,`loop_line($1,$2,1,0)',`dnl
loop_row($2, eval(`($3-1)*($2+1)+1'), $4)dnl
ifelse(eval($4<$1),1,`loop_line($1,$2,incr($3),incr($4))')dnl
')')

loop_line(11, 2)

############################################

*FvwmPager: Geometry +0-0
*FvwmPager: DeskTopScale 128
*FvwmPager: Label * Pager
*FvwmPager: Font none

############################################

#*FvwmWharfColorset 0
#*FvwmWharfGeometry -0+0
#*FvwmWharf Clock nil MaxSwallow "pclock" xclock -geometry 64x64 -padding 0

#Style "FvwmWharf" BorderWidth 1,\
#                 NoTitle,\
#                 NoHandles,\
#                 Sticky,\
#                 ForeColor black,\
#                 BackColor rgb:1c/2/2,\
#                 FVWMBorder,\
#                 WindowListSkip

#Module FvwmWharf

############################################
# EOF

Добавление эффектов с помощью xcompmgr

Утилита xcompmgr является надстройкой над любым оконным менеджером, которая добавляет композитности. Если вы используете достаточно простой, лёгкий и быстрый (в том числе и в настройке) оконный менеджер (я, например, такие очень люблю), но хотите добавить в него рок-н-рола в виде теней, прозрачности и прочих радостей, то xcompmgr — это то, что вам надо.

Возможные проблемы

Единственная проблема, которую я видел с этой утилитой, это ошибка вида:

error 143: BadPicture request 139 minor 8 serial 100383

В разных версиях строчка немного разная, но код 143 неизменен.

Проблема заключается в том, какой утилитой вы устанавливаете фон. Приём display -window root background.png — не подходит; xloadimage — тоже. Я ни разу не видел проблем с feh:

feh --bg-scale background.png

Используйте её и проблемы пропадут.

Параметры

Чтобы увидеть эффекты, обязательно указывайте ключ -c:

xcompmgr -c

Вызовы feh и xcompmgr можно разместить раз и навсегда в .xinitrc.

Более развёрнутый пример:

xcompmgr -c -r 9 -l -12 -t -12 -c .5 -f -I .2 -O .2 -D 20 -F

Здесь мы задали параметры тени (сделали её поменьше размером, но более отчётливой) и ускорили эффекты плавного появления и пропадания окон (красота — это прекрасно, но замедлять работу не надо). Опция -F нужна только если вы используете утилиту transset, работа которой становится плавной.

Управление прозрачностью — transset

Утилита transset позволяет управлять прозрачностью окна. Сейчас появилась и набрала популярность более «продвинутая» утилита transset-df с расширенной функциональностью. Советую использовать её.

Чтобы посмотреть, как она работает, просто запустите её без параметров и укажите мышкой любое окно. Оно станет полупрозрачным. Повторите — окно вернётся в прежнее состояние.

Но больше пользы от этой утилиты можно получить, если настроить её запуск из оконного менеджера.

Например, моём любимом FVWM, я повесил её на знаки «больше»/«меньше». Теперь они уменьшают и увеличивают прозрачность:

Key comma WTSF12346I MOD1 Exec exec transset-df --actual --dec .1 --min .4
Key period WTSF12346I MOD1 Exec exec transset-df --actual --inc .1

Честно, сказать, пользуюсь этим не часто. Но иногда удобно видеть, что под текущим окном в tail -f serve.log произошло движение.