Сборка evilwm: Xorg, оконный менеджер, панель управления
evilwm — лучший оконный менеджер
За десять лет использования X Window System я перепробовал множество оконных менеджеров. Под какими-то работал годами, какие-то просто попробовал на один зуб. И общее направление моей «эволюции» практически всегда шло к упрощению оформления рабочего стола. В конце концов, я фактически сделал свой собственный оконный менеджер. Сделан он из evilwm 0.99.25 (http://www.6809.org.uk/evilwm/).
Привожу здесь две модификации: простую, и «продвинутую».
Замечания относительно версии 1.0.0
В июне 2007 года вышел evilwm 1.0.0. Я подготовил для него набор патчей, соответствующий «продвинутой» версии (см. ниже). evilwm-1.0.0.patch.tgz
Патчи для простой модификации evilwm
Патч для файла events.c:
128c128
< case KEY_LOWER: case KEY_ALTLOWER:
—
> case KEY_LOWER:
130a131,133
> case KEY_RAISE:
> XRaiseWindow(dpy, c->parent);
> break;
139a143,145
> case KEY_MAXHEIG:
> maximise_client(c, MAXIMISE_HORZ);
> break;
141c147
< case KEY_FIX:
—
> case KEY_FIX: case KEY_FIXA:
164,165d169
< case Button2:
< sweep(c); break;
166a171,172
> sweep(c); break;
> case Button2:
Для файла keymap.h:
3a4,12
> /* девять цифровых кнопок — движения и информация
> альт-цифровая — размер
> право/лево — переключение десктопов
> вверх/вниз — вверх/вниз
> PgUp/PgDn — растянуть вертикально/горизонтально
> ins — приклеить
> end — во весь экран
> */
>
6,23c15,32
< #define KEY_TOPLEFT XK_y
< #define KEY_TOPRIGHT XK_u
< #define KEY_BOTTOMLEFT XK_b
< #define KEY_BOTTOMRIGHT XK_n
< #define KEY_LEFT XK_h
< #define KEY_RIGHT XK_l
< #define KEY_DOWN XK_j
< #define KEY_UP XK_k
< #define KEY_LOWER XK_Insert
< #define KEY_ALTLOWER XK_KP_Insert
< #define KEY_INFO XK_i
< #define KEY_MAXVERT XK_equal
< #define KEY_MAX XK_x
< #ifdef VWM
< # define KEY_FIX XK_f
< # define KEY_PREVDESK XK_Left
< # define KEY_NEXTDESK XK_Right
< #endif
—
> #define KEY_TOPLEFT XK_KP_Home
> #define KEY_TOPRIGHT XK_KP_Page_Up
> #define KEY_BOTTOMLEFT XK_KP_End
> #define KEY_BOTTOMRIGHT XK_KP_Page_Down
> #define KEY_LEFT XK_KP_Left
> #define KEY_RIGHT XK_KP_Right
> #define KEY_DOWN XK_KP_Down
> #define KEY_UP XK_KP_Up
> #define KEY_FIX XK_Insert
> #define KEY_FIXA XK_KP_Insert
> #define KEY_LOWER XK_Down
> #define KEY_INFO XK_KP_Begin
> #define KEY_RAISE XK_Up
> #define KEY_MAX XK_End
> #define KEY_MAXVERT XK_Page_Up
> #define KEY_MAXHEIG XK_Page_Down
> #define KEY_PREVDESK XK_Left
> #define KEY_NEXTDESK XK_Right
Для файла screen.c:
454c454,455
< KEY_LOWER, KEY_ALTLOWER, KEY_INFO, KEY_MAXVERT, KEY_MAX,
—
> KEY_LOWER, KEY_RAISE, KEY_INFO,
> KEY_MAX, KEY_MAXVERT, KEY_MAXHEIG,
456c457
< KEY_FIX, KEY_PREVDESK, KEY_NEXTDESK,
—
> KEY_FIX, KEY_FIXA, KEY_PREVDESK, KEY_NEXTDESK,
Накладываем патчи, и собираем. Для запуска прописываем в .xinitrc:
/home/a/bin/evilwm \
-mask1 mod4 \
-mask2 mod4 \
-altmask alt \
-snap 10 \
-fg \#999900 -bg \#000000 -fc \#000000 &
# ..другие команды
После этого основной управляющей кнопкой становится кнопка с логотипом-окошком. Буду называть её win.
Управление с клавиатуры (пользователям SithWM сочетания клавиш будут знакомы):
• win-enter — запуск xterm,
• win-tab — переключение между окнами текущего виртуального стола,
• win-esc — прибить окно,
• win-alt-esc — прибить окно намертво,
• win-1…win-8 — переключение рабочих столов,
• win-[стрелки вправо/влево] — движение по рабочим столам,
• win-insert — приклеить окно к экрану (при движении по рабочим столам окно не будет оставаться на прежнем рабочем столе, а будет следовать за вами),
• win-[стрелки вверх/вниз] — перемещение активного окна в стеке: поместить под другие окна, поместить поверх других окон,
• win-end — развернуть окно во весь экран,
• win-pagedown — развернуть окно во всю ширину экрана,
• win-pageup — развернуть окно во всю высоту экрана.
Используя клавиши на цифровой клавиатуре можно выполнить дополнительные операции:
• win-8, win-4, win-6, win-2 — перемещение окна,
• win-7, win-9, win-1, win-3 — сдвинуть окно в соответствующий угол экрана,
• win-5 — посмотреть информацию об окне: размер и заголовок окна.
Мышь:
• win-левая кнопка — перемещение окна,
• win-правая кнопка — изменение размеров окна,
• win-средняя кнопка — изменение положения окна в стеке.
Получается очень удобный оконный менеджер, которому не хватает только панели для запуска приложений (см. ниже).
«Продвинутый» evilwm
Последний год я пользуюсь более «продвинутой» модификацией evilwm. Полный набор патчей можно забрать единым архивом evilwm-0.99.25.patch.tgz.
Они накладываются сразу на несколько файлов одной командой:
patch <evilwm-0.99.25.patch
После этого, как всегда:
make; make install
Продвинутая версия отличается тем, что в ней 36 виртуальных столов, они привязаны ко всем цифрам и ко всем буквам латинского алфавита (удобно держать, скажем на столе «M» — почтового клиента, на столе «W» — vnc-клиента с открытым Windows и так далее). Стрелки переключают рабочие столы в том порядке, в каком расположены клавиши на клавиатуре (если вам это не подходит, поправьте массив KeyVDeskMap в файле events.c).
Кроме того, на клавишу еnter запускается не xterm, а evilwm-xterm. Это может быть скрипт, который запустит для вас что угодно.
Простая и удобная панелька
Я написал вот такую простенькую панель на Tcl/Tk:
#!/bin/sh
# the next line restarts using wish \
exec wish8.4 "$0" "$@"set menu { {
{#ffffff} xterm xterm
{#8888ff} mc {xterm -e mc}
} {
{#ffff00} gimp gimp
{#999999} xmms xmms
} {
{#9999ff} FF firefox
{#9999ff} mail thunderbird
} }set font {-*-verdana-bold-r-*-*-9-*-*-*-*-*-*-r}
proc next_time_step {} {
global time
set time [clock format [clock seconds] -format {%H:%M}]
after 1000 next_time_step
}proc hide_all {} {
global bottons
foreach {n p} [eval concat $bottons] { grid forget $n }
}proc show_panel {btn} {
global bottons
foreach {n p} [lindex $bottons $btn] {
grid $n -column $p -row 0 -sticky news
}
}proc click {b} {
raise .
hide_all
show_panel $b
}proc execute {cmd} {
if {[catch "exec $cmd {&}" err]} {
tk_messageBox -default ok -icon error -message $err \
-title error -type ok
}
}proc menu2bottons {menu} {
global font
set bottons {}
set c 0
foreach {m} $menu {
set i 1
set b {}
foreach {clr lab cmd} $m {
set n [label .u$c -text $lab -fg $clr -bg {#000000} -font $font \
-padx 2 -pady 0 -anchor w -borderwidth 1 -relief raised]
bind $n <Button-1> [list execute $cmd]
lappend b $n $i
incr i
incr c
}
lappend bottons $b
}
return $bottons
}set bottons [menu2bottons $menu]
set time {00:00}
set n [label .l -textvariable time -fg {#999999} -bg #000000 -font $font \
-padx 2 -pady 0 -anchor w -borderwidth 1 -relief raised]
bind $n <Button-1> {click 0}
bind $n <Button-2> {click 1}
bind $n <Button-3> {click 2}
grid $n -sticky news -column 0 -row 0
bind . <Control-q> {exit}
bind . <FocusOut> {hide_all}
wm title . {ctrl-panel}
wm transient .
wm resizable . 0 0
next_time_step
В нераскрытом состоянии это просто кнопка с часами. При нажатии на кнопку, выезжает панель с кнопками для запуска различных приложений. На каждую из трёх кнопок мыши можно «повесить» своё меню. Меню настраиваются прямо в коде панели в первых строках. Формат очевиден: указывается цвет надписи, надпись на кнопке и приложение, ассоциированное с кнопкой.
Обратите внимание на переменную font, возможно вам придётся изменить её значение.
Когда панель теряет фокус ввода — меню автоматически убирается.
Спустя четыре года
я забросил evilwm и вернулся на fvwm. Предлагаю конфигурационный файл для fvwm:
# fvwm -cmd 'FvwmM4 /root/.fvwm/.fvwm2rc-m4'
############################################ M4 MACRO
define(`MOD_KEY', `4')
define(`MMOD_KEY', `4M')
define(`CMOD_KEY', `4C')
define(`Window', `WTSF124')
define(`WindowI', `WTSF124I')
define(`WinRotCond', `(CurrentPage !Iconic !Shaded !FvwmPager !xclock)')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
RenewFunc(StartFunction)
+ I Module FvwmBackerRenewFunc(MoveAndGoToPage)
+ I Raise
+ I MoveToPage $0 $1
+ I GotoPage $0 $1RenewFunc(RaiseAndMove)
+ I Raise
+ C Iconify false
+ M Move
+ D StickRenewFunc(SelectWindow)
+ I Focus
+ I Iconify false
+ I Raise
+ I WarpToWindow -5px -5pxRenewFunc(RaiseAndStick)
+ I Raise
+ I Stick############################################ Menu
RenewMenu(RDesktop)
# …RenewMenu(Apps)
+ "Firefox" Exec exec firefox3
# …
+ "Xfontsel" Exec exec xfontselRenewMenu(Util)
+ "Utilities" Title
+ "Xterm" Exec exec xterm
+ "Root" Exec exec xterm -bg \#330000 -e sudo bash
+ "Apps" Popup Apps
+ "RDesktop" Popup RDesktop
+ "Xkill" Exec exec xkill
+ "" Nop
+ "Exit" Popup Quit-VerifyRenewMenu(Quit-Verify)
+ "Really Quit Fvwm?" Title
+ "No, Don't Quit" Nop
+ "Restart" Restart —dont-preserve-state
+ "" Nop
+ "Yes, Really Quit" QuitRenewMenu(Window-Ops)
+ "Maximize" Maximize
+ "Maximize vertical" Maximize 0 100
+ "Maximize horizontal" Maximize 100 0
+ "" Nop
+ "Iconify" Iconify on
+ "Stick" RaiseAndStick
+ "" Nop
+ "Close window" Close
+ "Destroy window" Destroy############################################ Misc
DeskTopSize 10×3
EdgeResistance 10000 20 # 10000ms — motion is impossible
EdgeScroll 100 100
SnapAttraction 10 SameType
IgnoreModifiers L25 # ignore caps-lock num-lock scroll-lock############################################ Window Title
ButtonStyle 1 Vector 5 40×60@0 40×40@1 60×40@1 60×60@0 40×60@0
ButtonStyle 2 Vector 5 20×80@0 20×20@1 80×20@1 80×80@0 20×80@0
ButtonStyle 4 Vector 4 50×75@0 80×25@0 20×25@1 50×75@1
ButtonStyle 6 Vector 10 45×65@0 45×80@0 20×80@0 20×50@1 35×50@1 \
35×65@1 35×20@1 80×20@1 80×65@0 35×65@0
ButtonStyle 8 Vector 10 20×20@0 80×20@1 \
80×40@0 65×40@0 65×70@0 50×90@0 \
35×70@0 35×40@1 20×40@0 20×20@1ButtonStyle 1 — Clear
ButtonStyle 2 — Clear MWMDecorMax
ButtonStyle 4 — Clear
ButtonStyle 6 — Clear
ButtonStyle 8 — Clear MwmDecorStick############################################ Mouse
Mouse 0 1 A Menu Window-Ops Nop
Mouse 0 2 A Maximize
Mouse 0 4 A Iconify on
Mouse 0 6 A Resize
Mouse 0 8 A RaiseAndStick
Mouse 1 T A RaiseAndMove
Mouse 2 T A Lower
Mouse 3 T A RaiseLowerMouse 1 R A Menu Util
Mouse 3 R A Menu Util
Mouse 2 R A Module FvwmPager -transient 0 0
Mouse 1 I A RaiseAndMove
Mouse 2 I A Iconify off
Mouse 3 I A Iconify offMouse 1 Window MOD_KEY RaiseAndMove
Mouse 2 Window MOD_KEY RaiseLower
Mouse 2 Window MMOD_KEY Iconify on
Mouse 3 Window MOD_KEY Resize############################################ Hot Keys
Key Right A CMOD_KEY Next WinRotCond SelectWindow
Key period A MOD_KEY Next WinRotCond SelectWindow
Key Left A CMOD_KEY Prev WinRotCond SelectWindow
Key comma A MOD_KEY Prev WinRotCond SelectWindow
Key Up A MOD_KEY Raise
Key Down A MOD_KEY Lower
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 +1pKey grave A MOD_KEY GotoPage prev
Key End Window MOD_KEY Maximize
Key Page_Up Window MOD_KEY Maximize 0 100
Key Page_Down Window MOD_KEY Maximize 100 0
Key Delete Window MOD_KEY Iconify onKey Home WindowI MOD_KEY RaiseAndStick
Key Escape WindowI MOD_KEY CloseKey Return A MOD_KEY Popup Util
Key Space A MMOD_KEY Exec xlock -mode swarm
Key Tab Window MOD_KEY RaiseLower
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,
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,
0, 2, a,
1, 2, s,
2, 2, d,
3, 2, f,
4, 2, g,
5, 2, z,
6, 2, x,
7, 2, c,
8, 2, v,
9, 2, b)############################################ Styles
Style * \
BorderWidth 0, \
HandleWidth 5, \
Font "-*-helvetica-medium-r-*-*-8-*-*-*-*-*-koi8-r", \
IconFont "-*-helvetica-medium-r-*-*-12-*-*-*-*-*-koi8-r", \
MWMFunctions, \
MWMDecor, \
HintOverride, \
MWMBorder, \
MWMButtons, \
IconBox 200×800+0+0Style xterm BorderWidth 0, HandleWidth 3, NoTitle, \
IconBox 200×800-0+0, IconFill Right Top
Style xclock BorderWidth 0, HandleWidth 0, NoTitle, Sticky
Style xmms NoTitle
Style FvwmPager NoTitle, Sticky, BorderWidth 0, HandleWidth 0############################################ Misc2
*FvwmBacker: Command (Desk 0, Page * 0) -solid gray30
*FvwmBacker: Command (Desk 0, Page * 1) -solid gray20
*FvwmBacker: Command (Desk 0, Page * 2) -solid gray10*FvwmPager: Geometry +0-0
*FvwmPager: DeskTopScale 128
*FvwmPager: Label * Pager############################################
# EOF