nixp.ru v3.0

23 октября 2017,
понедельник,
14:25:23 MSK

DevOps с компанией «Флант»
Genie написал 30 ноября 2004 года в 20:13 (928 просмотров) Ведет себя как мужчина; открыл 40 тем в форуме, оставил 4758 комментариев на сайте.

Итак, несколько слов о том, как реализовать то, что мне хотелось.

По нажатию комбинации клавиш (или по пункту в меню, или событию, или….) запускать программу, если эта программа была не запущена. Или переёти к ней, если она была запущена.

Так как конфиг у меня не монолитный, а разбит по частям, то это у меня в разных файлах. В общем, кому как больше нравится.

# Run Mozilla, Opera
Key w           A       4       RunOrGoto "*Mozilla*" mozilla
Key w           A       4M      RunOrGoto "*Opera*" opera
# Run rxvt
Key s           A       4       Exec rxvt -g 96x40 -T "Терминал"

тут у меня не указывается, на какой именно page пускать, но это можно сделать указав параметры программе. man на тему ресурсов.

Теперь о самой RunOrGoto:

# Run program if window doesn't exists
DestroyFunc RunOrGoto
AddToFunc RunOrGoto
+ I All ($0) MyFocus
+ I None ($0) Exec $1

Вот, собственно, об этом и всё ;)

Genie

Собственно, остальные часто используемые кнопки:

$ cat ~/.fvwm/keys.hook
IgnoreModifiers L25
Key F4          WTSFI   M       Close
Key F2          WTSFI   4       Popup Window-Ops
Key F12         A       M       Restart
Key F12         A       MC      UpdateClock
Key F1          WTSFI   M       Maximize grow grow
Key F1          WTSFI   C       MyIcon
Key F1          A       4       Menu /MyMenu
Key Tab         A       4       WindowList Root c c
Key Escape      A       4       Menu /Debian
Key Tab         A       M       Next [CurrentPage, !Iconic] Focus-and-Raise
Key Tab         A       MC      Next [CurrentPage] Focus-and-Raise
Key Grave       A       4       Popup Pages
# Управление XMMS
# стоп
Key XF86AudioStop A     A       Exec exec xmms -s
# старт
Key XF86AudioPlay A     A       Exec exec xmms -t
# следующая
Key XF86AudioNext A     A       Exec exec xmms -f
# предыдущая
Key XF86AudioPrev A     A       Exec exec xmms -r
# Управление громкостью
Key XF86AudioLowerVolume A S    Exec exec aumix -d /dev/mixer -w-5
Key XF86AudioLowerVolume A N    Exec exec aumix -d /dev/mixer1 -w-5
Key XF86AudioRaiseVolume A S    Exec exec aumix -d /dev/mixer -w+5
Key XF86AudioRaiseVolume A N    Exec exec aumix -d /dev/mixer1 -w+5
Key XF86Calculator A    S       Exec exec aumix -I -d /dev/mixer
Key XF86Calculator A    N       Exec exec aumix -I -d /dev/mixer1
Key XF86AudioMute A     S       Exec exec aumix -d /dev/mixer -w0
Key XF86AudioMute A     N       Exec exec aumix -d /dev/mixer1 -w0
# Хранитель экрана
Key XF86Sleep  A       S       Exec exec xlock -remote -nice 19 -nolock -mode random -modelist allgl -fullrandom
Key XF86Sleep   A       N       Exec exec xlock -remote -nolock -mode blank
# Снимок экрана
Key Print       A       N       Exec exec screenshot.pl
# Управление навигацией по большому экрану
Key Left        A       M       -
Key Left        A       4       Scroll -100 +0
Key Left        A       4S      Scroll -25 +0
Key Right       A       M       -
Key Right       A       4       Scroll +100 +0
Key Right       A       4S      Scroll +25 +0
Key Up          A       M       -
Key Up          A       4       Scroll +0 -100
Key Up          A       4S      Scroll +0 -25
Key Down        A       M       -
Key Down        A       4       Scroll +0 +100
Key Down        A       4S      Scroll +0 +25
Key w           A       S4      RunOrGoto "VMware*Workstation" vmware
Key w           A       4       RunOrGoto "*Mozilla*" mozilla
Key w           A       4M      RunOrGoto "*Opera*" opera
Key s           A       4       Exec rxvt -g 96x40 -T "Терминал"
Key e           A       4       Exec rxvt -g 96x40 -T "Midnight Commander" -e /usr/bin/mc
Key a           A       4       RunOrGoto "*Sylpheed*" sylpheed
Key a           A       S4      RunOrGoto "Licq*" licq
Key v           A       4       Exec exec /home/genie/bin/playcd1
Key v           A       M4      Exec exec rxvt -xrm "*Page:0 2 2" -g 96x45+0-0 -T Player_Console -e /home/genie/bin/playcd0 -ao oss:/dev/dsp1
Key c           A       M4      Exec exec /home/genie/bin/clips1
Key c           A       CM4     Exec exec rxvt -xrm "*Page:0 2 2" -g 96x45+0-0 -T Player_Console -e /home/genie/bin/clips0 -ao oss:/dev/dsp1
# Управление расположением и перемещением оконка
Key KP_Left     W       4       MyAnimatedMove 0 keep
Key KP_Right    W       4       MyAnimatedMove -0 keep
Key KP_Up       W       4       MyAnimatedMove keep 0
Key KP_Down     W       4       MyAnimatedMove keep -0
Key KP_Home     W       4       MyAnimatedMove 0 0
Key KP_End      W       4       MyAnimatedMove 0 -0
Key KP_Prior    W       4       MyAnimatedMove -0 0
Key KP_Next     W       4       MyAnimatedMove -0 -0
Key Home        W       4       Maximize grow 0
Key End         W       4       Maximize 0 grow
Key Delete      W       4       Function MyIcon
Genie

