Программирование
On-line приложения
Почитать
Web-сервер Apache
Печать и форматирование
MySQL
Разные рецепты
Сборка/установка
Редактор vi
Справки
Философия
Мой опыт
Скачать
Программы на Tcl/Tk (GUI)
Программы на Python/Tk (GUI)
Программы (CLI)
Help
Хобби
Фракталы
on-line
Язык для рисования фракталов
Гиперкуб
Теория относительности
Ампуллярии
Преподавание
Студенту/абитуриенту
Мой опыт
Автора!

Сборка evilwm

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 FvwmBacker

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

RenewFunc(RaiseAndMove)
 + I Raise
 + C Iconify false
 + M Move
 + D Stick

RenewFunc(SelectWindow)
 + I Focus
 + I Iconify false
 + I Raise
 + I WarpToWindow -5px -5px

RenewFunc(RaiseAndStick)
 + I Raise
 + I Stick

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

RenewMenu(RDesktop)
# ...

RenewMenu(Apps)
 + "Firefox"       Exec exec firefox3
# ...
 + "Xfontsel"      Exec exec xfontsel 

RenewMenu(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-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"            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 10x3
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  40x60@0 40x40@1 60x40@1 60x60@0 40x60@0
ButtonStyle 2 Vector 5  20x80@0 20x20@1 80x20@1 80x80@0 20x80@0
ButtonStyle 4 Vector 4  50x75@0 80x25@0 20x25@1 50x75@1
ButtonStyle 6 Vector 10 45x65@0 45x80@0 20x80@0 20x50@1 35x50@1 \
                        35x65@1 35x20@1 80x20@1 80x65@0 35x65@0
ButtonStyle 8 Vector 10 20x20@0 80x20@1 \
                        80x40@0 65x40@0 65x70@0 50x90@0 \
                        35x70@0 35x40@1 20x40@0 20x20@1

ButtonStyle 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 RaiseLower

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 RaiseAndMove
Mouse 2  I  A Iconify off
Mouse 3  I  A Iconify off

Mouse 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 +1p

Key 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 on

Key Home      WindowI  MOD_KEY RaiseAndStick
Key Escape    WindowI  MOD_KEY Close

Key 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 200x800+0+0

Style xterm BorderWidth 0, HandleWidth 3, NoTitle, \
            IconBox 200x800-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

Эта страница набрала немалую популярность, её посещает множество людей, поэтому я решил провести небольшое исследование. Если у вас есть комментарий, если вы сочли полученную информацию полезной, не полной, или вообще бесполезной, вы можете высказать своё мнение, пожелания, дополнения.

Если вы ожидаете получить от меня ответ или разъяснение, пожалуйста укажите e-mail.
Ваше сообщение не появится на странице, а просто отправится мне.

© 1999 − 2010 Мичурин Алексей — http://www.michurin.com.ru/