XMENU
секретное меню

Смысл программы

Если работать на компьютере профессионально, часто приходится выполнять одни и те же последовательности действий. Естественно, любой программист в соответствии с принципом "Машина должна работать, а человек - думать", поспешит такие повторяющиеся действия как-то автоматизировать. Надо только придумать, как их запускать. С одной стороны, они должны быть всегда под рукой, с другой стороны - не должны все время маячить на экране. Этим условиям удовлетворяет только системная панель. Осталось написать программу, которая будет садиться в системную панель и показывать оттуда меню.

Запуск и использование

Параметров командной строки у XMENU нет, а текущие настройки она берет из двух файлов, находящихся в текущем каталоге. Первым читается файл с именем XMENU.CFG. В нем хранятся настройки, общие для всех пользователей. Затем читается файл с названием <имя пользователя>.cfg, содержащий настройки для конкретного пользователя. Один из этих файлов или сразу оба могут отсутствовать. Настройка работы программы и меню осуществляется с помощью операторов, описанных ниже.

Программа позволяет задавать два меню, вызывающееся по левой и по правой кнопке мыши соответственно.

Настройки программы

ДОБАВИТЬ filename ( ->eol; -- )

Читается и интерпретируется содержимое указанного файла

ИКОНКА 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

Пример (можно скачать отсюда)


\ Пример файла XMENU.CFG

МАКРО office с:\microsoft office\office\
СКРИПТ ПЕРЛ d:\perl\bin\perl.exe

>> Редактор WORD |open2.ico
   ЗАПУСТИТЬ "[office]winword.exe"
---
МЕНЮ Пример вложенного меню |recycle.ico

>> Привет
   ФОРТ:
     " Привет всем!!!" msg
   ФОРТ;

>> Программа на Перле
   ПЕРЛ d:\prog.pl

КОНЕЦ-МЕНЮ
---
>> DIR C:
   ЗАПУСТИТЬ cmd.exe /cdir c: /P

---
>> Тексты моих программ
   ФИЛЬТР *.f;*.spf КАТАЛОГ d:\spf\forth

>> Программы
   ПРОГРАММЫ

>> Мои документы
   МОИ-ДОКУМЕНТЫ

>> Папка Фара
   ПРОГРАММА Far manager

Изменения по версиям

1.30

+ ИКОНКА, ПОДСКАЗКА, ПУНКТ-..., ДОБАВИТЬ, ЛЕВОЕ-МЕНЮ, ПРАВОЕ-МЕНЮ, ПРАВОЕ-МЕНЮ-ПО-ЛЕВОМУ, ЗАПОМНИТЬ КАК
+ Управление через внешний канал
+ Второй файл инициализации по имени пользователя
- Устранены утечки памяти и системных объектов при вызове каталогов и перечитывании файлов конфигурации

1.20

+ КАТАЛОГ, ПАПКА, ФИЛЬТР, ПРОГРАММЫ, МОИ-ДОКУМЕНТЫ, ПРОГРАММА

1.13

+ ЗАПУСТИТЬ и СКРИПТ выставляют своим пунктам иконки по умолчанию.
* Диалоговое окно диагностики ошибок расширено и исправлена его работа.

1.12

- исправлена ошибка: программа слетала под NT, если после выхода из обработчика меню на стеке что-то оставалось

1.11

* В Эксплорере показывается правильная иконка

1.10

* Программы и скрипты запускаются в их каталоге
+ СКРИПТ
+ МАКРО
+ иконки в менюшках

1.02

- Исправлен тонкий и неповторяемый сознательно глюк: меню появляется и тут же исчезает. Оказывается, перед показом меню надо назначать окну передний план, а после TrackPopupMenu специально посылать окну пустое сообщение, Подробности см. в MSDN

1.01

* Добавлен флаг tpm_returncmd, дабы не извращаться с сообщениями wm_command