diff mupdf-source/thirdparty/freeglut/progs/demos/Resizer/Resizer.cpp @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/freeglut/progs/demos/Resizer/Resizer.cpp	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,383 @@
+#include <stdio.h>
+
+#include <GL/freeglut.h>
+
+int nWindow, nChildWindow = -1;
+int nLoopMain = 0;
+GLboolean bChildPosDone = GL_FALSE, bChildSizeDone = GL_FALSE;
+
+void SampleKeyboard( unsigned char cChar, int nMouseX, int nMouseY );
+void Redisplay();
+void Reshape(int width, int height);
+void Position(int x, int y);
+void WindowStatus(int state);
+
+
+
+
+void DrawQuad()
+{
+    int width  = glutGet(GLUT_WINDOW_WIDTH);
+    int height = glutGet(GLUT_WINDOW_HEIGHT);
+
+    glBegin(GL_QUADS);
+        glVertex2d(width*.25, height*.75);
+        glVertex2d(width*.75, height*.75);
+        glVertex2d(width*.75, height*.25);
+        glVertex2d(width*.25, height*.25);
+    glEnd();
+}
+
+void UnhideTimer(int window)
+{
+    glutSetWindow(window);
+    glutShowWindow();
+}
+
+void ChangeTitleTimer(int unused)
+{
+    glutSetIconTitle("new icon title");
+    glutSetWindowTitle("new test title");
+}
+
+void SampleKeyboard( unsigned char cChar, int nMouseX, int nMouseY )
+{
+    switch (cChar)
+    {
+    case 27:
+        glutLeaveMainLoop();
+
+        break;
+
+
+    case 'f':
+    case 'F':
+        printf("main window toggle fullscreen\n");
+        glutFullScreenToggle();
+
+        break;
+
+
+    case 'r':
+    case 'R':
+        if (nChildWindow!=-1 && cChar=='r') /* Capital R always resizes the main window*/
+        {
+            glutSetWindow(nChildWindow);
+            printf("child window resize\n");
+            if (!bChildSizeDone)
+                glutReshapeWindow(glutGet(GLUT_WINDOW_WIDTH)+50,glutGet(GLUT_WINDOW_HEIGHT)+50);
+            else
+                glutReshapeWindow(glutGet(GLUT_WINDOW_WIDTH)-50,glutGet(GLUT_WINDOW_HEIGHT)-50);
+            bChildSizeDone = !bChildSizeDone;
+        }
+        else
+        {
+            glutSetWindow(nWindow);
+            printf("main window resize\n");
+            if (glutGet(GLUT_WINDOW_WIDTH)<400)
+                glutReshapeWindow(600,300);
+            else
+                glutReshapeWindow(300,300);
+        }
+
+        break;
+
+
+    case 'm':
+    case 'M':
+        if (nChildWindow!=-1 && cChar=='m') /* Capital M always moves the main window*/
+        {
+            glutSetWindow(nChildWindow);
+            /* The window position you request is relative to the top-left
+             * corner of the client area of the parent window.
+             */
+            if (!bChildPosDone)
+                glutPositionWindow(glutGet(GLUT_WINDOW_X)+50,glutGet(GLUT_WINDOW_Y)+50);
+            else
+                glutPositionWindow(glutGet(GLUT_WINDOW_X)-50,glutGet(GLUT_WINDOW_Y)-50);
+            bChildPosDone = !bChildPosDone;
+        }
+        else
+        {
+            glutSetWindow(nWindow);
+            printf("main window position\n");
+            /* The window position you request is the outer top-left of the window,
+             * the client area is at a different position if the window has borders
+             * and/or a title bar.
+             */
+            if (glutGet(GLUT_WINDOW_X)<400)
+                glutPositionWindow(600,300);
+            else
+                glutPositionWindow(300,300);
+        }
+
+        break;
+
+
+    case 'd':
+    case 'D':
+        if (nChildWindow!=-1 && cChar=='d') /* Capital D always moves+resizes the main window*/
+        {
+            glutSetWindow(nChildWindow);
+            if (!bChildPosDone)
+                glutPositionWindow(glutGet(GLUT_WINDOW_X)+50,glutGet(GLUT_WINDOW_Y)+50);
+            else
+                glutPositionWindow(glutGet(GLUT_WINDOW_X)-50,glutGet(GLUT_WINDOW_Y)-50);
+            bChildPosDone = !bChildPosDone;
+            if (!bChildSizeDone)
+                glutReshapeWindow(glutGet(GLUT_WINDOW_WIDTH)+50,glutGet(GLUT_WINDOW_HEIGHT)+50);
+            else
+                glutReshapeWindow(glutGet(GLUT_WINDOW_WIDTH)-50,glutGet(GLUT_WINDOW_HEIGHT)-50);
+            bChildSizeDone = !bChildSizeDone;
+        }
+        else
+        {
+            if (glutGet(GLUT_WINDOW_X)<400)
+                glutPositionWindow(600,300);
+            else
+                glutPositionWindow(300,300);
+            if (glutGet(GLUT_WINDOW_WIDTH)<400)
+                glutReshapeWindow(600,300);
+            else
+                glutReshapeWindow(300,300);
+        }
+        break;
+
+
+    case 'c':
+    case 'C':
+        if (nChildWindow==-1)
+        {
+            int width  = glutGet(GLUT_WINDOW_WIDTH);
+            int height = glutGet(GLUT_WINDOW_HEIGHT);
+
+            /* open child window */
+            printf("open child window\n");
+
+            nChildWindow = glutCreateSubWindow(nWindow,(int)(width*.35),(int)(height*.35),(int)(width*.3),(int)(height*.3));
+            glutKeyboardFunc( SampleKeyboard );
+            glutDisplayFunc( Redisplay );
+            glutReshapeFunc( Reshape );
+            glutPositionFunc( Position );
+            glutWindowStatusFunc( WindowStatus );
+        }
+        else
+        {
+            /* close child window */
+            printf("close child window\n");
+            glutSetWindow(nWindow);
+            glutDestroyWindow(nChildWindow);
+            nChildWindow = -1;
+            bChildSizeDone = GL_FALSE;
+            bChildPosDone  = GL_FALSE;
+        }
+        break;
+
+
+    case 'i':
+    case 'I':
+        glutIconifyWindow();
+        glutTimerFunc(1500, ChangeTitleTimer, 0);
+        break;
+
+
+    case 'h':
+    case 'H':
+        if (nChildWindow!=-1 && cChar=='h') /* Capital H always hides the main window*/
+        {
+            glutSetWindow(nChildWindow);
+            glutTimerFunc(2000, UnhideTimer, nChildWindow);
+        }
+        else
+        {
+            glutSetWindow(nWindow);
+            glutTimerFunc(2000, UnhideTimer, nWindow);
+        }
+        glutHideWindow();
+        break;
+
+    case 'p':
+    case 'P':
+        if (nChildWindow!=-1 && cChar=='p') /* Capital P always changes pointer for the main window*/
+        {
+            glutSetWindow(nChildWindow);
+            if (glutGet(GLUT_WINDOW_CURSOR)==GLUT_CURSOR_TOP_SIDE)
+                glutSetCursor(GLUT_CURSOR_RIGHT_ARROW);
+            else
+                glutSetCursor(GLUT_CURSOR_TOP_SIDE);
+        }
+        else
+        {
+            glutSetWindow(nWindow);
+            if (glutGet(GLUT_WINDOW_CURSOR)==GLUT_CURSOR_CYCLE)
+                glutSetCursor(GLUT_CURSOR_RIGHT_ARROW);
+            else
+                glutSetCursor(GLUT_CURSOR_CYCLE);
+        }
+        break;
+
+    default:
+        break;
+    }
+}
+
+void Idle(void)
+{
+    glutPostRedisplay();
+}
+
+void Reshape(int width, int height)
+{
+    int win = glutGetWindow();
+
+    printf("reshape %s, client area: %dx%d\n",win==nWindow?"main":"child",
+        width, height);
+
+    glViewport(0,0,width,height);
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+    gluOrtho2D(0,width,0,height);
+
+    if (win==nWindow && nChildWindow!=-1)
+    {
+        /* Put child window in right place */
+        int x = (int)(width*.35), y=(int)(height*.35), w=(int)(width*.3), h = (int)(height*.3);
+        if (bChildPosDone)
+        {
+            x += 50;
+            y += 50;
+        }
+        if (bChildSizeDone)
+        {
+            w += 50;
+            h += 50;
+        }
+        glutSetWindow(nChildWindow);
+        glutPositionWindow(x,y);
+        glutReshapeWindow(w,h);
+        glutSetWindow(nWindow);
+    }
+}
+
+void Position(int x, int y)
+{
+    int win = glutGetWindow();
+
+    printf("position, %s: (%d,%d)\n",win==nWindow?"top-left (non-client) of main":"top-left of child relative to parent",
+        x, y);
+}
+
+void WindowStatus(int state)
+{
+    int win = glutGetWindow();
+    printf("windowstatus (win %i): %i\n",win,state);
+}
+
+void Redisplay(void)
+{
+    int win = glutGetWindow();
+    int viewport[4];
+
+    if (win==nWindow)
+    {
+        glClearColor(.2f,0.f,0.f,0.f);
+        glColor3f(1,1,1);
+    }
+    else
+    {
+        /* child window */
+        glClearColor(.0f,.2f,0.f,0.f);
+        glColor3f(.5,.5,.5);
+        glutPostWindowRedisplay(nWindow);
+    }
+    glClear(GL_COLOR_BUFFER_BIT);
+    DrawQuad();
+
+    if (win==nWindow)
+    {
+        glColor3f(1, 1, 0);
+        glGetIntegerv(GL_VIEWPORT, viewport);
+        glRasterPos2i(2, -glutBitmapHeight(GLUT_BITMAP_9_BY_15)+3+viewport[3]);
+        glutBitmapString(GLUT_BITMAP_9_BY_15, (unsigned char*)"press f/r/m/d/c/i/h/p");
+    }
+
+    glutSwapBuffers();
+    glutPostWindowRedisplay(win);
+}
+
+void Timer(int unused)
+{
+    int win = glutGetWindow();
+    int x, y;
+    int width, height;
+    int border, caption;
+
+    x       = glutGet(GLUT_WINDOW_X);
+    y       = glutGet(GLUT_WINDOW_Y);
+    width   = glutGet(GLUT_WINDOW_WIDTH);
+    height  = glutGet(GLUT_WINDOW_HEIGHT);
+    border  = glutGet(GLUT_WINDOW_BORDER_WIDTH);
+    caption = glutGet(GLUT_WINDOW_HEADER_HEIGHT);
+    /* returned position is top-left of client area, to get top-left of
+     * of window you'll need to add the size of the border and caption
+     * of the current window (can be 0).
+     * Note that the window position is not necessarily positive (e.g.
+     * when the window is on a monitor to the left of the primary monitor
+     * or simply when maximized--try pressing the maximize button).
+     * the returned size is the size of the client area
+     * Note that the top-left of a child window is relative to the
+     * top-left of the client area of the parent.
+     */
+    /* printf("window border: %dpx, caption: %dpx\n",border,caption); */
+    if (win==nWindow)
+        printf("main  window %dx%d, top-left of client at: (%d,%d), of window at: (%d,%d)\n",
+            width, height,
+            x ,y,
+            x-border,
+            y-caption);
+    else
+        printf("child window %dx%d, top-left of client at: (%d,%d), relative to parent\n",
+        width, height,
+        x ,y);
+
+    /* (re)set the timer callback and ask glut to call it in 500 ms */
+    glutTimerFunc(500, Timer, 0);
+}
+
+
+int main(int argc, char* argv[])
+{
+    int border, caption;
+    glutInit( &argc, argv );
+    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE /*| GLUT_BORDERLESS*/); // do try as well with GLUT_BORDERLESS and GLUT_CAPTIONLESS
+    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS);
+    
+    /* Get border and caption size of default window style */
+    border  = glutGet(GLUT_WINDOW_BORDER_WIDTH);
+    caption = glutGet(GLUT_WINDOW_HEADER_HEIGHT);
+    printf("default window style border: %dpx, caption: %dpx\n",border,caption);
+
+    /* NB: The window position you request is the outer top-left of the
+     * window, the client area is at a different position if the window has
+     * borders and/or a title bar.
+     */
+    glutInitWindowPosition(150,250);
+    glutInitWindowSize(200,200);
+
+    nWindow = glutCreateWindow("test");
+    glutSetIconTitle("test icon title");
+    printf("main window id: %d\n", nWindow);
+
+    glutKeyboardFunc( SampleKeyboard );
+    glutDisplayFunc( Redisplay );
+    glutReshapeFunc( Reshape );
+    glutPositionFunc( Position );
+    glutWindowStatusFunc( WindowStatus );
+
+    glutTimerFunc(300, Timer, 0);
+
+    glutMainLoop();
+    printf("glutMainLoop returned\n");
+
+    return EXIT_SUCCESS;
+}