Skip to content
Snippets Groups Projects
partiviewGlut.cc 3.65 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    #include <stdarg.h>
    #include <errno.h>
    
    #include <GL/glut.h>
    
    #include "flhack.H"
    #include "Gview.H"
    #include "partiview.H"
    #include "geometry.h"
    #include "shmem.h"
    #include "pview_funcs.h"
    
    extern "C" {
    #include "findfile.h"
    };
    
    int wwidth = 640;
    int wheight = 480;
    int wposx = 100;
    int wposy = 100;
    int isFullScreen = false;
    
    extern char partiview_version[];
    
    void display()
    {
        ppui.view->redraw(true);
    
        glutSwapBuffers();
    }
    
    void reshape (int _w,int _h)
    {
        if (!isFullScreen) {
            wwidth = _w;
            wheight = _h;
        }
    
        ppui.view->size(_w,_h);
    }
    
    void mouseFunc(int _button,int _state,int _x,int _y)
    {
    #ifdef MACINTOSH
        if (_button == GLUT_LEFT_BUTTON && glutGetModifiers())
            _button = GLUT_RIGHT_BUTTON;
    #endif
    
        Fl::state = 0;
        if (_button == GLUT_LEFT_BUTTON) {
            Fl::state = FL_BUTTON1;
            Fl::button = FL_LEFT_MOUSE;
        }
        if (_button == GLUT_MIDDLE_BUTTON) {
            Fl::state = FL_BUTTON2;
            Fl::button = FL_MIDDLE_MOUSE;
        }
        if (_button == GLUT_RIGHT_BUTTON) {
            Fl::state = FL_BUTTON3;
            Fl::button = FL_RIGHT_MOUSE;
        }
        if (glutGetModifiers() == GLUT_ACTIVE_SHIFT)
            Fl::state += FL_SHIFT;
        if (glutGetModifiers() == GLUT_ACTIVE_CTRL)
            Fl::state += FL_CTRL;
        Fl::x = _x;
        Fl::y = _y;
    
        if (_state == GLUT_DOWN)
            ppui.view->handle(FL_PUSH);
        else {
            Fl::state = 0;
            ppui.view->handle(FL_RELEASE);
            Fl::button = 0;
        }
    }
    
    void mouseMotion(int _x,int _y)
    {
        Fl::x = _x;
        Fl::y = _y;
    
        ppui.view->handle(FL_DRAG);
    }
    
    void special(int _key,int _x,int _y)
    {
        Fl::keys[0] = _key;
        Fl::keys[1] = '\0';
        Fl::x = _x;
        Fl::y = _y;
    
        if (glutGetModifiers() == GLUT_ACTIVE_SHIFT)
            Fl::state += FL_SHIFT;
        if (glutGetModifiers() == GLUT_ACTIVE_CTRL)
            Fl::state += FL_CTRL;
    
        ppui.view->handle(FL_KEYBOARD);
    
        if (_key == GLUT_KEY_F1) {
            fprintf(stdout, "> ");
            char line[1024];
            gets(line);
            pviewEval(line);
        }
        if (_key == GLUT_KEY_F11) {
            if (isFullScreen) {
                isFullScreen = false;
                glutPositionWindow(wposx, wposy);
                glutReshapeWindow(wwidth, wheight);
            } else {
                isFullScreen = true;
                glutFullScreen();
            }
        }
    
        glutPostRedisplay();
    }
    
    void keyboard(unsigned char _key,int _x,int _y)
    {
        Fl::keys[0] = _key;
        Fl::keys[1] = '\0';
        Fl::x = _x;
        Fl::y = _y;
    
        if (glutGetModifiers() == GLUT_ACTIVE_SHIFT)
            Fl::state += FL_SHIFT;
        if (glutGetModifiers() == GLUT_ACTIVE_CTRL)
            Fl::state += FL_CTRL;
    
        ppui.view->handle(FL_KEYBOARD);
    
        glutPostRedisplay();
    }
    
    void idle(void)
    {
        Fl::idle();
    
        if (pviewPicked()) {
            fprintf(stdout, "%s\n", _pickmsg);
            strcpy(_pickmsg, "");
        }
    
        glutPostRedisplay();
    }
    
    int main(int _argc,char **_argv)
    {
        glutInit(&_argc,_argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
        glutInitWindowSize(wwidth, wheight);
        glutInitWindowPosition(wposx, wposy);
        glutCreateWindow(_argv[0]);
    
        fprintf(stdout, "Welcome to Partiview ver.%s : glut version.\n", partiview_version);
        fprintf(stdout, "Hit [F1] key to enter a command.\n\n");
    
        // initialize partiview
        char* initarg = NULL;
        if (_argc>1)
            initarg = _argv[1];
        pviewInit(initarg);
        pviewEval("inertia on");
    
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutMouseFunc(mouseFunc);
        glutMotionFunc(mouseMotion);
    
        glutKeyboardFunc(keyboard);
        glutSpecialFunc(special);
        glutIdleFunc(idle);
    
        glutMainLoop();
    
        return 0;
    }