resizer demo: adding a bit more output to console to indicate what is going on upon...
[freeglut] / progs / demos / Resizer / Resizer.cpp
index 41d8872..85ce4b8 100644 (file)
@@ -4,33 +4,42 @@
 \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
 void Redisplay();\r
 void Reshape(int width, int height);\r
 void Position(int x, int y);\r
+void WindowStatus(int state);\r
 \r
 \r
 \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
+void UnhideTimer(int window)\r
+{\r
+    glutSetWindow(window);\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
@@ -65,7 +74,7 @@ void SampleKeyboard( unsigned char cChar, int nMouseX, int nMouseY )
         {\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
@@ -96,7 +105,7 @@ void SampleKeyboard( unsigned char cChar, int nMouseX, int nMouseY )
              * 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
@@ -105,20 +114,52 @@ void SampleKeyboard( unsigned char cChar, int nMouseX, int nMouseY )
         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
             glutPositionFunc( Position );\r
+            glutWindowStatusFunc( WindowStatus );\r
         }\r
         else\r
         {\r
@@ -133,6 +174,60 @@ void SampleKeyboard( unsigned char cChar, int nMouseX, int nMouseY )
         break;\r
 \r
 \r
+    case 'i':\r
+    case 'I':\r
+        glutIconifyWindow();\r
+        glutTimerFunc(1500, ChangeTitleTimer, 0);\r
+        break;\r
+\r
+\r
+    case 'h':\r
+    case 'H':\r
+        if (nChildWindow!=-1 && cChar=='h') /* Capital H always hides the main window*/\r
+        {\r
+            glutSetWindow(nChildWindow);\r
+            glutTimerFunc(2000, UnhideTimer, nChildWindow);\r
+        }\r
+        else\r
+        {\r
+            glutSetWindow(nWindow);\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
+                       {\r
+                               glutSetCursor(GLUT_CURSOR_RIGHT_ARROW);\r
+                               printf("reverting child window cursor\n");\r
+                       }\r
+            else\r
+                       {\r
+                               glutSetCursor(GLUT_CURSOR_TOP_SIDE);\r
+                               printf("changing child window cursor\n");\r
+                       }\r
+        }\r
+        else\r
+        {\r
+            glutSetWindow(nWindow);\r
+            if (glutGet(GLUT_WINDOW_CURSOR)==GLUT_CURSOR_CYCLE)\r
+                       {\r
+                               glutSetCursor(GLUT_CURSOR_RIGHT_ARROW);\r
+                               printf("reverting main window cursor\n");\r
+                       }\r
+            else\r
+                       {\r
+                               glutSetCursor(GLUT_CURSOR_CYCLE);\r
+                               printf("changing main window cursor\n");\r
+                       }\r
+        }\r
+        break;\r
+\r
     default:\r
         break;\r
     }\r
@@ -147,7 +242,7 @@ void Reshape(int width, int height)
 {\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
@@ -157,9 +252,21 @@ void Reshape(int width, int height)
 \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
@@ -168,13 +275,20 @@ void Position(int x, int y)
 {\r
     int win = glutGetWindow();\r
 \r
-    printf("position, %s: %dx%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 WindowStatus(int state)\r
+{\r
+    int win = glutGetWindow();\r
+    printf("windowstatus (win %i): %i\n",win,state);\r
+}\r
+\r
 void Redisplay(void)\r
 {\r
     int win = glutGetWindow();\r
+    int viewport[4];\r
 \r
     if (win==nWindow)\r
     {\r
@@ -191,19 +305,29 @@ void Redisplay(void)
     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
@@ -219,17 +343,17 @@ void Timer(int unused)
     /* 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 1 second */
-    glutTimerFunc(300, 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
@@ -253,12 +377,14 @@ int main(int argc, char* argv[])
     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
     glutDisplayFunc( Redisplay );\r
     glutReshapeFunc( Reshape );\r
     glutPositionFunc( Position );\r
+    glutWindowStatusFunc( WindowStatus );\r
 \r
     glutTimerFunc(300, Timer, 0);\r
 \r
@@ -266,4 +392,4 @@ int main(int argc, char* argv[])
     printf("glutMainLoop returned\n");\r
 \r
     return EXIT_SUCCESS;\r
-}
\ No newline at end of file
+}\r