|
|
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.