Inferno Programmer's Guide / Руководство программиста по ОС Inferno: Chapter 3 - Limbo Programming

← →
Английский оригинал Перевод на русский

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

Модуль Prefab (prefab.m) содержит компоненты для создания высокоуровневых графических объектов. Он расчитан на применение в устройствах, которые не похожи на обычные компьютеры с клавиатурами и мышами. Он специально предназначен для создания приложений интерактивного телевидения (ITV), управляемых с помощью инфрокрасных пультов.
Используя возможности модуля Draw, модуль Prefab может группировать единичные элементы, обращаясь к ним как к группам элементов и активизировать элементы по команде.

j1m 05.05.09 в 08:16

0

Концепция и Терминология

j1m 30.04.09 в 10:53

0

Модуль prefab, как графический "тулкит" предоставляет высокоуровневые графические возможности, сравнимые с модулем Draw.

j1m 13.05.09 в 11:14

0

Compound

j1m 30.04.09 в 10:54

0

Тип Compound определяет боксы, рисуемые на экране. Каждый из них появляется в новом окне Compound.image и содержит (возможно nil) заголовок и содержимое. Он занимает место на экране, определенное в Compound.r. Процесс размещение ресурсов для Compound создает окно, но не отрисовывает его.

j1m 13.05.09 в 11:19

0

После того, как Compound будет создан, функция Compound.draw() должна быть вызвана чтобы сделать его видимым. Compound имеет обрамление вокруг себя, определенное в Style.edgecolor и соержащее (сверху вниз):
* заголовок (если есть)
* горизонтальную линию (если есть заголовок)
* содержимое

j1m 13.05.09 в 11:22

0

приложения должны выдеять ресурсы для Compound с помощью его же методов.

j1m 13.05.09 в 11:23

0

Элементы

j1m 30.04.09 в 10:54

0

Модуль Prefab определяет элементы как графические компоненты. Существует шесть типов элементов Prefab:

j1m 13.05.09 в 18:07

0

* EText. Единичная текстовая строка. Текст этого элемента отрисовывается с использованием style.textfont и style.textcolor.
* ETitle. Текстовая строка, обычно используется для заголовка compound. Текст этого элемента отрисовывается с использованием style.textfont и style.textcolor.
* Eicon. Изображение.
* ESeparator Изображение, предназначенное для заполнения свободного пространства в списке.
* EHorizontal. Горизонтальный список элементов.
* EVertical. Вертикальный список элементов.

j1m 13.05.09 в 18:13

0

Объекты на экране типа Compound, каждый из которых занимает уникальное окно на экране и содержит объекты типа Element. Element может быть единственным объектом или списком экземпляров Element, которые могут быть использованы для создания структурных компонентов.

j1m 14.05.09 в 09:15

0

Приложения должны выделять ресурсы для объектов типа Element только через его же методы.

j1m 14.05.09 в 09:16

0

Environ

j1m 30.04.09 в 10:54

0

Тип Environ указывает тип и стиль элемента.
Screen типа ref Draw->Screen, определяет как будут отображены элементы.
Стиль типа Style, определяет как отрисовываются элементы.
Тип Style это набор информации о шрифте и цвете для приложения или набора пунктов в приложении.
За исключением использования Layout, единственный способ управлять видом элементов Prefab, это пользоваться членами Style.

rapidfx 14.05.09 в 13:20

0

Цвет членов elemcolor, edgecolor, titlecolor, textcolor и highlightcolor обычно ссылаются на константу ц\занчения цвета (единственную копию цвета пикселя). Все они имеют тип ref Draw->lmage, и все они могут быть любым изображением.

rapidfx 14.05.09 в 15:04

0

Стили выделяются обычными Limbo-выражениями. Не существует специальных функций. Все члены Style должны быть определены. Тем не менее, не вызовет ошибок модификация членов Style после того, как как они были созданы и переданы в функцию Prefab, результвты могут быть непредсказыемыми.
Тип Layout определяет более общую форму текста и вида дисплея. Он обеспечивает более точное управление шрифтом и цветом которым показывается текст и включаемыми изображениями в виде элементов текста. Он позволяет установить тег для каждого компонента результирующего элемента или списка элементов.

