Программирование
On-line приложения
Почитать
Web-сервер Apache
Печать и форматирование
MySQL
Разные рецепты
Сборка/установка
Справки
Философия
Мой опыт
Скачать
Программы на 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, возможно вам придётся изменить её значение.

Когда панель теряет фокус ввода — меню автоматически убирается.

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

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

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