home *** CD-ROM | disk | FTP | other *** search
/ Serving the Web / ServingTheWeb1995.disc1of1.iso / linux / slacksrce / d / libc / libc-4.6 / libc-4 / libc-linux / curses-bsd4.4 / tstp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-29  |  3.6 KB  |  125 lines

  1. /*
  2.  * Copyright (c) 1981, 1993, 1994
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. static char sccsid[] = "@(#)tstp.c    8.3 (Berkeley) 5/4/94";
  36. #endif /* not lint */
  37.  
  38. #include <errno.h>
  39. #include <signal.h>
  40. #include <termios.h>
  41. #include <unistd.h>
  42.  
  43. #include "curses.h"
  44.  
  45. /*
  46.  * stop_signal_handler --
  47.  *    Handle stop signals.
  48.  */
  49. void
  50. __stop_signal_handler(signo)
  51.     int signo;
  52. {
  53.     struct termios save;
  54.     sigset_t oset, set;
  55.  
  56.     /* Get the current terminal state (which the user may have changed). */
  57.     if (tcgetattr(STDIN_FILENO, &save))
  58.         return;
  59.  
  60.     /*
  61.      * Block window change and timer signals.  The latter is because
  62.      * applications use timers to decide when to repaint the screen.
  63.      */
  64.     (void)sigemptyset(&set);
  65.     (void)sigaddset(&set, SIGALRM);
  66.     (void)sigaddset(&set, SIGWINCH);
  67.     (void)sigprocmask(SIG_BLOCK, &set, &oset);
  68.     
  69.     /*
  70.      * End the window, which also resets the terminal state to the
  71.      * original modes.
  72.      */
  73.     endwin();
  74.  
  75.     /* Unblock SIGTSTP. */
  76.     (void)sigemptyset(&set);
  77.     (void)sigaddset(&set, SIGTSTP);
  78.     (void)sigprocmask(SIG_UNBLOCK, &set, NULL);
  79.  
  80.     /* Stop ourselves. */
  81.     __restore_stophandler();
  82.     (void)kill(0, SIGTSTP);
  83.  
  84.     /* Time passes ... */
  85.  
  86.     /* Reset the curses SIGTSTP signal handler. */
  87.     __set_stophandler();
  88.  
  89.     /* save the new "default" terminal state */
  90.     (void)tcgetattr(STDIN_FILENO, &__orig_termios);
  91.  
  92.     /* Reset the terminal state to the mode just before we stopped. */
  93.     (void)tcsetattr(STDIN_FILENO, __tcaction ?
  94.         TCSASOFT | TCSADRAIN : TCSADRAIN, &save);
  95.  
  96.     /* Restart the screen. */
  97.     __startwin();
  98.  
  99.     /* Repaint the screen. */
  100.     wrefresh(curscr);
  101.  
  102.     /* Reset the signals. */
  103.     (void)sigprocmask(SIG_SETMASK, &oset, NULL);
  104. }
  105.  
  106. static void (*otstpfn)() = SIG_DFL;
  107.  
  108. /*
  109.  * Set the TSTP handler.
  110.  */
  111. void
  112. __set_stophandler()
  113. {
  114.     otstpfn = signal(SIGTSTP, __stop_signal_handler);
  115. }
  116.  
  117. /*
  118.  * Restore the TSTP handler.
  119.  */
  120. void
  121. __restore_stophandler()
  122. {
  123.     (void)signal(SIGTSTP, otstpfn);
  124. }
  125.