Если работать на компьютере профессионально, часто приходится выполнять одни и те же последовательности действий. Естественно, любой программист в соответствии с принципом "Машина должна работать, а человек - думать", поспешит такие повторяющиеся действия как-то автоматизировать. Надо только придумать, как их запускать. С одной стороны, они должны быть всегда под рукой, с другой стороны - не должны все время маячить на экране. Этим условиям удовлетворяет только системная панель. Осталось написать программу, которая будет садиться в системную панель и показывать оттуда меню.
Параметров командной строки у XMENU нет, а текущие настройки она берет из двух файлов, находящихся в текущем каталоге. Первым читается файл с именем XMENU.CFG. В нем хранятся настройки, общие для всех пользователей. Затем читается файл с названием <имя пользователя>.cfg, содержащий настройки для конкретного пользователя. Один из этих файлов или сразу оба могут отсутствовать. Настройка работы программы и меню осуществляется с помощью операторов, описанных ниже.
Программа позволяет задавать два меню, вызывающееся по левой и по правой кнопке мыши соответственно.
Читается и интерпретируется содержимое указанного файла
ИКОНКА filename ( ->eol; -- )Стандартная иконка программы, изображающая синюю мышку, заменяется на указанную.
ПОДСКАЗКА tooltip ( ->eol; -- )Стандартная подсказка программы "Секретное меню" заменяется на указанную.
\ ( ->eol; -- )Все до конца строки считается комментарием
МАКРО macro text ( -- )Определить макрос macro. Использовать его можно в командах ЗАПУСТИТЬ, КАТАЛОГ и в командах вызова скрипта. Вместо выражения [macro] будет подставлен text. В Форт-программах, стоящих между ФОРТ: и ФОРТ; развернуть макрос можно с помощью слова macro ( zmacro -- ztext)
СКРИПТ script program ( -- )Определить команду script, вызывающую программу program. Если в имени программы есть пробелы, все имя необходимо заключить в кавычки
ЗАПОМНИТЬ filename КАК name ( -- )Прочитать файл иконки filename и запомнить иконку под именем name. Если в имени файла или иконки есть пробелы, все имя необходимо заключить в кавычки. Запомненную иконку можно затем использовать при вызове программы через внешний канал.
Все определения меню, указанные ниже, будут относиться к меню, вызываемому по ЛЕВОЙ клавише мыши.
ПРАВОЕ-МЕНЮ ( -- )Все определения меню, указанные ниже, будут относиться к меню, вызываемому по ПРАВОЙ клавише мыши. Если после интерпретации всех файлов правое меню окажется пустым, в него автоматически будут добавлены три пункта: ПУНКТ-ПЕРЕЧИТАТЬ, ПУНКТ-О-ПРОГРАММЕ, ПУНКТ-ВЫХОД.
ПРАВОЕ-МЕНЮ-ПО-ЛЕВОМУ ( -- )После вызова этой команды правое меню будет уничтожено, а нажатие и левой, и правой кнопок мыши будут вызывать одно и то же левое меню.
>> item |icon ( ->"|" ->eol; -- )Пункт меню с текстом item и иконкой icon. В следующей строке записывается действие, которые должно выполняться при выборе этого пункта. Таких действий всего три - запустить внешнюю программу, запустить скрипт или выполнить программу на Форте.
ЗАПУСТИТЬ command-string ( ->eol; -- )Открыть указанный файл. У файла может быть командная строка command-string. Можно указывать не только исполняемые файлы, но и любые другие. Исполняемые файлы будут действительно запущены, другие - открыты согласно зарегистрированному расширению. Здесь стоит сказать пару слов о полных именах файлов, в которых есть пробелы. Такие файлы нужно заключать в кавычки, однако не все, а только первый из них. Соответственно, для команды ЗАПУСТИТЬ в кавычках должно стоять только имя запускаемой программы, а кавычки вокруг аргументов должны быть только в том случае, если их понимает вызываемая программа.
ФОРТ: ( -- )Начать определение программы на Форте, которая будет выполнена при выборе пункта меню. Делать эта программа может все, что угодно. Для вывода на экран пользуйтесь словами err ( z -- ) и msg ( z -- ). На выходе программа должна оставить стек в том же состоянии, в каком он был на входе, иначе (под Windows NT) произойдет сбой общей защиты.
ФОРТ; ( -- )Закончить определение программы на Форте
--- ( -- )Поставить в меню горизонтальный разделитель
МЕНЮ submenu |icon ( ->"|"; ->eol; -- )Начать вложенное меню, присвоив ему текст submenu и иконку icon
КОНЕЦ-МЕНЮ ( -- )Закончить вложенное меню
КАТАЛОГ dir ( ->eol; -- )Создать пункт меню, который будет показывать указанный каталог. Ограничить список показываемых файлов определенными масками можно с помощью слова ФИЛЬТР
ПАПКА dir ( ->eol; -- )То же, что и КАТАЛОГ
ФИЛЬТР filter ( ->bl; -- )Ограничить показ следующего каталогами указанными масками. Маски разделяются точкой с запятой
ПРОГРАММЫ ( -- )Показать список программ для текущего пользователя (точнее, список общих программ и список программ пользователя)
МОИ-ДОКУМЕНТЫ ( -- )Показать каталог документов текущего пользователя
ПРОГРАММА prog ( ->bl; -- )Показать содержимое пункта меню "Программы", соответствующий указанному имени
ПУНКТ-ПЕРЕЧИТАТЬ ( -- )Стандартный пункт Перечитать файл - читает заново файлы настройки, соответственно переустанавливая все элементы меню и другие настройки
ПУНКТ-О-ПРОГРАММЕ ( -- )Стандартный пункт О программе - показывает информацию об авторе
ПУНКТ-О-ПРОГРАММЕ ( -- )Стандартный пункт Выход - выгружает программу из памяти.
Программа постоянно прослушивает широковещательный канал с именем XMENU и выполняет команды, присланные по этому каналу. Таким образом можно управлять программой из внешних программ. При отсылке команды на нее реагируют все запущенные копии XMENU, даже находящиеся в разных терминальных сессиях. Распознаются следующие команды:
" ( ->"; -- )Компилирует asciiz-строку.
new-tooltip ( z -- )Устанавливает новую подсказку.
msgbox ( ztitle ztext -- )Заставляет программу показать окно сообщения с указанным заголовком и текстом.
popup-info ( ztitle ztext ms -- )Заставляет программу показать всплывающую информацию. Информация будет находиться на экране указанное число миллисекунд (но не меньше 10 сек. и не больше 30 сек.).
new-icon ( zicon ms -- )То же, что и new-icon-by-handle, но иконка представляется своим именем, запомненным по ЗАПОМНИТЬ ... КАК. Такой вызов будет работать между терминальными сессиями, но в файле конфигурации XMENU необходимо заранее задать иконки, которые будут использоваться.
make-mouse-blink ( -- )Заставляет мышку мигнуть.
new-icon-by-handle ( hicon ms -- )Устанавливает новую иконку на ms миллисекунд. Если ms = 0, иконка устанавливается навсегда. hicon - это дескриптор иконки, его можно передать как число. Предполагается, что вызывающая программа сама прочитает нужные ей иконки и передаст в XMENU только дескриптор. Это можно сделать, если вызывающая программа и XMENU работают в одной и той же терминальной сессии.
(( ( -- )Начинает определение блока данных на стеке.
)) ( ... -- ... block)Заканчивает определение блока данных на стеке.
animate-icon ( ... block -- )Демонстрирует анимацию иконки в системном лотке. Блок данных должен состоять из пар (имя иконки, время показа в мс).
(( " ic1" 200 " ic2" 200 " ic3" 200 )) animate-icon