Annotation of researchv9/X11/src/X.V11R1/lib/oldXMenu/Create.c, revision 1.1

1.1     ! root        1: /* $Header: Create.c,v 1.10 87/09/10 23:04:14 toddb 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 "XMenuInternal.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: 
        !           108:     XColor color_def;          /* Temp color definition holder. */
        !           109:     XColor screen_def;         /* Temp screen color defintion holder */
        !           110:     XColor p_bdr_color;                /* Color of border. */
        !           111:     XColor s_bdr_color;                /* Color of highlight. */
        !           112:     XColor p_frg_color;                /* Color of pane foreground color. */
        !           113:     XColor s_frg_color;                /* Color of selection foreground. */
        !           114:     XColor bkgnd_color;                /* Color of background.. */
        !           115:     XColor mouse_color;                /* Color of mouse cursor. */
        !           116:     Cursor mouse_cursor;       /* Mouse cursor. */
        !           117:     Pixmap inact_pixmap;        /* Menu inactive pixmap. */
        !           118: 
        !           119:     int inact_pnum;            /* Inactive background pattern number. */
        !           120: 
        !           121:     Pixel p_bdr_pixel;         /* Pane border pixel. */
        !           122:     Pixel s_bdr_pixel;         /* Selection border pixel. */
        !           123:     Pixel p_frg_pixel;         /* Pane forground pixel. */
        !           124:     Pixel s_frg_pixel;         /* Selection forground pixel. */
        !           125:     Pixel bkgnd_pixel;         /* Menu background pixel. */
        !           126: 
        !           127:     int *width, *height;
        !           128:     Pixmap *bitmap;
        !           129:     int *x_hot, *y_hot;
        !           130:     int status;                 /* Return code from XReadBitmapFile. */
        !           131: 
        !           132:     Pixmap cursor;              /* Cursor pixmap holder. */
        !           133:     Pixmap cursor_mask;         /* Cursor mask pixmap holder. */
        !           134:     Pixmap stipple_pixmap;     /* Stippple mask for half-tone text. */
        !           135:     unsigned long valuemask;
        !           136:     XGCValues *values;
        !           137:     
        !           138: 
        !           139:     /*
        !           140:      * Calloc the XMenu structure and the initial pane.
        !           141:      */
        !           142:     menu = (XMenu *)calloc(1, sizeof(XMenu));
        !           143:     if (menu == NULL) {
        !           144:        _XMErrorCode = XME_CALLOC;
        !           145:        return(NULL);
        !           146:     }
        !           147:     pane = (XMPane *)calloc(1, sizeof(XMPane));
        !           148:     if (pane == NULL) {
        !           149:        _XMErrorCode = XME_CALLOC;
        !           150:        return(NULL);
        !           151:     }
        !           152:     
        !           153:     /* 
        !           154:      * Create the XAssocTable
        !           155:      */
        !           156:     assoc_tab = (XAssocTable *)XCreateAssocTable(XASSOC_TABLE_SIZE);
        !           157:     if(assoc_tab == NULL) {
        !           158:        _XMErrorCode= XME_CREATE_ASSOC;
        !           159:        return(NULL);
        !           160:     }
        !           161: 
        !           162:     /*
        !           163:      * Set up the default environment name.
        !           164:      */
        !           165:     if (def_env == NULL || *def_env == '\0') def_env = "XMenu";
        !           166: 
        !           167:     /*
        !           168:      * Set up internal fail-safe defaults.
        !           169:      */
        !           170:     freeze = DEF_FREEZE;
        !           171:     reverse = DEF_REVERSE;
        !           172:     menu_style = DEF_MENU_STYLE;
        !           173:     menu_mode = DEF_MENU_MODE;
        !           174:     inact_pnum = DEF_INACT_PNUM;
        !           175: 
        !           176:     p_style = DEF_P_STYLE;
        !           177:     p_spread = DEF_P_SPREAD;
        !           178:     p_fnt_name = DEF_P_FNT_NAME;
        !           179:     p_bdr_width = DEF_P_BDR_WIDTH;
        !           180: 
        !           181:     s_style = DEF_S_STYLE;
        !           182:     s_spread = DEF_S_SPREAD;
        !           183:     s_fnt_name = DEF_S_FNT_NAME;
        !           184:     s_bdr_width = DEF_S_BDR_WIDTH;
        !           185: 
        !           186:     /*
        !           187:      * Get default values from X.
        !           188:      */
        !           189:     def_val = XGetDefault(def_env, "MenuFreeze");
        !           190:     if (def_val != NULL) {
        !           191:        if (strcmp(def_val, "on") == 0) freeze = 1;
        !           192:        else if (strcmp(def_val, "off") == 0) freeze = 0;
        !           193:     }
        !           194: 
        !           195:     def_val = XGetDefault(def_env, "MenuReverseVideo");
        !           196:     if (def_val != NULL) {
        !           197:        if (strcmp(def_val, "on") == 0) reverse = 1;
        !           198:        else if (strcmp(def_val, "off") == 0) reverse = 0;
        !           199:     }
        !           200: 
        !           201:     def_val = XGetDefault(def_env, "MenuStyle");
        !           202:     if (def_val != NULL) {
        !           203:        if (strcmp(def_val, "right_hand") == 0) menu_style = RIGHT;
        !           204:        else if (strcmp(def_val, "left_hand") == 0) menu_style = LEFT;
        !           205:        else if (strcmp(def_val, "center") == 0) menu_style = CENTER;
        !           206:     }
        !           207: 
        !           208:     def_val = XGetDefault(def_env, "MenuMode");
        !           209:     if (def_val != NULL) {
        !           210:        if (strcmp(def_val, "box") == 0) menu_mode = BOX;
        !           211:        else if (strcmp(def_val, "invert") == 0) menu_mode = INVERT;
        !           212:     }
        !           213:     
        !           214:     def_val = XGetDefault(def_env, "MenuMouse");
        !           215:     if (
        !           216:        def_val != NULL &&
        !           217:        DisplayCells(display, DefaultScreen(display)) > 2 &&
        !           218:        XAllocNamedColor(display, 
        !           219:                         DefaultColormap(display, DefaultScreen(display)), 
        !           220:                         def_val, 
        !           221:                         &mouse_color, &color_def)
        !           222:        );
        !           223:     else if (reverse &&
        !           224:             XAllocNamedColor(display,
        !           225:                              DefaultColormap(display, DefaultScreen(display)),
        !           226:                              "white",
        !           227:                              &mouse_color, &color_def)
        !           228:             );
        !           229:     
        !           230:     else if (XAllocNamedColor(display,
        !           231:                              DefaultColormap(display, DefaultScreen(display)),
        !           232:                              "black", 
        !           233:                              &mouse_color, &color_def)
        !           234:             );
        !           235:     
        !           236:     else ;
        !           237: 
        !           238:     def_val = XGetDefault(def_env, "MenuBackground");
        !           239:     if (
        !           240:        def_val != NULL &&
        !           241:        DisplayCells(display, DefaultScreen(display)) > 2 &&
        !           242:        XAllocNamedColor(display,
        !           243:                         DefaultColormap(display, DefaultScreen(display)),
        !           244:                         def_val,
        !           245:                         &bkgnd_color, &color_def)
        !           246:        );
        !           247:     else if (reverse &&
        !           248:             XAllocNamedColor(display,
        !           249:                              DefaultColormap(display, DefaultScreen(display)),
        !           250:                              "black",
        !           251:                              &bkgnd_color, &color_def)
        !           252:             );
        !           253:     else if (XAllocNamedColor(display,
        !           254:                              DefaultColormap(display, DefaultScreen(display)),
        !           255:                              "white",
        !           256:                              &bkgnd_color, &color_def)
        !           257:             );
        !           258:     else;
        !           259: 
        !           260:     def_val = XGetDefault(def_env, "MenuInactivePattern");
        !           261:     if (def_val != NULL) {
        !           262:        if (strcmp(def_val, "dimple1") == 0) inact_pnum = 0;
        !           263:        else if (strcmp(def_val, "dimple3") == 0) inact_pnum = 1;
        !           264:        else if (strcmp(def_val, "gray1") == 0) inact_pnum = 2;
        !           265:        else if (strcmp(def_val, "gray3") == 0) inact_pnum = 3;
        !           266:        else if (strcmp(def_val, "cross_weave") == 0) inact_pnum = 4;
        !           267:     }
        !           268: 
        !           269:     def_val = XGetDefault(def_env, "PaneStyle");
        !           270:     if (def_val != NULL) {
        !           271:        if (strcmp(def_val, "flush_left") == 0) p_style = LEFT;
        !           272:        else if (strcmp(def_val, "flush_right") == 0) p_style = RIGHT;
        !           273:        else if (strcmp(def_val, "center") == 0) p_style = CENTER;
        !           274:     }
        !           275: 
        !           276:     def_val = XGetDefault(def_env, "PaneFont");
        !           277:     if (def_val != NULL) p_fnt_name = def_val;
        !           278: 
        !           279:     def_val = XGetDefault(def_env, "PaneForeground");
        !           280:     if (
        !           281:        def_val != NULL &&
        !           282:        DisplayCells(display, DefaultScreen(display)) > 2 
        !           283:        )
        !           284:       XAllocNamedColor(display, DefaultColormap(display,
        !           285:                                                DefaultScreen(display)),
        !           286:                       def_val,
        !           287:                       &p_frg_color, &color_def);
        !           288:          
        !           289:     else if (reverse) XAllocNamedColor(display,
        !           290:                                       DefaultColormap(display, 
        !           291:                                                       DefaultScreen(display)),
        !           292:                                       "white",
        !           293:                                       &p_frg_color, &color_def);
        !           294:     else XAllocNamedColor(display,
        !           295:                          DefaultColormap(display, DefaultScreen(display)),
        !           296:                          "black",
        !           297:                          &p_frg_color, &color_def);
        !           298: 
        !           299:     def_val = XGetDefault(def_env, "PaneBorder");
        !           300:     if (
        !           301:        def_val != NULL &&
        !           302:        DisplayCells(display, DefaultScreen(display)) > 2 &&
        !           303:        XAllocNamedColor(display,
        !           304:                         DefaultColormap(display, DefaultScreen(display)),
        !           305:                         def_val,
        !           306:                         &p_bdr_color, &color_def)
        !           307:        );
        !           308:     else if (reverse &&
        !           309:             XAllocNamedColor(display, 
        !           310:                              DefaultColormap(display, DefaultScreen(display)),
        !           311:                              "white",
        !           312:                              &p_bdr_color, &color_def)
        !           313:             );
        !           314:     else XAllocNamedColor(display, 
        !           315:                          DefaultColormap(display, DefaultScreen(display)),
        !           316:                          "black",
        !           317:                          &p_bdr_color, &color_def);
        !           318:     
        !           319:     def_val = XGetDefault(def_env, "PaneBorderWidth");
        !           320:     if (def_val != NULL) p_bdr_width = atoi(def_val);
        !           321:     
        !           322:     def_val = XGetDefault(def_env, "PaneSpread");
        !           323:     if (def_val != NULL) p_spread = atof(def_val);
        !           324: 
        !           325:     def_val = XGetDefault(def_env, "SelectionStyle");
        !           326:     if (def_val != NULL) {
        !           327:        if (strcmp(def_val, "flush_left") == 0) s_style = LEFT;
        !           328:        else if (strcmp(def_val, "flush_right") == 0) s_style = RIGHT;
        !           329:        else if (strcmp(def_val, "center") == 0) s_style = CENTER;
        !           330:     }
        !           331: 
        !           332:     def_val = XGetDefault(def_env, "SelectionFont");
        !           333:     if (def_val != NULL) s_fnt_name = def_val;
        !           334: 
        !           335:     def_val = XGetDefault(def_env, "SelectionForeground");
        !           336:     if (
        !           337:        def_val != NULL &&
        !           338:        DisplayCells(display, DefaultScreen(display)) > 2 &&
        !           339:        XAllocNamedColor(display,
        !           340:                         DefaultColormap(display, DefaultScreen(display)),
        !           341:                         def_val,
        !           342:                         &s_frg_color, &color_def)
        !           343:        ); 
        !           344:     else if (reverse &&
        !           345:             XAllocNamedColor(display,
        !           346:                              DefaultColormap(display, DefaultScreen(display)),
        !           347:                              "white",
        !           348:                              &s_frg_color, &color_def)
        !           349:             ) ;
        !           350:     else if (XAllocNamedColor(display,
        !           351:                              DefaultColormap(display, DefaultScreen(display)),
        !           352:                              "black",
        !           353:                              &s_frg_color, &color_def)
        !           354:             ) ;
        !           355:     else ;
        !           356:     
        !           357: 
        !           358:     def_val = XGetDefault(def_env, "SelectionBorder");
        !           359:     if (
        !           360:        def_val != NULL &&
        !           361:        DisplayCells(display, DefaultScreen(display)) > 2 &&
        !           362:        XAllocNamedColor(display,
        !           363:                         DefaultColormap(display, DefaultScreen(display)),
        !           364:                         def_val,
        !           365:                         &s_bdr_color, &color_def)
        !           366:        ) ;
        !           367:     else if (reverse &&
        !           368:             XAllocNamedColor(display, 
        !           369:                              DefaultColormap(display, DefaultScreen(display)),
        !           370:                              "white",
        !           371:                              &s_bdr_color, &color_def)
        !           372:             ) ;
        !           373:     else if (XAllocNamedColor(display,
        !           374:                              DefaultColormap(display, DefaultScreen(display)),
        !           375:                              "black",
        !           376:                              &s_bdr_color, &color_def)
        !           377:             ) ;
        !           378:     else ;
        !           379: 
        !           380:     def_val = XGetDefault(def_env, "SelectionBorderWidth");
        !           381:     if (def_val != NULL) s_bdr_width = atoi(def_val);
        !           382:     
        !           383:     def_val = XGetDefault(def_env, "SelectionSpread");
        !           384:     if (def_val != NULL) s_spread = atof(def_val);
        !           385: 
        !           386:     /*
        !           387:      * Create and store the inactive pattern pixmap.
        !           388:      */
        !           389:     switch (inact_pnum) 
        !           390:       {
        !           391:   case 0:
        !           392:          inact_pixmap = XCreateBitmapFromData(
        !           393:                                               display,
        !           394:                                               RootWindow(display, DefaultScreen(display)), 
        !           395:                                               dimple1_bits, 
        !           396:                                               16, 16
        !           397:                                               );
        !           398:          break;
        !           399:   case 1:
        !           400:          inact_pixmap = XCreateBitmapFromData(
        !           401:                                               display, 
        !           402:                                               RootWindow(display, DefaultScreen(display)), 
        !           403:                                               dimple3_bits, 
        !           404:                                               16,16);
        !           405:          break;
        !           406:   case 2:
        !           407:          inact_pixmap = XCreateBitmapFromData(
        !           408:                                               display, RootWindow(display, DefaultScreen(display)), 
        !           409:                                               gray1_bits, 16, 16);
        !           410:          break;
        !           411:   case 3:
        !           412:          inact_pixmap = XCreateBitmapFromData(
        !           413:                                               display, 
        !           414:                                               RootWindow(display, DefaultScreen(display)), 
        !           415:                                               gray3_bits, 16, 16);
        !           416:          break;
        !           417:   case 4:
        !           418:          inact_pixmap = XCreateBitmapFromData(
        !           419:                                               display, 
        !           420:                                               RootWindow(display, DefaultScreen(display)), 
        !           421:                                               cross_weave_bits, 16, 16);
        !           422:          break;
        !           423:   default:
        !           424:          break;
        !           425:          
        !           426:       }
        !           427:     if (inact_pixmap == NULL) {
        !           428:        _XMErrorCode = XME_STORE_BITMAP;
        !           429:        return(NULL);
        !           430:     }
        !           431: 
        !           432:     /*
        !           433:      * Load the mouse cursor.
        !           434:      */
        !           435:          
        !           436:     switch (menu_style) {
        !           437:         case LEFT:
        !           438:            cursor = XCreateBitmapFromData(display,
        !           439:                                           RootWindow(display,
        !           440:                                                      DefaultScreen(display)),
        !           441:                                           left_ptr_bits,
        !           442:                                           left_ptr_width,
        !           443:                                           left_ptr_height);
        !           444:            cursor_mask = XCreateBitmapFromData(display,
        !           445:                                                RootWindow(display,
        !           446:                                                      DefaultScreen(display)),
        !           447:                                                left_ptrmsk_bits,
        !           448:                                                left_ptrmsk_width,
        !           449:                                                left_ptrmsk_height);
        !           450:            mouse_cursor = XCreatePixmapCursor(
        !           451:                                               display,
        !           452:                                               cursor, cursor_mask, 
        !           453:                                               &mouse_color, &bkgnd_color,
        !           454:                                               left_ptr_x_hot,
        !           455:                                               left_ptr_y_hot
        !           456:                                               );
        !           457:            XFreePixmap(display, cursor);
        !           458:            XFreePixmap(display, cursor_mask);      
        !           459:            break;
        !           460:         case RIGHT:
        !           461:            cursor = XCreateBitmapFromData(display,
        !           462:                                           RootWindow(display,
        !           463:                                                      DefaultScreen(display)),
        !           464:                                           right_ptr_bits,
        !           465:                                           right_ptr_width,
        !           466:                                           right_ptr_height);
        !           467:            cursor_mask = XCreateBitmapFromData(display,
        !           468:                                                RootWindow(display,
        !           469:                                                      DefaultScreen(display)),
        !           470:                                                right_ptrmsk_bits,
        !           471:                                                right_ptrmsk_width,
        !           472:                                                right_ptrmsk_height);
        !           473:            mouse_cursor = XCreatePixmapCursor(
        !           474:                                               display,
        !           475:                                               cursor, cursor_mask,
        !           476:                                               &mouse_color, &bkgnd_color,
        !           477:                                               right_ptr_x_hot,
        !           478:                                               right_ptr_y_hot
        !           479:                                               );
        !           480:            XFreePixmap(display, cursor);
        !           481:            XFreePixmap(display, cursor_mask);      
        !           482:            break;
        !           483:         case CENTER:
        !           484:            cursor = XCreateBitmapFromData(display,
        !           485:                                           RootWindow(display,
        !           486:                                                      DefaultScreen(display)),
        !           487:                                           cntr_ptr_bits,
        !           488:                                           cntr_ptr_width,
        !           489:                                           cntr_ptr_height);
        !           490:            cursor_mask = XCreateBitmapFromData(display,
        !           491:                                                RootWindow(display,
        !           492:                                                      DefaultScreen(display)),
        !           493:                                                cntr_ptrmsk_bits,
        !           494:                                                cntr_ptrmsk_width,
        !           495:                                                cntr_ptrmsk_height);
        !           496:            mouse_cursor = XCreatePixmapCursor(
        !           497:                                               display,
        !           498:                                               cursor, cursor_mask,
        !           499:                                               &mouse_color, &bkgnd_color,
        !           500:                                               cntr_ptr_x_hot,
        !           501:                                               cntr_ptr_y_hot
        !           502:                                               );
        !           503:            XFreePixmap(display, cursor);
        !           504:            XFreePixmap(display, cursor_mask);      
        !           505:        break;
        !           506:  default:
        !           507:        /* Error! Invalid style parameter. */
        !           508:        _XMErrorCode = XME_STYLE_PARAM;
        !           509:        return(NULL);
        !           510:     }
        !           511:     if (mouse_cursor == _X_FAILURE) {
        !           512:        _XMErrorCode = XME_CREATE_CURSOR;
        !           513:        return(NULL);
        !           514:     }
        !           515: 
        !           516:     /*
        !           517:      * Open the pane and selection fonts.
        !           518:      */
        !           519:     
        !           520:     p_fnt_info = XLoadQueryFont(display, p_fnt_name);
        !           521:     if (p_fnt_info == NULL) {
        !           522:        _XMErrorCode = XME_OPEN_FONT;
        !           523:        return(NULL);
        !           524:        
        !           525:     }
        !           526: 
        !           527:     s_fnt_info = XLoadQueryFont(display, s_fnt_name);
        !           528:     if (s_fnt_info == NULL) {
        !           529:        _XMErrorCode = XME_OPEN_FONT;
        !           530:        return(NULL);
        !           531:     }
        !           532:     /*
        !           533:      * Calculate the fixed padding value in pixels for each font.
        !           534:      */
        !           535:     p_fnt_height = p_fnt_info->max_bounds.ascent + p_fnt_info->max_bounds.descent;
        !           536:     s_fnt_height = s_fnt_info->max_bounds.ascent + s_fnt_info->max_bounds.descent;
        !           537:     p_fnt_pad = s_spread * p_fnt_height;
        !           538:     s_fnt_pad = s_spread * s_fnt_height;
        !           539: 
        !           540:     /*
        !           541:      * Calculate fixed height and offset requirements.
        !           542:      */
        !           543:     flag_height = p_fnt_height + (p_fnt_pad << 1);
        !           544: 
        !           545:     p_height = 0;
        !           546:     p_y_off = flag_height + p_bdr_width;
        !           547:     p_x_off = p_y_off * p_spread;
        !           548: 
        !           549:     s_height = s_fnt_height + (s_fnt_pad << 1) + (s_bdr_width << 1);
        !           550:     s_y_off = s_height;
        !           551:     s_x_off = p_x_off;
        !           552: 
        !           553:     /*
        !           554:      * Set up the pane list header.
        !           555:      */
        !           556:     pane->next = pane;
        !           557:     pane->prev = pane;
        !           558:     pane->type = PL_HEADER;
        !           559:     pane->serial = -1;
        !           560: 
        !           561:     /*
        !           562:      * Initialize the internal pane and selection creation queues.
        !           563:      */
        !           564:     _XMWinQueInit();
        !           565:     
        !           566:     /*
        !           567:      * Create pane, active, and inactive GC's.
        !           568:      */
        !           569:     values = (XGCValues *)malloc(sizeof(XGCValues));
        !           570:     valuemask = (GCForeground | GCBackground | GCFont | GCLineWidth);
        !           571: 
        !           572:     /*
        !           573:      * First, pane.
        !           574:      */
        !           575: 
        !           576:     values->foreground = p_frg_color.pixel;
        !           577:     values->background = bkgnd_color.pixel;
        !           578:     values->font = p_fnt_info->fid;
        !           579:     values->line_width = p_bdr_width;
        !           580:     
        !           581:     pane_GC = XCreateGC(
        !           582:                        display, 
        !           583:                        RootWindow(display, DefaultScreen(display)),
        !           584:                        valuemask,
        !           585:                        values);
        !           586:     /*
        !           587:      * Then normal video selection.
        !           588:      */
        !           589: 
        !           590:     values->foreground = s_frg_color.pixel;
        !           591:     values->background = bkgnd_color.pixel;
        !           592:     values->font = s_fnt_info->fid;
        !           593:     values->line_width = s_bdr_width;
        !           594:     normal_select_GC = XCreateGC(display, 
        !           595:                                 RootWindow(display, DefaultScreen(display)),
        !           596:                                 valuemask,
        !           597:                                 values);
        !           598:     /*
        !           599:      * Inverse video selection.
        !           600:      */
        !           601: 
        !           602:     values->foreground = bkgnd_color.pixel;            
        !           603:     values->background = s_frg_color.pixel;
        !           604:     values->font = s_fnt_info->fid;
        !           605:     values->line_width = s_bdr_width;
        !           606:     inverse_select_GC = XCreateGC(display, 
        !           607:                                  RootWindow(display, DefaultScreen(display)),
        !           608:                                  valuemask,
        !           609:                                  values);
        !           610:     stipple_pixmap = XCreateBitmapFromData(display,
        !           611:                                           RootWindow(display,
        !           612:                                                      DefaultScreen(display)),
        !           613:                                           stipple_bits,                
        !           614:                                           stipple_width,               
        !           615:                                           stipple_height);     
        !           616:     
        !           617:     /*
        !           618:      * Finally, inactive pane header and selections
        !           619:      */
        !           620:     valuemask |= (GCFillStyle | GCStipple);
        !           621:     values->foreground = s_frg_pixel;
        !           622:     values->background = bkgnd_color.pixel;
        !           623:     values->font = s_fnt_info->fid;
        !           624:     values->line_width = s_bdr_width;
        !           625:     values->fill_style = FillStippled;
        !           626:     values->stipple = stipple_pixmap;
        !           627:        
        !           628:     inact_GC = XCreateGC(display, 
        !           629:                         RootWindow(display, DefaultScreen(display)),
        !           630:                         valuemask,
        !           631:                         values);
        !           632: 
        !           633:     /*
        !           634:      * Construct the XMenu object.
        !           635:      */
        !           636:     /* -------------------- Menu data -------------------- */
        !           637:     menu->menu_style = menu_style;
        !           638:     menu->menu_mode = menu_mode;
        !           639:     menu->freeze = freeze;
        !           640:     menu->aeq = 0;
        !           641:     menu->recompute = 1;
        !           642:     menu->parent = parent;
        !           643:     menu->height = 0;
        !           644:     menu->width = 0;
        !           645:     menu->mouse_cursor = mouse_cursor;
        !           646:     menu->assoc_tab = assoc_tab;
        !           647:     menu->p_list = pane;
        !           648:     /* -------------------- Pane window data -------------------- */
        !           649:     menu->p_style = p_style;
        !           650:     menu->p_events = DEF_P_EVENTS;
        !           651:     menu->p_fnt_info = p_fnt_info;
        !           652:     menu->p_fnt_pad = p_fnt_pad;
        !           653:     menu->p_spread = p_spread;
        !           654:     menu->p_bdr_width = p_bdr_width;
        !           655:     menu->flag_height = flag_height;
        !           656:     menu->p_width = 0;
        !           657:     menu->p_height = p_height;
        !           658:     menu->p_x_off = p_x_off;
        !           659:     menu->p_y_off = p_y_off;
        !           660:     menu->p_count = 0;
        !           661:     menu->pane_GC = pane_GC;
        !           662:     menu->x_pos = 0;
        !           663:     menu->y_pos = 0;
        !           664:     /* -------------------- Selection window data -------------------- */
        !           665:     menu->s_style = s_style;
        !           666:     menu->s_events = DEF_S_EVENTS;
        !           667:     menu->s_fnt_info = s_fnt_info;
        !           668:     menu->s_fnt_pad = s_fnt_pad;
        !           669:     menu->s_spread = s_spread;
        !           670:     menu->s_bdr_width = s_bdr_width;           /* unnecessary */
        !           671:     menu->s_width = 0;
        !           672:     menu->s_height = s_height;
        !           673:     menu->s_x_off = s_x_off;
        !           674:     menu->s_y_off = s_y_off;
        !           675:     menu->s_count = 0;
        !           676:     menu->normal_select_GC = normal_select_GC;
        !           677:     menu->inverse_select_GC = inverse_select_GC;
        !           678:     menu->inact_GC = inact_GC;
        !           679:     /* -------------------- Color data -------------------- */
        !           680:     menu->p_bdr_color = p_bdr_color.pixel;
        !           681:     menu->s_bdr_color = s_bdr_color.pixel;
        !           682:     menu->p_frg_color = p_frg_color.pixel;
        !           683:     menu->s_frg_color = s_frg_color.pixel;
        !           684:     menu->bkgnd_color = bkgnd_color.pixel;
        !           685:     /* -------------------- Pixmap data -------------------- */
        !           686:     menu->p_bdr_pixmap = NULL;
        !           687:     menu->s_bdr_pixmap = NULL;
        !           688:     menu->p_frg_pixmap = NULL;
        !           689:     menu->s_frg_pixmap = NULL;
        !           690:     menu->bkgnd_pixmap = NULL;
        !           691:     menu->inact_pixmap = inact_pixmap;
        !           692: 
        !           693:     /*
        !           694:      * Return the completed XMenu.
        !           695:      */
        !           696:     _XMErrorCode = XME_NO_ERROR;
        !           697:     return(menu);
        !           698: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.