home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / AP / JED / JED097-1.TAR / jed / src / sig.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-12  |  2.1 KB  |  106 lines

  1. /*
  2.  *  Copyright (c) 1992, 1994 John E. Davis  (davis@amy.tch.harvard.edu)
  3.  *  All Rights Reserved.
  4.  */
  5. #if !defined (msdos) && !defined (__os2__)
  6. #include <signal.h>
  7. #ifndef VMS
  8. #include <sys/types.h>
  9. #endif
  10.  
  11. #include "config.h"
  12. #include "sig.h"
  13. #include "file.h"
  14. #include "sysdep.h"
  15. #include "slang.h"
  16. #include "misc.h"
  17. #include "screen.h"
  18. #include "cmds.h"
  19. #include "hooks.h"
  20.  
  21. int last_signal_code;
  22. int signal_in_progress = 0;
  23.  
  24. #ifndef VMS
  25. #ifdef SIGWINCH
  26. void resize_display(int sig)
  27. {
  28.    int r, c;
  29.    (void) sig;
  30.    get_term_dimensions(&c, &r);
  31.    if (r > MAX_SCREEN_SIZE) r = MAX_SCREEN_SIZE;
  32.    change_screen_size(c, r);
  33.    signal (SIGWINCH, resize_display);
  34. }
  35. #endif
  36. #endif
  37.  
  38. void my_signal(int sig)
  39. {
  40.     last_signal_code = sig;
  41.     /* set signal to point to default */
  42.     signal(sig, SIG_DFL);
  43.  
  44.     if (signal_in_progress)
  45.       kill(getpid(), last_signal_code);
  46.    
  47.    if (signal_in_progress) abort();
  48.  
  49.     signal_in_progress = 1;
  50.  
  51.     auto_save_all();
  52.     reset_display();
  53.     reset_tty();
  54.     kill (getpid (), last_signal_code);
  55. }
  56.  
  57. /* a control-G puts us here */
  58. void my_interrupt(int sig)
  59. {
  60.    SLKeyBoard_Quit = 1;
  61.    if (Ignore_User_Abort == 0) SLang_Error = 2;
  62.    signal (SIGINT, my_interrupt);
  63. }
  64.  
  65. #ifdef SIGTSTP
  66. int Signal_Sys_Spawn_Flag = 0;
  67. /* This should only be called from outside disturbance */
  68. void sig_sys_spawn_cmd(int sig)
  69. {
  70.    Signal_Sys_Spawn_Flag = 1;
  71.    sys_spawn_cmd();
  72.    update(NULL, 1, 0);               /* force update */
  73.    Signal_Sys_Spawn_Flag = 0;
  74. }
  75. #endif
  76.  
  77. void init_signals (void)
  78. {
  79. #ifndef VMS
  80. #ifdef SIGWINCH
  81.    if (X_Get_Term_Size_Hook == NULL) (void) signal(SIGWINCH,resize_display);
  82. #endif
  83. #endif
  84.    signal (SIGINT, my_interrupt);
  85.    signal (SIGHUP, my_signal);
  86.    signal (SIGQUIT, my_signal);
  87.    signal (SIGILL, my_signal);
  88.    signal (SIGTRAP, my_signal);
  89. #if 0
  90.    signal (SIGIOT, my_signal);  /* used by abort */
  91. #endif
  92.    signal (SIGFPE, my_signal);
  93. #ifdef SIGBUS
  94.    signal (SIGBUS, my_signal);
  95. #endif
  96.    signal (SIGSEGV, my_signal);
  97. #ifdef SIGSYS
  98.     signal (SIGSYS, my_signal);
  99. #endif
  100.     signal (SIGTERM, my_signal);
  101. #ifdef SIGTSTP
  102.    signal (SIGTSTP, sig_sys_spawn_cmd);
  103. #endif
  104. }
  105. #endif
  106.