@ -1,5 +1,5 @@
/* See LICENSE for licence details. */
/* See LICENSE for licence details. */
# define _XOPEN_SOURCE
# define _XOPEN_SOURCE 600
# include <ctype.h>
# include <ctype.h>
# include <errno.h>
# include <errno.h>
# include <fcntl.h>
# include <fcntl.h>
@ -107,61 +107,68 @@ typedef struct {
GC gc ;
GC gc ;
} DC ;
} DC ;
void die ( const char * errstr , . . . ) ;
void draw ( int ) ;
void execsh ( void ) ;
void sigchld ( int ) ;
char * kmap ( KeySym ) ;
void kpress ( XKeyEvent * ) ;
void resize ( XEvent * ) ;
void run ( void ) ;
int escaddc ( char ) ;
int escfinal ( char ) ;
void escdump ( void ) ;
void eschandle ( void ) ;
void escparse ( void ) ;
void escreset ( void ) ;
void tclearregion ( int , int , int , int ) ;
void tcpos ( int ) ;
void tcursor ( int ) ;
void tdeletechar ( int ) ;
void tdeleteline ( int ) ;
void tdump ( void ) ;
void tinsertblank ( int ) ;
void tinsertblankline ( int ) ;
void tmoveto ( int , int ) ;
void tnew ( int , int ) ;
void tnewline ( void ) ;
void tputc ( char ) ;
void tputs ( char * , int ) ;
void tresize ( int , int ) ;
void tscroll ( void ) ;
void tsetattr ( int * , int ) ;
void tsetchar ( char ) ;
void tsetscroll ( int , int ) ;
void ttynew ( void ) ;
void ttyread ( void ) ;
void ttyresize ( int , int ) ;
void ttywrite ( char * , size_t ) ;
unsigned long xgetcol ( const char * ) ;
void xclear ( int , int , int , int ) ;
void xcursor ( int ) ;
void xdrawc ( int , int , Glyph ) ;
void xinit ( void ) ;
void xscroll ( void ) ;
static void die ( const char * errstr , . . . ) ;
static void draw ( int ) ;
static void execsh ( void ) ;
static void sigchld ( int ) ;
static void run ( void ) ;
static int escaddc ( char ) ;
static int escfinal ( char ) ;
static void escdump ( void ) ;
static void eschandle ( void ) ;
static void escparse ( void ) ;
static void escreset ( void ) ;
static void tclearregion ( int , int , int , int ) ;
static void tcpos ( int ) ;
static void tcursor ( int ) ;
static void tdeletechar ( int ) ;
static void tdeleteline ( int ) ;
static void tdump ( void ) ;
static void tinsertblank ( int ) ;
static void tinsertblankline ( int ) ;
static void tmoveto ( int , int ) ;
static void tnew ( int , int ) ;
static void tnewline ( void ) ;
static void tputc ( char ) ;
static void tputs ( char * , int ) ;
static void tresize ( int , int ) ;
static void tscroll ( void ) ;
static void tsetattr ( int * , int ) ;
static void tsetchar ( char ) ;
static void tsetscroll ( int , int ) ;
static void ttynew ( void ) ;
static void ttyread ( void ) ;
static void ttyresize ( int , int ) ;
static void ttywrite ( const char * , size_t ) ;
static unsigned long xgetcol ( const char * ) ;
static void xclear ( int , int , int , int ) ;
static void xcursor ( int ) ;
static void xdrawc ( int , int , Glyph ) ;
static void xinit ( void ) ;
static void xscroll ( void ) ;
static void expose ( XEvent * ) ;
static void kpress ( XEvent * ) ;
static void resize ( XEvent * ) ;
static void ( * handler [ LASTEvent ] ) ( XEvent * ) = {
[ KeyPress ] = kpress ,
[ Expose ] = expose ,
[ ConfigureNotify ] = resize
} ;
/* Globals */
/* Globals */
DC dc ;
XWindow xw ;
Term term ;
Escseq escseq ;
int cmdfd ;
pid_t pid ;
int running ;
static DC dc ;
static XWindow xw ;
static Term term ;
static Escseq escseq ;
static int cmdfd ;
static pid_t pid ;
static int running ;
void
void
die ( const char * errstr , . . . ) {
die ( const char * errstr , . . . ) {
@ -259,7 +266,7 @@ ttyread(void) {
}
}
void
void
ttywrite ( char * s , size_t n ) {
ttywrite ( const char * s , size_t n ) {
if ( write ( cmdfd , s , n ) = = - 1 )
if ( write ( cmdfd , s , n ) = = - 1 )
die ( " write error on tty: %s \n " , SERRNO ) ;
die ( " write error on tty: %s \n " , SERRNO ) ;
}
}
@ -997,29 +1004,25 @@ draw(int redraw_all) {
xcursor ( CSdraw ) ;
xcursor ( CSdraw ) ;
}
}
char *
kmap ( KeySym k ) {
int i ;
for ( i = 0 ; i < LEN ( key ) ; i + + )
if ( key [ i ] . k = = k )
return ( char * ) key [ i ] . s ;
return NULL ;
void
expose ( XEvent * ev ) {
draw ( SCredraw ) ;
}
}
void
void
kpress ( XKeyEvent * e ) {
kpress ( XEvent * ev ) {
XKeyEvent * e = & ev - > xkey ;
KeySym ksym ;
KeySym ksym ;
char buf [ 32 ] ;
char buf [ 32 ] ;
int len ;
int len ;
int meta ;
int meta ;
int shift ;
int shift ;
char * skmap ;
meta = e - > state & Mod1Mask ;
meta = e - > state & Mod1Mask ;
shift = e - > state & ShiftMask ;
shift = e - > state & ShiftMask ;
len = XLookupString ( e , buf , sizeof ( buf ) , & ksym , NULL ) ;
len = XLookupString ( e , buf , sizeof ( buf ) , & ksym , NULL ) ;
if ( skmap = kmap ( ksym ) )
ttywrite ( skmap , strlen ( skmap ) ) ;
if ( key [ ksym ] )
ttywrite ( key [ ksy mn>pan class="p">] , strlen ( key [ ksy mn>pan class="p">] ) ) ;
else if ( len > 0 ) {
else if ( len > 0 ) {
buf [ sizeof ( buf ) - 1 ] = ' \0 ' ;
buf [ sizeof ( buf ) - 1 ] = ' \0 ' ;
if ( meta & & len = = 1 )
if ( meta & & len = = 1 )
@ -1054,7 +1057,6 @@ resize(XEvent *e) {
void
void
run ( void ) {
run ( void ) {
int ret ;
XEvent ev ;
XEvent ev ;
fd_set rfd ;
fd_set rfd ;
int xfd = XConnectionNumber ( xw . dis ) ;
int xfd = XConnectionNumber ( xw . dis ) ;
@ -1062,39 +1064,25 @@ run(void) {
running = 1 ;
running = 1 ;
XSelectInput ( xw . dis , xw . win , ExposureMask | KeyPressMask | StructureNotifyMask ) ;
XSelectInput ( xw . dis , xw . win , ExposureMask | KeyPressMask | StructureNotifyMask ) ;
XResizeWindow ( xw . dis , xw . win , xw . w , xw . h ) ; /* fix resize bug in wmii (?) */
XResizeWindow ( xw . dis , xw . win , xw . w , xw . h ) ; /* fix resize bug in wmii (?) */
while ( running ) {
while ( running ) {
FD_ZERO ( & rfd ) ;
FD_ZERO ( & rfd ) ;
FD_SET ( cmdfd , & rfd ) ;
FD_SET ( cmdfd , & rfd ) ;
FD_SET ( xfd , & rfd ) ;
FD_SET ( xfd , & rfd ) ;
XFlush ( xw . dis ) ;
ret = select ( MAX ( xfd , cmdfd ) + 1 , & rfd , NULL , NULL , NULL ) ;
if ( ret < 0 )
if ( select ( MAX ( xfd , cmdfd ) + 1 , & rfd , NULL , NULL , NULL ) = = - 1 ) {
if ( errno = = EINTR )
continue ;
die ( " select failed: %s \n " , SERRNO ) ;
die ( " select failed: %s \n " , SERRNO ) ;
if ( FD_ISSET ( xfd , & rfd ) ) {
while ( XPending ( xw . dis ) ) {
XNextEvent ( xw . dis , & ev ) ;
switch ( ev . type ) {
default :
break ;
case KeyPress :
kpress ( & ev . xkey ) ;
break ;
case Expose :
draw ( SCredraw ) ;
break ;
case ConfigureNotify :
resize ( & ev ) ;
break ;
}
}
}
}
if ( FD_ISSET ( cmdfd , & rfd ) ) {
if ( FD_ISSET ( cmdfd , & rfd ) ) {
ttyread ( ) ;
ttyread ( ) ;
draw ( SCupdate ) ;
draw ( SCupdate ) ;
}
}
while ( XPending ( xw . dis ) ) {
XNextEvent ( xw . dis , & ev ) ;
if ( handler [ ev . type ] )
( handler [ ev . type ] ) ( & ev ) ;
}
}
}
}
}