|
|
1.1 root 1: #include <X/mit-copyright.h>
2:
3: /* $Header: XMenuCreate.c,v 10.12 86/07/11 16:59:46 tony Rel $ */
4: /* Copyright Massachusetts Institute of Technology 1985 */
5:
6: /*
7: * XMenu: MIT Project Athena, X Window system menu package
8: *
9: * XMenuCreate - Creates an X window system menu object.
10: *
11: * Author: Tony Della Fera, DEC
12: * January 23, 1986
13: *
14: */
15:
16: #include "XMenuInternal.h"
17:
18: #include "../bitmaps/dimple1.bitmap"
19: #include "../bitmaps/dimple3.bitmap"
20: #include "../bitmaps/gray1.bitmap"
21: #include "../bitmaps/gray3.bitmap"
22: #include "../bitmaps/cross_weave.bitmap"
23:
24: #include "../cursors/left_ptr.cursor"
25: #include "../cursors/left_ptr_mask.cursor"
26: #include "../cursors/right_ptr.cursor"
27: #include "../cursors/right_ptr_mask.cursor"
28: #include "../cursors/center_ptr.cursor"
29: #include "../cursors/center_ptr_mask.cursor"
30:
31: #define DEF_FREEZE 0
32: #define DEF_REVERSE 0
33: #define DEF_MENU_STYLE RIGHT
34: #define DEF_MENU_MODE INVERT
35: #define DEF_INACT_PNUM 3
36: #define MAX_INACT_PNUM 4
37:
38: #define DEF_P_STYLE CENTER
39: #define DEF_P_EVENTS (EnterWindow | ExposeWindow)
40: #define DEF_P_FNT_NAME "8x13"
41: #define DEF_P_SPREAD 0.5
42: #define DEF_P_BDR_WIDTH 2
43:
44: #define DEF_S_STYLE LEFT
45: #define DEF_S_EVENTS (EnterWindow | LeaveWindow)
46: #define DEF_S_FNT_NAME "6x10"
47: #define DEF_S_SPREAD 0.10
48: #define DEF_S_BDR_WIDTH 1
49:
50: #define XASSOC_TABLE_SIZE 64
51:
52: #define TILE_BUF_SIZE 5
53:
54: int atoi();
55: double atof();
56:
57: XMenu *
58: XMenuCreate(parent, def_env)
59: Window parent; /* Window ID of the menu's parent window. */
60: register char *def_env; /* X Defaults program environment name. */
61: {
62: register int i; /* Loop counter. */
63: register int j; /* Loop counter. */
64: register char *def_val; /* X Default value temp variable. */
65:
66: register XMenu *menu; /* Pointer to the new menu. */
67: XMStyle menu_style; /* Menu display style. */
68: XMMode menu_mode; /* Menu display mode. */
69: XMPane *pane; /* Pane list header. */
70: XAssocTable *assoc_tab; /* XAssocTable pointer. */
71: Cursor mouse_cursor; /* Mouse cursor. */
72: int freeze; /* Freeze server mode. */
73: int reverse; /* Reverse video mode. */
74: int tile_count; /* Number of tiles created by XMakeTiles. */
75:
76: XMStyle p_style; /* Pane display style. */
77: char *p_fnt_name; /* Flag font name. */
78: FontInfo *p_fnt_info; /* Flag font information. */
79: int p_fnt_pad; /* Flag font padding in pixels. */
80: double p_spread; /* Pane spread in flag height fractions. */
81: int p_bdr_width; /* Pane border width. */
82: int flag_height; /* Flag window height. */
83: int p_height; /* Pane window height. */
84: int p_x_off; /* Pane X offset. */
85: int p_y_off; /* Pane Y offset. */
86:
87: XMStyle s_style; /* Selection display style. */
88: char *s_fnt_name; /* Selection font name. */
89: FontInfo *s_fnt_info; /* Selection font information. */
90: int s_fnt_pad; /* Selection font padding in pixels. */
91: double s_spread; /* Select spread in line height fractions. */
92: int s_bdr_width; /* Highlight border width. */
93: int s_height; /* Selection window height. */
94: int s_x_off; /* Selection window X offset. */
95: int s_y_off; /* Selection window Y offset. */
96:
97: Color color_def; /* Color definition holder. */
98: int p_bdr_color; /* Color of border pixmap. */
99: int s_bdr_color; /* Color of highlight pixmap. */
100: int p_frg_color; /* Color of pane foreground pixmap. */
101: int s_frg_color; /* Color of selection foreground pixmap. */
102: int bkgnd_color; /* Color of background pixmap. */
103: int mouse_color; /* Color of mouse cursor. */
104:
105: Bitmap inact_bitmap; /* Inactive background pattern bitmap. */
106: int inact_pnum; /* Inactive background pattern number. */
107:
108: Pixmap p_bdr_pixmap; /* Pane border pixmap. */
109: Pixmap s_bdr_pixmap; /* Selection border pixmap. */
110: Pixmap p_frg_pixmap; /* Pane forground pixmap. */
111: Pixmap s_frg_pixmap; /* Selection forground pixmap. */
112: Pixmap bkgnd_pixmap; /* Menu background pixmap. */
113: Pixmap inact_pixmap; /* Menu inactive pixmap. */
114:
115: TileFrame tile_buf[TILE_BUF_SIZE]; /* XMakeTiles buffer. */
116:
117: /*
118: * Calloc the XMenu structure and the initial pane.
119: */
120: menu = (XMenu *)calloc(1, sizeof(XMenu));
121: if (menu == NULL) {
122: _XMErrorCode = XME_CALLOC;
123: return(NULL);
124: }
125: pane = (XMPane *)calloc(1, sizeof(XMPane));
126: if (pane == NULL) {
127: _XMErrorCode = XME_CALLOC;
128: return(NULL);
129: }
130:
131: /*
132: * Create the XAssocTable.
133: */
134: assoc_tab = (XAssocTable *)XCreateAssocTable(XASSOC_TABLE_SIZE);
135: if (assoc_tab == NULL) {
136: _XMErrorCode = XME_CREATE_ASSOC;
137: return(NULL);
138: }
139:
140: /*
141: * Set up the default environment name.
142: */
143: if (def_env == NULL || *def_env == '\0') def_env = "XMenu";
144:
145: /*
146: * Set up internal fail-safe defaults.
147: */
148: freeze = DEF_FREEZE;
149: reverse = DEF_REVERSE;
150: menu_style = DEF_MENU_STYLE;
151: menu_mode = DEF_MENU_MODE;
152: inact_pnum = DEF_INACT_PNUM;
153:
154: p_style = DEF_P_STYLE;
155: p_spread = DEF_P_SPREAD;
156: p_fnt_name = DEF_P_FNT_NAME;
157: p_bdr_width = DEF_P_BDR_WIDTH;
158:
159: s_style = DEF_S_STYLE;
160: s_spread = DEF_S_SPREAD;
161: s_fnt_name = DEF_S_FNT_NAME;
162: s_bdr_width = DEF_S_BDR_WIDTH;
163:
164: /*
165: * Get default values from X.
166: */
167: def_val = XGetDefault(def_env, "MenuFreeze");
168: if (def_val != NULL) {
169: if (strcmp(def_val, "on") == 0) freeze = 1;
170: else if (strcmp(def_val, "off") == 0) freeze = 0;
171: }
172:
173: def_val = XGetDefault(def_env, "MenuReverseVideo");
174: if (def_val != NULL) {
175: if (strcmp(def_val, "on") == 0) reverse = 1;
176: else if (strcmp(def_val, "off") == 0) reverse = 0;
177: }
178:
179: def_val = XGetDefault(def_env, "MenuStyle");
180: if (def_val != NULL) {
181: if (strcmp(def_val, "right_hand") == 0) menu_style = RIGHT;
182: else if (strcmp(def_val, "left_hand") == 0) menu_style = LEFT;
183: else if (strcmp(def_val, "center") == 0) menu_style = CENTER;
184: }
185:
186: def_val = XGetDefault(def_env, "MenuMode");
187: if (def_val != NULL) {
188: if (strcmp(def_val, "box") == 0) menu_mode = BOX;
189: else if (strcmp(def_val, "invert") == 0) menu_mode = INVERT;
190: }
191:
192: def_val = XGetDefault(def_env, "MenuMouse");
193: if (
194: def_val != NULL &&
195: DisplayCells() > 2 &&
196: XParseColor(def_val, &color_def) &&
197: XGetHardwareColor(&color_def)
198: ) mouse_color = color_def.pixel;
199: else if (reverse) mouse_color = WhitePixel;
200: else mouse_color = BlackPixel;
201:
202: def_val = XGetDefault(def_env, "MenuBackground");
203: if (
204: def_val != NULL &&
205: DisplayCells() > 2 &&
206: XParseColor(def_val, &color_def) &&
207: XGetHardwareColor(&color_def)
208: ) bkgnd_color = color_def.pixel;
209: else if (reverse) bkgnd_color = BlackPixel;
210: else bkgnd_color = WhitePixel;
211:
212: def_val = XGetDefault(def_env, "MenuInactivePattern");
213: if (def_val != NULL) {
214: if (strcmp(def_val, "dimple1") == 0) inact_pnum = 0;
215: else if (strcmp(def_val, "dimple3") == 0) inact_pnum = 1;
216: else if (strcmp(def_val, "gray1") == 0) inact_pnum = 2;
217: else if (strcmp(def_val, "gray3") == 0) inact_pnum = 3;
218: else if (strcmp(def_val, "cross_weave") == 0) inact_pnum = 4;
219: }
220:
221: def_val = XGetDefault(def_env, "PaneStyle");
222: if (def_val != NULL) {
223: if (strcmp(def_val, "flush_left") == 0) p_style = LEFT;
224: else if (strcmp(def_val, "flush_right") == 0) p_style = RIGHT;
225: else if (strcmp(def_val, "center") == 0) p_style = CENTER;
226: }
227:
228: def_val = XGetDefault(def_env, "PaneFont");
229: if (def_val != NULL) p_fnt_name = def_val;
230:
231: def_val = XGetDefault(def_env, "PaneForeground");
232: if (
233: def_val != NULL &&
234: DisplayCells() > 2 &&
235: XParseColor(def_val, &color_def) &&
236: XGetHardwareColor(&color_def)
237: ) p_frg_color = color_def.pixel;
238: else if (reverse) p_frg_color = WhitePixel;
239: else p_frg_color = BlackPixel;
240:
241: def_val = XGetDefault(def_env, "PaneBorder");
242: if (
243: def_val != NULL &&
244: DisplayCells() > 2 &&
245: XParseColor(def_val, &color_def) &&
246: XGetHardwareColor(&color_def)
247: ) p_bdr_color = color_def.pixel;
248: else if (reverse) p_bdr_color = WhitePixel;
249: else p_bdr_color = BlackPixel;
250:
251: def_val = XGetDefault(def_env, "PaneBorderWidth");
252: if (def_val != NULL) p_bdr_width = atoi(def_val);
253:
254: def_val = XGetDefault(def_env, "PaneSpread");
255: if (def_val != NULL) p_spread = atof(def_val);
256:
257: def_val = XGetDefault(def_env, "SelectionStyle");
258: if (def_val != NULL) {
259: if (strcmp(def_val, "flush_left") == 0) s_style = LEFT;
260: else if (strcmp(def_val, "flush_right") == 0) s_style = RIGHT;
261: else if (strcmp(def_val, "center") == 0) s_style = CENTER;
262: }
263:
264: def_val = XGetDefault(def_env, "SelectionFont");
265: if (def_val != NULL) s_fnt_name = def_val;
266:
267: def_val = XGetDefault(def_env, "SelectionForeground");
268: if (
269: def_val != NULL &&
270: DisplayCells() > 2 &&
271: XParseColor(def_val, &color_def) &&
272: XGetHardwareColor(&color_def)
273: ) s_frg_color = color_def.pixel;
274: else if (reverse) s_frg_color = WhitePixel;
275: else s_frg_color = BlackPixel;
276:
277: def_val = XGetDefault(def_env, "SelectionBorder");
278: if (
279: def_val != NULL &&
280: DisplayCells() > 2 &&
281: XParseColor(def_val, &color_def) &&
282: XGetHardwareColor(&color_def)
283: ) s_bdr_color = color_def.pixel;
284: else if (reverse) s_bdr_color = WhitePixel;
285: else s_bdr_color = BlackPixel;
286:
287: def_val = XGetDefault(def_env, "SelectionBorderWidth");
288: if (def_val != NULL) s_bdr_width = atoi(def_val);
289:
290: def_val = XGetDefault(def_env, "SelectionSpread");
291: if (def_val != NULL) s_spread = atof(def_val);
292:
293: /*
294: * Create and store the inactive pattern pixmap.
295: */
296: switch (inact_pnum) {
297: case 0:
298: inact_bitmap = XStoreBitmap(16, 16, dimple1_bits);
299: break;
300: case 1:
301: inact_bitmap = XStoreBitmap(16, 16, dimple3_bits);
302: break;
303: case 2:
304: inact_bitmap = XStoreBitmap(16, 16, gray1_bits);
305: break;
306: case 3:
307: inact_bitmap = XStoreBitmap(16, 16, gray3_bits);
308: break;
309: case 4:
310: inact_bitmap = XStoreBitmap(16, 16, cross_weave_bits);
311: break;
312: }
313: if (inact_bitmap == _X_FAILURE) {
314: _XMErrorCode = XME_STORE_BITMAP;
315: return(NULL);
316: }
317:
318: /*
319: * Generate the pixmaps from the background and forground colors.
320: */
321: tile_buf[0].pixel = p_bdr_color;
322: tile_buf[1].pixel = s_bdr_color;
323: tile_buf[2].pixel = p_frg_color;
324: tile_buf[3].pixel = s_frg_color;
325: tile_buf[4].pixel = bkgnd_color;
326:
327: tile_count = XMakeTiles(tile_buf, TILE_BUF_SIZE);
328: if (tile_count != TILE_BUF_SIZE) {
329: _XMErrorCode = XME_MAKE_TILES;
330: return(NULL);
331: }
332:
333: p_bdr_pixmap = tile_buf[0].pixmap;
334: s_bdr_pixmap = tile_buf[1].pixmap;
335: p_frg_pixmap = tile_buf[2].pixmap;
336: s_frg_pixmap = tile_buf[3].pixmap;
337: bkgnd_pixmap = tile_buf[4].pixmap;
338:
339: /*
340: * Generate the inactive pixmap.
341: */
342: inact_pixmap = XMakePixmap(inact_bitmap, p_frg_color, bkgnd_color);
343: if (inact_pixmap == _X_FAILURE) {
344: _XMErrorCode = XME_MAKE_PIXMAP;
345: return(NULL);
346: }
347:
348: /*
349: * Free the inactive pattern bitmap since we no longer need it.
350: */
351: XFreeBitmap(inact_bitmap);
352:
353: /*
354: * Load the mouse cursor.
355: */
356: switch (menu_style) {
357: case LEFT:
358: mouse_cursor = XCreateCursor(
359: right_ptr_width, right_ptr_height,
360: right_ptr_bits, right_ptr_mask_bits,
361: right_ptr_x_hot, right_ptr_y_hot,
362: mouse_color, bkgnd_color,
363: GXcopy
364: );
365: break;
366: case RIGHT:
367: mouse_cursor = XCreateCursor(
368: left_ptr_width, left_ptr_height,
369: left_ptr_bits, left_ptr_mask_bits,
370: left_ptr_x_hot, left_ptr_y_hot,
371: mouse_color, bkgnd_color,
372: GXcopy
373: );
374: break;
375: case CENTER:
376: mouse_cursor = XCreateCursor(
377: center_ptr_width, center_ptr_height,
378: center_ptr_bits, center_ptr_mask_bits,
379: center_ptr_x_hot, center_ptr_y_hot,
380: mouse_color, bkgnd_color,
381: GXcopy
382: );
383: break;
384: default:
385: /* Error! Invalid style parameter. */
386: _XMErrorCode = XME_STYLE_PARAM;
387: return(NULL);
388: }
389: if (mouse_cursor == _X_FAILURE) {
390: _XMErrorCode = XME_CREATE_CURSOR;
391: return(NULL);
392: }
393:
394: /*
395: * Open the pane and selection fonts.
396: */
397: p_fnt_info = XOpenFont(p_fnt_name);
398: if (p_fnt_info == NULL) {
399: _XMErrorCode = XME_OPEN_FONT;
400: return(NULL);
401: }
402: s_fnt_info = XOpenFont(s_fnt_name);
403: if (s_fnt_info == NULL) {
404: _XMErrorCode = XME_OPEN_FONT;
405: return(NULL);
406: }
407:
408: /*
409: * Calculate the fixed padding value in pixels for each font.
410: */
411: p_fnt_pad = s_spread * p_fnt_info->height;
412: s_fnt_pad = s_spread * s_fnt_info->height;
413:
414: /*
415: * Calculate fixed height and offset requirements.
416: */
417: flag_height = p_fnt_info->height + (p_fnt_pad << 1);
418:
419: p_height = 0;
420: p_y_off = flag_height + p_bdr_width;
421: p_x_off = p_y_off * p_spread;
422:
423: s_height = s_fnt_info->height + (s_fnt_pad << 1) + (s_bdr_width << 1);
424: s_y_off = s_height;
425: s_x_off = p_x_off;
426:
427: /*
428: * Set up the pane list header.
429: */
430: pane->next = pane;
431: pane->prev = pane;
432: pane->type = PL_HEADER;
433: pane->serial = -1;
434:
435: /*
436: * Initialize the internal pane and selection creation queues.
437: */
438: _XMWinQueInit();
439:
440: /*
441: * Construct the XMenu object.
442: */
443: /* -------------------- Menu data -------------------- */
444: menu->menu_style = menu_style;
445: menu->menu_mode = menu_mode;
446: menu->freeze = freeze;
447: menu->aeq = 0;
448: menu->recompute = 1;
449: menu->parent = parent;
450: menu->height = 0;
451: menu->width = 0;
452: menu->mouse_cursor = mouse_cursor;
453: menu->assoc_tab = assoc_tab;
454: menu->p_list = pane;
455: /* -------------------- Pane window data -------------------- */
456: menu->p_style = p_style;
457: menu->p_events = DEF_P_EVENTS;
458: menu->p_fnt_info = p_fnt_info;
459: menu->p_fnt_pad = p_fnt_pad;
460: menu->p_spread = p_spread;
461: menu->p_bdr_width = p_bdr_width;
462: menu->flag_height = flag_height;
463: menu->p_width = 0;
464: menu->p_height = p_height;
465: menu->p_x_off = p_x_off;
466: menu->p_y_off = p_y_off;
467: menu->p_count = 0;
468: /* -------------------- Selection window data -------------------- */
469: menu->s_style = s_style;
470: menu->s_events = DEF_S_EVENTS;
471: menu->s_fnt_info = s_fnt_info;
472: menu->s_fnt_pad = s_fnt_pad;
473: menu->s_spread = s_spread;
474: menu->s_bdr_width = s_bdr_width;
475: menu->s_width = 0;
476: menu->s_height = s_height;
477: menu->s_x_off = s_x_off;
478: menu->s_y_off = s_y_off;
479: menu->s_count = 0;
480: /* -------------------- Color data -------------------- */
481: menu->p_bdr_color = p_bdr_color;
482: menu->s_bdr_color = s_bdr_color;
483: menu->p_frg_color = p_frg_color;
484: menu->s_frg_color = s_frg_color;
485: menu->bkgnd_color = bkgnd_color;
486: /* -------------------- Pixmap data -------------------- */
487: menu->p_bdr_pixmap = p_bdr_pixmap;
488: menu->s_bdr_pixmap = s_bdr_pixmap;
489: menu->p_frg_pixmap = p_frg_pixmap;
490: menu->s_frg_pixmap = s_frg_pixmap;
491: menu->bkgnd_pixmap = bkgnd_pixmap;
492: menu->inact_pixmap = inact_pixmap;
493:
494: /*
495: * Return the completed XMenu.
496: */
497: _XMErrorCode = XME_NO_ERROR;
498: return(menu);
499: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.