rapidfx 16.05.09 в 19:18

0

Пример

j1m 30.04.09 в 10:54

0

Листинг 3-15 prefabgreet.b


Сравнив этот пример с примером Draw, вы увидите что код инициализации остался практически тем же.
В добавок к типам Display, Image, and Font, в этом примере используется объект Screen object.
В Строке 30 создается новый объект Screen и сохраняется в screen. Это становится основой на которой рисуются такие элементы как окна.

rapidfx 14.05.09 в 17:51

0

Строки с 34 по 41 определяют цвет и шрифт информации которая будет отображена в окне.

rapidfx 16.05.09 в 19:20

0

строка 43 создает оконное окружение (??), базирующееся на ранее определенном screen и стиле.

rapidfx 16.05.09 в 19:21

0

Строка 52 задает заголовок окна. Строки 53 и 54 задают иконку и текст для отображения. Строка 55 определяет пространство которое будет использовано для размещения элементов.

rapidfx 16.05.09 в 19:23

0

Строка 56 устанавливает размещение элементов по горизонтальной линии. Строки с 57 по 59 добавляют элементысписка в соответствующем порядке. Строка 60 форматирует элементы.

rapidfx 16.05.09 в 19:25

0

Строка 62 задает прямоугольник или окно, которое будет отображено. Оно содержит заголовок и содержимое. Строка 63 фактически отрисовывает окно.
После компиляции этой программы, вы должны запустить ее из консоли Inferno: inferno$ prefabgreet inferno

rapidfx 16.05.09 в 19:27

0

// Тут рисунок со страницы 128

j1m 30.04.09 в 10:54

0

Модули Limbo/Tk

j1m 30.04.09 в 10:55

0

Модули Limbo/Tk содержат общие компоненты GUI, подобные таковым в тулките Tk (меню, кнопки и другие виджеты). Они используются для конструирования графического интерфейса пользователя без прямого вызова примитивов модуля Draw.

j1m 05.05.09 в 08:30

0

Концепция и Терминология

j1m 30.04.09 в 10:55

0

Те, кто знаком со связкой Tcl/Tk, найдут Limbo/Tk очень похожим. Однако, Limbo/Tk не поддерживает всех возможностей Tk 4.0.
''Для получения большей информации о различиях между Limbo/Tk и Tk 4.0 смотрите Inferno Reference Manual.''

j1m 13.05.09 в 18:18

0

Важно отметить, тем не менее, что для приложений Limbo/Tk, язык Limbo используется для создания и управления компонентов Tk (виджетов), а не Tcl.

rapidfx 16.05.09 в 19:31

0

Функция toplevel()

j1m 30.04.09 в 10:55

0

Функция toplevel() создает окно. Она возвращает объект типа Toplevel, который можно передавать другим функциям Limbo/Tk.

j1m 14.05.09 в 09:18

0

Функция cmd()

j1m 30.04.09 в 10:56

0

Функция cmd принимает команды Limbo/Tk как строки для создания и управления графическими объектами Tk.
Управляющие строки содержат команды и их аргументы. Они похожи на упрощенную версию Tcl. Смотрите Inferno Reference Manual для большей информации о командах Limbo/Tk.

Функция namechan()
Функция namechan модуля Limbo/Tk используется для установки соединения между виджетами Limbo/Tk и программами Limbo. Отправка команды выражается в пересылке строки по Limbo-каналу. Функция namechan используется для связывания канала строк Limbo (Limbo chan of string) с именем которое может использоваться внутри Limbo/Tk.

rapidfx 16.05.09 в 19:40

0

Wmlib

j1m 30.04.09 в 10:56

0

В стандартную поставку Inferno входит менеджер окон wm и модуль Wmlib (wmlib.m), который упрощает обработку команд Limbo/Tk и создание грфических приложений.

j1m 14.05.09 в 09:20

0

