@ -1904,6 +1904,42 @@ csireset(void)
memset ( & csiescseq , 0 , sizeof ( csiescseq ) ) ;
}
void
osc4_color_response ( int num )
{
int n ;
char buf [ 32 ] ;
unsigned char r , g , b ;
if ( xgetcolor ( num , & r , & g , & b ) ) {
fprintf ( stderr , " erresc: failed to fetch osc4 color %d \n " , num ) ;
return ;
}
n = snprintf ( buf , sizeof buf , " \033 ]4;%d;rgb:%02x%02x/%02x%02x/%02x%02x \007 " ,
num , r , r , g , g , b , b ) ;
ttywrite ( buf , n , 1 ) ;
}
void
osc_color_response ( int index , int num )
{
int n ;
char buf [ 32 ] ;
unsigned char r , g , b ;
if ( xgetcolor ( index , & r , & g , & b ) ) {
fprintf ( stderr , " erresc: failed to fetch osc color %d \n " , index ) ;
return ;
}
n = snprintf ( buf , sizeof buf , " \033 ]%d;rgb:%02x%02x/%02x%02x/%02x%02x \007 " ,
num , r , r , g , g , b , b ) ;
ttywrite ( buf , n , 1 ) ;
}
void
strhandle ( void )
{
@ -1942,14 +1978,56 @@ strhandle(void)
}
}
return ;
case 10 :
if ( narg < 2 )
break ;
p = strescseq . args [ 1 ] ;
if ( ! strcmp ( p , " ? " ) )
osc_color_response ( defaultfg , 10 ) ;
else if ( xsetcolorname ( defaultfg , p ) )
fprintf ( stderr , " erresc: invalid foreground color: %s \n " , p ) ;
else
redraw ( ) ;
return ;
case 11 :
if ( narg < 2 )
break ;
p = strescseq . args [ 1 ] ;
if ( ! strcmp ( p , " ? " ) )
osc_color_response ( defaultbg , 11 ) ;
else if ( xsetcolorname ( defaultbg , p ) )
fprintf ( stderr , " erresc: invalid background color: %s \n " , p ) ;
else
redraw ( ) ;
return ;
case 12 :
if ( narg < 2 )
break ;
p = strescseq . args [ 1 ] ;
if ( ! strcmp ( p , " ? " ) )
osc_color_response ( defaultcs , 12 ) ;
else if ( xsetcolorname ( defaultcs , p ) )
fprintf ( stderr , " erresc: invalid cursor color: %s \n " , p ) ;
else
redraw ( ) ;
return ;
case 4 : /* color set */
if ( narg < 3 )
break ;
p = strescseq . args [ 2 ] ;
/* FALLTHROUGH */
case 104 : /* color reset, here p = NULL */
case 104 : /* color reset */
j = ( narg > 1 ) ? atoi ( strescseq . args [ 1 ] ) : - 1 ;
if ( xsetcolorname ( j , p ) ) {
if ( p & & ! strcmp ( p , " ? " ) )
osc4_color_response ( j ) ;
else if ( xsetcolorname ( j , p ) ) {
if ( par = = 104 & & narg < = 1 )
return ; /* color reset without parameter */
fprintf ( stderr , " erresc: invalid color j=%d, p=%s \n " ,