ещё немного тут

теперь о динамических менюшках.

в главном меню строчка:

+ "Мультимедиа%video.png%"      Popup /MyMenu/MMedia

и смо оно:

AddToMenu /MyMenu/MMedia
+ DynamicPopupAction Function MMediaMenu
AddToFunc MMediaMenu
+ I DestroyMenu recreate /MyMenu/MMedia
+ I AddToMenu /MyMenu/MMedia "Мультимедиа%video.png%" Title
+ I AddToMenu /MyMenu/MMedia "Вставь CD в привод...%cdrom.png%" Exec exec /home/genie/bin/playcd1
+ I PipeRead 'for i in /mnt/media/grab/*.{iso,bin}; do ii=`basename \"$i\"`; echo AddToMenu /MyMenu/MMedia \\\"${ii%.???}\%video.png\%\\\" Exec exec $HOME/bin/play_iso \\\"$i\\\"; done'
+ I PipeRead 'for i in /mnt/media/grab/*.avi; do ii=`basename \"$i\"`; echo AddToMenu /MyMenu/MMedia \\\"${ii%.???}\%video.png\%\\\" Exec exec $HOME/bin/play_avi \\\"$i\\\"; done'
Genie

Немного продолжим ;)

Раскраска менюшек.

Простой вертикальный градиент с наибольшей яркостью по центру.

$ cat ~/.fvwm/menu.hook
#Раскраска всплывающих менюшек
MenuStyle * Foreground grey90
MenuStyle * SeparatorsShort
MenuStyle * Hilight3DOff, HilightBack black, ActiveFore white
MenuStyle * Animation
MenuStyle * TrianglesSolid
MenuStyle * Font -monotype-arial-medium-r-normal-*-*-80-*-*-p-*-koi8-r fvwm, PopupOffset 1 90
MenuStyle * MenuFace VGradient 128 2 royalblue3 50 royalblue1 50 royalblue4
Read menu/window-ops.menu
Read menu/my.menu

моё основное меню такое вот:

