|
|
1.1 ! root 1: /* $Header: Create.c,v 1.14 88/02/02 19:02:31 jim Exp $ */ ! 2: /* Copyright Massachusetts Institute of Technology 1985 */ ! 3: ! 4: #include <X11/copyright.h> ! 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 "XMenuInt.h" ! 17: ! 18: ! 19: #include <X11/bitmaps/dimple1> ! 20: #include <X11/bitmaps/dimple3> ! 21: #include <X11/bitmaps/gray1> ! 22: #include <X11/bitmaps/gray3> ! 23: #include <X11/bitmaps/cross_weave> ! 24: ! 25: #include <X11/bitmaps/left_ptr> ! 26: #include <X11/bitmaps/left_ptrmsk> ! 27: #include <X11/bitmaps/right_ptr> ! 28: #include <X11/bitmaps/right_ptrmsk> ! 29: #include <X11/bitmaps/cntr_ptr> ! 30: #include <X11/bitmaps/cntr_ptrmsk> ! 31: #include <X11/bitmaps/stipple> ! 32: ! 33: ! 34: #define DEF_FREEZE 0 ! 35: #define DEF_REVERSE 0 ! 36: #define DEF_MENU_STYLE LEFT ! 37: #define DEF_MENU_MODE BOX ! 38: #define DEF_INACT_PNUM 3 ! 39: #define MAX_INACT_PNUM 4 ! 40: ! 41: #define DEF_P_STYLE CENTER ! 42: ! 43: #define DEF_P_EVENTS (EnterWindowMask | ExposureMask) ! 44: #define DEF_P_FNT_NAME "fixed" ! 45: #define DEF_P_SPREAD 0.5 ! 46: #define DEF_P_BDR_WIDTH 2 ! 47: ! 48: #define DEF_S_STYLE LEFT ! 49: #define DEF_S_EVENTS (EnterWindowMask | LeaveWindowMask) ! 50: #define DEF_S_FNT_NAME "fixed" ! 51: #define DEF_S_SPREAD 0.10 ! 52: #define DEF_S_BDR_WIDTH 1 ! 53: ! 54: #define XASSOC_TABLE_SIZE 64 ! 55: ! 56: #define TILE_BUF_SIZE 5 ! 57: ! 58: int atoi(); ! 59: double atof(); ! 60: ! 61: XMenu * ! 62: XMenuCreate(display, parent, def_env) ! 63: Display *display; /* ID of previously opened display */ ! 64: Window parent; /* Window ID of the menu's parent window. */ ! 65: register char *def_env; /* X Defaults program environment name. */ ! 66: { ! 67: register int i; /* Loop counter. */ ! 68: register int j; /* Loop counter. */ ! 69: register char *def_val; /* X Default value temp variable. */ ! 70: ! 71: register XMenu *menu; /* Pointer to the new menu. */ ! 72: XMStyle menu_style; /* Menu display style. */ ! 73: XMMode menu_mode; /* Menu display mode. */ ! 74: XMPane *pane; /* Pane list header. */ ! 75: XAssocTable *assoc_tab; /* XAssocTable pointer. */ ! 76: ! 77: int freeze; /* Freeze server mode. */ ! 78: int reverse; /* Reverse video mode. */ ! 79: ! 80: XMStyle p_style; /* Pane display style. */ ! 81: char *p_fnt_name; /* Flag font name. */ ! 82: XFontStruct *p_fnt_info; /* Flag font structure */ ! 83: int p_fnt_pad; /* Flag font padding in pixels. */ ! 84: double p_spread; /* Pane spread in flag height fractions. */ ! 85: int p_fnt_height; /* Pane character height. */ ! 86: int p_bdr_width; /* Pane border width. */ ! 87: int flag_height; /* Flag window height. */ ! 88: int p_height; /* Pane window height. */ ! 89: int p_x_off; /* Pane X offset. */ ! 90: int p_y_off; /* Pane Y offset. */ ! 91: GC pane_GC; /* Pane graphics context. */ ! 92: ! 93: XMStyle s_style; /* Selection display style. */ ! 94: char *s_fnt_name; /* Selection font name. */ ! 95: XFontStruct *s_fnt_info; /* Selection font structure. */ ! 96: int s_fnt_pad; /* Selection font padding in pixels. */ ! 97: int s_fnt_height; /* Selection font character height */ ! 98: double s_spread; /* Select spread in line height fractions. */ ! 99: int s_bdr_width; /* Highlight border width. */ ! 100: int s_height; /* Selection window height. */ ! 101: int s_x_off; /* Selection window X offset. */ ! 102: int s_y_off; /* Selection window Y offset. */ ! 103: GC normal_select_GC; /* GC used for normal video selection. */ ! 104: GC inverse_select_GC; /* GC used for inverse video selection. */ ! 105: GC inact_GC; /* GC for inactive pane header and */ ! 106: /* selections. */ ! 107: GC inact_GC_noexpose; ! 108: ! 109: XColor color_def; /* Temp color definition holder. */ ! 110: XColor screen_def; /* Temp screen color defintion holder */ ! 111: XColor p_bdr_color; /* Color of border. */ ! 112: XColor s_bdr_color; /* Color of highlight. */ ! 113: XColor p_frg_color; /* Color of pane foreground color. */ ! 114: XColor s_frg_color; /* Color of selection foreground. */ ! 115: XColor bkgnd_color; /* Color of background.. */ ! 116: XColor mouse_color; /* Color of mouse cursor. */ ! 117: Cursor mouse_cursor; /* Mouse cursor. */ ! 118: Pixmap inact_bitmap; /* Menu inactive pixmap. */ ! 119: ! 120: int inact_pnum; /* Inactive background pattern number. */ ! 121: ! 122: Pixel p_bdr_pixel; /* Pane border pixel. */ ! 123: Pixel s_bdr_pixel; /* Selection border pixel. */ ! 124: Pixel p_frg_pixel; /* Pane forground pixel. */ ! 125: Pixel s_frg_pixel; /* Selection forground pixel. */ ! 126: Pixel bkgnd_pixel; /* Menu background pixel. */ ! 127: ! 128: int *width, *height; ! 129: Pixmap *bitmap; ! 130: int *x_hot, *y_hot; ! 131: int status; /* Return code from XReadBitmapFile. */ ! 132: ! 133: Pixmap cursor; /* Cursor pixmap holder. */ ! 134: Pixmap cursor_mask; /* Cursor mask pixmap holder. */ ! 135: Pixmap stipple_pixmap; /* Stippple mask for half-tone text. */ ! 136: unsigned long valuemask; ! 137: XGCValues *values; ! 138: ! 139: ! 140: /* ! 141: * Calloc the XMenu structure and the initial pane. ! 142: */ ! 143: menu = (XMenu *)calloc(1, sizeof(XMenu)); ! 144: if (menu == NULL) { ! 145: _XMErrorCode = XME_CALLOC; ! 146: return(NULL); ! 147: } ! 148: pane = (XMPane *)calloc(1, sizeof(XMPane)); ! 149: if (pane == NULL) { ! 150: _XMErrorCode = XME_CALLOC; ! 151: return(NULL); ! 152: } ! 153: ! 154: /* ! 155: * Create the XAssocTable ! 156: */ ! 157: assoc_tab = (XAssocTable *)XCreateAssocTable(XASSOC_TABLE_SIZE); ! 158: if(assoc_tab == NULL) { ! 159: _XMErrorCode= XME_CREATE_ASSOC; ! 160: return(NULL); ! 161: } ! 162: ! 163: /* ! 164: * Set up the default environment name. ! 165: */ ! 166: if (def_env == NULL || *def_env == '\0') def_env = "XMenu"; ! 167: ! 168: /* ! 169: * Set up internal fail-safe defaults. ! 170: */ ! 171: freeze = DEF_FREEZE; ! 172: reverse = DEF_REVERSE; ! 173: menu_style = DEF_MENU_STYLE; ! 174: menu_mode = DEF_MENU_MODE; ! 175: inact_pnum = DEF_INACT_PNUM; ! 176: ! 177: p_style = DEF_P_STYLE; ! 178: p_spread = DEF_P_SPREAD; ! 179: p_fnt_name = DEF_P_FNT_NAME; ! 180: p_bdr_width = DEF_P_BDR_WIDTH; ! 181: ! 182: s_style = DEF_S_STYLE; ! 183: s_spread = DEF_S_SPREAD; ! 184: s_fnt_name = DEF_S_FNT_NAME; ! 185: s_bdr_width = DEF_S_BDR_WIDTH; ! 186: ! 187: /* ! 188: * Get default values from X. ! 189: */ ! 190: def_val = XGetDefault(display, def_env, "MenuFreeze"); ! 191: if (def_val != NULL) { ! 192: if (strcmp(def_val, "on") == 0) freeze = 1; ! 193: else if (strcmp(def_val, "off") == 0) freeze = 0; ! 194: } ! 195: ! 196: def_val = XGetDefault(display, def_env, "MenuReverseVideo"); ! 197: if (def_val != NULL) { ! 198: if (strcmp(def_val, "on") == 0) reverse = 1; ! 199: else if (strcmp(def_val, "off") == 0) reverse = 0; ! 200: } ! 201: ! 202: def_val = XGetDefault(display, def_env, "MenuStyle"); ! 203: if (def_val != NULL) { ! 204: if (strcmp(def_val, "right_hand") == 0) menu_style = RIGHT; ! 205: else if (strcmp(def_val, "left_hand") == 0) menu_style = LEFT; ! 206: else if (strcmp(def_val, "center") == 0) menu_style = CENTER; ! 207: } ! 208: ! 209: def_val = XGetDefault(display, def_env, "MenuMode"); ! 210: if (def_val != NULL) { ! 211: if (strcmp(def_val, "box") == 0) menu_mode = BOX; ! 212: else if (strcmp(def_val, "invert") == 0) menu_mode = INVERT; ! 213: } ! 214: ! 215: def_val = XGetDefault(display, def_env, "MenuMouse"); ! 216: if ( ! 217: def_val != NULL && ! 218: DisplayCells(display, DefaultScreen(display)) > 2 && ! 219: XAllocNamedColor(display, ! 220: DefaultColormap(display, DefaultScreen(display)), ! 221: def_val, ! 222: &mouse_color, &color_def) ! 223: ); ! 224: else if (reverse && ! 225: XAllocNamedColor(display, ! 226: DefaultColormap(display, DefaultScreen(display)), ! 227: "white", ! 228: &mouse_color, &color_def) ! 229: ); ! 230: ! 231: else if (XAllocNamedColor(display, ! 232: DefaultColormap(display, DefaultScreen(display)), ! 233: "black", ! 234: &mouse_color, &color_def) ! 235: ); ! 236: ! 237: else ; ! 238: ! 239: def_val = XGetDefault(display, def_env, "MenuBackground"); ! 240: if ( ! 241: def_val != NULL && ! 242: DisplayCells(display, DefaultScreen(display)) > 2 && ! 243: XAllocNamedColor(display, ! 244: DefaultColormap(display, DefaultScreen(display)), ! 245: def_val, ! 246: &bkgnd_color, &color_def) ! 247: ); ! 248: else if (reverse && ! 249: XAllocNamedColor(display, ! 250: DefaultColormap(display, DefaultScreen(display)), ! 251: "black", ! 252: &bkgnd_color, &color_def) ! 253: ); ! 254: else if (XAllocNamedColor(display, ! 255: DefaultColormap(display, DefaultScreen(display)), ! 256: "white", ! 257: &bkgnd_color, &color_def) ! 258: ); ! 259: else; ! 260: ! 261: def_val = XGetDefault(display, def_env, "MenuInactivePattern"); ! 262: if (def_val != NULL) { ! 263: if (strcmp(def_val, "dimple1") == 0) inact_pnum = 0; ! 264: else if (strcmp(def_val, "dimple3") == 0) inact_pnum = 1; ! 265: else if (strcmp(def_val, "gray1") == 0) inact_pnum = 2; ! 266: else if (strcmp(def_val, "gray3") == 0) inact_pnum = 3; ! 267: else if (strcmp(def_val, "cross_weave") == 0) inact_pnum = 4; ! 268: } ! 269: ! 270: def_val = XGetDefault(display, def_env, "PaneStyle"); ! 271: if (def_val != NULL) { ! 272: if (strcmp(def_val, "flush_left") == 0) p_style = LEFT; ! 273: else if (strcmp(def_val, "flush_right") == 0) p_style = RIGHT; ! 274: else if (strcmp(def_val, "center") == 0) p_style = CENTER; ! 275: } ! 276: ! 277: def_val = XGetDefault(display, def_env, "PaneFont"); ! 278: if (def_val != NULL) p_fnt_name = def_val; ! 279: ! 280: def_val = XGetDefault(display, def_env, "PaneForeground"); ! 281: if ( ! 282: def_val != NULL && ! 283: DisplayCells(display, DefaultScreen(display)) > 2 ! 284: ) ! 285: XAllocNamedColor(display, DefaultColormap(display, ! 286: DefaultScreen(display)), ! 287: def_val, ! 288: &p_frg_color, &color_def); ! 289: ! 290: else if (reverse) XAllocNamedColor(display, ! 291: DefaultColormap(display, ! 292: DefaultScreen(display)), ! 293: "white", ! 294: &p_frg_color, &color_def); ! 295: else XAllocNamedColor(display, ! 296: DefaultColormap(display, DefaultScreen(display)), ! 297: "black", ! 298: &p_frg_color, &color_def); ! 299: ! 300: def_val = XGetDefault(display, def_env, "PaneBorder"); ! 301: if ( ! 302: def_val != NULL && ! 303: DisplayCells(display, DefaultScreen(display)) > 2 && ! 304: XAllocNamedColor(display, ! 305: DefaultColormap(display, DefaultScreen(display)), ! 306: def_val, ! 307: &p_bdr_color, &color_def) ! 308: ); ! 309: else if (reverse && ! 310: XAllocNamedColor(display, ! 311: DefaultColormap(display, DefaultScreen(display)), ! 312: "white", ! 313: &p_bdr_color, &color_def) ! 314: ); ! 315: else XAllocNamedColor(display, ! 316: DefaultColormap(display, DefaultScreen(display)), ! 317: "black", ! 318: &p_bdr_color, &color_def); ! 319: ! 320: def_val = XGetDefault(display, def_env, "PaneBorderWidth"); ! 321: if (def_val != NULL) p_bdr_width = atoi(def_val); ! 322: ! 323: def_val = XGetDefault(display, def_env, "PaneSpread"); ! 324: if (def_val != NULL) p_spread = atof(def_val); ! 325: ! 326: def_val = XGetDefault(display, def_env, "SelectionStyle"); ! 327: if (def_val != NULL) { ! 328: if (strcmp(def_val, "flush_left") == 0) s_style = LEFT; ! 329: else if (strcmp(def_val, "flush_right") == 0) s_style = RIGHT; ! 330: else if (strcmp(def_val, "center") == 0) s_style = CENTER; ! 331: } ! 332: ! 333: def_val = XGetDefault(display, def_env, "SelectionFont"); ! 334: if (def_val != NULL) s_fnt_name = def_val; ! 335: ! 336: def_val = XGetDefault(display, def_env, "SelectionForeground"); ! 337: if ( ! 338: def_val != NULL && ! 339: DisplayCells(display, DefaultScreen(display)) > 2 && ! 340: XAllocNamedColor(display, ! 341: DefaultColormap(display, DefaultScreen(display)), ! 342: def_val, ! 343: &s_frg_color, &color_def) ! 344: ); ! 345: else if (reverse && ! 346: XAllocNamedColor(display, ! 347: DefaultColormap(display, DefaultScreen(display)), ! 348: "white", ! 349: &s_frg_color, &color_def) ! 350: ) ; ! 351: else if (XAllocNamedColor(display, ! 352: DefaultColormap(display, DefaultScreen(display)), ! 353: "black", ! 354: &s_frg_color, &color_def) ! 355: ) ; ! 356: else ; ! 357: ! 358: ! 359: def_val = XGetDefault(display, def_env, "SelectionBorder"); ! 360: if ( ! 361: def_val != NULL && ! 362: DisplayCells(display, DefaultScreen(display)) > 2 && ! 363: XAllocNamedColor(display, ! 364: DefaultColormap(display, DefaultScreen(display)), ! 365: def_val, ! 366: &s_bdr_color, &color_def) ! 367: ) ; ! 368: else if (reverse && ! 369: XAllocNamedColor(display, ! 370: DefaultColormap(display, DefaultScreen(display)), ! 371: "white", ! 372: &s_bdr_color, &color_def) ! 373: ) ; ! 374: else if (XAllocNamedColor(display, ! 375: DefaultColormap(display, DefaultScreen(display)), ! 376: "black", ! 377: &s_bdr_color, &color_def) ! 378: ) ; ! 379: else ; ! 380: ! 381: def_val = XGetDefault(display, def_env, "SelectionBorderWidth"); ! 382: if (def_val != NULL) s_bdr_width = atoi(def_val); ! 383: ! 384: def_val = XGetDefault(display, def_env, "SelectionSpread"); ! 385: if (def_val != NULL) s_spread = atof(def_val); ! 386: ! 387: /* ! 388: * Create and store the inactive pattern pixmap. ! 389: */ ! 390: switch (inact_pnum) ! 391: { ! 392: case 0: ! 393: inact_bitmap = XCreateBitmapFromData( ! 394: display, ! 395: RootWindow(display, DefaultScreen(display)), ! 396: dimple1_bits, ! 397: 16, 16 ! 398: ); ! 399: break; ! 400: case 1: ! 401: inact_bitmap = XCreateBitmapFromData( ! 402: display, ! 403: RootWindow(display, DefaultScreen(display)), ! 404: dimple3_bits, ! 405: 16,16); ! 406: break; ! 407: case 2: ! 408: inact_bitmap = XCreateBitmapFromData( ! 409: display, RootWindow(display, DefaultScreen(display)), ! 410: gray1_bits, 16, 16); ! 411: break; ! 412: case 3: ! 413: inact_bitmap = XCreateBitmapFromData( ! 414: display, ! 415: RootWindow(display, DefaultScreen(display)), ! 416: gray3_bits, 16, 16); ! 417: break; ! 418: case 4: ! 419: inact_bitmap = XCreateBitmapFromData( ! 420: display, ! 421: RootWindow(display, DefaultScreen(display)), ! 422: cross_weave_bits, 16, 16); ! 423: break; ! 424: default: ! 425: break; ! 426: ! 427: } ! 428: if (inact_bitmap == NULL) { ! 429: _XMErrorCode = XME_STORE_BITMAP; ! 430: return(NULL); ! 431: } ! 432: ! 433: /* ! 434: * Load the mouse cursor. ! 435: */ ! 436: ! 437: switch (menu_style) { ! 438: case LEFT: ! 439: cursor = XCreateBitmapFromData(display, ! 440: RootWindow(display, ! 441: DefaultScreen(display)), ! 442: left_ptr_bits, ! 443: left_ptr_width, ! 444: left_ptr_height); ! 445: cursor_mask = XCreateBitmapFromData(display, ! 446: RootWindow(display, ! 447: DefaultScreen(display)), ! 448: left_ptrmsk_bits, ! 449: left_ptrmsk_width, ! 450: left_ptrmsk_height); ! 451: mouse_cursor = XCreatePixmapCursor( ! 452: display, ! 453: cursor, cursor_mask, ! 454: &mouse_color, &bkgnd_color, ! 455: left_ptr_x_hot, ! 456: left_ptr_y_hot ! 457: ); ! 458: XFreePixmap(display, cursor); ! 459: XFreePixmap(display, cursor_mask); ! 460: break; ! 461: case RIGHT: ! 462: cursor = XCreateBitmapFromData(display, ! 463: RootWindow(display, ! 464: DefaultScreen(display)), ! 465: right_ptr_bits, ! 466: right_ptr_width, ! 467: right_ptr_height); ! 468: cursor_mask = XCreateBitmapFromData(display, ! 469: RootWindow(display, ! 470: DefaultScreen(display)), ! 471: right_ptrmsk_bits, ! 472: right_ptrmsk_width, ! 473: right_ptrmsk_height); ! 474: mouse_cursor = XCreatePixmapCursor( ! 475: display, ! 476: cursor, cursor_mask, ! 477: &mouse_color, &bkgnd_color, ! 478: right_ptr_x_hot, ! 479: right_ptr_y_hot ! 480: ); ! 481: XFreePixmap(display, cursor); ! 482: XFreePixmap(display, cursor_mask); ! 483: break; ! 484: case CENTER: ! 485: cursor = XCreateBitmapFromData(display, ! 486: RootWindow(display, ! 487: DefaultScreen(display)), ! 488: cntr_ptr_bits, ! 489: cntr_ptr_width, ! 490: cntr_ptr_height); ! 491: cursor_mask = XCreateBitmapFromData(display, ! 492: RootWindow(display, ! 493: DefaultScreen(display)), ! 494: cntr_ptrmsk_bits, ! 495: cntr_ptrmsk_width, ! 496: cntr_ptrmsk_height); ! 497: mouse_cursor = XCreatePixmapCursor( ! 498: display, ! 499: cursor, cursor_mask, ! 500: &mouse_color, &bkgnd_color, ! 501: cntr_ptr_x_hot, ! 502: cntr_ptr_y_hot ! 503: ); ! 504: XFreePixmap(display, cursor); ! 505: XFreePixmap(display, cursor_mask); ! 506: break; ! 507: default: ! 508: /* Error! Invalid style parameter. */ ! 509: _XMErrorCode = XME_STYLE_PARAM; ! 510: return(NULL); ! 511: } ! 512: if (mouse_cursor == _X_FAILURE) { ! 513: _XMErrorCode = XME_CREATE_CURSOR; ! 514: return(NULL); ! 515: } ! 516: ! 517: /* ! 518: * Open the pane and selection fonts. ! 519: */ ! 520: ! 521: p_fnt_info = XLoadQueryFont(display, p_fnt_name); ! 522: if (p_fnt_info == NULL) { ! 523: _XMErrorCode = XME_OPEN_FONT; ! 524: return(NULL); ! 525: ! 526: } ! 527: ! 528: s_fnt_info = XLoadQueryFont(display, s_fnt_name); ! 529: if (s_fnt_info == NULL) { ! 530: _XMErrorCode = XME_OPEN_FONT; ! 531: return(NULL); ! 532: } ! 533: /* ! 534: * Calculate the fixed padding value in pixels for each font. ! 535: */ ! 536: p_fnt_height = p_fnt_info->max_bounds.ascent + p_fnt_info->max_bounds.descent; ! 537: s_fnt_height = s_fnt_info->max_bounds.ascent + s_fnt_info->max_bounds.descent; ! 538: p_fnt_pad = s_spread * p_fnt_height; ! 539: s_fnt_pad = s_spread * s_fnt_height; ! 540: ! 541: /* ! 542: * Calculate fixed height and offset requirements. ! 543: */ ! 544: flag_height = p_fnt_height + (p_fnt_pad << 1); ! 545: ! 546: p_height = 0; ! 547: p_y_off = flag_height + p_bdr_width; ! 548: p_x_off = p_y_off * p_spread; ! 549: ! 550: s_height = s_fnt_height + (s_fnt_pad << 1) + (s_bdr_width << 1); ! 551: s_y_off = s_height; ! 552: s_x_off = p_x_off; ! 553: ! 554: /* ! 555: * Set up the pane list header. ! 556: */ ! 557: pane->next = pane; ! 558: pane->prev = pane; ! 559: pane->type = PL_HEADER; ! 560: pane->serial = -1; ! 561: ! 562: /* ! 563: * Initialize the internal pane and selection creation queues. ! 564: */ ! 565: _XMWinQueInit(); ! 566: ! 567: /* ! 568: * Create pane, active, and inactive GC's. ! 569: */ ! 570: values = (XGCValues *)malloc(sizeof(XGCValues)); ! 571: valuemask = (GCForeground | GCBackground | GCFont | GCLineWidth); ! 572: ! 573: /* ! 574: * First, pane. ! 575: */ ! 576: ! 577: values->foreground = p_frg_color.pixel; ! 578: values->background = bkgnd_color.pixel; ! 579: values->font = p_fnt_info->fid; ! 580: values->line_width = p_bdr_width; ! 581: ! 582: pane_GC = XCreateGC( ! 583: display, ! 584: RootWindow(display, DefaultScreen(display)), ! 585: valuemask, ! 586: values); ! 587: /* ! 588: * Then normal video selection. ! 589: */ ! 590: ! 591: values->foreground = s_frg_color.pixel; ! 592: values->background = bkgnd_color.pixel; ! 593: values->font = s_fnt_info->fid; ! 594: values->line_width = s_bdr_width; ! 595: normal_select_GC = XCreateGC(display, ! 596: RootWindow(display, DefaultScreen(display)), ! 597: valuemask, ! 598: values); ! 599: /* ! 600: * Inverse video selection. ! 601: */ ! 602: ! 603: values->foreground = bkgnd_color.pixel; ! 604: values->background = s_frg_color.pixel; ! 605: values->font = s_fnt_info->fid; ! 606: values->line_width = s_bdr_width; ! 607: inverse_select_GC = XCreateGC(display, ! 608: RootWindow(display, DefaultScreen(display)), ! 609: valuemask, ! 610: values); ! 611: stipple_pixmap = XCreateBitmapFromData(display, ! 612: RootWindow(display, ! 613: DefaultScreen(display)), ! 614: stipple_bits, ! 615: stipple_width, ! 616: stipple_height); ! 617: ! 618: /* ! 619: * Finally, inactive pane header and selections ! 620: */ ! 621: valuemask |= (GCFillStyle | GCStipple); ! 622: values->foreground = s_frg_color.pixel; ! 623: values->background = bkgnd_color.pixel; ! 624: values->font = s_fnt_info->fid; ! 625: values->line_width = s_bdr_width; ! 626: values->fill_style = FillStippled; ! 627: values->stipple = stipple_pixmap; ! 628: ! 629: inact_GC = XCreateGC(display, ! 630: RootWindow(display, DefaultScreen(display)), ! 631: valuemask, ! 632: values); ! 633: ! 634: valuemask |= (GCGraphicsExposures); ! 635: values->graphics_exposures = False; ! 636: inact_GC_noexpose = XCreateGC (display, ! 637: RootWindow (display, ! 638: DefaultScreen (display)), ! 639: valuemask, values); ! 640: ! 641: ! 642: /* ! 643: * Construct the XMenu object. ! 644: */ ! 645: /* -------------------- Menu data -------------------- */ ! 646: menu->menu_style = menu_style; ! 647: menu->menu_mode = menu_mode; ! 648: menu->freeze = freeze; ! 649: menu->aeq = 0; ! 650: menu->recompute = 1; ! 651: menu->parent = parent; ! 652: menu->height = 0; ! 653: menu->width = 0; ! 654: menu->mouse_cursor = mouse_cursor; ! 655: menu->assoc_tab = assoc_tab; ! 656: menu->p_list = pane; ! 657: /* -------------------- Pane window data -------------------- */ ! 658: menu->p_style = p_style; ! 659: menu->p_events = DEF_P_EVENTS; ! 660: menu->p_fnt_info = p_fnt_info; ! 661: menu->p_fnt_pad = p_fnt_pad; ! 662: menu->p_spread = p_spread; ! 663: menu->p_bdr_width = p_bdr_width; ! 664: menu->flag_height = flag_height; ! 665: menu->p_width = 0; ! 666: menu->p_height = p_height; ! 667: menu->p_x_off = p_x_off; ! 668: menu->p_y_off = p_y_off; ! 669: menu->p_count = 0; ! 670: menu->pane_GC = pane_GC; ! 671: menu->x_pos = 0; ! 672: menu->y_pos = 0; ! 673: /* -------------------- Selection window data -------------------- */ ! 674: menu->s_style = s_style; ! 675: menu->s_events = DEF_S_EVENTS; ! 676: menu->s_fnt_info = s_fnt_info; ! 677: menu->s_fnt_pad = s_fnt_pad; ! 678: menu->s_spread = s_spread; ! 679: menu->s_bdr_width = s_bdr_width; /* unnecessary */ ! 680: menu->s_width = 0; ! 681: menu->s_height = s_height; ! 682: menu->s_x_off = s_x_off; ! 683: menu->s_y_off = s_y_off; ! 684: menu->s_count = 0; ! 685: menu->normal_select_GC = normal_select_GC; ! 686: menu->inverse_select_GC = inverse_select_GC; ! 687: menu->inact_GC = inact_GC; ! 688: /* -------------------- Color data -------------------- */ ! 689: menu->p_bdr_color = p_bdr_color.pixel; ! 690: menu->s_bdr_color = s_bdr_color.pixel; ! 691: menu->p_frg_color = p_frg_color.pixel; ! 692: menu->s_frg_color = s_frg_color.pixel; ! 693: menu->bkgnd_color = bkgnd_color.pixel; ! 694: /* -------------------- Pixmap data -------------------- */ ! 695: menu->p_bdr_pixmap = NULL; ! 696: menu->s_bdr_pixmap = NULL; ! 697: menu->p_frg_pixmap = NULL; ! 698: menu->s_frg_pixmap = NULL; ! 699: menu->bkgnd_pixmap = NULL; ! 700: if (DisplayPlanes (display, DefaultScreen (display)) == 1) ! 701: menu->inact_pixmap = inact_bitmap; ! 702: else ! 703: { ! 704: int loop; ! 705: ! 706: menu->inact_pixmap = XCreatePixmap (display, ! 707: parent, ! 708: 16, ! 709: 16, ! 710: DisplayPlanes (display, ! 711: DefaultScreen (display))); ! 712: if (menu->inact_pixmap == NULL) ! 713: { ! 714: _XMErrorCode = XME_STORE_BITMAP; ! 715: return(NULL); ! 716: } ! 717: ! 718: XCopyPlane (display, inact_bitmap, menu->inact_pixmap, ! 719: inact_GC_noexpose, 0, 0, 16, 16, 0, 0, 1); ! 720: ! 721: /* ! 722: for (loop = 0; ! 723: loop < DisplayPlanes (display, DefaultScreen (display)); ! 724: loop++) ! 725: { ! 726: XCopyPlane (display, ! 727: inact_bitmap, ! 728: menu->inact_pixmap, ! 729: inact_GC, ! 730: 0, ! 731: 0, ! 732: 16, ! 733: 16, ! 734: 0, ! 735: 0, ! 736: (1 << loop)); ! 737: } ! 738: */ ! 739: } ! 740: ! 741: /* ! 742: * Return the completed XMenu. ! 743: */ ! 744: _XMErrorCode = XME_NO_ERROR; ! 745: return(menu); ! 746: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.