home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lyx-0.13.2.tar.gz / lyx-0.13.2.tar / lyx-0.13.2 / src / figinset.C < prev    next >
C/C++ Source or Header  |  1998-04-23  |  3KB  |  130 lines

  1. /*
  2.  *    figinset.C - part of LyX project
  3.  */
  4.  
  5. #include <config.h>
  6.  
  7. #include <unistd.h>
  8. //#include <signal.h>
  9. #include <sys/wait.h>
  10.  
  11. #if defined(sgi) && !defined(__GNUC__)
  12. #include <bstring.h>
  13. #endif
  14.  
  15. #include <stdlib.h>
  16.  
  17. #include "lyx_main.h"
  18. #include "error.h"
  19. #include "procMgr.h"
  20. #include "insetfig.h"
  21. #include "figlist.h"
  22. #include "gsqueue.h"
  23.  
  24. //     $Id: figinset.C,v 1.1.1.1 1998/04/23 16:02:49 larsbj Exp $    
  25.  
  26. #if !defined(lint) && !defined(WITH_WARNINGS)
  27. static char vcid[] = "$Id: figinset.C,v 1.1.1.1 1998/04/23 16:02:49 larsbj Exp $";
  28. #endif /* lint */
  29.  
  30. //extern void sigchldhandler(int sig);
  31.  
  32. extern void UpdateInset(Inset* inset, bool mark_dirty = true);
  33. // better for asyncron updating:
  34. extern void PutInsetIntoInsetUpdateList(Inset* inset);
  35. extern void ProhibitInput();
  36. extern void AllowInput();
  37.  
  38. int bmpinsref = 0;  // number of bitmaps
  39.  
  40. extern Colormap color_map;
  41.  
  42.  
  43. static void makeupdatelist(figdata *p)
  44. {
  45.     int i;
  46.  
  47.     for (i = 0; i < figL.figinsref; ++i) if (figL.figures[i]->data == p) {
  48.         if (lyxerr.debugging()) {
  49.             lyxerr.print(LString("Updating inset ")
  50.                      + long(figL.figures[i]->inset));
  51.         }
  52.         // add inset figures[i]->inset into to_update list
  53.         PutInsetIntoInsetUpdateList(figL.figures[i]->inset);
  54.     }
  55. }
  56.  
  57.  
  58. void sigchldchecker(int)
  59. {
  60.     int i, status;
  61.     figdata *p;
  62.     int pid = 0;
  63.  
  64.     for (i = bmpinsref - 1; i >= 0; --i)
  65.         if (figL.bitmaps[i]->reading && figL.bitmaps[i]->gspid > 0)
  66.             if ((pid = waitpid(figL.bitmaps[i]->gspid, &status, WNOHANG)) ==
  67.                 figL.bitmaps[i]->gspid) {
  68.                 // now read the file and remove it from disk
  69.                 p = figL.bitmaps[i];
  70.                 p->reading = false;
  71.                 if (figL.bitmaps[i]->gsdone) status = 0;
  72.                 if (lyxerr.debugging()) {
  73.                     if (status == 0) {
  74.                         printf("GS [%d] exit OK.\n", pid);
  75.                     } else {
  76.                         printf("GS [%d] error %d E:%d %d S:%d %d\n", pid,
  77.                                status, WIFEXITED(status), WEXITSTATUS(status),
  78.                                WIFSIGNALED(status), WTERMSIG(status));
  79.                     }
  80.                 }
  81.                 if (status == 0) {
  82.                     figL.bitmap_waiting = true;
  83.                     p->broken = false;
  84.                 } else {
  85.                     // remove temporary files
  86.                     char tmp[128];
  87.                     sprintf(tmp, "%s/~lyxgs%d.ps", 
  88.                         system_tempdir.c_str(),
  89.                         p->gspid);
  90.                     unlink(tmp);
  91.                     p->gspid = -1;
  92.                     p->broken = true;
  93.                 }
  94.                 makeupdatelist(figL.bitmaps[i]);
  95.                 gsQ.gsrunning--;
  96.                 gsQ.runqueue();
  97.                 break;
  98.             }
  99.     if (!pid) {
  100.         ProcessManager::pidwait *p = procMgr.pw, *prev = NULL;
  101.         while (p) {
  102.             if ((pid = waitpid(p->pid, &status, WNOHANG)) == p->pid
  103.                 ) {
  104.                 // got a pid we were waiting for
  105.                 if (lyxerr.debugging()) {
  106.                     printf("Caught child pid of recompute routine %d\n",
  107.                            pid);
  108.                 }
  109.                 if (prev) prev->next = p->next;
  110.                 else procMgr.pw = p->next;
  111.                 free(p);
  112.                 break;
  113.             }
  114.             prev = p;
  115.             p = p->next;
  116.         }
  117.     }
  118.     if (lyxerr.debugging()) {
  119.         if (pid) lyxerr.print(LString("Caught child pid: ")
  120.                       + int(pid));
  121.         if (pid <= 0)   /* jc: catching non expected SIGCHLD */
  122.             lyxerr.print(LString("Caught child pid: ")
  123.                      + int(wait(NULL)));
  124.     } else {
  125.         if (pid <= 0) {
  126.             wait(NULL);
  127.         }
  128.     }
  129. }
  130.