\r
int nWindow, nChildWindow = -1;\r
int nLoopMain = 0;\r
-\r
-int nPosX, nPosY;\r
-int nWidth, nHeight;\r
-\r
GLboolean bChildPosDone = GL_FALSE, bChildSizeDone = GL_FALSE;\r
\r
void SampleKeyboard( unsigned char cChar, int nMouseX, int nMouseY );\r
\r
void DrawQuad()\r
{\r
- nWidth = glutGet(GLUT_WINDOW_WIDTH);\r
- nHeight = glutGet(GLUT_WINDOW_HEIGHT);\r
+ int width = glutGet(GLUT_WINDOW_WIDTH);\r
+ int height = glutGet(GLUT_WINDOW_HEIGHT);\r
\r
glBegin(GL_QUADS);\r
- glVertex2d(nWidth*.25, nHeight*.75);\r
- glVertex2d(nWidth*.75, nHeight*.75);\r
- glVertex2d(nWidth*.75, nHeight*.25);\r
- glVertex2d(nWidth*.25, nHeight*.25);\r
+ glVertex2d(width*.25, height*.75);\r
+ glVertex2d(width*.75, height*.75);\r
+ glVertex2d(width*.75, height*.25);\r
+ glVertex2d(width*.25, height*.25);\r
glEnd();\r
}\r
\r
glutShowWindow();\r
}\r
\r
+void ChangeTitleTimer(int unused)\r
+{\r
+ glutSetIconTitle("new icon title");\r
+ glutSetWindowTitle("new test title");\r
+}\r
+\r
void SampleKeyboard( unsigned char cChar, int nMouseX, int nMouseY )\r
{\r
switch (cChar)\r
{\r
glutSetWindow(nWindow);\r
printf("main window resize\n");\r
- if (nWidth<400)\r
+ if (glutGet(GLUT_WINDOW_WIDTH)<400)\r
glutReshapeWindow(600,300);\r
else\r
glutReshapeWindow(300,300);\r
* the client area is at a different position if the window has borders\r
* and/or a title bar.\r
*/\r
- if (nPosX<400)\r
+ if (glutGet(GLUT_WINDOW_X)<400)\r
glutPositionWindow(600,300);\r
else\r
glutPositionWindow(300,300);\r
break;\r
\r
\r
+ case 'd':\r
+ case 'D':\r
+ if (nChildWindow!=-1 && cChar=='d') /* Capital D always moves+resizes the main window*/\r
+ {\r
+ glutSetWindow(nChildWindow);\r
+ if (!bChildPosDone)\r
+ glutPositionWindow(glutGet(GLUT_WINDOW_X)+50,glutGet(GLUT_WINDOW_Y)+50);\r
+ else\r
+ glutPositionWindow(glutGet(GLUT_WINDOW_X)-50,glutGet(GLUT_WINDOW_Y)-50);\r
+ bChildPosDone = !bChildPosDone;\r
+ if (!bChildSizeDone)\r
+ glutReshapeWindow(glutGet(GLUT_WINDOW_WIDTH)+50,glutGet(GLUT_WINDOW_HEIGHT)+50);\r
+ else\r
+ glutReshapeWindow(glutGet(GLUT_WINDOW_WIDTH)-50,glutGet(GLUT_WINDOW_HEIGHT)-50);\r
+ bChildSizeDone = !bChildSizeDone;\r
+ }\r
+ else\r
+ {\r
+ if (glutGet(GLUT_WINDOW_X)<400)\r
+ glutPositionWindow(600,300);\r
+ else\r
+ glutPositionWindow(300,300);\r
+ if (glutGet(GLUT_WINDOW_WIDTH)<400)\r
+ glutReshapeWindow(600,300);\r
+ else\r
+ glutReshapeWindow(300,300);\r
+ }\r
+ break;\r
+\r
+\r
case 'c':\r
case 'C':\r
if (nChildWindow==-1)\r
{\r
+ int width = glutGet(GLUT_WINDOW_WIDTH);\r
+ int height = glutGet(GLUT_WINDOW_HEIGHT);\r
+\r
/* open child window */\r
printf("open child window\n");\r
- nWidth = glutGet(GLUT_WINDOW_WIDTH);\r
- nHeight = glutGet(GLUT_WINDOW_HEIGHT);\r
\r
- nChildWindow = glutCreateSubWindow(nWindow,(int)(nWidth*.35),(int)(nHeight*.35),(int)(nWidth*.3),(int)(nHeight*.3));\r
+ nChildWindow = glutCreateSubWindow(nWindow,(int)(width*.35),(int)(height*.35),(int)(width*.3),(int)(height*.3));\r
glutKeyboardFunc( SampleKeyboard );\r
glutDisplayFunc( Redisplay );\r
glutReshapeFunc( Reshape );\r
case 'i':\r
case 'I':\r
glutIconifyWindow();\r
+ glutTimerFunc(1500, ChangeTitleTimer, 0);\r
break;\r
\r
\r
glutTimerFunc(2000, UnhideTimer, nWindow);\r
}\r
glutHideWindow();\r
+ break;\r
+\r
+ case 'p':\r
+ case 'P':\r
+ if (nChildWindow!=-1 && cChar=='p') /* Capital P always changes pointer for the main window*/\r
+ {\r
+ glutSetWindow(nChildWindow);\r
+ if (glutGet(GLUT_WINDOW_CURSOR)==GLUT_CURSOR_TOP_SIDE)\r
+ glutSetCursor(GLUT_CURSOR_RIGHT_ARROW);\r
+ else\r
+ glutSetCursor(GLUT_CURSOR_TOP_SIDE);\r
+ }\r
+ else\r
+ {\r
+ glutSetWindow(nWindow);\r
+ if (glutGet(GLUT_WINDOW_CURSOR)==GLUT_CURSOR_CYCLE)\r
+ glutSetCursor(GLUT_CURSOR_RIGHT_ARROW);\r
+ else\r
+ glutSetCursor(GLUT_CURSOR_CYCLE);\r
+ }\r
+ break;\r
\r
default:\r
break;\r
{\r
int win = glutGetWindow();\r
\r
- printf("reshape %s, %dx%d\n",win==nWindow?"main":"child",\r
+ printf("reshape %s, client area: %dx%d\n",win==nWindow?"main":"child",\r
width, height);\r
\r
glViewport(0,0,width,height);\r
\r
if (win==nWindow && nChildWindow!=-1)\r
{\r
+ /* Put child window in right place */\r
+ int x = (int)(width*.35), y=(int)(height*.35), w=(int)(width*.3), h = (int)(height*.3);\r
+ if (bChildPosDone)\r
+ {\r
+ x += 50;\r
+ y += 50;\r
+ }\r
+ if (bChildSizeDone)\r
+ {\r
+ w += 50;\r
+ h += 50;\r
+ }\r
glutSetWindow(nChildWindow);\r
- glutPositionWindow((int)(width*.35),(int)(height*.35));\r
- glutReshapeWindow((int)(width*.3),(int)(height*.3));\r
+ glutPositionWindow(x,y);\r
+ glutReshapeWindow(w,h);\r
glutSetWindow(nWindow);\r
}\r
}\r
{\r
int win = glutGetWindow();\r
\r
- printf("position, %s: (%d,%d)\n",win==nWindow?"top-left of main":"top-left of child relative to parent",\r
+ printf("position, %s: (%d,%d)\n",win==nWindow?"top-left (non-client) of main":"top-left of child relative to parent",\r
x, y);\r
}\r
\r
void Redisplay(void)\r
{\r
int win = glutGetWindow();\r
+ int viewport[4];\r
\r
if (win==nWindow)\r
{\r
glClear(GL_COLOR_BUFFER_BIT);\r
DrawQuad();\r
\r
+ if (win==nWindow)\r
+ {\r
+ glColor3f(1, 1, 0);\r
+ glGetIntegerv(GL_VIEWPORT, viewport);\r
+ glRasterPos2i(2, -glutBitmapHeight(GLUT_BITMAP_9_BY_15)+3+viewport[3]);\r
+ glutBitmapString(GLUT_BITMAP_9_BY_15, (unsigned char*)"press f/r/m/d/c/i/h/p");\r
+ }\r
+\r
glutSwapBuffers();\r
glutPostWindowRedisplay(win);\r
}\r
\r
-void Timer(int unused)
-{
- int win = glutGetWindow();
+void Timer(int unused)\r
+{\r
+ int win = glutGetWindow();\r
+ int x, y;\r
+ int width, height;\r
int border, caption;\r
\r
- nPosX = glutGet(GLUT_WINDOW_X);\r
- nPosY = glutGet(GLUT_WINDOW_Y);\r
- nWidth = glutGet(GLUT_WINDOW_WIDTH);\r
- nHeight = glutGet(GLUT_WINDOW_HEIGHT);\r
+ x = glutGet(GLUT_WINDOW_X);\r
+ y = glutGet(GLUT_WINDOW_Y);\r
+ width = glutGet(GLUT_WINDOW_WIDTH);\r
+ height = glutGet(GLUT_WINDOW_HEIGHT);\r
border = glutGet(GLUT_WINDOW_BORDER_WIDTH);\r
caption = glutGet(GLUT_WINDOW_HEADER_HEIGHT);\r
/* returned position is top-left of client area, to get top-left of\r
/* printf("window border: %dpx, caption: %dpx\n",border,caption); */\r
if (win==nWindow)\r
printf("main window %dx%d, top-left of client at: (%d,%d), of window at: (%d,%d)\n",\r
- nWidth, nHeight,\r
- nPosX ,nPosY,\r
- nPosX-border,\r
- nPosY-border-caption);\r
+ width, height,\r
+ x ,y,\r
+ x-border,\r
+ y-caption);\r
else\r
printf("child window %dx%d, top-left of client at: (%d,%d), relative to parent\n",\r
- nWidth, nHeight,\r
- nPosX ,nPosY);
-
- /* (re)set the timer callback and ask glut to call it in 500 ms */
- glutTimerFunc(500, Timer, 0);
+ width, height,\r
+ x ,y);\r
+\r
+ /* (re)set the timer callback and ask glut to call it in 500 ms */\r
+ glutTimerFunc(500, Timer, 0);\r
}\r
\r
\r
glutInitWindowSize(200,200);\r
\r
nWindow = glutCreateWindow("test");\r
+ glutSetIconTitle("test icon title");\r
printf("main window id: %d\n", nWindow);\r
\r
glutKeyboardFunc( SampleKeyboard );\r