root/lib/tty/win.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. rxvt_getc
  2. anything_ready
  3. show_rxvt_contents
  4. look_for_rxvt_extensions

   1 /*
   2    Terminal management xterm and rxvt support
   3 
   4    Copyright (C) 1995-2019
   5    Free Software Foundation, Inc.
   6 
   7    Written by:
   8    Andrew Borodin <aborodin@vmail.ru>, 2009.
   9 
  10    This file is part of the Midnight Commander.
  11 
  12    The Midnight Commander is free software: you can redistribute it
  13    and/or modify it under the terms of the GNU General Public License as
  14    published by the Free Software Foundation, either version 3 of the License,
  15    or (at your option) any later version.
  16 
  17    The Midnight Commander is distributed in the hope that it will be useful,
  18    but WITHOUT ANY WARRANTY; without even the implied warranty of
  19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20    GNU General Public License for more details.
  21 
  22    You should have received a copy of the GNU General Public License
  23    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  24  */
  25 
  26 /** \file win.c
  27  *  \brief Source: Terminal management xterm and rxvt support
  28  */
  29 
  30 #include <config.h>
  31 
  32 #include <stdio.h>
  33 #include <stdlib.h>
  34 #include <string.h>
  35 #ifdef HAVE_SYS_SELECT_H
  36 #include <sys/select.h>
  37 #else
  38 #include <sys/time.h>
  39 #include <sys/types.h>
  40 #include <unistd.h>
  41 #endif
  42 
  43 #include "lib/global.h"
  44 #include "lib/util.h"           /* is_printable() */
  45 #include "tty-internal.h"
  46 #include "tty.h"                /* tty_gotoyx, tty_print_char */
  47 #include "win.h"
  48 
  49 /*** global variables ****************************************************************************/
  50 
  51 char *smcup = NULL;
  52 char *rmcup = NULL;
  53 
  54 /*** file scope macro definitions ****************************************************************/
  55 
  56 /*** file scope type declarations ****************************************************************/
  57 
  58 /*** file scope variables ************************************************************************/
  59 
  60 static gboolean rxvt_extensions = FALSE;
  61 
  62 /*** file scope functions ************************************************************************/
  63 /* --------------------------------------------------------------------------------------------- */
  64 
  65 /* my own weird protocol base 16 - paul */
  66 static int
  67 rxvt_getc (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
  68 {
  69     int r;
  70     unsigned char c;
  71 
  72     while (read (0, &c, 1) != 1);
  73     if (c == '\n')
  74         return -1;
  75     r = (c - 'A') * 16;
  76     while (read (0, &c, 1) != 1);
  77     r += (c - 'A');
  78     return r;
  79 }
  80 
  81 /* --------------------------------------------------------------------------------------------- */
  82 
  83 static int
  84 anything_ready (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
  85 {
  86     fd_set fds;
  87     struct timeval tv;
  88 
  89     FD_ZERO (&fds);
  90     FD_SET (0, &fds);
  91     tv.tv_sec = 0;
  92     tv.tv_usec = 0;
  93     return select (1, &fds, 0, 0, &tv);
  94 }
  95 
  96 /* --------------------------------------------------------------------------------------------- */
  97 /*** public functions ****************************************************************************/
  98 /* --------------------------------------------------------------------------------------------- */
  99 
 100 void
 101 show_rxvt_contents (int starty, unsigned char y1, unsigned char y2)
     /* [previous][next][first][last][top][bottom][index][help]  */
 102 {
 103     unsigned char *k;
 104     int bytes, i, j, cols = 0;
 105 
 106     y1 += (mc_global.keybar_visible != 0);      /* i don't knwo why we need this - paul */
 107     y2 += (mc_global.keybar_visible != 0);
 108     while (anything_ready ())
 109         tty_lowlevel_getch ();
 110 
 111     /* my own weird protocol base 26 - paul */
 112     printf (ESC_STR "CL%c%c%c%c\n", (y1 / 26) + 'A', (y1 % 26) + 'A', (y2 / 26) + 'A',
 113             (y2 % 26) + 'A');
 114 
 115     bytes = (y2 - y1) * (COLS + 1) + 1; /* *should* be the number of bytes read */
 116     j = 0;
 117     k = g_malloc (bytes);
 118     while (TRUE)
 119     {
 120         int c;
 121 
 122         c = rxvt_getc ();
 123         if (c < 0)
 124             break;
 125         if (j < bytes)
 126             k[j++] = c;
 127         for (cols = 1;; cols++)
 128         {
 129             c = rxvt_getc ();
 130             if (c < 0)
 131                 break;
 132             if (j < bytes)
 133                 k[j++] = c;
 134         }
 135     }
 136     for (i = 0; i < j; i++)
 137     {
 138         if ((i % cols) == 0)
 139             tty_gotoyx (starty + (i / cols), 0);
 140         tty_print_char (is_printable (k[i]) ? k[i] : ' ');
 141     }
 142     g_free (k);
 143 }
 144 
 145 /* --------------------------------------------------------------------------------------------- */
 146 
 147 gboolean
 148 look_for_rxvt_extensions (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 149 {
 150     static gboolean been_called = FALSE;
 151 
 152     if (!been_called)
 153     {
 154         const char *e = getenv ("RXVT_EXT");
 155         rxvt_extensions = ((e != NULL) && (strcmp (e, "1.0") == 0));
 156         been_called = TRUE;
 157     }
 158 
 159     if (rxvt_extensions)
 160         mc_global.tty.console_flag = '\004';
 161 
 162     return rxvt_extensions;
 163 }
 164 
 165 /* --------------------------------------------------------------------------------------------- */

/* [previous][next][first][last][top][bottom][index][help]  */