@@ -48,6 +48,16 @@ static gboolean im_context_delete_surrounding_cb(GtkIMContext *imc, int offset,
48
48
return TRUE;
49
49
}
50
50
51
+ static Lisp_Object make_color_string (PangoAttrColor * pac )
52
+ {
53
+ char buf [256 ];
54
+ sprintf (buf , "#%02x%02x%02x" ,
55
+ pac -> color .red >> 8 ,
56
+ pac -> color .green >> 8 ,
57
+ pac -> color .blue >> 8 );
58
+ return build_string (buf );
59
+ }
60
+
51
61
static void im_context_preedit_changed_cb (GtkIMContext * imc , gpointer user_data )
52
62
{
53
63
struct pgtk_display_info * dpyinfo = user_data ;
@@ -95,54 +105,32 @@ static void im_context_preedit_changed_cb(GtkIMContext *imc, gpointer user_data)
95
105
has_underline = 1 ;
96
106
}
97
107
108
+ PangoAttrColor * pac ;
98
109
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 );
109
- }
110
+ pac = (PangoAttrColor * ) pango_attr_iterator_get (iter , PANGO_ATTR_UNDERLINE_COLOR );
111
+ if (pac != NULL )
112
+ part = Fcons (Fcons (Qul , make_color_string (pac )), part );
113
+ else
114
+ part = Fcons (Fcons (Qul , Qt ), part );
110
115
}
111
116
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
- }
117
+ pac = (PangoAttrColor * ) pango_attr_iterator_get (iter , PANGO_ATTR_FOREGROUND );
118
+ if (pac != NULL )
119
+ part = Fcons (Fcons (Qfg , make_color_string (pac )), part );
121
120
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
- }
121
+ pac = (PangoAttrColor * ) pango_attr_iterator_get (iter , PANGO_ATTR_BACKGROUND );
122
+ if (pac != NULL )
123
+ part = Fcons (Fcons (Qbg , make_color_string (pac )), part );
131
124
132
- part = Freverse (part );
125
+ part = Fnreverse (part );
133
126
list = Fcons (part , list );
134
127
} while (pango_attr_iterator_next (iter ));
135
128
136
- list = Freverse (list );
129
+ list = Fnreverse (list );
137
130
pgtk_enqueue_preedit (f , list );
138
131
139
- if (dpyinfo -> im .preedit_str != NULL )
140
- g_free (dpyinfo -> im .preedit_str );
141
- dpyinfo -> im .preedit_str = str ;
142
-
143
- if (dpyinfo -> im .preedit_attrs != NULL )
144
- pango_attr_list_unref (dpyinfo -> im .preedit_attrs );
145
- dpyinfo -> im .preedit_attrs = attrs ;
132
+ g_free (str );
133
+ pango_attr_list_unref (attrs );
146
134
}
147
135
148
136
static void im_context_preedit_end_cb (GtkIMContext * imc , gpointer user_data )
@@ -156,14 +144,6 @@ static void im_context_preedit_end_cb(GtkIMContext *imc, gpointer user_data)
156
144
return ;
157
145
158
146
pgtk_enqueue_preedit (f , Qnil );
159
-
160
- if (dpyinfo -> im .preedit_str != NULL )
161
- g_free (dpyinfo -> im .preedit_str );
162
- dpyinfo -> im .preedit_str = NULL ;
163
-
164
- if (dpyinfo -> im .preedit_attrs != NULL )
165
- pango_attr_list_unref (dpyinfo -> im .preedit_attrs );
166
- dpyinfo -> im .preedit_attrs = NULL ;
167
147
}
168
148
169
149
static void im_context_preedit_start_cb (GtkIMContext * imc , gpointer user_data )
@@ -196,8 +176,6 @@ void pgtk_im_focus_out(struct frame *f)
196
176
197
177
void pgtk_im_init (struct pgtk_display_info * dpyinfo )
198
178
{
199
- dpyinfo -> im .preedit_str = NULL ;
200
- dpyinfo -> im .preedit_attrs = NULL ;
201
179
dpyinfo -> im .context = NULL ;
202
180
}
203
181
@@ -206,14 +184,6 @@ void pgtk_im_finish(struct pgtk_display_info *dpyinfo)
206
184
if (dpyinfo -> im .context != NULL )
207
185
g_object_unref (dpyinfo -> im .context );
208
186
dpyinfo -> im .context = NULL ;
209
-
210
- if (dpyinfo -> im .preedit_str != NULL )
211
- g_free (dpyinfo -> im .preedit_str );
212
- dpyinfo -> im .preedit_str = NULL ;
213
-
214
- if (dpyinfo -> im .preedit_attrs != NULL )
215
- pango_attr_list_unref (dpyinfo -> im .preedit_attrs );
216
- dpyinfo -> im .preedit_attrs = NULL ;
217
187
}
218
188
219
189
DEFUN ("pgtk-use-im-context" , Fpgtk_use_im_context , Spgtk_use_im_context ,
@@ -231,20 +201,9 @@ DEFUN ("pgtk-use-im-context", Fpgtk_use_im_context, Spgtk_use_im_context,
231
201
232
202
g_object_unref (dpyinfo -> im .context );
233
203
dpyinfo -> im .context = NULL ;
234
-
235
- if (dpyinfo -> im .preedit_str != NULL )
236
- g_free (dpyinfo -> im .preedit_str );
237
- dpyinfo -> im .preedit_str = NULL ;
238
-
239
- if (dpyinfo -> im .preedit_attrs != NULL )
240
- pango_attr_list_unref (dpyinfo -> im .preedit_attrs );
241
- dpyinfo -> im .preedit_attrs = NULL ;
242
204
}
243
205
} else {
244
206
if (dpyinfo -> im .context == NULL ) {
245
- dpyinfo -> im .preedit_str = NULL ;
246
- dpyinfo -> im .preedit_attrs = NULL ;
247
-
248
207
dpyinfo -> im .context = gtk_im_multicontext_new ();
249
208
g_signal_connect (dpyinfo -> im .context , "commit" , G_CALLBACK (im_context_commit_cb ), dpyinfo );
250
209
g_signal_connect (dpyinfo -> im .context , "retrieve-surrounding" , G_CALLBACK (im_context_retrieve_surrounding_cb ), dpyinfo );
@@ -268,4 +227,7 @@ syms_of_pgtkim (void)
268
227
defsubr (& Spgtk_use_im_context );
269
228
270
229
DEFSYM (Qpgtk_refresh_preedit , "pgtk-refresh-preedit" );
230
+ DEFSYM (Qul , "ul" );
231
+ DEFSYM (Qfg , "fg" );
232
+ DEFSYM (Qbg , "bg" );
271
233
}
0 commit comments