$ cat ~/.fvwm/menu/my.menu
Read menu/my_console.menu
Read menu/my_network.menu
Read menu/my_graphix.menu
Read menu/my_games.menu
Read menu/my_actions.menu
Read menu/my_config.menu
DestroyMenu /MyMenu
AddToMenu /MyMenu "Моё меню" Title Top
+ "Консоль%lilo-term.xpm%"      Popup /MyMenu/Console
+ "Сетевое%network.xpm%"        Popup /MyMenu/Network
+ "Графика%graphix.xpm%"        Popup /MyMenu/Graphix
+ "Главное%debian-logo.xpm%"    Popup /Debian
+ "Мультимедиа%video.png%" Popup /MyMenu/MMedia
+ "Игрушки%games.xpm%"          Popup /MyMenu/Games
+ "Действия%actions.xpm%"       Popup /MyMenu/Actions

Соответственно, в каждом и находится то, что и описано.

Genie

ну, а теперь одно из самых сложных.

заголовок окна. который включает в себя несколько индикаторов ;) реально их два — часы и индикатор текущей page.

каждую минуту пускается вот такой скрипт:

$ cat ~/bin/cron/1m/fvwm.PixmapClock
#!/bin/sh
lock=PixMapClock.lock
plck=/dev/shm/${LOGNAME}/lock
pclk=/dev/shm/${LOGNAME}/pix
mkdir -p $plck $pclk
    [ `pidof FvwmCommandS` ] && FvwmCommand 'MyChangePage' 2>/dev/null

а сама фнкция описывается в файлике ~/.fvwm/func.hook:

DestroyFunc MyChangePage
AddToFunc MyChangePage
+ I Exec $[HOME]/.fvwm/bin/pix.update "$[page.nx]$[page.ny]"
+ I UpdateClock
DestroyFunc UpdateClock
AddToFunc UpdateClock
+ I DestroyDecor recreate Default
+ I AddToDecor Default
+ I TitleStyle\
 (VGradient 128 2 royalblue1 50 royalblue3 50 royalblue4)\
 Inactive (VGradient 128 2 grey85 50 grey70 50 grey50) -- Flat
+ I AddTitleStyle\
 Active (Pixmap /tmp/$[LOGNAME]/pix/clock.xpm -- Right) -- Flat
+ I ButtonStyle All\
 (VGradient 128 2 royalblue1 50 royalblue3 50 royalblue4)\
 Inactive (VGradient 128 2 grey85 50 grey70 50 grey50) -- Flat
+ I AddButtonStyle 1\
 (Pixmap mini.window2.xpm)\
 Inactive (Pixmap mini.window.xpm) -- Flat
+ I Style * UseDecor Default

а картинка.. часиков генерируется вот таким скриптом….

