diff options
Diffstat (limited to 'nx-X11/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c')
-rw-r--r-- | nx-X11/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c | 732 |
1 files changed, 0 insertions, 732 deletions
diff --git a/nx-X11/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c b/nx-X11/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c deleted file mode 100644 index 8056bd0ca..000000000 --- a/nx-X11/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c +++ /dev/null @@ -1,732 +0,0 @@ -/* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: The application programming interfaces -** established by SGI in conjunction with the Original Code are The -** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released -** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version -** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X -** Window System(R) (Version 1.3), released October 19, 1998. This software -** was created using the OpenGL(R) version 1.2.1 Sample Implementation -** published by SGI, but has not been independently verified as being -** compliant with the OpenGL(R) version 1.2.1 Specification. -** -*/ -/* $XFree86$ */ - -#include <stdio.h> -#include <GL/glx.h> -#include <GL/gl.h> -#ifdef __GLX_MOTIF -#include "GLwMDrawAP.h" -#else /* not __GLX_MOTIF */ -#include "GLwDrawAP.h" -#include <X11/IntrinsicP.h> -#include <X11/StringDefs.h> -#endif /* __GLX_MOTIF */ -#include <assert.h> - -#ifdef __GLX_MOTIF -/* The MOTIF version differs only in the inclusion of the primitive - * widget class and in a vew variable and type name differences. - * Rather than put ifdefs all over the place, we just use a few defines - * to make it use motif types and names - */ -#define GLwDrawingAreaWidget GLwMDrawingAreaWidget -#define GLwDrawingAreaClassRec GLwMDrawingAreaClassRec -#define glwDrawingAreaClassRec glwMDrawingAreaClassRec -#define glwDrawingAreaWidgetClass glwMDrawingAreaWidgetClass -#define GLwDrawingAreaRec GLwMDrawingAreaRec -#endif /* __GLX_MOTIF */ - -/* forward definitions */ -/* resource default procs */ -static void createColormap(GLwDrawingAreaWidget w, - int offset, XrmValue *value); - -/* widget methods */ -static void Initialize(GLwDrawingAreaWidget req, GLwDrawingAreaWidget new, - ArgList args, Cardinal *num_args); -static void Realize(Widget w, Mask *valueMask, - XSetWindowAttributes *attributes); -static void Redraw(GLwDrawingAreaWidget w, XEvent *event, Region region); -static void Resize(GLwDrawingAreaWidget glw); -static void Destroy(GLwDrawingAreaWidget glw); - -#define offset(field) XtOffset(GLwDrawingAreaWidget, glwDrawingArea.field) - -static char defaultTranslations[] = -#ifdef __GLX_MOTIF - "<Key>osfHelp:PrimitiveHelp() \n" -#endif - "<KeyDown>: glwInput() \n\ - <KeyUp>: glwInput() \n\ - <BtnDown>: glwInput() \n\ - <BtnUp>: glwInput() \n\ - <BtnMotion>: glwInput() "; - -static void glwInput(GLwDrawingAreaWidget glw, XEvent *event, - String *, Cardinal *); - -static XtActionsRec actions[] = { - { "glwInput", (XtActionProc) glwInput }, /* key or mouse input */ -}; - -/* - * There is a bit of unusual handling of the resources here. - * Because Xt insists on allocating the colormap resource when it is - * processing the core resources (even if we redeclare the colormap - * resource here, we need to do a little trick. When Xt first allocates - * the colormap, we allow it to allocate the default one, since we have - * not yet determined the appropriate visual (which is determined from - * resources parsed after the colormap). We also let it allocate colors - * in that default colormap. - * - * In the initialize proc we calculate the actual visual. Then, we - * reobtain the colormap resource using XtGetApplicationResources in - * the initialize proc. If requested, we also reallocate colors in - * that colormap using the same method. - */ - -static XtResource resources[] = { - /* The GLX attributes. Add any new attributes here */ - - {GLwNbufferSize, GLwCBufferSize, XtRInt, sizeof (int), - offset(bufferSize), XtRImmediate, (XtPointer) 0}, - - {GLwNlevel, GLwCLevel, XtRInt, sizeof (int), - offset(level), XtRImmediate, (XtPointer) 0}, - - {GLwNrgba, GLwCRgba, XtRBoolean, sizeof (Boolean), - offset(rgba), XtRImmediate, (XtPointer) FALSE}, - - {GLwNdoublebuffer, GLwCDoublebuffer, XtRBoolean, sizeof (Boolean), - offset(doublebuffer), XtRImmediate, (XtPointer) FALSE}, - - {GLwNstereo, GLwCStereo, XtRBoolean, sizeof (Boolean), - offset(stereo), XtRImmediate, (XtPointer) FALSE}, - - {GLwNauxBuffers, GLwCAuxBuffers, XtRInt, sizeof (int), - offset(auxBuffers), XtRImmediate, (XtPointer) 0}, - - {GLwNredSize, GLwCColorSize, XtRInt, sizeof (int), - offset(redSize), XtRImmediate, (XtPointer) 1}, - - {GLwNgreenSize, GLwCColorSize, XtRInt, sizeof (int), - offset(greenSize), XtRImmediate, (XtPointer) 1}, - - {GLwNblueSize, GLwCColorSize, XtRInt, sizeof (int), - offset(blueSize), XtRImmediate, (XtPointer) 1}, - - {GLwNalphaSize, GLwCAlphaSize, XtRInt, sizeof (int), - offset(alphaSize), XtRImmediate, (XtPointer) 0}, - - {GLwNdepthSize, GLwCDepthSize, XtRInt, sizeof (int), - offset(depthSize), XtRImmediate, (XtPointer) 0}, - - {GLwNstencilSize, GLwCStencilSize, XtRInt, sizeof (int), - offset(stencilSize), XtRImmediate, (XtPointer) 0}, - - {GLwNaccumRedSize, GLwCAccumColorSize, XtRInt, sizeof (int), - offset(accumRedSize), XtRImmediate, (XtPointer) 0}, - - {GLwNaccumGreenSize, GLwCAccumColorSize, XtRInt, sizeof (int), - offset(accumGreenSize), XtRImmediate, (XtPointer) 0}, - - {GLwNaccumBlueSize, GLwCAccumColorSize, XtRInt, sizeof (int), - offset(accumBlueSize), XtRImmediate, (XtPointer) 0}, - - {GLwNaccumAlphaSize, GLwCAccumAlphaSize, XtRInt, sizeof (int), - offset(accumAlphaSize), XtRImmediate, (XtPointer) 0}, - - /* the attribute list */ - {GLwNattribList, GLwCAttribList, XtRPointer, sizeof(int *), - offset(attribList), XtRImmediate, (XtPointer) NULL}, - - /* the visual info */ - {GLwNvisualInfo, GLwCVisualInfo, GLwRVisualInfo, sizeof (XVisualInfo *), - offset(visualInfo), XtRImmediate, (XtPointer) NULL}, - -/* miscellaneous resources */ - {GLwNinstallColormap, GLwCInstallColormap, XtRBoolean, sizeof (Boolean), - offset(installColormap), XtRImmediate, (XtPointer) TRUE}, - - {GLwNallocateBackground, GLwCAllocateColors, XtRBoolean, sizeof (Boolean), - offset(allocateBackground), XtRImmediate, (XtPointer) FALSE}, - - {GLwNallocateOtherColors, GLwCAllocateColors, XtRBoolean, sizeof (Boolean), - offset(allocateOtherColors), XtRImmediate, (XtPointer) FALSE}, - - {GLwNinstallBackground, GLwCInstallBackground, XtRBoolean, sizeof (Boolean), - offset(installBackground), XtRImmediate, (XtPointer) TRUE}, - - {GLwNginitCallback, GLwCCallback, XtRCallback, sizeof (XtCallbackList), - offset(ginitCallback), XtRImmediate, (XtPointer) NULL}, - - {GLwNinputCallback, GLwCCallback, XtRCallback, sizeof (XtCallbackList), - offset(inputCallback), XtRImmediate, (XtPointer) NULL}, - - {GLwNresizeCallback, GLwCCallback, XtRCallback, sizeof (XtCallbackList), - offset(resizeCallback), XtRImmediate, (XtPointer) NULL}, - - {GLwNexposeCallback, GLwCCallback, XtRCallback, sizeof (XtCallbackList), - offset(exposeCallback), XtRImmediate, (XtPointer) NULL}, - -#ifdef __GLX_MOTIF - /* Changes to Motif primitive resources */ - {XmNtraversalOn, XmCTraversalOn, XmRBoolean, sizeof (Boolean), - XtOffset (GLwDrawingAreaWidget, primitive.traversal_on), XmRImmediate, - (XtPointer) FALSE}, - - /* highlighting is normally disabled, as when Motif tries to disable - * highlighting, it tries to reset the color back to the parent's - * background (usually Motif blue). Unfortunately, that is in a - * different colormap, and doesn't work too well. - */ - {XmNhighlightOnEnter, XmCHighlightOnEnter, XmRBoolean, sizeof (Boolean), - XtOffset (GLwDrawingAreaWidget, primitive.highlight_on_enter), - XmRImmediate, (XtPointer) FALSE}, - - {XmNhighlightThickness, XmCHighlightThickness, XmRHorizontalDimension, - sizeof (Dimension), - XtOffset (GLwDrawingAreaWidget, primitive.highlight_thickness), - XmRImmediate, (XtPointer) 0}, - -#endif /* __GLX_MOTIF */ -}; - -/* The following resources are reobtained using XtGetApplicationResources - * in the initialize proc. - */ -/* The colormap */ -static XtResource initializeResources[] = { - /* reobtain the colormap with the new visual */ - {XtNcolormap, XtCColormap, XtRColormap, sizeof(Colormap), - XtOffset(GLwDrawingAreaWidget, core.colormap), - XtRCallProc,(XtPointer) createColormap}, -}; - -/* reallocate any colors we need in the new colormap */ - -/* The background is obtained only if the allocateBackground resource is TRUE*/ -static XtResource backgroundResources[] = { -#ifdef __GLX_MOTIF - { - XmNbackground, XmCBackground, XmRPixel, - sizeof (Pixel), XtOffset(GLwDrawingAreaWidget, core.background_pixel), - XmRCallProc, (XtPointer) _XmBackgroundColorDefault - }, - { - XmNbackgroundPixmap, XmCPixmap, XmRXmBackgroundPixmap, - sizeof (Pixmap), XtOffset(GLwDrawingAreaWidget, core.background_pixmap), - XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP - }, - -#else /* ! __GLX_MOTIF */ - {XtNbackground, XtCBackground, XtRPixel,sizeof(Pixel), - XtOffset(GLwDrawingAreaWidget,core.background_pixel), - XtRString, (XtPointer)"XtDefaultBackground"}, - {XtNbackgroundPixmap, XtCPixmap, XtRPixmap, sizeof(Pixmap), - XtOffset(GLwDrawingAreaWidget,core.background_pixmap), - XtRImmediate, (XtPointer)XtUnspecifiedPixmap}, -#endif /* __GLX_MOTIF */ -}; - -/* The other colors such as the foreground are allocated only if - * allocateOtherColors are set. These resources only exist in Motif. - */ - -#ifdef __GLX_MOTIF -static XtResource otherColorResources[] = { - { - XmNforeground, XmCForeground, XmRPixel, - sizeof (Pixel), XtOffset(GLwDrawingAreaWidget, primitive.foreground), - XmRCallProc, (XtPointer) _XmForegroundColorDefault - }, - - { - XmNhighlightColor, XmCHighlightColor, XmRPixel, sizeof (Pixel), - XtOffset(GLwDrawingAreaWidget, primitive.highlight_color), - XmRCallProc, (XtPointer) _XmHighlightColorDefault - }, - - { - XmNhighlightPixmap, XmCHighlightPixmap, XmRPrimHighlightPixmap, - sizeof (Pixmap), - XtOffset(GLwDrawingAreaWidget, primitive.highlight_pixmap), - XmRCallProc, (XtPointer) _XmPrimitiveHighlightPixmapDefault - }, -}; -#endif /* __GLX_MOTIF */ - -struct attribInfo -{ - int offset; - int attribute; -}; - -static struct attribInfo intAttribs[] = -{ - { offset(bufferSize), GLX_BUFFER_SIZE }, - { offset(level), GLX_LEVEL }, - { offset(auxBuffers), GLX_AUX_BUFFERS }, - { offset(redSize), GLX_RED_SIZE }, - { offset(greenSize), GLX_GREEN_SIZE }, - { offset(blueSize), GLX_BLUE_SIZE }, - { offset(alphaSize), GLX_ALPHA_SIZE }, - { offset(depthSize), GLX_DEPTH_SIZE }, - { offset(stencilSize), GLX_STENCIL_SIZE }, - { offset(accumRedSize), GLX_ACCUM_RED_SIZE }, - { offset(accumGreenSize), GLX_ACCUM_GREEN_SIZE }, - { offset(accumBlueSize), GLX_ACCUM_BLUE_SIZE }, - { offset(accumAlphaSize), GLX_ACCUM_ALPHA_SIZE }, - { 0, None }, -}; - -static struct attribInfo booleanAttribs[] = -{ - { offset(rgba), GLX_RGBA }, - { offset(doublebuffer), GLX_DOUBLEBUFFER }, - { offset(stereo), GLX_STEREO }, - { 0, None }, -}; - -#undef offset - - -GLwDrawingAreaClassRec glwDrawingAreaClassRec = -{ - { /* core fields */ -#ifdef __GLX_MOTIF - /* superclass */ (WidgetClass) &xmPrimitiveClassRec, - /* class_name */ "GLwMDrawingArea", -#else /* not __GLX_MOTIF */ - /* superclass */ (WidgetClass) &widgetClassRec, - /* class_name */ "GLwDrawingArea", -#endif /* __GLX_MOTIF */ - /* widget_size */ sizeof(GLwDrawingAreaRec), - /* class_initialize */ NULL, - /* class_part_initialize */ NULL, - /* class_inited */ FALSE, - /* initialize */ (XtInitProc) Initialize, - /* initialize_hook */ NULL, - /* realize */ Realize, - /* actions */ actions, - /* num_actions */ XtNumber(actions), - /* resources */ resources, - /* num_resources */ XtNumber(resources), - /* xrm_class */ NULLQUARK, - /* compress_motion */ TRUE, - /* compress_exposure */ TRUE, - /* compress_enterleave */ TRUE, - /* visible_interest */ TRUE, - /* destroy */ (XtWidgetProc) Destroy, - /* resize */ (XtWidgetProc) Resize, - /* expose */ (XtExposeProc) Redraw, - /* set_values */ NULL, - /* set_values_hook */ NULL, - /* set_values_almost */ XtInheritSetValuesAlmost, - /* get_values_hook */ NULL, - /* accept_focus */ NULL, - /* version */ XtVersion, - /* callback_private */ NULL, - /* tm_table */ defaultTranslations, - /* query_geometry */ XtInheritQueryGeometry, - /* display_accelerator */ XtInheritDisplayAccelerator, - /* extension */ NULL - }, -#ifdef __GLX_MOTIF /* primitive resources */ - { - /* border_highlight */ XmInheritBorderHighlight, - /* border_unhighlight */ XmInheritBorderUnhighlight, - /* translations */ XtInheritTranslations, - /* arm_and_activate */ NULL, - /* get_resources */ NULL, - /* num get_resources */ 0, - /* extension */ NULL, - } -#endif /* __GLX_MOTIF */ -}; - -WidgetClass glwDrawingAreaWidgetClass = (WidgetClass)&glwDrawingAreaClassRec; - -static void error(Widget w, char *string) -{ - char buf[100]; -#ifdef __GLX_MOTIF - sprintf (buf, "GLwMDrawingArea: %s\n", string); -#else - sprintf (buf, "GLwDrawingArea: %s\n", string); -#endif - XtAppError(XtWidgetToApplicationContext(w), buf); -} - -static void warning(Widget w, char *string) -{ - char buf[100]; -#ifdef __GLX_MOTIF - sprintf (buf, "GLwMDraw: %s\n", string); -#else - sprintf (buf, "GLwDraw: %s\n", string); -#endif - XtAppWarning(XtWidgetToApplicationContext(w), buf); -} - -/* resource initialization methods */ -/* Initialize the attribList based on the attributes */ -static void createAttribList(GLwDrawingAreaWidget w) -{ - int listLength; - register struct attribInfo *ap; - int *ip; - - /* first find out how long a list we need */ - listLength=1; /* include the terminating NULL */ - for (ap = booleanAttribs; ap->attribute; ap++) - { - if (*(Boolean *)(((char *)w)+ap->offset)) - listLength++; /* one word for a boolean */ - } - for (ap = intAttribs; ap->attribute; ap++) - { - if (*(int *)(((char *)w)+ap->offset)) - listLength+=2; /* one word for an int */ - } - w->glwDrawingArea.attribList = (int *)XtMalloc(listLength*sizeof(int)); - ip = w->glwDrawingArea.attribList; - for (ap = booleanAttribs; ap->attribute; ap++) - { - if (*(Boolean *)(((char *)w)+ap->offset)) - *ip++ = ap->attribute; - } - for (ap = intAttribs; ap->attribute; ap++) - { - if (*(int *)(((char *)w)+ap->offset)) - { - *ip++ = ap->attribute; - *ip++ = *(int *)(((char *)w)+ap->offset); - } - } - *ip = None; -} - -/* Initialize the visualInfo based on the attribute list */ -static void createVisualInfo(GLwDrawingAreaWidget w) -{ - assert(w->glwDrawingArea.attribList); - w->glwDrawingArea.visualInfo = glXChooseVisual(XtDisplay(w), - XScreenNumberOfScreen(XtScreen(w)), - w->glwDrawingArea.attribList); - if (!w->glwDrawingArea.visualInfo) - error((Widget)w,"requested visual not supported"); -} - -/* Initialize the colormap based on the visual info. - * This routine maintains a cache of visual-infos to colormaps. If two - * widgets share the same visual info, they share the same colormap. - * This function is called by the callProc of the colormap resource entry. - */ -static void createColormap(GLwDrawingAreaWidget w, - int offset, XrmValue *value) -{ - static struct cmapCache - { - Visual *visual; - Colormap cmap; - int screen; - } *cmapCache; - static int cacheEntries=0; - static int cacheMalloced=0; - - register int i; - - assert(w->glwDrawingArea.visualInfo); - - /* see if we can find it in the cache */ - for (i=0; i<cacheEntries; i++) - if (cmapCache[i].visual == w->glwDrawingArea.visualInfo->visual && - cmapCache[i].screen == w->glwDrawingArea.visualInfo->screen) - { - value->addr = (XtPointer) (&cmapCache[i].cmap); - return; - } - /* not in the cache, create a new entry */ - if (cacheEntries >= cacheMalloced) - { - /* need to malloc a new one. Since we are likely to have only a - * few colormaps, we allocate one the first time, and double - * each subsequent time. - */ - if (cacheMalloced == 0) - { - cacheMalloced = 1; - cmapCache = (struct cmapCache *)XtMalloc(sizeof(struct cmapCache)); - } - else - { - cacheMalloced <<= 1; - cmapCache = (struct cmapCache *)XtRealloc((char *) cmapCache, - sizeof(struct cmapCache)* - cacheMalloced); - } - } - - cmapCache[cacheEntries].cmap = XCreateColormap (XtDisplay(w), - RootWindow(XtDisplay(w), - w->glwDrawingArea.visualInfo->screen), - w->glwDrawingArea.visualInfo->visual, - AllocNone); - cmapCache[cacheEntries].visual = w->glwDrawingArea.visualInfo->visual; - cmapCache[cacheEntries].screen = w->glwDrawingArea.visualInfo->screen; - value->addr = (XtPointer) (&cmapCache[cacheEntries++].cmap); -} - -static void -Initialize (GLwDrawingAreaWidget req, GLwDrawingAreaWidget new, - ArgList args, Cardinal *num_args) -{ - - if (req->core.width == 0) - new->core.width = 100; - if (req->core.height == 0) - new->core.width = 100; - - /* create the attribute list if needed */ - if (new->glwDrawingArea.attribList == NULL) - { - new->glwDrawingArea.myList = TRUE; - createAttribList(new); - } - else - new->glwDrawingArea.myList = FALSE; - - /* determine the visual info if needed */ - if (new->glwDrawingArea.visualInfo == NULL) - { - new->glwDrawingArea.myVisual = TRUE; - createVisualInfo(new); - } - else - new->glwDrawingArea.myVisual = FALSE; - - new->core.depth = new->glwDrawingArea.visualInfo->depth; - - /* Reobtain the colormap and colors in it using XtGetApplicationResources*/ - XtGetApplicationResources((Widget) new, new, - initializeResources, - XtNumber(initializeResources), - args, *num_args); - - /* obtain the color resources if appropriate */ - if (req->glwDrawingArea.allocateBackground) - XtGetApplicationResources((Widget) new, new, - backgroundResources, - XtNumber(backgroundResources), - args, *num_args); - -#ifdef __GLX_MOTIF - if (req->glwDrawingArea.allocateOtherColors) - XtGetApplicationResources((Widget) new, new, - otherColorResources, - XtNumber(otherColorResources), - args, *num_args); -#endif /* __GLX_MOTIF */ - -} - -static void -Realize(Widget w, Mask *valueMask, XSetWindowAttributes *attributes) -{ - register GLwDrawingAreaWidget glw = (GLwDrawingAreaWidget)w; - GLwDrawingAreaCallbackStruct cb; - - /* if we haven't requested that the background be both installed and - * allocated, don't install it. - */ - if (!(glw->glwDrawingArea.installBackground && - glw->glwDrawingArea.allocateBackground)) - *valueMask &= ~CWBackPixel; - - XtCreateWindow (w, (unsigned int)InputOutput, - glw->glwDrawingArea.visualInfo->visual, - *valueMask, attributes); - - /* if appropriate, call XSetWMColormapWindows to install the colormap */ - if (glw->glwDrawingArea.installColormap) - { - Widget parentShell = XtParent(w); - Status status; - Window *windowsReturn; - int countReturn; - - while (parentShell && !XtIsShell(parentShell)) - parentShell = XtParent(parentShell); - if (parentShell && XtWindow(parentShell)) - { - /* check to see if there is already a property */ - status = XGetWMColormapWindows(XtDisplay(parentShell), - XtWindow(parentShell), - &windowsReturn, &countReturn); - - /* if no property, just create one */ - if (!status) - { - Window windows[2]; - windows[0] = XtWindow(w); - windows[1] = XtWindow(parentShell); - XSetWMColormapWindows(XtDisplay(parentShell), - XtWindow(parentShell), - windows, 2); - } - /* there was a property, add myself to the beginning */ - else - { - Window *windows = (Window *)XtMalloc((sizeof(Window))* - (countReturn+1)); - register int i; - windows[0] = XtWindow(w); - for (i=0; i<countReturn; i++) - windows[i+1] = windowsReturn[i]; - XSetWMColormapWindows(XtDisplay(parentShell), - XtWindow(parentShell), - windows, countReturn+1); - XtFree((char *) windows); - XFree((char *) windowsReturn); - } - } - else - warning((Widget)w, - "Could not set colormap property on parent shell"); - } - cb.reason = GLwCR_GINIT; - cb.event = NULL; - cb.width = glw->core.width; - cb.height = glw->core.height; - XtCallCallbackList((Widget) glw, glw->glwDrawingArea.ginitCallback, &cb); -} - -static void -Redraw(GLwDrawingAreaWidget w, XEvent *event, Region region) -{ - GLwDrawingAreaCallbackStruct cb; - - cb.reason = GLwCR_EXPOSE; - cb.event = event; - cb.width = w->core.width; - cb.height = w->core.height; - XtCallCallbackList ((Widget) w, w->glwDrawingArea.exposeCallback, &cb); -} - -static void -Resize(GLwDrawingAreaWidget glw) -{ - GLwDrawingAreaCallbackStruct cb; - - /* if we get a resize event before being realized, we can't handle it */ - if (!XtIsRealized((Widget)glw)) - return; - cb.reason = GLwCR_RESIZE; - cb.event = NULL; - cb.width = glw->core.width; - cb.height = glw->core.height; - XtCallCallbackList ((Widget) glw, glw->glwDrawingArea.resizeCallback, &cb); -} - -static void -Destroy(GLwDrawingAreaWidget glw) -{ - if (glw->glwDrawingArea.myList && glw->glwDrawingArea.attribList) - XtFree ((XtPointer)glw->glwDrawingArea.attribList); - if (glw->glwDrawingArea.myVisual && glw->glwDrawingArea.visualInfo) - XFree ((XtPointer)glw->glwDrawingArea.visualInfo); - - /* if my colormap was installed, remove it */ - if (glw->glwDrawingArea.installColormap) - { - Widget parentShell = XtParent(glw); - Status status; - Window *windowsReturn; - int countReturn; - register int i; - - /* find the parent shell */ - while (parentShell && !XtIsShell(parentShell)) - parentShell = XtParent(parentShell); - - if (parentShell && XtWindow(parentShell)) - { - /* make sure there is a property */ - status = XGetWMColormapWindows(XtDisplay(parentShell), - XtWindow(parentShell), - &windowsReturn, &countReturn); - - /* if no property, just return. If there was a property, - * continue - */ - if (status) - { - /* search for a match */ - for (i=0; i<countReturn; i++) - { - if (windowsReturn[i] == XtWindow(glw)) - { - /* we found a match, now copu the rest down */ - for (i++; i<countReturn; i++) - { - windowsReturn[i-1] = windowsReturn[i]; - } - XSetWMColormapWindows(XtDisplay(parentShell), - XtWindow(parentShell), - windowsReturn, countReturn-1); - break; /* from outer for */ - } - } - XFree((char *) windowsReturn); - } - } - } -} - -/* Action routine for keyboard and mouse events */ -/* ARGSUSED */ -static void glwInput (GLwDrawingAreaWidget glw, XEvent *event, - String * params, Cardinal * numParams) -{ - GLwDrawingAreaCallbackStruct cb; - - cb.reason = GLwCR_INPUT; - cb.event = event; - cb.width = glw->core.width; - cb.height = glw->core.height; - XtCallCallbackList ((Widget) glw, glw->glwDrawingArea.inputCallback, &cb); -} - -#ifdef __GLX_MOTIF -/* Provide a Motif-style create routine */ -Widget GLwCreateMDrawingArea(Widget parent, char *name, - ArgList arglist, Cardinal argcount) -{ - return (XtCreateWidget (name, glwMDrawingAreaWidgetClass, parent, arglist, - argcount)); -} -#endif |