chiark / gitweb /
better with more bendingness costs
[moebius2.git] / view.c
diff --git a/view.c b/view.c
index 32ae7d7df8a8a39ecd9ad0785f0d2870bed54c89..36b85b58ecd1a4fa08394f221cb46ccafdd59d81 100644 (file)
--- a/view.c
+++ b/view.c
@@ -25,11 +25,44 @@ static struct stat input_stab;
 static const char *input_filename;
 static int pause_updates;
 
+#define TITLE_MAX 100
+static char title[TITLE_MAX+1];
+
 static void read_input(void) {
-  int r;
+  int r, last_readlink_r, last_readlink_errno=0;
+  char symlink_check[sizeof(title)];
+
+  last_readlink_r= -2;
   
-  if (input_f) fclose(input_f);
-  input_f= fopen(input_filename, "rb");  if (!input_f) diee("input file");
+  for (;;) {
+    r= readlink(input_filename, symlink_check, TITLE_MAX);
+    assert(r<=TITLE_MAX);
+    assert(r!=-2);
+
+    if (r>=0) symlink_check[r]= 0;
+    else symlink_check[0]= 0;
+
+    if (r == last_readlink_r &&
+       (r<0
+        ? (errno==last_readlink_errno)
+        : !strcmp(symlink_check, title))) {
+      assert(input_f);
+      if (r<0) {
+       if (last_readlink_errno==EINVAL)
+         snprintf(title,sizeof(title),"%s",input_filename);
+       else
+         snprintf(title,sizeof(title),"? %s",strerror(last_readlink_errno));
+      }
+      break;
+    }
+    
+    strcpy(title, symlink_check);
+    last_readlink_r= r;
+    last_readlink_errno= errno;
+
+    if (input_f) fclose(input_f);
+    input_f= fopen(input_filename, "rb");  if (!input_f) diee("input file");
+  }
 
   if (fstat(fileno(input_f), &input_stab)) diee("fstat input file");
 
@@ -45,7 +78,7 @@ static void transform_coordinates(void) {
 
   int v, k;
   
-  FOR_VERTEX(v) {
+  FOR_VERTEX(v,INNER) {
     input_gsl.data= &conformation[v][0];
     GA( gsl_blas_dgemv(CblasNoTrans, 1.0,&transform_gsl, &input_gsl,
                       0.0, &result_gsl) );
@@ -77,7 +110,7 @@ static void generate_display_list(void) {
   int vb, ve[V6], e;
 
   ntris= 0;
-  FOR_VERTEX(vb) {
+  FOR_VERTEX(vb,INNER) {
     /* We use the two triangles in the parallelogram vb, vb+e5, vb+e0, vb+e1.
      * We go round each triangle clockwise (although our surface is non-
      * orientable so it shouldn't matter).  Picking the parallelogram
@@ -94,7 +127,7 @@ static void generate_display_list(void) {
 
   if (!vertex_in_triangles_checked) {
     int v, expd;
-    FOR_VERTEX(v) {
+    FOR_VERTEX(v,INNER) {
       expd= RIM_VERTEX_P(v) ? 3 : 6;
       if (vertex_in_triangles[v] != expd) {
        fprintf(stderr,"vertex %02x used for %d triangles, expected %d\n",
@@ -255,7 +288,8 @@ static void display_conformation(void) {
     drawtriangles(&dmwhite);
     printf("shown, %d/%d triangles cut\n", ncut, ntris);
   }
-  
+
+  XA( XStoreName(display,window,title) );
   XA( XSetWindowBackgroundPixmap(display,window,pixmap) );
   XA( XClearWindow(display,window) );
   currentbuffer= !currentbuffer;
@@ -656,7 +690,7 @@ static void check_input(void) {
 
 static void topocheck(void) {
   int v1,e,v2,eprime,v1prime, count;
-  FOR_EDGE(v1,e,v2) {
+  FOR_EDGE(v1,e,v2, INNER) {
     count= 0;
     FOR_VEDGE(v2,eprime,v1prime)
       if (v1prime==v1) count++;
@@ -679,6 +713,7 @@ int main(int argc, const char *const *argv) {
   struct pollfd *polls=0;
   int motion_deferred=0, motion_x=-1, motion_y=-1;
 
+  mgraph_prepare();
   topocheck();
   if (argc==1) { printf("topology self-consistent, ok\n"); exit(0); }