|
|
1.1 root 1: .TH CMDCACHE 3L
2: .XE "cmdcache()"
3: .SH NAME
4: cmdcache, useritems \- cache a command in the Application cache
5:
6: .SH SYNOPSIS
7: .ft B
8: #include <dmd.h>
9: .br
10: #include <menu.h>
11: .br
12: #include <object.h>
13: .PP
14: .ft B
15: Titem1 useritems;
16: .PP
17: .ft B
18: int cmdcache (s, m, b, u, e)
19: .br
20: char \(**s;
21: .br
22: Tmenu \(**m;
23: .br
24: Bitmap \(**b;
25: .br
26: void (\(**u)( );
27: .br
28: void (\(**e)( );
29:
30: .SH DESCRIPTION
31: The
32: .I cmdcache
33: function allows the caching of an application as a command to expand the
34: basic set of
35: global menu commands accessed from button 3, such as
36: \f3New\f1, \f3Reshape\f1, etc.. Although the basic set of commands mostly
37: deals with window operations, a cached command can have other functionalities. The
38: criteria to decide if an application should be cached as a command or
39: as an application is as follows:
40: .IP ""
41: The application runs without a window.
42: .IP ""
43: The application is compact and specialized, and its user
44: interface must be done through the mouse.
45: .IP ""
46: The scope of the application is global to the whole terminal.
47: .PP
48: An example of a cached command is the terminal resident \fBExit\fR command.
49: .PP
50: The application format is just a vehicle to download the code of the command into
51: the terminal; therefore, it should use a template
52: similar to the one used in the \fBEXAMPLE\fR
53: section, which has \fImain()\fR that calls the \fIcmdcache\fR function
54: with the right parameters and exits immediately.
55: .PP
56: The
57: .I cmdcache
58: function will use the null terminated ASCII string \fIs\fR as the
59: \fItag\fR name (see \fIcache(3L)\fR for a definition of a \fItag\fR name), and
60: also as the \fImenu\fR name of the command. The menu name will be displayed on
61: the \fBMore\fR menu for user selection. Note that a command can only be
62: accessed from the \fBMore\fR menu, and booting it through \fIdmdld\fR will not
63: work.
64: .PP
65: The bitmap \fIb\fR, if not null, will be displayed as an icon on the left on
66: the menu name of the command. It is recommended that cached commands have
67: an icon to differentiate them from cached applications, since the \fBMore\fR
68: menu lists all of them nondiscriminatively.
69: .PP
70: The cached command can have a submenu of its own if the argument \fIm\fR is
71: defined. The submenu \fIm\fR has to be generated \fIdynamically\fR, and the
72: menu generator must use the globally defined \fIuseritems\fR
73: (see \fItmenuhit(3R)\fR for details of a dynamic menu generation). The
74: structure for \fIuseritems\fR is \fBTitem1\fR,
75: which is used for all global commands and is defined as follows:
76: .PP
77: .RS 3
78: .nf
79: .ft CM
80: typedef struct Titem1 {
81: char *text;
82: struct {
83: unsigned short uval;
84: unsigned short grey;
85: } ufield;
86: struct Tmenu *next;
87: Bitmap *icon;
88: void (*dfn)();
89: } Titem1;
90: .fi
91: .RE
92: The field
93: \fInext\fR does not apply for items in a cached command's submenu (i.e.,
94: the terminal does not support fourth-level global submenus). Since submenu
95: off the item is not supported, the field \fIdfn\fR is also not relevant.
96: All other fields can be updated by the command's menu generator.
97: .PP
98: The argument function \fIu\fR is called by the terminal during the generation of the
99: dynamic \fBMore\fR menu. (The \fBMore\fR menu keeps changing because applications
100: and commands can constantly cache in and decache out.) When the terminal
101: processes a cached command, it copies the static information of the
102: command into \fIuseritems\fR: the argument \fIs\fR goes into the item field
103: \fItext\fR, the argument \fIb\fR into item field \fIicon\fR, the argument
104: \fIm\fR into item field \fInext\fR. Then the terminal will call the function
105: of type \fIvoid\fR
106: pointed by \fIu\fR, if present, with two arguments: The first one is a
107: pointer to the command object under consideration
108: (this argument is reserved) , and the other is a pointer
109: to the item structure being initialized (i.e., \fIuseritems\fR). The function
110: pointed by \fIu\fR may dynamically update the item's \fIufield.grey\fR, and
111: also re-initialize any fields of the item structure (e.g., if the current
112: conditions dictate that all items in the command's submenu are
113: invalid, the command may decide not to have a submenu, so the function
114: pointed by \fIu\fR may change the field \fInext\fR to null).
115: .IP \fBNote\fR
116: The fields \fIufield.uval\fR and \fIdfn\fR are used by the terminal for
117: housekeeping: they differentiate between selections of cached applications,
118: cached commands in the \fBMore\fR menu and items in third-level submenus of
119: those applications and commands. Even though it is possible to modify them,
120: it is \fIstrongly\fR not recommended unless the programmer understands
121: the terminal's internals.
122: .PP
123: If the argument \fIu\fR is not specified, the \fIcmdcache\fR supplies a default
124: function which initializes the \fIgrey\fR field of the item to null (no greying).
125: .PP
126: The argument function \fIe\fR of type \fIvoid\fR
127: is called when the command or an item from
128: its submenu \fIm\fR is selected. The function \fIe\fR accepts two arguments:
129: The first one is -1 if the command does not have a submenu, or
130: the index of the selected item (i.e., \fIuseritems.ufield.uval\fR)
131: if the command has a submenu.
132: The second argument is the pointer to the cached command object, but it
133: is reserved.
134: The function \fIe\fR is executed in the context of the
135: terminal's control process like other
136: global menu commands; therefore, some global
137: variables
138: relating to the downloaded application template and window parameters
139: such as \fIP\fR, \fIdisplay\fR, \fIDrect\fR, etc., do not have any meaning.
140: .PP
141: If the argument function \fIe\fR is not specified, no action is taken if the
142: item is selected. Also if the command has a submenu, selecting the command
143: menu name in the \fBMore\fR menu instead of an item in the command's submenu
144: will result to a null operation.
145:
146: .SS Return Value
147: If the command is successfully cached, the function \fIcmdcache\fR
148: returns a 1. Otherwise, a 0 is returned.
149: .PP
150: A failure may be due to the following reasons. Another command or
151: application
152: of the same name is already in the cache, or the terminal
153: runs out of memory when initiating the caching operation.
154:
155: .SH EXAMPLE
156: The following application caches a command
157: which lets the user pick a window and displays the name of the
158: application running in that window. The command supports
159: two options: the \fBfull\fR option displays the full name, and
160: the \fBclipped\fR option displays the full name clipped from
161: any path name prefix. The uargv field of the selected process
162: \f2p\f1 holds the \f2argv\f1 used by that process.
163: .PP
164: Note that if the chosen application is cached, the displayed
165: clipped name is the \fItag\fR name it is cached under.
166: .PP
167: .RS 3
168: .nf
169: .ft CM
170: .S -2
171: #include <dmd.h>
172: #include <menu.h>
173: #include <object.h>
174:
175: struct Tmenu obmenu;
176: Word qmarkdata[] = {
177: 0x3C00,
178: 0x7E00,
179: 0xE700,
180: 0xC300,
181: 0x0300,
182: 0x0700,
183: 0x0E00,
184: 0x1C00,
185: 0x1800,
186: 0x1800,
187: 0x0000,
188: 0x1800,
189: 0x1800
190: };
191: Bitmap qmark = {
192: (Word *)qmarkdata,
193: 1,
194: 0, 0, 8, 13,
195: 0
196: };
197:
198:
199: main ()
200: {
201: Titem1 *genesis(); /* command's submenu generator */
202: void showname(); /* command's executing code */
203:
204:
205: obmenu.item = (Titem *)0; /* dynamic submenu */
206: obmenu.generator = (Titem *(*)())genesis;
207: obmenu.menumap = TM_TEXT|TM_UFIELD|TM_NEXT|
208: TM_ICON|TM_DFN;
209:
210: cmdcache ("name", &obmenu, &qmark, 0l, showname);
211: }
212:
213:
214: Titem1 *
215: genesis (i, m)
216: int i;
217: Tmenu *m;
218: {
219: register Titem1 *item = &useritems;
220: /* MUST use "useritems" */
221:
222: switch (i) {
223: case 0: /* first item */
224: item->text = "full";
225: break;
226: case 1:
227: item->text = "clipped";
228: break;
229: default: /* last item */
230: item->text = (char *)0;
231: return (item);
232: }
233:
234: item->ufield.uval = i;
235:
236: /* WARNING: "useritems" is a global variable
237: ** used by all cached commands that have a
238: ** submenu, so we cannot assume that fields
239: ** that are not initialized by genesis() are
240: ** cleared since other
241: ** commands may initialize
242: ** them when they are running.
243: **
244: ** To be sure, just clear any unused fields.
245: */
246: item->ufield.grey = 0;
247: item->icon = (Bitmap *)0;
248: return (item); /* returns "useritems" */
249: }
250:
251:
252: void
253: showname (val)
254: int val;
255: {
256: register Proc *p;
257: register char *s;
258: Proc *point2window();
259: char *clipprefix();
260:
261: p = point2window (3); /* pick a window */
262: s = p->uargv[0]; /* "full" name */
263: if (val)
264: s = clipprefix(s); /* "clipped" name */
265: msgbox (s, (char *)0); /* display name */
266: }
267: .fi
268: .RE
269: .S +2
270:
271: .SH SEE ALSO
272: ucache(1),
273: cache(3L), decache(3L), tmenuhit(3R).
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.