summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common.h8
-rw-r--r--src/graphics_cs_svg.c14
-rw-r--r--src/graphics_cs_x11.c8
-rw-r--r--src/hackvr.c58
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;