📄 window.c
字号:
/* * DOS/DJGPP Mesa Utility Toolkit * Version: 1.0 * * Copyright (C) 2005 Daniel Borca All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */#include <stdio.h>#include "internal.h"static GLuint swaptime, swapcount;static DMesaVisual visual = NULL;GLUTwindow *_glut_current, *_glut_windows[MAX_WINDOWS];static voidclean (void){ int i; for (i=1; i<=MAX_WINDOWS; i++) { glutDestroyWindow(i); } if (visual) DMesaDestroyVisual(visual); pc_close_stdout(); pc_close_stderr();}static GLUTwindow *_glut_window (int win){ if (win > 0 && --win < MAX_WINDOWS) { return _glut_windows[win]; } return NULL;}int APIENTRYglutCreateWindow (const char *title){ int i; int m8width = (_glut_default.width + 7) & ~7; if (!(_glut_default.mode & GLUT_DOUBLE)) { return 0; } /* We set the Visual once. This will be our desktop (graphic mode). * We should do this in the `glutInit' code, but we don't have any idea * about its geometry. Supposedly, when we are about to create one * window, we have a slight idea about resolution. */ if (!visual) { if ((visual=DMesaCreateVisual(_glut_default.x + m8width, _glut_default.y + _glut_default.height, _glut_visual.bpp, _glut_visual.refresh, GLUT_SINGLE, !(_glut_default.mode & GLUT_INDEX), (_glut_default.mode & GLUT_ALPHA ) ? _glut_visual.alpha : 0, (_glut_default.mode & GLUT_DEPTH ) ? _glut_visual.depth : 0, (_glut_default.mode & GLUT_STENCIL) ? _glut_visual.stencil : 0, (_glut_default.mode & GLUT_ACCUM ) ? _glut_visual.accum : 0))==NULL) { return 0; } DMesaGetIntegerv(DMESA_GET_SCREEN_SIZE, _glut_visual.geometry); DMesaGetIntegerv(DMESA_GET_DRIVER_CAPS, &_glut_visual.flags); /* Also hook stdio/stderr once */ pc_open_stdout(); pc_open_stderr(); pc_atexit(clean); } /* Search for an empty slot. * Each window has its own rendering Context and its own Buffer. */ for (i=0; i<MAX_WINDOWS; i++) { if (_glut_windows[i] == NULL) { DMesaContext c; DMesaBuffer b; GLUTwindow *w; if ((w = (GLUTwindow *)calloc(1, sizeof(GLUTwindow))) == NULL) { return 0; } /* Allocate the rendering Context. */ if ((c = DMesaCreateContext(visual, NULL)) == NULL) { free(w); return 0; } /* Allocate the Buffer (displayable area). * We have to specify buffer size and position (inside the desktop). */ if ((b = DMesaCreateBuffer(visual, _glut_default.x, _glut_default.y, m8width, _glut_default.height)) == NULL) { DMesaDestroyContext(c); free(w); return 0; } /* Bind Buffer to Context and make the Context the current one. */ if (!DMesaMakeCurrent(c, b)) { DMesaDestroyBuffer(b); DMesaDestroyContext(c); free(w); return 0; } _glut_current = _glut_windows[i] = w; w->num = ++i; w->xpos = _glut_default.x; w->ypos = _glut_default.y; w->width = m8width; w->height = _glut_default.height; w->context = c; w->buffer = b; return i; } } return 0;}int APIENTRYglutCreateSubWindow (int win, int x, int y, int width, int height){ return GL_FALSE;}void APIENTRYglutDestroyWindow (int win){ GLUTwindow *w = _glut_window(win); if (w != NULL) { if (w->destroy) { w->destroy(); } DMesaMakeCurrent(NULL, NULL); DMesaDestroyBuffer(w->buffer); DMesaDestroyContext(w->context); free(w); _glut_windows[win - 1] = NULL; }}void APIENTRYglutPostRedisplay (void){ _glut_current->redisplay = GL_TRUE;}void APIENTRYglutSwapBuffers (void){ if (_glut_current->show_mouse) { /* XXX scare mouse */ DMesaSwapBuffers(_glut_current->buffer); /* XXX unscare mouse */ } else { DMesaSwapBuffers(_glut_current->buffer); } if (_glut_fps) { GLint t = glutGet(GLUT_ELAPSED_TIME); swapcount++; if (swaptime == 0) swaptime = t; else if (t - swaptime > _glut_fps) { double time = 0.001 * (t - swaptime); double fps = (double)swapcount / time; fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f FPS\n", swapcount, time, fps); swaptime = t; swapcount = 0; } }}int APIENTRYglutGetWindow (void){ return _glut_current->num;}void APIENTRYglutSetWindow (int win){ GLUTwindow *w = _glut_window(win); if (w != NULL) { _glut_current = w; DMesaMakeCurrent(_glut_current->context, _glut_current->buffer); }}void APIENTRYglutSetWindowTitle (const char *title){}void APIENTRYglutSetIconTitle (const char *title){}void APIENTRYglutPositionWindow (int x, int y){ if (DMesaMoveBuffer(x, y)) { _glut_current->xpos = x; _glut_current->ypos = y; }}void APIENTRYglutReshapeWindow (int width, int height){ if (DMesaResizeBuffer(width, height)) { _glut_current->width = width; _glut_current->height = height; if (_glut_current->reshape) { _glut_current->reshape(width, height); } else { glViewport(0, 0, width, height); } }}void APIENTRYglutFullScreen (void){}void APIENTRYglutPopWindow (void){}void APIENTRYglutPushWindow (void){}void APIENTRYglutIconifyWindow (void){}void APIENTRYglutShowWindow (void){}void APIENTRYglutHideWindow (void){}void APIENTRYglutCloseFunc (GLUTdestroyCB destroy){ _glut_current->destroy = destroy;}void APIENTRYglutPostWindowRedisplay (int win){ GLUTwindow *w = _glut_window(win); if (w != NULL) { w->redisplay = GL_TRUE; }}void * APIENTRYglutGetWindowData (void){ return _glut_current->data;}void APIENTRYglutSetWindowData (void *data){ _glut_current->data = data;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -