484 lines
10 KiB
Plaintext
484 lines
10 KiB
Plaintext
/*
|
|
* $Id: dumb.trm,v 1.16 2004/04/13 17:24:16 broeker Exp $
|
|
*
|
|
*/
|
|
|
|
/* GNUPLOT - qtopia.trm */
|
|
|
|
/*[
|
|
* Copyright 1991 - 1993, 1998, 2004 Thomas Williams, Colin Kelley
|
|
*
|
|
* Permission to use, copy, and distribute this software and its
|
|
* documentation for any purpose with or without fee is hereby granted,
|
|
* provided that the above copyright notice appear in all copies and
|
|
* that both that copyright notice and this permission notice appear
|
|
* in supporting documentation.
|
|
*
|
|
* Permission to modify the software is granted, but not the right to
|
|
* distribute the complete modified source code. Modifications are to
|
|
* be distributed as patches to the released version. Permission to
|
|
* distribute binaries produced by compiling modified sources is granted,
|
|
* provided you
|
|
* 1. distribute the corresponding source modifications from the
|
|
* released version in the form of a patch file along with the binaries,
|
|
* 2. add special version identification to distinguish your version
|
|
* in addition to the base release version number,
|
|
* 3. provide your name and address as the primary contact for the
|
|
* support of your modified version, and
|
|
* 4. retain our contact information in regard to use of the base
|
|
* software.
|
|
* Permission to distribute the released version of the source code along
|
|
* with corresponding source modifications in the form of a patch file is
|
|
* granted with same provisions 2 through 4 for binary distributions.
|
|
*
|
|
* This software is provided "as is" without express or implied warranty
|
|
* to the extent permitted by applicable law.
|
|
]*/
|
|
|
|
/*
|
|
* This file is included by ../term.c.
|
|
*
|
|
* This terminal driver supports:
|
|
* qtopia terminals
|
|
*
|
|
* AUTHORS
|
|
* Michael Neuroth, 2004-05-16
|
|
* INTERNET: michael.neuroth@freenet.de
|
|
*
|
|
* send your comments or suggestions to (gnuplot-info@lists.sourceforge.net).
|
|
*
|
|
*/
|
|
#include "driver.h"
|
|
|
|
#define NO_QTOPIA_ENHANCED_SUPPORT
|
|
|
|
#ifdef TERM_REGISTER
|
|
register_term(qtopia_driver)
|
|
#endif
|
|
|
|
#ifdef TERM_PROTO
|
|
TERM_PUBLIC void QTOPIA_options __PROTO((void));
|
|
TERM_PUBLIC void QTOPIA_init __PROTO((void));
|
|
TERM_PUBLIC void QTOPIA_graphics __PROTO((void));
|
|
TERM_PUBLIC void QTOPIA_text __PROTO((void));
|
|
TERM_PUBLIC void QTOPIA_reset __PROTO((void));
|
|
TERM_PUBLIC void QTOPIA_linetype __PROTO((int linetype));
|
|
TERM_PUBLIC void QTOPIA_move __PROTO((unsigned int x, unsigned int y));
|
|
TERM_PUBLIC void QTOPIA_point __PROTO((unsigned int x, unsigned int y,
|
|
int point));
|
|
TERM_PUBLIC void QTOPIA_vector __PROTO((unsigned int x, unsigned int y));
|
|
TERM_PUBLIC void QTOPIA_put_text __PROTO((unsigned int x, unsigned int y,
|
|
const char *str));
|
|
TERM_PUBLIC void QTOPIA_arrow __PROTO((unsigned int sx, unsigned int sy,
|
|
unsigned int ex, unsigned int ey,
|
|
int head));
|
|
|
|
#define ENHqtopia_put_text NULL
|
|
|
|
|
|
#define QTOPIA_XMAX 4096
|
|
#define QTOPIA_YMAX 4096
|
|
|
|
#ifdef ZAURUS
|
|
#define QTOPIA_VCHAR (QTOPIA_YMAX/25)
|
|
#define QTOPIA_HCHAR (QTOPIA_XMAX/40)
|
|
#define QTOPIA_VTIC (QTOPIA_YMAX/50)
|
|
#define QTOPIA_HTIC (QTOPIA_XMAX/40)
|
|
#else
|
|
#define QTOPIA_VCHAR (QTOPIA_YMAX/25)
|
|
#define QTOPIA_HCHAR (QTOPIA_XMAX/50)
|
|
#define QTOPIA_VTIC (QTOPIA_YMAX/100)
|
|
#define QTOPIA_HTIC (QTOPIA_XMAX/150)
|
|
#endif
|
|
|
|
#endif /* TERM_PROTO */
|
|
|
|
#ifdef TERM_BODY
|
|
|
|
/*#include <winsock2.h>*/
|
|
/* needs: ws2_32.lib */
|
|
#ifndef _MSC_VER
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#endif
|
|
|
|
#define QTOPIA_MAX_BUFFER 512
|
|
#define QTOPIA_MAX_DELAY_COUNT 20 /* * 100 ms = 2 s */
|
|
|
|
#ifdef _MSC_VER
|
|
#define QTOPIA_BAD_SOCKET INVALID_SOCKET /* -1 */
|
|
#define QTOPIA_BAD_CONNECT SOCKET_ERROR
|
|
#else
|
|
#define QTOPIA_BAD_SOCKET -1
|
|
#define QTOPIA_BAD_CONNECT -1
|
|
#endif
|
|
#define QTOPIA_PORT_NO 5050
|
|
|
|
static int qtopia_client_socket = QTOPIA_BAD_SOCKET;
|
|
static unsigned short qtopia_port_no = QTOPIA_PORT_NO;
|
|
static char qtopia_host_name[QTOPIA_MAX_BUFFER+1] = { "localhost" };
|
|
|
|
static int OpenClient __PROTO(( int test));
|
|
static void CloseClient();
|
|
|
|
static void MySleep( delay )
|
|
int delay;
|
|
{
|
|
#ifdef _MSC_VER
|
|
Sleep( delay );
|
|
#else
|
|
usleep( delay );
|
|
#endif
|
|
}
|
|
|
|
static void InitSockets()
|
|
{
|
|
#ifdef _MSC_VER
|
|
WORD wVersionRequested;
|
|
WSADATA wsaData;
|
|
int err;
|
|
|
|
wVersionRequested = MAKEWORD( 2, 2 );
|
|
|
|
err = WSAStartup( wVersionRequested, &wsaData );
|
|
#endif
|
|
}
|
|
|
|
static void ExitSockets()
|
|
{
|
|
#ifdef _MSC_VER
|
|
WSACleanup();
|
|
#endif
|
|
}
|
|
|
|
static int CheckForQtplot( count )
|
|
int count;
|
|
{
|
|
/* test (via sockets) if qtplot is allready running */
|
|
if( !OpenClient( 1 ) )
|
|
{
|
|
/* give qtplot a litle bit time to start... */
|
|
if( count < QTOPIA_MAX_DELAY_COUNT )
|
|
{
|
|
if( count == 0 )
|
|
{
|
|
#ifdef _MSC_VER
|
|
system( "start qtplot" );
|
|
#else
|
|
system( "qtplot&" );
|
|
#endif
|
|
}
|
|
|
|
MySleep(100);
|
|
|
|
return CheckForQtplot( count+1 );
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CloseClient();
|
|
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
static int OpenClient( test )
|
|
int test;
|
|
{
|
|
int len;
|
|
struct sockaddr_in address;
|
|
int result;
|
|
|
|
/* Create a socket for the client. */
|
|
|
|
qtopia_client_socket = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
if( qtopia_client_socket != QTOPIA_BAD_SOCKET )
|
|
{
|
|
/* Name the socket, as agreed with the server. */
|
|
|
|
address.sin_family = AF_INET;
|
|
address.sin_addr.s_addr = inet_addr(/*qtopia_host_name*/"127.0.0.1"); /* localhost */
|
|
address.sin_port = htons(qtopia_port_no);
|
|
len = sizeof(address);
|
|
|
|
/* Now connect our socket to the server's socket. */
|
|
|
|
result = connect(qtopia_client_socket, (struct sockaddr *)&address, len);
|
|
|
|
if( result == QTOPIA_BAD_SOCKET )
|
|
{
|
|
/* mark this socket as bad */
|
|
|
|
close( qtopia_client_socket );
|
|
|
|
qtopia_client_socket = QTOPIA_BAD_SOCKET;
|
|
|
|
if( !test )
|
|
{
|
|
fprintf( gpoutfile, "error connecting to server !\n" );
|
|
}
|
|
return 0; /* something went wrong */
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( !test )
|
|
{
|
|
fprintf( gpoutfile, "error creating socket !\n" );
|
|
}
|
|
return 0; /* something went wrong */
|
|
}
|
|
|
|
return 1; /* everything ist ok ! */
|
|
}
|
|
|
|
static void CloseClient()
|
|
{
|
|
close( qtopia_client_socket );
|
|
}
|
|
|
|
static int IsClientOk()
|
|
{
|
|
return qtopia_client_socket != QTOPIA_BAD_SOCKET;
|
|
}
|
|
|
|
static void SendDataToSocket( sLine )
|
|
const char * sLine;
|
|
{
|
|
if( IsClientOk() )
|
|
{
|
|
int send_count;
|
|
|
|
send_count = send( qtopia_client_socket, sLine, strlen( sLine ), 0 );
|
|
|
|
if( send_count <= 0 )
|
|
{
|
|
fprintf( gpoutfile, "error writing to socket str=%s!\n", sLine );
|
|
}
|
|
/*
|
|
else
|
|
{
|
|
fprintf( gpoutfile, "wrote %d bytes\n", send_count );
|
|
}
|
|
*/
|
|
}
|
|
else
|
|
{
|
|
/* for testing... */
|
|
/*fprintf( gpoutfile, sLine );*/
|
|
}
|
|
}
|
|
|
|
/* ************************************************** */
|
|
|
|
enum QTOPIA_id { QTOPIA_PORT, QTOPIA_HOST, QTOPIA_OTHER };
|
|
|
|
static struct gen_table QTOPIA_opts[] =
|
|
{
|
|
{ "po$rt", QTOPIA_PORT },
|
|
{ "ho$st", QTOPIA_HOST },
|
|
{ NULL, QTOPIA_OTHER }
|
|
};
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_options()
|
|
{
|
|
/* this is not for the qtopia terminal ! */
|
|
/*SendDataToSocket( "qtd options\n" );*/
|
|
|
|
int x, y;
|
|
struct value a;
|
|
|
|
while (!END_OF_COMMAND)
|
|
{
|
|
switch(lookup_table(&QTOPIA_opts[0],c_token))
|
|
{
|
|
case QTOPIA_PORT:
|
|
c_token++;
|
|
if (END_OF_COMMAND)
|
|
int_error(c_token, "expecting port number");
|
|
qtopia_port_no = (int) real(const_express(&a));
|
|
break;
|
|
case QTOPIA_HOST:
|
|
c_token++;
|
|
if (END_OF_COMMAND)
|
|
int_error(c_token, "expecting host name");
|
|
if (isstring(c_token))
|
|
quote_str( qtopia_host_name, c_token, sizeof(qtopia_host_name) );
|
|
else
|
|
copy_str( qtopia_host_name, c_token, sizeof(qtopia_host_name) );
|
|
c_token++;
|
|
break;
|
|
case QTOPIA_OTHER:
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
sprintf(term_options, "host=%s port=%d",qtopia_host_name,qtopia_port_no);
|
|
}
|
|
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_init()
|
|
{
|
|
/* initialize lib (if necassary) */
|
|
InitSockets();
|
|
CheckForQtplot( 0 );
|
|
OpenClient( 0 );
|
|
|
|
SendDataToSocket( "qtd init\n" );
|
|
}
|
|
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_graphics()
|
|
{
|
|
SendDataToSocket( "qtd graphics\n" );
|
|
}
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_text()
|
|
{
|
|
SendDataToSocket( "qtd text\n" );
|
|
}
|
|
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_reset()
|
|
{
|
|
SendDataToSocket( "qtd reset\n" );
|
|
|
|
/* give the qtplot a litle bit time to shutdown */
|
|
MySleep(100);
|
|
|
|
CloseClient();
|
|
ExitSockets();
|
|
}
|
|
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_linetype(linetype)
|
|
int linetype;
|
|
{
|
|
char sBuffer[QTOPIA_MAX_BUFFER];
|
|
|
|
sprintf( sBuffer, "qtd linetype type=%d\n",linetype );
|
|
|
|
SendDataToSocket( sBuffer );
|
|
}
|
|
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_move(x, y)
|
|
unsigned int x, y;
|
|
{
|
|
char sBuffer[QTOPIA_MAX_BUFFER];
|
|
|
|
sprintf( sBuffer, "qtd move x=%d y=%d\n",x,y );
|
|
|
|
SendDataToSocket( sBuffer );
|
|
}
|
|
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_point(x, y, point)
|
|
unsigned int x, y;
|
|
int point;
|
|
{
|
|
char sBuffer[QTOPIA_MAX_BUFFER];
|
|
|
|
sprintf( sBuffer, "qtd point x=%d y=%d point=%d\n",x,y,point );
|
|
|
|
SendDataToSocket( sBuffer );
|
|
}
|
|
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_vector(_x, _y)
|
|
unsigned int _x, _y;
|
|
{
|
|
char sBuffer[QTOPIA_MAX_BUFFER];
|
|
|
|
sprintf( sBuffer, "qtd vector x=%d y=%d\n",_x,_y );
|
|
|
|
SendDataToSocket( sBuffer );
|
|
}
|
|
|
|
|
|
TERM_PUBLIC void
|
|
QTOPIA_put_text(x, y, str)
|
|
unsigned int x, y;
|
|
const char *str;
|
|
{
|
|
char sBuffer[QTOPIA_MAX_BUFFER];
|
|
|
|
sprintf( sBuffer, "qtd put_text x=%d y=%d str=%s\n",x,y,str );
|
|
|
|
SendDataToSocket( sBuffer );
|
|
}
|
|
|
|
/* not suported yet ! */
|
|
TERM_PUBLIC void
|
|
QTOPIA_arrow(sx, sy, ex, ey, head)
|
|
unsigned int sx, sy, ex, ey;
|
|
int head; /* ignored */
|
|
{
|
|
char sBuffer[QTOPIA_MAX_BUFFER];
|
|
|
|
sprintf( sBuffer, "qtd arrow sx=%d sy=%d ex=%d ey=%d head=%d\n",sx,sy,ex,ey,head );
|
|
|
|
SendDataToSocket( sBuffer );
|
|
}
|
|
|
|
|
|
#endif /* TERM_BODY */
|
|
|
|
#ifdef TERM_TABLE
|
|
TERM_TABLE_START(qtopia_driver)
|
|
"qtopia", "qtopia or Qt",
|
|
QTOPIA_XMAX, QTOPIA_YMAX, QTOPIA_VCHAR, QTOPIA_HCHAR,
|
|
QTOPIA_VTIC, QTOPIA_HTIC, QTOPIA_options, QTOPIA_init, QTOPIA_reset,
|
|
QTOPIA_text, null_scale, QTOPIA_graphics, QTOPIA_move, QTOPIA_vector,
|
|
QTOPIA_linetype, QTOPIA_put_text, null_text_angle,
|
|
null_justify_text, QTOPIA_point, /*QTOPIA_arrow*/0, set_font_null,
|
|
0, /* pointsize */
|
|
TERM_CAN_MULTIPLOT,
|
|
NULL, NULL, NULL, NULL
|
|
#ifdef USE_MOUSE
|
|
, NULL, NULL, NULL, NULL, NULL
|
|
#endif
|
|
#ifdef PM3D
|
|
, NULL, NULL, NULL, NULL
|
|
#endif
|
|
TERM_TABLE_END(qtopia_driver)
|
|
|
|
#undef LAST_TERM
|
|
#define LAST_TERM qtopia_driver
|
|
|
|
#endif /* TERM_TABLE */
|
|
|
|
#ifdef TERM_HELP
|
|
START_HELP(qtopia)
|
|
"1 qtopia",
|
|
"?commands set terminal qtopia",
|
|
"?set terminal qtopia",
|
|
"?set term qtopia",
|
|
"?terminal qtopia",
|
|
"?term qtopia",
|
|
"?qtopia",
|
|
" The `qtopia` terminal driver has no additional options.",
|
|
"",
|
|
" Syntax:",
|
|
" set terminal qtopia",
|
|
""
|
|
END_HELP(qtopia)
|
|
#endif /* TERM_HELP */
|