]> granicus.if.org Git - graphviz/commitdiff
Fix for bug#1776
authorellson <devnull@localhost>
Sun, 4 Oct 2009 20:15:42 +0000 (20:15 +0000)
committerellson <devnull@localhost>
Sun, 4 Oct 2009 20:15:42 +0000 (20:15 +0000)
Not quite the fix suggested by Eric Rannaud <eric.rannaud@gmail.com>
because we have traditionally used SIGINT to get partial layouts.

Just prevent -Tgtk, -Txlib, or any other event-handling devices from rendering
after an interrupt.

cmd/dot/dot.c
lib/common/emit.c
lib/gvc/gvc.h
lib/gvc/gvcontext.c

index 0f74621f73d2cb15bf2d244eb31dc0a89adca23b..c4b4d746711510dd00ab424b95bf50e785a94cee 100644 (file)
@@ -62,8 +62,11 @@ static graph_t * G;
 #ifndef WIN32
 static void intr(int s)
 {
+/* if interrupted we try to produce a partial rendering before exiting */
     if (G)
        gvRenderJobs(Gvc, G);
+/* Note that we don't call gvFinalize() so that we don't start event-driven
+ * devices like -Tgtk or -Txlib */
     exit (gvFreeContext(Gvc));
 }
 
@@ -212,5 +215,6 @@ int main(int argc, char **argv)
            prev = G;
        }
     }
+    gvFinalize(Gvc);
     return (gvFreeContext(Gvc));
 }
index 036ebc3ce01a9283e68c2bd1ebd4ab789168f8eb..c4e8371aec1704fbd4210952e3832696f721ae84 100644 (file)
@@ -3217,7 +3217,7 @@ int gvRenderJobs (GVC_t * gvc, graph_t * g)
        }
 
         /* the last job, after all input graphs are processed,
-         *      is finalized from gvFreeContext()
+         *      is finalized from gvFinalize()
          */
        prevjob = job;
     }
index bc4752295d6eac54eaed213dcbf2e4d78bb1d4af..bd14e650714d151cf78ab4ce14cd122e44a1f228 100644 (file)
@@ -94,6 +94,7 @@ extern int gvRenderJobs(GVC_t *gvc, graph_t *g);
 extern int gvFreeLayout(GVC_t *gvc, graph_t *g);
 
 /* Clean up graphviz context */
+extern void gvFinalize(GVC_t *gvc);
 extern int gvFreeContext(GVC_t *gvc);
 
 /** Add a library from your user application
index e142f341b0aadc17ffdcae7611b4995e17656a43..080bcdf68a58a5bc57fe1ad63594a68881b6dcef 100644 (file)
@@ -64,13 +64,18 @@ GVC_t *gvNEWcontext(const lt_symlist_t *builtins, int demand_loading)
     return gvc;
 }
 
+void gvFinalize(GVC_t * gvc)
+{
+    if (gvc->active_jobs)
+       gvrender_end_job(gvc->active_jobs);
+}
+
+
 int gvFreeContext(GVC_t * gvc)
 {
     GVG_t *gvg, *gvg_next;
     gvplugin_package_t *package, *package_next;
 
-    if (gvc->active_jobs)
-       gvrender_end_job(gvc->active_jobs);
     emit_once_reset();
     gvg_next = gvc->gvgs;
     while ((gvg = gvg_next)) {