@@ -174,6 +174,8 @@ static void csidump(void);
174174static void csihandle (void );
175175static void csiparse (void );
176176static void csireset (void );
177+ static void osc4_color_response (int num );
178+ static void osc_color_response (int index , int num );
177179static int eschandle (uchar );
178180static void strdump (void );
179181static void strhandle (void );
@@ -1932,6 +1934,42 @@ csireset(void)
19321934 memset (& csiescseq , 0 , sizeof (csiescseq ));
19331935}
19341936
1937+ void
1938+ osc4_color_response (int num )
1939+ {
1940+ int n ;
1941+ char buf [32 ];
1942+ unsigned char r , g , b ;
1943+
1944+ if (xgetcolor (num , & r , & g , & b )) {
1945+ fprintf (stderr , "erresc: failed to fetch osc4 color %d\n" , num );
1946+ return ;
1947+ }
1948+
1949+ n = snprintf (buf , sizeof buf , "\033]4;%d;rgb:%02x%02x/%02x%02x/%02x%02x\007" ,
1950+ num , r , r , g , g , b , b );
1951+
1952+ ttywrite (buf , n , 1 );
1953+ }
1954+
1955+ void
1956+ osc_color_response (int index , int num )
1957+ {
1958+ int n ;
1959+ char buf [32 ];
1960+ unsigned char r , g , b ;
1961+
1962+ if (xgetcolor (index , & r , & g , & b )) {
1963+ fprintf (stderr , "erresc: failed to fetch osc color %d\n" , index );
1964+ return ;
1965+ }
1966+
1967+ n = snprintf (buf , sizeof buf , "\033]%d;rgb:%02x%02x/%02x%02x/%02x%02x\007" ,
1968+ num , r , r , g , g , b , b );
1969+
1970+ ttywrite (buf , n , 1 );
1971+ }
1972+
19351973void
19361974strhandle (void )
19371975{
@@ -1970,14 +2008,56 @@ strhandle(void)
19702008 }
19712009 }
19722010 return ;
2011+ case 10 :
2012+ if (narg < 2 )
2013+ break ;
2014+
2015+ p = strescseq .args [1 ];
2016+
2017+ if (!strcmp (p , "?" ))
2018+ osc_color_response (defaultfg , 10 );
2019+ else if (xsetcolorname (defaultfg , p ))
2020+ fprintf (stderr , "erresc: invalid foreground color: %s\n" , p );
2021+ else
2022+ redraw ();
2023+ break ;
2024+ case 11 :
2025+ if (narg < 2 )
2026+ break ;
2027+
2028+ p = strescseq .args [1 ];
2029+
2030+ if (!strcmp (p , "?" ))
2031+ osc_color_response (defaultbg , 11 );
2032+ else if (xsetcolorname (defaultbg , p ))
2033+ fprintf (stderr , "erresc: invalid background color: %s\n" , p );
2034+ else
2035+ redraw ();
2036+ break ;
2037+ case 12 :
2038+ if (narg < 2 )
2039+ break ;
2040+
2041+ p = strescseq .args [1 ];
2042+
2043+ if (!strcmp (p , "?" ))
2044+ osc_color_response (defaultcs , 12 );
2045+ else if (xsetcolorname (defaultcs , p ))
2046+ fprintf (stderr , "erresc: invalid cursor color: %s\n" , p );
2047+ else
2048+ redraw ();
2049+ break ;
19732050 case 4 : /* color set */
19742051 if (narg < 3 )
19752052 break ;
19762053 p = strescseq .args [2 ];
19772054 /* FALLTHROUGH */
19782055 case 104 : /* color reset, here p = NULL */
19792056 j = (narg > 1 ) ? atoi (strescseq .args [1 ]) : -1 ;
1980- if (xsetcolorname (j , p )) {
2057+
2058+ if (!strcmp (p , "?" ))
2059+ osc4_color_response (j );
2060+ else if (xsetcolorname (j , p )) {
19812061 if (par == 104 && narg <= 1 )
19822062 return ; /* color reset without parameter */
19832063 fprintf (stderr , "erresc: invalid color j=%d, p=%s\n" ,
0 commit comments