170 lines
3.5 KiB
C
170 lines
3.5 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <math.h>
|
|
|
|
static const char cvs_ident[] = "$Id$";
|
|
|
|
#ifdef _AIX
|
|
# include <termio.h>
|
|
#else
|
|
# include <termios.h>
|
|
#endif
|
|
|
|
#include "grxlib.h"
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
void Done (void) { putchar (':'); }
|
|
void StartLine (long id) { printf ("\033GL%ld", id); }
|
|
void StartPoint (long id) { printf ("\033GP%ld", id); }
|
|
void StartFill (long id) { printf ("\033GF%ld", id); }
|
|
void Extend (int x, int y) { printf (";%d;%d", x, y); }
|
|
void FillArea (int x1, int y1, int x2, int y2)
|
|
{
|
|
printf (";%d;%d;%d;%d", x1, y1, x2, y2);
|
|
}
|
|
|
|
void PlaceText (long id, int x, int y, int mode, char *text)
|
|
{
|
|
printf ("\033GT%ld;%d;%d;%d;%d:%s", id, x, y, mode, strlen(text), text);
|
|
fflush (stdout);
|
|
}
|
|
|
|
void ClearWindow (long id) { printf ("\033GC%ld:", id); }
|
|
void ForeColor (int col) { printf ("\033[3%dm", (col<0||col>7)?0:col); }
|
|
void DefaultRendition (void) { printf ("\033[m"); }
|
|
|
|
#define LINESZ 100
|
|
static char line [LINESZ];
|
|
static FILE *infd = NULL;
|
|
|
|
long
|
|
CreateWin (int x, int y, int w, int h)
|
|
{
|
|
long id = 0;
|
|
|
|
fflush (stdout);
|
|
printf ("\033GW%d;%d;%d;%d:", x, y, w, h);
|
|
fflush (stdout);
|
|
while (1)
|
|
{
|
|
if ((fgets (line, LINESZ, infd) != NULL) &&
|
|
(sscanf (line,"\033W%ld", &id) == 1))
|
|
break;
|
|
}
|
|
return id;
|
|
}
|
|
|
|
void
|
|
QueryWin (long id, int *nfwidth, int *nfheight)
|
|
{
|
|
int id1, x, y, width, height, fwidth, fheight;
|
|
printf ("\033GG%ld:",id);
|
|
fflush (stdout);
|
|
while (1)
|
|
{
|
|
if ((fgets (line, sizeof(line), infd) != NULL) &&
|
|
(sscanf (line,"\033G%ld %ld %ld %ld %ld %ld %ld %ld %ld",
|
|
&id1, &x, &y, &width, &height,
|
|
&fwidth, &fheight, nfwidth, nfheight) != 0))
|
|
break;
|
|
}
|
|
}
|
|
|
|
int
|
|
WaitForCarriageReturn (long *win, int *x, int *y)
|
|
{
|
|
int i, len;
|
|
|
|
fgets (line, LINESZ, infd);
|
|
line [LINESZ-1] = 0;
|
|
len = strlen (line);
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
if (line [i] == '\033')
|
|
{
|
|
int ret = 1;
|
|
i++;
|
|
switch (line[i]) {
|
|
case 'R': ret++;
|
|
/* drop */
|
|
case 'P':
|
|
sscanf (&line[i+1],"%ld;%d;%d", win, x, y);
|
|
return ret;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int fno2;
|
|
static struct termios ttmode;
|
|
|
|
int
|
|
InitializeGraphics (int scroll_text_up)
|
|
{
|
|
int fno, i;
|
|
char *screen_tty;
|
|
struct winsize winsize;
|
|
|
|
fno = fileno (stdout);
|
|
if (!isatty (fno))
|
|
{
|
|
fprintf (stderr, "stdout must be a tty\n");
|
|
return 0;
|
|
}
|
|
screen_tty = ttyname (fno);
|
|
ioctl (fno, TCGETS, (char *)&ttmode);
|
|
ttmode.c_lflag &= ~ECHO;
|
|
ioctl (fno, TCSETS, (char *)&ttmode);
|
|
|
|
infd = fopen (screen_tty, "rw");
|
|
|
|
fno2 = fileno (infd);
|
|
ioctl (fno2, TCGETS, (char *)&ttmode);
|
|
ttmode.c_lflag &= ~ECHO;
|
|
ioctl (fno2, TCSETS, (char *)&ttmode);
|
|
|
|
/* query rxvt to find if graphics are available */
|
|
fflush (stdout);
|
|
printf ("\033GQ");
|
|
fflush (stdout);
|
|
while (1)
|
|
{
|
|
if ((fgets (line, LINESZ, infd) != NULL) &&
|
|
(sscanf (line,"\033G%d", &i) == 1))
|
|
{
|
|
if (!i)
|
|
{
|
|
fprintf (stderr, "rxvt graphics not available\n");
|
|
CloseGraphics ();
|
|
return 0;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (scroll_text_up)
|
|
{
|
|
ioctl (fno, TIOCGWINSZ, &winsize);
|
|
fflush (stdout);
|
|
for (i = 0; i < winsize.ws_row; i++)
|
|
putchar ('\n');
|
|
fflush (stdout);
|
|
}
|
|
return i;
|
|
}
|
|
|
|
void
|
|
CloseGraphics (void)
|
|
{
|
|
DefaultRendition ();
|
|
fflush (stdout);
|
|
ttmode.c_lflag |= ECHO;
|
|
ioctl (fno2, TCSETS, (char *)&ttmode);
|
|
fclose (infd);
|
|
}
|
|
/*----------------------- end-of-file (C source) -----------------------*/
|