Added basic functionality for passing graphics preferences between core and app

svn path=/trunk/boinc/; revision=100
This commit is contained in:
Eric Heien 2002-06-07 22:47:13 +00:00
parent 9d6db62022
commit a994fe0520
5 changed files with 119 additions and 0 deletions

View File

@ -394,3 +394,14 @@ Michael Gary June 07, 2002
lib/
parse.C
Eric Heien June 07, 2002
- Added initial functionality for passing graphics preferences between core and app
client/
Makefile.in
app.C
lib/
gfx_interface.C
gfx_interface.h

View File

@ -40,6 +40,7 @@ OBJS = \
speed_stats.o \
time_stats.o \
util.o \
../lib/gfx_interface.o \
../lib/parse.o \
../lib/md5_file.o \
../lib/md5.o

View File

@ -42,6 +42,7 @@
#include "file_names.h"
#include "log_flags.h"
#include "parse.h"
#include "gfx_interface.h"
#include "app.h"
@ -100,7 +101,16 @@ int ACTIVE_TASK::start(bool first_time) {
FILE_REF file_ref;
FILE_INFO* fip;
int fd, retval;
char prefs_path[256];
FILE *prefs_fd;
GFX_INTERFACE *gi = new GFX_INTERFACE;
gi->width = 640;
gi->height = 480;
gi->depth = 32;
gi->fps = 5;
gi->draw_offscreen = 1;
gi->shared_mem_key = ftok(dirname, 'B'); // Generate a unique identifier
#ifdef unix
pid = fork();
@ -131,6 +141,12 @@ int ACTIVE_TASK::start(bool first_time) {
}
}
// Write out the app prefs
sprintf( prefs_path, "%s/%s", dirname, "prefs.xml" );
prefs_fd = fopen( prefs_path, "w" );
gi->write_prefs(prefs_fd);
fclose(prefs_fd);
// create symbolic links, and hook up descriptors, for input files
//
for (i=0; i<wup->input_files.size(); i++) {

55
lib/gfx_interface.C Normal file
View File

@ -0,0 +1,55 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "gfx_interface.h"
#include "parse.h"
int GFX_INTERFACE::write_prefs(FILE *fout) {
fprintf( fout,
"<gfx_prefs>\n"
" <gfx_width>%d</gfx_width>\n"
" <gfx_height>%d</gfx_height>\n"
" <gfx_depth>%d</gfx_depth>\n"
" <gfx_fps>%f</gfx_fps>\n"
" <gfx_shmem_key>%d</gfx_shmem_key>\n"
"</gfx_prefs>",
width, height, depth, fps, shared_mem_key
);
return 0;
}
int GFX_INTERFACE::parse(FILE* fin) {
char buf[256];
fgets(buf, 256, fin);
if (!match_tag(buf, "<gfx_prefs>")) {
fprintf(stderr, "GFX_INTERFACE::parse(): bad first tag %s\n", buf);
return -1;
}
while(fgets(buf,256,fin)) {
if (match_tag(buf, "</gfx_prefs>")) return 0;
else if (parse_int(buf, "<gfx_width>", width)) continue;
else if (parse_int(buf, "<gfx_height>", height)) continue;
else if (parse_int(buf, "<gfx_depth>", depth)) continue;
else if (parse_double(buf, "<gfx_fps>", fps)) continue;
else if (parse_int(buf, "<gfx_shmem_key>", shared_mem_key)) continue;
else fprintf(stderr, "GFX_INTERFACE::parse(): unrecognized: %s\n", buf);
}
return -1;
}
int GFX_INTERFACE::open_parse_prefs( void ) {
FILE *prefs;
int err;
prefs = fopen( "prefs.xml", "r" );
if( prefs == NULL )
return -1;
rewind( prefs );
err = parse( prefs );
fclose( prefs );
return err;
}

36
lib/gfx_interface.h Normal file
View File

@ -0,0 +1,36 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define DRAW_OFFSCREEN 0x01
#define DRAW_ONSCREEN 0x02
// Status flags
#define ERROR -1
#define WAITING_FOR_APP 0
#define APP_READY 1
#define APP_REQUEST 2
#define BUFFER_DIRTY 3
#define BUFFER_CLEAN 4
#ifndef _GFX_INTERFACE
#define _GFX_INTERFACE
struct GFX_INTERFACE {
int width, height; // in pixels
int depth; // in bits (8. 16, 24, etc)
double fps; // max frames per second to draw (can be < 1)
int draw_offscreen; // should we draw offscreen/onscreen/anything
int shared_mem_key; // key for graphics shared memory region
int offscreen_dirty; // is the offscreen buffer ready for blitting?
int status; // status of graphics rendering (see flags above)
char *graphicsData;
int shared_mem_allocated;
int write_prefs(FILE*);
int parse(FILE*);
int open_parse_prefs();
};
#endif _GFX_INTERFACE