$ cat ~/.fvwm/bin/pix.update
#!/usr/bin/perl
use Fcntl qw(:DEFAULT :flock);
$lock="PixMapClock.lock";
$plck="/tmp/$ENV{'LOGNAME'}/lock";
$pclk="/tmp/$ENV{'LOGNAME'}/pix";
$ppix="$ENV{'HOME'}/.fvwm/icons/clock";
$page=$ARGV[0];
system("mkdir -p $plck $pclk");
@s1{'_',':'}=('     ','     ');
@s2{'_',':'}=('     ',' ..  ');
@d1{'0','1','2','3','4','5','6','7','8','9'}=(' .....  ','        ',' .....  ',' .....  ','        ',' .....  ',' .....  ',' .....  ',' .....  ',' .....  ');
@d2{'0','1','2','3','4','5','6','7','8','9'}=('. ... . ','      . ','  ... . ','  ... . ','.     . ','. ...   ','. ...   ','  ... . ','. ... . ','. ... . ');
@d3{'0','1','2','3','4','5','6','7','8','9'}=('..   .. ','     .. ','     .. ','     .. ','..   .. ','..      ','..      ','     .. ','..   .. ','..   .. ');
@d4{'0','1','2','3','4','5','6','7','8','9'}=('.     . ','      . ','  ... . ','  ... . ','. ... . ','. ...   ','. ...   ','      . ','. ... . ','. ... . ');
@d5{'0','1','2','3','4','5','6','7','8','9'}=('.     . ','      . ','. ...   ','  ... . ','  ... . ','  ... . ','. ... . ','      . ','. ... . ','  ... . ');
@d6{'0','1','2','3','4','5','6','7','8','9'}=('..   .. ','     .. ','..      ','     .. ','     .. ','     .. ','..   .. ','     .. ','..   .. ','     .. ');
@d7{'0','1','2','3','4','5','6','7','8','9'}=('. ... . ','      . ','. ...   ','  ... . ','      . ','  ... . ','. ... . ','      . ','. ... . ','  ... . ');
@d8{'0','1','2','3','4','5','6','7','8','9'}=(' .....  ','        ',' .....  ',' .....  ','        ',' .....  ',' .....  ','        ',' .....  ',' .....  ');
@p1{'a','b','c','d','e','f','g','h','i'}=(' ,,, ,,, ,,, ',' ,,, ,,, ,,, ',' ,,, ,,, ,,, ',' ,,, ,,, ,,, ',' ,,, ,,, ,,, ',' ,,, ,,, ,,, ',' ,,, ,,, ,,, ',' ,,, ,,, ,,, ',' ,,, ,,, ,,, ');
@p2{'a','b','c','d','e','f','g','h','i'}=(',...,   ,   ,',',   ,...,   ,',',   ,   ,...,',',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,');
@p3{'a','b','c','d','e','f','g','h','i'}=(',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,',',...,   ,   ,',',   ,...,   ,',',   ,   ,...,',',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,');
@p4{'a','b','c','d','e','f','g','h','i'}=(',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,',',   ,   ,   ,',',...,   ,   ,',',   ,...,   ,',',   ,   ,...,');
@pg{"","00","10","20","01","11","21","02","12","22"}=('a','a','b','c','d','e','f','g','h','i');
$pixh='/* XPM */
static char * s_xpm[] = {
"76 13 4 1",
"       g None",
".      g #FFFFFF",
",      g #CCCCCC",
"*      g #FF0000",
';
@pxln{10,11,12,13,14,15,16,17,18,19,20,21,22}=('"s1d1p1",','"s1d2p2",','"s1d3p2",','"s2d3p2",','"s2d3p1",','"s1d4p3",','"s1d5p3",','"s1d6p3",','"s2d6p1",','"s2d6p4",','"s1d6p4",','"s1d7p4",','"s1d8p1"};');
if (sysopen(FH, "$plck/$lock", O_WRONLY|O_CREAT) && flock(FH, LOCK_EX|LOCK_NB))
{
    @t{0,1,2,3,4,5,6}=localtime;
    $dstr=sprintf "%02d_%02d:%02d_@pg{$page}",@t{3},@t{2},@t{1};
    $pixi=$pixh;
    foreach $k (sort keys %pxln)
    {
        @pxln{$k}=~ s~(s.)(d.)(p.)~&LINE;~;
        ($s,$d,$p)=($1,$2,$3);
        $t=$dstr;
        $t=~ s~([0-9])~$$d{$1}~eg;
        $t=~ s~^([ .]{16})~replace($1,'.','*')~e;
        $t=~ s~([a-i])~$$p{$1}~eg;
        $t=~ s~([_\:])~$$s{$1}~eg;
        @pxln{$k}=~ s~&LINE;~$t~;
        $pixi.="@pxln{$k}\n";
    }
    open(FILE,">$pclk/clock.xpm") && select(FILE) && printf $pixi;
    close(FILE);
    system("convert $pclk/clock.xpm $pclk/clock.png");
#    printf $pixi;
}
unlink("$plck/$lock");
sub replace
{
    $_=$_[0];
    $_=~ s~[$_[1]]~$_[2]~g;
    return $_;
}
Genie

всякие там иконки я уже и не очень помню, откуда брал, но тут каждый виберет и найдёт для себя сам ;)