@@ -63,103 +63,78 @@ static void im_context_preedit_changed_cb(GtkIMContext *imc, gpointer user_data)
63
63
64
64
gtk_im_context_get_preedit_string (imc , & str , & attrs , & pos );
65
65
66
+
67
+ /*
68
+ * (
69
+ * (TEXT (ul . COLOR) (bg . COLOR) (fg . COLOR))
70
+ * ...
71
+ * )
72
+ */
73
+ Lisp_Object list = Qnil ;
74
+
66
75
PangoAttrIterator * iter ;
67
76
iter = pango_attr_list_get_iterator (attrs );
68
77
do {
69
78
int st , ed ;
79
+ int has_underline = 0 ;
80
+ Lisp_Object part = Qnil ;
81
+
70
82
pango_attr_iterator_range (iter , & st , & ed );
71
- printf ("pango: %d..%d\n" , st , ed );
72
- PangoAttrInt * ul = pango_attr_iterator_get (iter , PANGO_ATTR_UNDERLINE );
83
+
84
+ if (ed > strlen (str ))
85
+ ed = strlen (str );
86
+ if (st >= ed )
87
+ continue ;
88
+
89
+ Lisp_Object text = make_string (str + st , ed - st );
90
+ part = Fcons (text , part );
91
+
92
+ PangoAttrInt * ul = (PangoAttrInt * ) pango_attr_iterator_get (iter , PANGO_ATTR_UNDERLINE );
73
93
if (ul != NULL ) {
74
- printf ("pango: has underline " );
75
- switch (ul -> value ) {
76
- case PANGO_UNDERLINE_NONE :
77
- printf ("none\n" );
78
- break ;
79
- case PANGO_UNDERLINE_DOUBLE :
80
- printf ("double\n" );
81
- break ;
82
- case PANGO_UNDERLINE_ERROR :
83
- printf ("error\n" );
84
- break ;
85
- case PANGO_UNDERLINE_SINGLE :
86
- printf ("single\n" );
87
- break ;
88
- case PANGO_UNDERLINE_LOW :
89
- printf ("low\n" );
90
- break ;
91
- default :
92
- break ;
93
- }
94
- }
95
- PangoAttrColor * ulc = pango_attr_iterator_get (iter , PANGO_ATTR_UNDERLINE_COLOR );
96
- if (ulc != NULL ) {
97
- printf ("pango: has underline color %02x%02x%02x\n" ,
98
- ulc -> color .red >> 8 , ulc -> color .green >> 8 , ulc -> color .blue >> 8 );
99
- }
100
- PangoAttrColor * fore = pango_attr_iterator_get (iter , PANGO_ATTR_FOREGROUND );
101
- if (fore != NULL ) {
102
- printf ("pango: has foreground %02x%02x%02x\n" ,
103
- fore -> color .red >> 8 , fore -> color .green >> 8 , fore -> color .blue >> 8 );
94
+ if (ul -> value != PANGO_UNDERLINE_NONE )
95
+ has_underline = 1 ;
104
96
}
105
- PangoAttrColor * back = pango_attr_iterator_get (iter , PANGO_ATTR_BACKGROUND );
106
- if (back != NULL ) {
107
- printf ("pango: has background %02x%02x%02x\n" ,
108
- back -> color .red >> 8 , back -> color .green >> 8 , back -> color .blue >> 8 );
109
- }
110
- } while (pango_attr_iterator_next (iter ));
111
97
112
-
113
- /* get size */
114
- PangoLayout * layout = gtk_widget_create_pango_layout (FRAME_GTK_WIDGET (f ), str );
115
- pango_layout_set_attributes (layout , attrs );
116
- int width , height ;
117
- pango_layout_get_pixel_size (layout , & width , & height );
118
-
119
- Lisp_Object image_data ;
120
- if (width != 0 && height != 0 ) {
121
- char * buf = g_new0 (char , 5 + 20 + 20 + 10 + 3 * width * height );
122
- sprintf (buf , "P6\n%d %d\n255\n" , width , height );
123
-
124
- int stride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24 , width );
125
- unsigned char * crbuf = g_new0 (unsigned char , stride * height );
126
- cairo_surface_t * surface = cairo_image_surface_create_for_data (crbuf , CAIRO_FORMAT_RGB24 , width , height , stride );
127
-
128
- cairo_t * cr = cairo_create (surface );
129
- cairo_set_source_rgb (cr , 0 , 0 , 0 );
130
- cairo_rectangle (cr , 0 , 0 , width , height );
131
- cairo_fill (cr );
132
- cairo_set_source_rgb (cr , 1 , 1 , 1 );
133
- pango_cairo_update_layout (cr , layout );
134
- pango_cairo_show_layout (cr , layout );
135
- cairo_destroy (cr );
136
-
137
- cairo_surface_flush (surface );
138
- cairo_surface_destroy (surface );
139
-
140
- unsigned char * sp = crbuf ;
141
- unsigned char * dp = (unsigned char * ) buf + strlen (buf );
142
- for (int y = 0 ; y < height ; y ++ ) {
143
- for (int x = 0 ; x < width ; x ++ ) {
144
- unsigned int rgb = * (unsigned int * ) sp ;
145
- * dp ++ = (rgb >> 16 ) & 0xff ;
146
- * dp ++ = (rgb >> 8 ) & 0xff ;
147
- * dp ++ = (rgb >> 0 ) & 0xff ;
148
- sp += 4 ;
98
+ if (has_underline ) {
99
+ PangoAttrColor * ulc = (PangoAttrColor * ) pango_attr_iterator_get (iter , PANGO_ATTR_UNDERLINE_COLOR );
100
+ if (ulc != NULL ) {
101
+ char * str = g_strdup_printf ("#%02x%02x%02x" ,
102
+ ulc -> color .red >> 8 ,
103
+ ulc -> color .green >> 8 ,
104
+ ulc -> color .blue >> 8 );
105
+ part = Fcons (Fcons (intern ("ul" ), make_string (str , strlen (str ))), part );
106
+ g_free (str );
107
+ } else {
108
+ part = Fcons (Fcons (intern ("ul" ), Qt ), part );
149
109
}
150
110
}
151
111
152
- image_data = make_unibyte_string (buf , dp - (unsigned char * ) buf );
112
+ PangoAttrColor * fore = (PangoAttrColor * ) pango_attr_iterator_get (iter , PANGO_ATTR_FOREGROUND );
113
+ if (fore != NULL ) {
114
+ char * str = g_strdup_printf ("#%02x%02x%02x" ,
115
+ fore -> color .red >> 8 ,
116
+ fore -> color .green >> 8 ,
117
+ fore -> color .blue >> 8 );
118
+ part = Fcons (Fcons (intern ("fg" ), make_string (str , strlen (str ))), part );
119
+ g_free (str );
120
+ }
153
121
154
- g_free (crbuf );
155
- g_free (buf );
156
- } else
157
- image_data = Qnil ;
122
+ PangoAttrColor * back = (PangoAttrColor * ) pango_attr_iterator_get (iter , PANGO_ATTR_BACKGROUND );
123
+ if (back != NULL ) {
124
+ char * str = g_strdup_printf ("#%02x%02x%02x" ,
125
+ back -> color .red >> 8 ,
126
+ back -> color .green >> 8 ,
127
+ back -> color .blue >> 8 );
128
+ part = Fcons (Fcons (intern ("bg" ), make_string (str , strlen (str ))), part );
129
+ g_free (str );
130
+ }
158
131
159
- pgtk_enqueue_preedit (f , image_data );
132
+ part = Freverse (part );
133
+ list = Fcons (part , list );
134
+ } while (pango_attr_iterator_next (iter ));
160
135
161
- g_object_unref ( layout );
162
- pango_font_description_free ( font_desc );
136
+ list = Freverse ( list );
137
+ pgtk_enqueue_preedit ( f , list );
163
138
164
139
if (dpyinfo -> im .preedit_str != NULL )
165
140
g_free (dpyinfo -> im .preedit_str );
0 commit comments