togl.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 2,204 行 · 第 1/5 页
C
2,204 行
/* $Id: togl.c,v 1.1 2006/08/09 22:56:56 jepler Exp $ *//* * Togl - a Tk OpenGL widget * Version 1.6 * Copyright (C) 1996-2002 Brian Paul and Ben Bederson * See the LICENSE-Togl file for copyright details. *//* * Currently we support X11, Win32 and Macintosh only */#if !defined(WIN32) && !defined(macintosh)#define X11#endif/*** Windows headers ***/#if defined(WIN32) && !defined(X11) && !defined(macintosh)#define WIN32_LEAN_AND_MEAN#include <windows.h>#undef WIN32_LEAN_AND_MEAN#include <winnt.h>/*** X Window System headers ***/#elif defined(X11) && !defined(WIN32) && !defined(macintosh)#include <X11/Xlib.h>#include <X11/Xutil.h>#include <X11/Xatom.h> /* for XA_RGB_DEFAULT_MAP atom */#if defined(__vms)#include <X11/StdCmap.h> /* for XmuLookupStandardColormap */#else#include <X11/Xmu/StdCmap.h> /* for XmuLookupStandardColormap */#endif#include <GL/glx.h>/*** Mac headers ***/#elif defined(macintosh) && !defined(WIN32) && !defined(X11)#include <Gestalt.h>#include <Traps.h>#include <agl.h>#include <tclMacCommonPch.h>#else /* make sure only one platform defined */#error Unsupported platform, or confused platform defines...#endif/*** Standard C headers ***/#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <tcl.h>#ifdef USE_LOCAL_TK_H #include "tk8.4a3.h"#else #include <tk.h>#endif#ifdef WIN32# include <tkPlatDecls.h>#endif#if TK_MAJOR_VERSION<8# error Sorry Togl requires Tcl/Tk ver 8.0 or higher.#endif#if defined(macintosh)# if TK_MAJOR_VERSION<8 || TK_MINOR_VERSION<3# error Sorry Mac version requires Tcl/Tk ver 8.3.0 or higher.# endif#endif /* Mac *//* workaround for bug #123153 in tcl ver8.4a2 (tcl.h) */#if defined(Tcl_InitHashTable) && defined(USE_TCL_STUBS)#undef Tcl_InitHashTable#define Tcl_InitHashTable (tclStubsPtr->tcl_InitHashTable)#endif#if (TK_MAJOR_VERSION>=8 && TK_MINOR_VERSION>=4)# define HAVE_TK_SETCLASSPROCS#endif/* * Copy of TkClassProcs declarations form tkInt.h * (this is needed for Tcl ver =< 8.4a3) */typedef int (TkBindEvalProc) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, XEvent *eventPtr, Tk_Window tkwin, KeySym keySym));typedef void (TkBindFreeProc) _ANSI_ARGS_((ClientData clientData));typedef Window (TkClassCreateProc) _ANSI_ARGS_((Tk_Window tkwin, Window parent, ClientData instanceData));typedef void (TkClassGeometryProc) _ANSI_ARGS_((ClientData instanceData));typedef void (TkClassModalProc) _ANSI_ARGS_((Tk_Window tkwin, XEvent *eventPtr));typedef struct TkClassProcs { TkClassCreateProc *createProc; TkClassGeometryProc *geometryProc; TkClassModalProc *modalProc;} TkClassProcs;#include "togl.h"/* Defaults */#define DEFAULT_WIDTH "400"#define DEFAULT_HEIGHT "400"#define DEFAULT_IDENT ""#define DEFAULT_FONTNAME "fixed"#define DEFAULT_TIME "1"#ifdef WIN32/* Maximum size of a logical palette corresponding to a colormap * in color index mode. */#define MAX_CI_COLORMAP_SIZE 4096/* * copy of TkWinColormap from tkWinInt.h */typedef struct { HPALETTE palette; /* Palette handle used when drawing. */ UINT size; /* Number of entries in the palette. */ int stale; /* 1 if palette needs to be realized, * otherwise 0. If the palette is stale, * then an idle handler is scheduled to * realize the palette. */ Tcl_HashTable refCounts; /* Hash table of palette entry reference counts * indexed by pixel value. */} TkWinColormap;static LRESULT (CALLBACK *tkWinChildProc)(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) = NULL;#define TK_WIN_CHILD_CLASS_NAME "TkChild"#endif /* WIN32 */#define MAX(a,b) (((a)>(b))?(a):(b))#define TCL_ERR(interp, string) \ do { \ Tcl_ResetResult(interp); \ Tcl_AppendResult(interp, string, NULL); \ return TCL_ERROR; \ } while (0)/* The constant DUMMY_WINDOW is used to signal window creation failure from the Togl_CreateWindow() */#define DUMMY_WINDOW -1#define ALL_EVENTS_MASK \ (KeyPressMask | \ KeyReleaseMask | \ ButtonPressMask | \ ButtonReleaseMask | \ EnterWindowMask | \ LeaveWindowMask | \ PointerMotionMask | \ ExposureMask | \ VisibilityChangeMask | \ FocusChangeMask | \ PropertyChangeMask | \ ColormapChangeMask)struct Togl{ struct Togl *Next; /* next in linked list */#if defined(WIN32) HDC tglGLHdc; /* Device context of device that OpenGL calls will be drawn on */ HGLRC tglGLHglrc; /* OpenGL rendering context to be made current */ int CiColormapSize; /* (Maximum) size of colormap in color index mode */#elif defined(X11) GLXContext GlCtx; /* Normal planes GLX context */#elif defined(macintosh) AGLContext aglCtx;#endif /* WIN32 */ Display *display; /* X's token for the window's display. */ Tk_Window TkWin; /* Tk window structure */ Tcl_Interp *Interp; /* Tcl interpreter */ Tcl_Command widgetCmd; /* Token for togl's widget command */#ifndef NO_TK_CURSOR Tk_Cursor Cursor; /* The widget's cursor */#endif int Width, Height; /* Dimensions of window */ int TimerInterval; /* Time interval for timer in milliseconds */#if (TCL_MAJOR_VERSION * 100 + TCL_MINOR_VERSION) >= 705 Tcl_TimerToken timerHandler; /* Token for togl's timer handler */#else Tk_TimerToken timerHandler; /* Token for togl's timer handler */#endif int RgbaFlag; /* configuration flags (ala GLX parameters) */ int RgbaRed; int RgbaGreen; int RgbaBlue; int DoubleFlag; int DepthFlag; int DepthSize; int AccumFlag; int AccumRed; int AccumGreen; int AccumBlue; int AccumAlpha; int AlphaFlag; int AlphaSize; int StencilFlag; int StencilSize; int PrivateCmapFlag; int OverlayFlag; int StereoFlag; int AuxNumber; int Indirect; char *ShareList; /* name (ident) of Togl to share dlists with */ char *ShareContext; /* name (ident) to share OpenGL context with */ char *Ident; /* User's identification string */ ClientData Client_Data; /* Pointer to user data */ GLboolean UpdatePending; /* Should normal planes be redrawn? */ Togl_Callback *CreateProc; /* Callback when widget is created */ Togl_Callback *DisplayProc; /* Callback when widget is rendered */ Togl_Callback *ReshapeProc; /* Callback when window size changes */ Togl_Callback *DestroyProc; /* Callback when widget is destroyed */ Togl_Callback *TimerProc; /* Callback when widget is idle */ /* Overlay stuff */#if defined(X11) GLXContext OverlayCtx; /* Overlay planes OpenGL context */#elif defined(WIN32) HGLRC tglGLOverlayHglrc;#endif /* X11 */ Window OverlayWindow; /* The overlay window, or 0 */ Togl_Callback *OverlayDisplayProc; /* Overlay redraw proc */ GLboolean OverlayUpdatePending; /* Should overlay be redrawn? */ Colormap OverlayCmap; /* colormap for overlay is created */ int OverlayTransparentPixel; /* transparent pixel */ int OverlayIsMapped; /* for DumpToEpsFile: Added by Miguel A. de Riera Pasenau 10.01.1997 */ XVisualInfo *VisInfo; /* Visual info of the current */ /* context needed for DumpToEpsFile */ GLfloat *EpsRedMap; /* Index2RGB Maps for Color index modes */ GLfloat *EpsGreenMap; GLfloat *EpsBlueMap; GLint EpsMapSize; /* = Number of indices in our Togl */};/* NTNTNT need to change to handle Windows Data Types *//* * Prototypes for functions local to this file */static int Togl_Cmd(ClientData clientData, Tcl_Interp *interp, int argc, char **argv);static void Togl_EventProc(ClientData clientData, XEvent *eventPtr);static Window Togl_CreateWindow(Tk_Window, Window, ClientData);#ifdef MESA_COLOR_HACKstatic int get_free_color_cells( Display *display, int screen, Colormap colormap);static void free_default_color_cells( Display *display, Colormap colormap);#endifstatic void ToglCmdDeletedProc( ClientData );#if defined(__sgi) && defined(STEREO)/* SGI-only stereo */static void stereoMakeCurrent( Display *dpy, Window win, GLXContext ctx );static void stereoInit( struct Togl *togl,int stereoEnabled );#endif#ifdef macintoshstatic void SetMacBufRect(struct Togl *togl);#endif/* * Setup Togl widget configuration options: */static Tk_ConfigSpec configSpecs[] = { {TK_CONFIG_PIXELS, "-height", "height", "Height", DEFAULT_HEIGHT, Tk_Offset(struct Togl, Height), 0, NULL}, {TK_CONFIG_PIXELS, "-width", "width", "Width", DEFAULT_WIDTH, Tk_Offset(struct Togl, Width), 0, NULL}, {TK_CONFIG_BOOLEAN, "-rgba", "rgba", "Rgba", "true", Tk_Offset(struct Togl, RgbaFlag), 0, NULL}, {TK_CONFIG_INT, "-redsize", "redsize", "RedSize", "1", Tk_Offset(struct Togl, RgbaRed), 0, NULL}, {TK_CONFIG_INT, "-greensize", "greensize", "GreenSize", "1", Tk_Offset(struct Togl, RgbaGreen), 0, NULL}, {TK_CONFIG_INT, "-bluesize", "bluesize", "BlueSize", "1", Tk_Offset(struct Togl, RgbaBlue), 0, NULL}, {TK_CONFIG_BOOLEAN, "-double", "double", "Double", "false", Tk_Offset(struct Togl, DoubleFlag), 0, NULL}, {TK_CONFIG_BOOLEAN, "-depth", "depth", "Depth", "false", Tk_Offset(struct Togl, DepthFlag), 0, NULL}, {TK_CONFIG_INT, "-depthsize", "depthsize", "DepthSize", "1", Tk_Offset(struct Togl, DepthSize), 0, NULL}, {TK_CONFIG_BOOLEAN, "-accum", "accum", "Accum", "false", Tk_Offset(struct Togl, AccumFlag), 0, NULL}, {TK_CONFIG_INT, "-accumredsize", "accumredsize", "AccumRedSize", "1", Tk_Offset(struct Togl, AccumRed), 0, NULL}, {TK_CONFIG_INT, "-accumgreensize", "accumgreensize", "AccumGreenSize", "1", Tk_Offset(struct Togl, AccumGreen), 0, NULL}, {TK_CONFIG_INT, "-accumbluesize", "accumbluesize", "AccumBlueSize", "1", Tk_Offset(struct Togl, AccumBlue), 0, NULL}, {TK_CONFIG_INT, "-accumalphasize", "accumalphasize", "AccumAlphaSize", "1", Tk_Offset(struct Togl, AccumAlpha), 0, NULL}, {TK_CONFIG_BOOLEAN, "-alpha", "alpha", "Alpha", "false", Tk_Offset(struct Togl, AlphaFlag), 0, NULL}, {TK_CONFIG_INT, "-alphasize", "alphasize", "AlphaSize", "1", Tk_Offset(struct Togl, AlphaSize), 0, NULL}, {TK_CONFIG_BOOLEAN, "-stencil", "stencil", "Stencil", "false", Tk_Offset(struct Togl, StencilFlag), 0, NULL}, {TK_CONFIG_INT, "-stencilsize", "stencilsize", "StencilSize", "1", Tk_Offset(struct Togl, StencilSize), 0, NULL}, {TK_CONFIG_INT, "-auxbuffers", "auxbuffers", "AuxBuffers", "0", Tk_Offset(struct Togl, AuxNumber), 0, NULL}, {TK_CONFIG_BOOLEAN, "-privatecmap", "privateCmap", "PrivateCmap", "false", Tk_Offset(struct Togl, PrivateCmapFlag), 0, NULL}, {TK_CONFIG_BOOLEAN, "-overlay", "overlay", "Overlay", "false", Tk_Offset(struct Togl, OverlayFlag), 0, NULL}, {TK_CONFIG_BOOLEAN, "-stereo", "stereo", "Stereo", "false", Tk_Offset(struct Togl, StereoFlag), 0, NULL},#ifndef NO_TK_CURSOR { TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor", "", Tk_Offset(struct Togl, Cursor), TK_CONFIG_NULL_OK },#endif {TK_CONFIG_INT, "-time", "time", "Time", DEFAULT_TIME, Tk_Offset(struct Togl, TimerInterval), 0, NULL}, {TK_CONFIG_STRING, "-sharelist", "sharelist", "ShareList", NULL, Tk_Offset(struct Togl, ShareList), 0, NULL}, {TK_CONFIG_STRING, "-sharecontext", "sharecontext", "ShareContext", NULL, Tk_Offset(struct Togl, ShareContext), 0, NULL}, {TK_CONFIG_STRING, "-ident", "ident", "Ident", DEFAULT_IDENT, Tk_Offset(struct Togl, Ident), 0, NULL}, {TK_CONFIG_BOOLEAN, "-indirect", "indirect", "Indirect", "false", Tk_Offset(struct Togl, Indirect), 0, NULL}, {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL, (char *) NULL, 0, 0, NULL}};/* * Default callback pointers. When a new Togl widget is created it * will be assigned these initial callbacks. */static Togl_Callback *DefaultCreateProc = NULL;static Togl_Callback *DefaultDisplayProc = NULL;static Togl_Callback *DefaultReshapeProc = NULL;static Togl_Callback *DefaultDestroyProc = NULL;static Togl_Callback *DefaultOverlayDisplayProc = NULL;static Togl_Callback *DefaultTimerProc = NULL;static ClientData DefaultClientData = NULL;static Tcl_HashTable CommandTable;/* * Head of linked list of all Togl widgets */static struct Togl *ToglHead = NULL;/* * Add given togl widget to linked list. */static void AddToList(struct Togl *t){ t->Next = ToglHead; ToglHead = t;}/* * Remove given togl widget from linked list. */static void RemoveFromList(struct Togl *t){ struct Togl *prev = NULL; struct Togl *pos = ToglHead; while (pos) { if (pos == t) { if (prev) { prev->Next = pos->Next; } else { ToglHead = pos->Next; } return; } prev = pos; pos = pos->Next; }}/* * Return pointer to togl widget given a user identifier string. */static struct Togl *FindTogl(const char *ident){ struct Togl *t = ToglHead; while (t) { if (strcmp(t->Ident, ident) == 0)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?