diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common.h | 8 | ||||
-rw-r--r-- | src/graphics_cs_svg.c | 14 | ||||
-rw-r--r-- | src/graphics_cs_x11.c | 8 | ||||
-rw-r--r-- | src/hackvr.c | 58 |
4 files changed, 46 insertions, 42 deletions
diff --git a/src/common.h b/src/common.h index 77ad619..7d8e5ab 100644 --- a/src/common.h +++ b/src/common.h @@ -96,6 +96,12 @@ typedef struct c3_shape {//use array or linked list? struct attrib attrib; } c3_s_t; +typedef enum hvr_state { + HVR_STATE_INIT, + HVR_STATE_RUN, + HVR_STATE_EXIT +} hvr_state; + struct hvr_global { int x; int y; @@ -115,12 +121,14 @@ struct hvr_global { struct hashtable ht_group; c3_group_rel_t eye[MAX_SIDES];//lol. 1000 eyes! array of group_rels for each eye. how to arrange eyes? c3_group_rel_t camera;//should there be an array for this? camera has .s which is a shape struct. each point is the eye? + hvr_state state;//I dunno. real zoom; int derp; real split; char localecho; int selfpipe[2]; char *version; + char *title; }; int selfcommand(char *); diff --git a/src/graphics_cs_svg.c b/src/graphics_cs_svg.c index 210a1cf..65f0bc5 100644 --- a/src/graphics_cs_svg.c +++ b/src/graphics_cs_svg.c @@ -143,7 +143,15 @@ void draw_cs_filled_shape(cs_s_t s) { //should I do clipping in each graphics lib or make graphics.c just have clipping stuff? void clear_backbuffer() { // strcpy(svg_global.backbuffer,"<?xml version=\"1.0\" standalone=\"no\">\n"); - strcpy(svg_global.backbuffer,"<html><head><meta http-equiv=\"refresh\" content=\"0\" /></head><body>\n"); + if(global.state == HVR_STATE_EXIT) {//we only want to actually print a refresh if we're not doing the last frame. + strcpy(svg_global.backbuffer,"<html><head><title>"); + strcat(svg_global.backbuffer,global.title); + strcat(svg_global.backbuffer,"</title></head><body>\n"); + } else { + strcpy(svg_global.backbuffer,"<html><head><title>"); + strcat(svg_global.backbuffer,global.title); + strcat(svg_global.backbuffer,"</title><meta http-equiv=\"refresh\" content=\"0\" /></head><body>\n"); + } strcat(svg_global.backbuffer,"<svg width=\"1024\" height=\"768\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n"); } @@ -243,7 +251,9 @@ void set_demands_attention() { */ } -void set_title(char *t) { +void set_title(char *t) {//this might need to be put somewhere else... + if(global.title) free(global.title); + global.title=strdup(t); //XStoreName(x11_global.dpy,x11_global.w,t); } diff --git a/src/graphics_cs_x11.c b/src/graphics_cs_x11.c index 1f9774a..f2911f6 100644 --- a/src/graphics_cs_x11.c +++ b/src/graphics_cs_x11.c @@ -372,7 +372,11 @@ void x11_keypress_handler(XKeyEvent *xkey,int x,int y) { #endif void set_title(char *t) { - XStoreName(x11_global.dpy,x11_global.w,t); + if(global.title) free(global.title); + global.title=strdup(t); + if(x11_global.dpy && x11_global.w) { + XStoreName(x11_global.dpy,x11_global.w,t); + } } int graphics_sub_init() { @@ -415,8 +419,8 @@ int graphics_sub_init() { set_aspect_ratio(); XSelectInput(x11_global.dpy, x11_global.w, HV_MOUSE_X11_EVENT_MASK|HV_X11_KB_EVENT_MASK|HV_GRAPHICS_X11_EVENT_MASK); } + XStoreName(x11_global.dpy,x11_global.w,global.title); XMapWindow(x11_global.dpy,x11_global.w); - set_title("hackvr");//uses the globals to know what dpy and w x11_global.gc=XCreateGC(x11_global.dpy,x11_global.w, 0, 0); x11_global.backbuffer=XCreatePixmap(x11_global.dpy,x11_global.w,MAXWIDTH,MAXHEIGHT,DefaultDepth(x11_global.dpy,DefaultScreen(x11_global.dpy))); x11_global.cleanbackbuffer=XCreatePixmap(x11_global.dpy,x11_global.w,MAXWIDTH,MAXHEIGHT,DefaultDepth(x11_global.dpy,DefaultScreen(x11_global.dpy))); diff --git a/src/hackvr.c b/src/hackvr.c index 4eaec17..1f64004 100644 --- a/src/hackvr.c +++ b/src/hackvr.c @@ -37,6 +37,13 @@ struct hvr_global global; //TODO: will have to make some pixmaps get resized when the window does. //for now set them to be as big as you think you'll ever resize the window to. +#ifndef GRAPHICAL +void set_title(char *t) { + if(global.title) free(global.title); + global.title=strdup(t); +} +#endif + int lum_based_on_distance(c3_s_t *s) { int i; real sum=0; @@ -47,36 +54,6 @@ int lum_based_on_distance(c3_s_t *s) { return sum * 5; } - -//might be able to make this faster by just using fgets() and not using recursion and malloc. -/* does not return the newline. */ - -//this isn't being used anymore afaict. -char *read_line_hack(FILE *fp,int len) { - short in; - char *t; - errno=0; - switch(in=fgetc(fp)) { - case '\n': - t=malloc(len+1); - t[len]=0; - return t; - case -1: - if(errno == EAGAIN) return 0; - if(feof(fp)) { - fprintf(stderr,"# reached EOF. exiting.\n"); - exit(0); - } - fprintf(stderr,"# some other error happened while reading. %d %d\n",EAGAIN,errno); - perror("hackvr"); - exit(1); - default: - if((t=read_line_hack(fp,len+1))) t[len]=in; - break; - } - return t; -} - int selfcommand(char *s) {//send this line to be handled by ourselves and output to stdout if(global.localecho) { write(global.selfpipe[1],s,strlen(s)); @@ -138,17 +115,18 @@ void hackvr_handler_idc(struct shit *me,char *line) { switch(hackvr_handler(line)) { case -1://quit fprintf(stderr,"# exiting due to EOF\n"); - //we need to flush another draw before exiting probably for _svg to get one last frame in. - #ifdef GRAPHICAL - redraw(); - #endif + global.state=HVR_STATE_EXIT; + #ifdef GRAPHICAL + draw_screen(); + #endif + //close(me->fd);//this doesn't make the main loop exit. gonna have to exit(0); exit(0); case 0://don't redraw break; case 1://redraw please. - #ifdef GRAPHICAL - redraw(); - #endif + #ifdef GRAPHICAL + redraw(); + #endif break; default://no idea. break; @@ -388,8 +366,8 @@ int hackvr_handler(char *line) { if(len != 3 && len != 4) return ret; if(len == 4) { if(0); -#ifdef GRAPHICAL else if(!strcmp(a[2],"title")) set_title(a[3]);//who cares for spaces anyway? +#ifdef GRAPHICAL else if(!strcmp(a[2],"camera.p.x")) global.camera.p.x=strtold(a[3],0); else if(!strcmp(a[2],"camera.p.y")) global.camera.p.y=strtold(a[3],0); else if(!strcmp(a[2],"camera.p.z")) global.camera.p.z=strtold(a[3],0); @@ -767,7 +745,10 @@ void alarm_handler(int sig) { } int main(int argc,char *argv[]) { + global.state=HVR_STATE_INIT; global.version=HVR_VERSION; + global.title=0; + set_title("hackvr"); int i; int fd=0;//stdin if(argc == 2) { @@ -835,6 +816,7 @@ int main(int argc,char *argv[]) { //signal(SIGALRM,alarm_handler); //alarm(10); fprintf(stderr,"# entering main loop\n"); + global.state=HVR_STATE_RUN; select_on_everything(); return 0; |