diff options
Diffstat (limited to 'oldXMenu/Create.c')
-rw-r--r-- | oldXMenu/Create.c | 746 |
1 files changed, 746 insertions, 0 deletions
diff --git a/oldXMenu/Create.c b/oldXMenu/Create.c new file mode 100644 index 00000000000..02a186b6e15 --- /dev/null +++ b/oldXMenu/Create.c @@ -0,0 +1,746 @@ +/* $Header: Create.c,v 1.14 88/02/02 19:02:31 jim Exp $ */ +/* Copyright Massachusetts Institute of Technology 1985 */ + +#include "copyright.h" + +/* + * XMenu: MIT Project Athena, X Window system menu package + * + * XMenuCreate - Creates an X window system menu object. + * + * Author: Tony Della Fera, DEC + * January 23, 1986 + * + */ + +#include "XMenuInt.h" + + +#include <X11/bitmaps/dimple1> +#include <X11/bitmaps/dimple3> +#include <X11/bitmaps/gray1> +#include <X11/bitmaps/gray3> +#include <X11/bitmaps/cross_weave> + +#include <X11/bitmaps/left_ptr> +#include <X11/bitmaps/left_ptrmsk> +#include <X11/bitmaps/right_ptr> +#include <X11/bitmaps/right_ptrmsk> +#include <X11/bitmaps/cntr_ptr> +#include <X11/bitmaps/cntr_ptrmsk> +#include <X11/bitmaps/stipple> + + +#define DEF_FREEZE 0 +#define DEF_REVERSE 0 +#define DEF_MENU_STYLE LEFT +#define DEF_MENU_MODE BOX +#define DEF_INACT_PNUM 3 +#define MAX_INACT_PNUM 4 + +#define DEF_P_STYLE CENTER + +#define DEF_P_EVENTS (EnterWindowMask | ExposureMask) +#define DEF_P_FNT_NAME "fixed" +#define DEF_P_SPREAD 0.5 +#define DEF_P_BDR_WIDTH 2 + +#define DEF_S_STYLE LEFT +#define DEF_S_EVENTS (EnterWindowMask | LeaveWindowMask) +#define DEF_S_FNT_NAME "fixed" +#define DEF_S_SPREAD 0.10 +#define DEF_S_BDR_WIDTH 1 + +#define XASSOC_TABLE_SIZE 64 + +#define TILE_BUF_SIZE 5 + +int atoi(); +double atof(); + +XMenu * +XMenuCreate(display, parent, def_env) + Display *display; /* ID of previously opened display */ + Window parent; /* Window ID of the menu's parent window. */ + register char *def_env; /* X Defaults program environment name. */ +{ + register int i; /* Loop counter. */ + register int j; /* Loop counter. */ + register char *def_val; /* X Default value temp variable. */ + + register XMenu *menu; /* Pointer to the new menu. */ + XMStyle menu_style; /* Menu display style. */ + XMMode menu_mode; /* Menu display mode. */ + XMPane *pane; /* Pane list header. */ + XAssocTable *assoc_tab; /* XAssocTable pointer. */ + + int freeze; /* Freeze server mode. */ + int reverse; /* Reverse video mode. */ + + XMStyle p_style; /* Pane display style. */ + char *p_fnt_name; /* Flag font name. */ + XFontStruct *p_fnt_info; /* Flag font structure */ + int p_fnt_pad; /* Flag font padding in pixels. */ + double p_spread; /* Pane spread in flag height fractions. */ + int p_fnt_height; /* Pane character height. */ + int p_bdr_width; /* Pane border width. */ + int flag_height; /* Flag window height. */ + int p_height; /* Pane window height. */ + int p_x_off; /* Pane X offset. */ + int p_y_off; /* Pane Y offset. */ + GC pane_GC; /* Pane graphics context. */ + + XMStyle s_style; /* Selection display style. */ + char *s_fnt_name; /* Selection font name. */ + XFontStruct *s_fnt_info; /* Selection font structure. */ + int s_fnt_pad; /* Selection font padding in pixels. */ + int s_fnt_height; /* Selection font character height */ + double s_spread; /* Select spread in line height fractions. */ + int s_bdr_width; /* Highlight border width. */ + int s_height; /* Selection window height. */ + int s_x_off; /* Selection window X offset. */ + int s_y_off; /* Selection window Y offset. */ + GC normal_select_GC; /* GC used for normal video selection. */ + GC inverse_select_GC; /* GC used for inverse video selection. */ + GC inact_GC; /* GC for inactive pane header and */ + /* selections. */ + GC inact_GC_noexpose; + + XColor color_def; /* Temp color definition holder. */ + XColor screen_def; /* Temp screen color defintion holder */ + XColor p_bdr_color; /* Color of border. */ + XColor s_bdr_color; /* Color of highlight. */ + XColor p_frg_color; /* Color of pane foreground color. */ + XColor s_frg_color; /* Color of selection foreground. */ + XColor bkgnd_color; /* Color of background.. */ + XColor mouse_color; /* Color of mouse cursor. */ + Cursor mouse_cursor; /* Mouse cursor. */ + Pixmap inact_bitmap; /* Menu inactive pixmap. */ + + int inact_pnum; /* Inactive background pattern number. */ + + Pixel p_bdr_pixel; /* Pane border pixel. */ + Pixel s_bdr_pixel; /* Selection border pixel. */ + Pixel p_frg_pixel; /* Pane forground pixel. */ + Pixel s_frg_pixel; /* Selection forground pixel. */ + Pixel bkgnd_pixel; /* Menu background pixel. */ + + int *width, *height; + Pixmap *bitmap; + int *x_hot, *y_hot; + int status; /* Return code from XReadBitmapFile. */ + + Pixmap cursor; /* Cursor pixmap holder. */ + Pixmap cursor_mask; /* Cursor mask pixmap holder. */ + Pixmap stipple_pixmap; /* Stippple mask for half-tone text. */ + unsigned long valuemask; + XGCValues *values; + + + /* + * Calloc the XMenu structure and the initial pane. + */ + menu = (XMenu *)calloc(1, sizeof(XMenu)); + if (menu == NULL) { + _XMErrorCode = XME_CALLOC; + return(NULL); + } + pane = (XMPane *)calloc(1, sizeof(XMPane)); + if (pane == NULL) { + _XMErrorCode = XME_CALLOC; + return(NULL); + } + + /* + * Create the XAssocTable + */ + assoc_tab = (XAssocTable *)XCreateAssocTable(XASSOC_TABLE_SIZE); + if(assoc_tab == NULL) { + _XMErrorCode= XME_CREATE_ASSOC; + return(NULL); + } + + /* + * Set up the default environment name. + */ + if (def_env == NULL || *def_env == '\0') def_env = "XMenu"; + + /* + * Set up internal fail-safe defaults. + */ + freeze = DEF_FREEZE; + reverse = DEF_REVERSE; + menu_style = DEF_MENU_STYLE; + menu_mode = DEF_MENU_MODE; + inact_pnum = DEF_INACT_PNUM; + + p_style = DEF_P_STYLE; + p_spread = DEF_P_SPREAD; + p_fnt_name = DEF_P_FNT_NAME; + p_bdr_width = DEF_P_BDR_WIDTH; + + s_style = DEF_S_STYLE; + s_spread = DEF_S_SPREAD; + s_fnt_name = DEF_S_FNT_NAME; + s_bdr_width = DEF_S_BDR_WIDTH; + + /* + * Get default values from X. + */ + def_val = XGetDefault(display, def_env, "MenuFreeze"); + if (def_val != NULL) { + if (strcmp(def_val, "on") == 0) freeze = 1; + else if (strcmp(def_val, "off") == 0) freeze = 0; + } + + def_val = XGetDefault(display, def_env, "MenuReverseVideo"); + if (def_val != NULL) { + if (strcmp(def_val, "on") == 0) reverse = 1; + else if (strcmp(def_val, "off") == 0) reverse = 0; + } + + def_val = XGetDefault(display, def_env, "MenuStyle"); + if (def_val != NULL) { + if (strcmp(def_val, "right_hand") == 0) menu_style = RIGHT; + else if (strcmp(def_val, "left_hand") == 0) menu_style = LEFT; + else if (strcmp(def_val, "center") == 0) menu_style = CENTER; + } + + def_val = XGetDefault(display, def_env, "MenuMode"); + if (def_val != NULL) { + if (strcmp(def_val, "box") == 0) menu_mode = BOX; + else if (strcmp(def_val, "invert") == 0) menu_mode = INVERT; + } + + def_val = XGetDefault(display, def_env, "MenuMouse"); + if ( + def_val != NULL && + DisplayCells(display, DefaultScreen(display)) > 2 && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + def_val, + &mouse_color, &color_def) + ); + else if (reverse && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "white", + &mouse_color, &color_def) + ); + + else if (XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "black", + &mouse_color, &color_def) + ); + + else ; + + def_val = XGetDefault(display, def_env, "MenuBackground"); + if ( + def_val != NULL && + DisplayCells(display, DefaultScreen(display)) > 2 && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + def_val, + &bkgnd_color, &color_def) + ); + else if (reverse && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "black", + &bkgnd_color, &color_def) + ); + else if (XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "white", + &bkgnd_color, &color_def) + ); + else; + + def_val = XGetDefault(display, def_env, "MenuInactivePattern"); + if (def_val != NULL) { + if (strcmp(def_val, "dimple1") == 0) inact_pnum = 0; + else if (strcmp(def_val, "dimple3") == 0) inact_pnum = 1; + else if (strcmp(def_val, "gray1") == 0) inact_pnum = 2; + else if (strcmp(def_val, "gray3") == 0) inact_pnum = 3; + else if (strcmp(def_val, "cross_weave") == 0) inact_pnum = 4; + } + + def_val = XGetDefault(display, def_env, "PaneStyle"); + if (def_val != NULL) { + if (strcmp(def_val, "flush_left") == 0) p_style = LEFT; + else if (strcmp(def_val, "flush_right") == 0) p_style = RIGHT; + else if (strcmp(def_val, "center") == 0) p_style = CENTER; + } + + def_val = XGetDefault(display, def_env, "PaneFont"); + if (def_val != NULL) p_fnt_name = def_val; + + def_val = XGetDefault(display, def_env, "PaneForeground"); + if ( + def_val != NULL && + DisplayCells(display, DefaultScreen(display)) > 2 + ) + XAllocNamedColor(display, DefaultColormap(display, + DefaultScreen(display)), + def_val, + &p_frg_color, &color_def); + + else if (reverse) XAllocNamedColor(display, + DefaultColormap(display, + DefaultScreen(display)), + "white", + &p_frg_color, &color_def); + else XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "black", + &p_frg_color, &color_def); + + def_val = XGetDefault(display, def_env, "PaneBorder"); + if ( + def_val != NULL && + DisplayCells(display, DefaultScreen(display)) > 2 && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + def_val, + &p_bdr_color, &color_def) + ); + else if (reverse && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "white", + &p_bdr_color, &color_def) + ); + else XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "black", + &p_bdr_color, &color_def); + + def_val = XGetDefault(display, def_env, "PaneBorderWidth"); + if (def_val != NULL) p_bdr_width = atoi(def_val); + + def_val = XGetDefault(display, def_env, "PaneSpread"); + if (def_val != NULL) p_spread = atof(def_val); + + def_val = XGetDefault(display, def_env, "SelectionStyle"); + if (def_val != NULL) { + if (strcmp(def_val, "flush_left") == 0) s_style = LEFT; + else if (strcmp(def_val, "flush_right") == 0) s_style = RIGHT; + else if (strcmp(def_val, "center") == 0) s_style = CENTER; + } + + def_val = XGetDefault(display, def_env, "SelectionFont"); + if (def_val != NULL) s_fnt_name = def_val; + + def_val = XGetDefault(display, def_env, "SelectionForeground"); + if ( + def_val != NULL && + DisplayCells(display, DefaultScreen(display)) > 2 && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + def_val, + &s_frg_color, &color_def) + ); + else if (reverse && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "white", + &s_frg_color, &color_def) + ) ; + else if (XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "black", + &s_frg_color, &color_def) + ) ; + else ; + + + def_val = XGetDefault(display, def_env, "SelectionBorder"); + if ( + def_val != NULL && + DisplayCells(display, DefaultScreen(display)) > 2 && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + def_val, + &s_bdr_color, &color_def) + ) ; + else if (reverse && + XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "white", + &s_bdr_color, &color_def) + ) ; + else if (XAllocNamedColor(display, + DefaultColormap(display, DefaultScreen(display)), + "black", + &s_bdr_color, &color_def) + ) ; + else ; + + def_val = XGetDefault(display, def_env, "SelectionBorderWidth"); + if (def_val != NULL) s_bdr_width = atoi(def_val); + + def_val = XGetDefault(display, def_env, "SelectionSpread"); + if (def_val != NULL) s_spread = atof(def_val); + + /* + * Create and store the inactive pattern pixmap. + */ + switch (inact_pnum) + { + case 0: + inact_bitmap = XCreateBitmapFromData( + display, + RootWindow(display, DefaultScreen(display)), + dimple1_bits, + 16, 16 + ); + break; + case 1: + inact_bitmap = XCreateBitmapFromData( + display, + RootWindow(display, DefaultScreen(display)), + dimple3_bits, + 16,16); + break; + case 2: + inact_bitmap = XCreateBitmapFromData( + display, RootWindow(display, DefaultScreen(display)), + gray1_bits, 16, 16); + break; + case 3: + inact_bitmap = XCreateBitmapFromData( + display, + RootWindow(display, DefaultScreen(display)), + gray3_bits, 16, 16); + break; + case 4: + inact_bitmap = XCreateBitmapFromData( + display, + RootWindow(display, DefaultScreen(display)), + cross_weave_bits, 16, 16); + break; + default: + break; + + } + if (inact_bitmap == NULL) { + _XMErrorCode = XME_STORE_BITMAP; + return(NULL); + } + + /* + * Load the mouse cursor. + */ + + switch (menu_style) { + case LEFT: + cursor = XCreateBitmapFromData(display, + RootWindow(display, + DefaultScreen(display)), + left_ptr_bits, + left_ptr_width, + left_ptr_height); + cursor_mask = XCreateBitmapFromData(display, + RootWindow(display, + DefaultScreen(display)), + left_ptrmsk_bits, + left_ptrmsk_width, + left_ptrmsk_height); + mouse_cursor = XCreatePixmapCursor( + display, + cursor, cursor_mask, + &mouse_color, &bkgnd_color, + left_ptr_x_hot, + left_ptr_y_hot + ); + XFreePixmap(display, cursor); + XFreePixmap(display, cursor_mask); + break; + case RIGHT: + cursor = XCreateBitmapFromData(display, + RootWindow(display, + DefaultScreen(display)), + right_ptr_bits, + right_ptr_width, + right_ptr_height); + cursor_mask = XCreateBitmapFromData(display, + RootWindow(display, + DefaultScreen(display)), + right_ptrmsk_bits, + right_ptrmsk_width, + right_ptrmsk_height); + mouse_cursor = XCreatePixmapCursor( + display, + cursor, cursor_mask, + &mouse_color, &bkgnd_color, + right_ptr_x_hot, + right_ptr_y_hot + ); + XFreePixmap(display, cursor); + XFreePixmap(display, cursor_mask); + break; + case CENTER: + cursor = XCreateBitmapFromData(display, + RootWindow(display, + DefaultScreen(display)), + cntr_ptr_bits, + cntr_ptr_width, + cntr_ptr_height); + cursor_mask = XCreateBitmapFromData(display, + RootWindow(display, + DefaultScreen(display)), + cntr_ptrmsk_bits, + cntr_ptrmsk_width, + cntr_ptrmsk_height); + mouse_cursor = XCreatePixmapCursor( + display, + cursor, cursor_mask, + &mouse_color, &bkgnd_color, + cntr_ptr_x_hot, + cntr_ptr_y_hot + ); + XFreePixmap(display, cursor); + XFreePixmap(display, cursor_mask); + break; + default: + /* Error! Invalid style parameter. */ + _XMErrorCode = XME_STYLE_PARAM; + return(NULL); + } + if (mouse_cursor == _X_FAILURE) { + _XMErrorCode = XME_CREATE_CURSOR; + return(NULL); + } + + /* + * Open the pane and selection fonts. + */ + + p_fnt_info = XLoadQueryFont(display, p_fnt_name); + if (p_fnt_info == NULL) { + _XMErrorCode = XME_OPEN_FONT; + return(NULL); + + } + + s_fnt_info = XLoadQueryFont(display, s_fnt_name); + if (s_fnt_info == NULL) { + _XMErrorCode = XME_OPEN_FONT; + return(NULL); + } + /* + * Calculate the fixed padding value in pixels for each font. + */ + p_fnt_height = p_fnt_info->max_bounds.ascent + p_fnt_info->max_bounds.descent; + s_fnt_height = s_fnt_info->max_bounds.ascent + s_fnt_info->max_bounds.descent; + p_fnt_pad = s_spread * p_fnt_height; + s_fnt_pad = s_spread * s_fnt_height; + + /* + * Calculate fixed height and offset requirements. + */ + flag_height = p_fnt_height + (p_fnt_pad << 1); + + p_height = 0; + p_y_off = flag_height + p_bdr_width; + p_x_off = p_y_off * p_spread; + + s_height = s_fnt_height + (s_fnt_pad << 1) + (s_bdr_width << 1); + s_y_off = s_height; + s_x_off = p_x_off; + + /* + * Set up the pane list header. + */ + pane->next = pane; + pane->prev = pane; + pane->type = PL_HEADER; + pane->serial = -1; + + /* + * Initialize the internal pane and selection creation queues. + */ + _XMWinQueInit(); + + /* + * Create pane, active, and inactive GC's. + */ + values = (XGCValues *)malloc(sizeof(XGCValues)); + valuemask = (GCForeground | GCBackground | GCFont | GCLineWidth); + + /* + * First, pane. + */ + + values->foreground = p_frg_color.pixel; + values->background = bkgnd_color.pixel; + values->font = p_fnt_info->fid; + values->line_width = p_bdr_width; + + pane_GC = XCreateGC( + display, + RootWindow(display, DefaultScreen(display)), + valuemask, + values); + /* + * Then normal video selection. + */ + + values->foreground = s_frg_color.pixel; + values->background = bkgnd_color.pixel; + values->font = s_fnt_info->fid; + values->line_width = s_bdr_width; + normal_select_GC = XCreateGC(display, + RootWindow(display, DefaultScreen(display)), + valuemask, + values); + /* + * Inverse video selection. + */ + + values->foreground = bkgnd_color.pixel; + values->background = s_frg_color.pixel; + values->font = s_fnt_info->fid; + values->line_width = s_bdr_width; + inverse_select_GC = XCreateGC(display, + RootWindow(display, DefaultScreen(display)), + valuemask, + values); + stipple_pixmap = XCreateBitmapFromData(display, + RootWindow(display, + DefaultScreen(display)), + stipple_bits, + stipple_width, + stipple_height); + + /* + * Finally, inactive pane header and selections + */ + valuemask |= (GCFillStyle | GCStipple); + values->foreground = s_frg_color.pixel; + values->background = bkgnd_color.pixel; + values->font = s_fnt_info->fid; + values->line_width = s_bdr_width; + values->fill_style = FillStippled; + values->stipple = stipple_pixmap; + + inact_GC = XCreateGC(display, + RootWindow(display, DefaultScreen(display)), + valuemask, + values); + + valuemask |= (GCGraphicsExposures); + values->graphics_exposures = False; + inact_GC_noexpose = XCreateGC (display, + RootWindow (display, + DefaultScreen (display)), + valuemask, values); + + + /* + * Construct the XMenu object. + */ + /* -------------------- Menu data -------------------- */ + menu->menu_style = menu_style; + menu->menu_mode = menu_mode; + menu->freeze = freeze; + menu->aeq = 0; + menu->recompute = 1; + menu->parent = parent; + menu->height = 0; + menu->width = 0; + menu->mouse_cursor = mouse_cursor; + menu->assoc_tab = assoc_tab; + menu->p_list = pane; + /* -------------------- Pane window data -------------------- */ + menu->p_style = p_style; + menu->p_events = DEF_P_EVENTS; + menu->p_fnt_info = p_fnt_info; + menu->p_fnt_pad = p_fnt_pad; + menu->p_spread = p_spread; + menu->p_bdr_width = p_bdr_width; + menu->flag_height = flag_height; + menu->p_width = 0; + menu->p_height = p_height; + menu->p_x_off = p_x_off; + menu->p_y_off = p_y_off; + menu->p_count = 0; + menu->pane_GC = pane_GC; + menu->x_pos = 0; + menu->y_pos = 0; + /* -------------------- Selection window data -------------------- */ + menu->s_style = s_style; + menu->s_events = DEF_S_EVENTS; + menu->s_fnt_info = s_fnt_info; + menu->s_fnt_pad = s_fnt_pad; + menu->s_spread = s_spread; + menu->s_bdr_width = s_bdr_width; /* unnecessary */ + menu->s_width = 0; + menu->s_height = s_height; + menu->s_x_off = s_x_off; + menu->s_y_off = s_y_off; + menu->s_count = 0; + menu->normal_select_GC = normal_select_GC; + menu->inverse_select_GC = inverse_select_GC; + menu->inact_GC = inact_GC; + /* -------------------- Color data -------------------- */ + menu->p_bdr_color = p_bdr_color.pixel; + menu->s_bdr_color = s_bdr_color.pixel; + menu->p_frg_color = p_frg_color.pixel; + menu->s_frg_color = s_frg_color.pixel; + menu->bkgnd_color = bkgnd_color.pixel; + /* -------------------- Pixmap data -------------------- */ + menu->p_bdr_pixmap = NULL; + menu->s_bdr_pixmap = NULL; + menu->p_frg_pixmap = NULL; + menu->s_frg_pixmap = NULL; + menu->bkgnd_pixmap = NULL; + if (DisplayPlanes (display, DefaultScreen (display)) == 1) + menu->inact_pixmap = inact_bitmap; + else + { + int loop; + + menu->inact_pixmap = XCreatePixmap (display, + parent, + 16, + 16, + DisplayPlanes (display, + DefaultScreen (display))); + if (menu->inact_pixmap == NULL) + { + _XMErrorCode = XME_STORE_BITMAP; + return(NULL); + } + + XCopyPlane (display, inact_bitmap, menu->inact_pixmap, + inact_GC_noexpose, 0, 0, 16, 16, 0, 0, 1); + +/* + for (loop = 0; + loop < DisplayPlanes (display, DefaultScreen (display)); + loop++) + { + XCopyPlane (display, + inact_bitmap, + menu->inact_pixmap, + inact_GC, + 0, + 0, + 16, + 16, + 0, + 0, + (1 << loop)); + } +*/ + } + + /* + * Return the completed XMenu. + */ + _XMErrorCode = XME_NO_ERROR; + return(menu); +} |