📄 create.c
字号:
/* $Header: Create.c,v 1.14 88/02/02 19:02:31 jim Exp $ *//* Copyright Massachusetts Institute of Technology 1985 */#include <X11/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 5int 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,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -