Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • fix_Makefile.mingw#2
  • update_Makefile.mingw
  • fix_Makefile.mingw
  • fix_API_for_C_apps
  • fix_procinfo_mac
  • boinccmd_gpu_mode_always_until_sigterm
  • fgrp_osx_hotfix
  • fix_boinc_master@f8250782
  • eah_wrapper_improvements
  • diagnostics_win-hotfix
  • diagnostics_win-hotfix-old
  • current_fgrp_apps
  • testing_gw_apps
  • gw_app_darwin_15
  • current_brp_apps
  • current_brp_apps_android10
  • current_gfx_apps
  • current_server
  • current_gw_apps
  • previous_fgrp_apps
  • previous_gw_apps
  • testing_brp_apps
  • apps_FGRP3_1.07
  • apps_FGRP3_1.08
25 results

graphics2_unix.C

Blame
  • graphics2_unix.C 6.70 KiB
    // Berkeley Open Infrastructure for Network Computing
    // http://boinc.berkeley.edu
    // Copyright (C) 2008 University of California
    //
    // This is free software; you can redistribute it and/or
    // modify it under the terms of the GNU Lesser General Public
    // License as published by the Free Software Foundation;
    // either version 2.1 of the License, or (at your option) any later version.
    //
    // This software is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    // See the GNU Lesser General Public License for more details.
    //
    // To view the GNU Lesser General Public License visit
    // http://www.gnu.org/copyleft/lesser.html
    // or write to the Free Software Foundation, Inc.,
    // 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    
    // unix-specific graphics stuff
    //
    #include "config.h"
    #include <stdlib.h>
    #include <stdio.h>    
    #include <setjmp.h>    
    #include <unistd.h> 
    #include <pthread.h> 
    #include <signal.h>
    #include <cstring>
    #include "x_opengl.h"
    
    #include "app_ipc.h"
    #include "util.h"
    #include "filesys.h"
    
    #include "boinc_gl.h"
    #include "boinc_glut.h"
    #include "boinc_api.h"
    #include "graphics2.h"
    
    #define TIMER_INTERVAL_MSEC 30
    
    static int xpos = 100, ypos = 100, width = 600, height = 400;
    static int clicked_button;
    static int win=0;
    static int checkparentcounter=0;
    
    #ifdef __APPLE__
    #include <sys/param.h>  // for MAXPATHLEN
    
    static bool need_show = false;
    #endif
    
    bool fullscreen;
    
    static void close_window() {
        exit(0);
    }
    
    // This callback is invoked when a user presses a key.
    //
    void keyboardD(unsigned char key, int /*x*/, int /*y*/) {
        if (fullscreen) {
            close_window();
        } else {
            boinc_app_key_press((int) key, 0);
        }
    }
    
    void keyboardU(unsigned char key, int /*x*/, int /*y*/) {
        if (fullscreen) {
            close_window();
        } else {
            boinc_app_key_release((int) key, 0);
        }
    }
    
    void mouse_click(int button, int state, int x, int y){
        clicked_button = button;
        if (fullscreen) {
            close_window();
        } else {
            if (state) {
                boinc_app_mouse_button(x, y, button, false);
            } else {
                boinc_app_mouse_button(x, y, button, true);
            }
        }
    }
    
    void mouse_click_move(int x, int y){
        if (fullscreen) {
            close_window();
        } else if (clicked_button == 2){
            boinc_app_mouse_move(x, y, false, false, true);
        } else if (clicked_button == 1){
            boinc_app_mouse_move(x, y, false, true, false);
        } else if (clicked_button == 0){
            boinc_app_mouse_move(x, y, true, false, false);
        } else{
            boinc_app_mouse_move(x, y, false, false, false);
        }
    }
    
    static void maybe_render() {
        int new_xpos, new_ypos, new_width, new_height;
        static int size_changed = 0;
        
        new_xpos = glutGet(GLUT_WINDOW_X);
        new_ypos = glutGet(GLUT_WINDOW_Y);
        new_width = glutGet(GLUT_WINDOW_WIDTH);
        new_height = glutGet(GLUT_WINDOW_HEIGHT);
        
        
        if (throttled_app_render(new_width, new_height, dtime())) {
            glutSwapBuffers();
            if (! fullscreen) {
                // If user has changed window size, wait until it stops 
                // changing and then write the new dimensions to file
                if ((new_xpos != xpos) || (new_ypos != ypos) || 
                    (new_width != width) || (new_height != height)
                    ) {
                        size_changed = 1;
                        xpos = new_xpos;
                        ypos = new_ypos;
                        width = new_width;
                        height = new_height;
                    } else {
                        if (size_changed && (++size_changed > 10)) {
                            size_changed = 0;
                            FILE *f = boinc_fopen("gfx_info", "w");
                            if (f) {
                                // ToDo: change this to XML
                                fprintf(f, "%d %d %d %d\n", xpos, ypos, width, height);
                                fclose(f);
                            }
                        }
                    }               // End if (new size != previous size) else 
                }                   // End if (! fullscreen)
    #ifdef __APPLE__
            MacGLUTFix(fullscreen);
            if (need_show) {
                glutShowWindow();
                need_show = false;
            }
    #endif
        }
    }
    
    static void make_window() {
        char window_title[256];
        get_window_title(window_title, 256);
    
        win = glutCreateWindow(window_title); 
        glutReshapeFunc(app_graphics_resize);
        glutKeyboardFunc(keyboardD);
        glutKeyboardUpFunc(keyboardU);
        glutMouseFunc(mouse_click);
        glutMotionFunc(mouse_click_move);
        glutDisplayFunc(maybe_render); 
        glEnable(GL_DEPTH_TEST);
    
        app_graphics_init();
      
    #ifdef __APPLE__
        glutWMCloseFunc(close_window);   // Enable the window's close box
        BringAppToFront();
        // Show window only after a successful call to throttled_app_render(); 
        // this avoids momentary display of old image when screensaver restarts 
        // which made image appear to "jump."
        need_show = true;
    #endif
    
        if (fullscreen)  {
            glutFullScreen();
        }
    }
    
    static void boinc_glut_init(int *argc, char** argv) {
        win = 0;
    
        FILE *f = boinc_fopen("gfx_info", "r");
        if (f) {
            // ToDo: change this to XML parsing
            fscanf(f, "%d %d %d %d\n", &xpos, &ypos, &width, &height);
            fclose(f);
        }
    
        glutInit (argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_ALPHA); 
        glutInitWindowPosition(xpos, ypos);
        glutInitWindowSize(width, height); 
    }
    
    static void timer_handler(int) {
        maybe_render();
        // When running under a V5 client, the worker app launches the graphics app
        // so this code kills the graphics when the worker application exits.
        // Under a V6 client, the Manager or Screensaver launched the graphics app
        // so this code kills the graphics when the Manager or Screensaver exits.
        if (--checkparentcounter < 0) {
            // Check approximately twice per second if parent process still running
            checkparentcounter = 500 / TIMER_INTERVAL_MSEC;
            if (getppid() == 1) {
                // Quit graphics application if parent process no longer running
                close_window();
            }
        }
        glutTimerFunc(TIMER_INTERVAL_MSEC, timer_handler, 0);
    }
    
    void boinc_graphics_loop(int argc, char** argv) {
    #ifdef __APPLE__
        char dir [MAXPATHLEN];
        getcwd(dir, MAXPATHLEN);
    #endif
        for (int i=1; i<argc; i++) {
            if (!strcmp(argv[i], "--fullscreen")) {
                fullscreen = true;
            }
        }
        boinc_glut_init(&argc, argv);
        make_window();
        glutTimerFunc(TIMER_INTERVAL_MSEC, timer_handler, 0);      
    #ifdef __APPLE__
        // Apparently glut changed our working directory in OS 10.3.9
        chdir(dir);
    #endif
        glutMainLoop();
    }