Смотри Inferno User s Guide для подробной информации о wm. Смотри Inferno Reference Manual для дополнительной информации о модуле Wmlib.

rapidfx 16.05.09 в 19:41

0

Пример

j1m 30.04.09 в 10:56

0

Слудющая версия программы Greet иллюстрирует использование модулей Limbo/Tk:
: // FIXME Код устарел и не будет работать, требуется модификация.

j1m 14.05.09 в 09:23

0

1 implement TkGreet;
2
3 include "sys.m";
4 include "draw.m";
5 include "tk.m";
6 include "wmlib.m";
7
8 sys: sys;
9 tk: Tk;
10 wmlib: Wmlib;
11 msg: string;
12
13 TkGreet : module {
14 init: fn(ctxt: ref Draw->context, argv: list of string);
15 };
16
17 init(ctxt: ref Draw->Context, argv: list of string) {
18 sys = load sys Sys->PATH;
19 tk = load Tk Tk->PATH;
20 wmlib = load Wmlib Wmlib->PATH;
21 wmlib->init();
22
23 if ((tl argv) != nil)
24 msg = "Hello, " + (hd(t1 argv)) + "!";
25 else
26 msg = "Hello, world!";
27
28 win_cfg := array [] of {
29 "label .i -bitmap @/icons/logon.bit",
30 "label .t -text {" + msg + "\n" + "}",
31 "focus .t",
32 "button .b -text {OK} -width lOh -command {send cmd o}",
33 "pack .i .t .b -padx 5 -pady 5",
34 "pack propagate . 0",
35 "update",
36 };
37
38 (title, menubut) := wmlib->titlebar(ctxt. screen, "-x 50 -y 25", "Limbo/Tk Example", wmlib->Hide); 39
40 cmd := chan of string;
41 tk->namechan(tit1e, cmd, "cmd"); 42
43 wmlib->tkcmds(tit1e, win_cfg);
44
45 for(;;) alt {
46 click := <- menubut =>
47 if (click[0] == 'e')
48 return;
49 wmlib->titlectl (title, click);
50 if (click[0] == 't')
51 tk->cmd(title, "focus .t");

j1m 14.05.09 в 09:25

0

: // FIXME: Что это? =)
s := <- ctnd =>
case s[0] {
'0' => exit
}
}

j1m 14.05.09 в 09:26

0

Строка 21 инициализирует дисплей для подготовки к рисованию.

rapidfx 16.05.09 в 19:44

0

Строки с 28 по 36 задают конфигурацию окна для отображения. Это массив строковых элементов, которые похожи на команды Tcl. Создание массивы удобный способ компиляции виджетов, которые формируют окно или часть дисплея.

rapidfx 16.05.09 в 19:47

0

Строка 38 определяет текст и кнопки отображаемые в заголовке и также начальные координаты (как командную строку).

rapidfx 16.05.09 в 19:49

0

Функция Wmlib. titlebar возвращает кортеж (тьюпл) содержащий ссылку на виджет верхнего уровня и канал используемый для уведомления программы о событиях от мыши на заголовке окна.

rapidfx 16.05.09 в 19:52

0

Строки 40 и 41 устанавливают канал используемый для сообщения между виджетами и программой. Он позволяет программам Limbo принимать уведомления о событиях.

rapidfx 16.05.09 в 19:53

0

Строка 43 создает окно при помощи массива строк которые задают окно как команды.

rapidfx 16.05.09 в 19:54

0

Строки с 45 по 56 это бесконечный цикл который обрабатывает события от виджетов. Оператор alt выбирает между двумя каналами: menubut - события от заголовка окна, и cmd - команды от других виджетов (в нашем случае, кнопка OK).

rapidfx 16.05.09 в 19:57

0

После компиляции этой программы, вы можете запустить ее в интерпретаторе Inferno в Window Manager (wm):
$ tkgreet inferno

rapidfx 16.05.09 в 19:58

0

// Тут рисунок со страницы 133

j1m 30.04.09 в 10:56

0
Минутку...

← Предыдущая страница