📄 test1.c
字号:
/* * $Header: /cvsroot/lesstif/lesstif/test/extra/gl/test1.c,v 1.1 2002/05/14 22:49:04 dannybackx Exp $ * * My application's main drawing window is an OpenGL * window that is based in a xmFrameWidget class using * GLwCreateMDrawingArea to build the window. I've * noticed that with LessTif, there are about 50 pixel * missing from the top of the window. Also, resizing * the main dialog window does not resize the OpenGL * child window. I don't have these problems with Motif. * * I see these problems in LessTif in the cygwin Windows * 2000 version. I am able to use Motif for the Windows * 2000 Interix 2.2, and various Unix systems. None of * the Motif versions display the problems. Note, there * are two other smaller OpenGL windows in the * application that are missing a smaller number of * pixels. I don't expect that this can be fixed easily, * but I thought I'd report the problem. * * Here's the code fragment that builds the main OpenGL * window. The default size of the window is 900x700. * * * Thanks, * * Frank Ortega */#include "LTTconfig.h"#include <stdlib.h>#include <stdio.h>#include <math.h>#include <X11/Xlib.h>#include <X11/keysym.h>#include <Xm/XmAll.h>#ifdef HAVE_GL_GLWMDRAWA_H#include <GL/GLwMDrawA.h>#else#error No <GL/GLwMDrawA.h> available#endifDisplay *dpy;Window win;GLXContext ctx;XtAppContext appc;Widget top, form, drawframe, glw;Arg al[10];int ac;static voiddraw_expose_callback(Widget w, XtPointer client, XtPointer call){ fprintf(stderr, "draw_expose_callback(wid %p win %p)\n", w, XtWindow(w)); printf("Redraw event\n"); glClear( GL_COLOR_BUFFER_BIT ); glColor3f( 1.0, 1.0, 0.0 ); glRectf( -0.8, -0.8, 0.8, 0.8 ); glXSwapBuffers( dpy, XtWindow(w));}static voiddo_resize(Widget w, XtPointer client, XtPointer call){ fprintf(stderr, "do_resize\n"); printf("Resize event\n"); glViewport( 0, 0, XtWidth(w), XtHeight(w) ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );}static Window make_rgb_db_window(Widget w){ int attrib[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, None }; int scrnum; XSetWindowAttributes attr; unsigned long mask; Window root, win; GLXContext ctx; XVisualInfo *visinfo; unsigned width = XtWidth(w), height = XtHeight(w); scrnum = DefaultScreen( dpy ); root = RootWindow( dpy, scrnum ); visinfo = glXChooseVisual( dpy, scrnum, attrib ); if (!visinfo) { printf("Error: couldn't get an RGB, Double-buffered visual\n"); exit(1); } win = XtWindow(w); ctx = glXCreateContext( dpy, visinfo, NULL, True ); glXMakeCurrent( dpy, win, ctx ); return win;}#if 0static void event_loop( Display *dpy ){ XEvent event; while (1) { XNextEvent( dpy, &event ); switch (event.type) { case Expose: redraw( dpy, event.xany.window ); break; case ConfigureNotify: resize( event.xconfigure.width, event.xconfigure.height ); break; } }}#endif#if 0/* From glxdemo.c */int main( int argc, char *argv[] ){ Display *dpy; Window win; dpy = XOpenDisplay(NULL); win = make_rgb_db_window( dpy, 300, 300 ); glShadeModel( GL_FLAT ); glClearColor( 0.5, 0.5, 0.5, 1.0 ); XMapWindow( dpy, win ); event_loop( dpy ); return 0;}#endifint attrib[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, None};#if 0static voiddraw_expose_callback(Widget w, XtPointer client, XtPointer call){ fprintf(stderr, "draw_expose_callback(wid %p win %p)\n", w, XtWindow(w));#if 1 work(NULL);#else XtAppAddWorkProc(appc, work, NULL);#endif}#endifstatic voidinit_window(Widget w, XtPointer client, XtPointer call){ fprintf(stderr, "init_window\n"); win = make_rgb_db_window(w); glShadeModel( GL_FLAT ); glClearColor( 0.5, 0.5, 0.5, 1.0 );}static voidinput(Widget w, XtPointer client, XtPointer call){ fprintf(stderr, "input\n");}int main(int argc, char *argv[]){ XtSetLanguageProc(NULL, NULL, NULL); top = XtVaAppInitialize(&appc, "Label", NULL, 0, &argc, argv, NULL, NULL); dpy = XtDisplay(top); ac = 0; XtSetArg(al[ac], XmNwidth, 500); ac++; XtSetArg(al[ac], XmNheight, 300); ac++; form = XmCreateForm(top, "form", al, ac); XtManageChild(form); /* Create OpenGL drawing window frame. */ drawframe = XtVaCreateManagedWidget("Drawframe", xmFrameWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, 10, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 10, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 10, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, 10,#if 0 XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, objxrottxt, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, maglabel, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNheight, windowheight+6, XmNwidth, windowwidth+6, #endif NULL); XtManageChild (drawframe); /* Create OpenGL drawing window. */ ac = 0; XtSetArg(al[ac], GLwNattribList, attrib); ac++;#if 1 XtSetArg(al[ac], XmNheight, 280); ac++; XtSetArg(al[ac], XmNwidth, 480); ac++; #else XtSetArg(al[ac], XmNheight,windowheight); ac++; XtSetArg(al[ac], XmNwidth,windowwidth); ac++; XtSetArg(al[ac], GLwNvisualInfo, vi); ac++;#endif glw = GLwCreateMDrawingArea(drawframe,"Glw", al, ac); XtManageChild (glw); XtAddCallback(glw,GLwNexposeCallback,draw_expose_callback, (caddr_t) 0); XtAddCallback(glw,GLwNresizeCallback,do_resize, (caddr_t) 0); XtAddCallback(glw,GLwNginitCallback,init_window, (caddr_t) 0); XtAddCallback(glw,GLwNinputCallback,input, (caddr_t) 0); XtRealizeWidget(top); #if 0 XtAppMainLoop(appc);#else LessTifTestMainLoop(top);#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -