| 209 |
210 |
| 210 static gint |
211 static gint |
| 211 gtk_imhtml_tip (gpointer data) |
212 gtk_imhtml_tip (gpointer data) |
| 212 { |
213 { |
| 213 GtkIMHtml *imhtml = data; |
214 GtkIMHtml *imhtml = data; |
| 214 PangoFontMetrics *font; |
215 PangoFontMetrics *font_metrics; |
| 215 PangoLayout *layout; |
216 PangoLayout *layout; |
| |
217 PangoFont *font; |
| 216 |
218 |
| 217 gint gap, x, y, h, w, scr_w, baseline_skip; |
219 gint gap, x, y, h, w, scr_w, baseline_skip; |
| 218 |
220 |
| 219 g_return_val_if_fail(GTK_IS_IMHTML(imhtml), FALSE); |
221 g_return_val_if_fail(GTK_IS_IMHTML(imhtml), FALSE); |
| 220 |
222 |
| 236 g_signal_connect_swapped (G_OBJECT (imhtml->tip_window), "expose_event", |
238 g_signal_connect_swapped (G_OBJECT (imhtml->tip_window), "expose_event", |
| 237 G_CALLBACK (gtk_imhtml_tip_paint), imhtml); |
239 G_CALLBACK (gtk_imhtml_tip_paint), imhtml); |
| 238 |
240 |
| 239 gtk_widget_ensure_style (imhtml->tip_window); |
241 gtk_widget_ensure_style (imhtml->tip_window); |
| 240 layout = gtk_widget_create_pango_layout(imhtml->tip_window, imhtml->tip); |
242 layout = gtk_widget_create_pango_layout(imhtml->tip_window, imhtml->tip); |
| 241 font = pango_font_get_metrics(pango_context_load_font(pango_layout_get_context(layout), |
243 font = pango_context_load_font(pango_layout_get_context(layout), |
| 242 imhtml->tip_window->style->font_desc), |
244 imhtml->tip_window->style->font_desc); |
| 243 NULL); |
245 |
| |
246 if (font == NULL) { |
| |
247 char *tmp = pango_font_description_to_string( |
| |
248 imhtml->tip_window->style->font_desc); |
| |
249 |
| |
250 gaim_debug(GAIM_DEBUG_ERROR, "gtk_imhtml_tip", |
| |
251 "pango_context_load_font() couldn't load font: '%s'\n", |
| |
252 tmp); |
| |
253 g_free(tmp); |
| |
254 |
| |
255 return FALSE; |
| |
256 |
| |
257 } |
| |
258 |
| |
259 font_metrics = pango_font_get_metrics(font, NULL); |
| 244 |
260 |
| 245 |
261 |
| 246 pango_layout_get_pixel_size(layout, &scr_w, NULL); |
262 pango_layout_get_pixel_size(layout, &scr_w, NULL); |
| 247 gap = PANGO_PIXELS((pango_font_metrics_get_ascent(font) + |
263 gap = PANGO_PIXELS((pango_font_metrics_get_ascent(font_metrics) + |
| 248 pango_font_metrics_get_descent(font))/ 4); |
264 pango_font_metrics_get_descent(font_metrics))/ 4); |
| 249 |
265 |
| 250 if (gap < 2) |
266 if (gap < 2) |
| 251 gap = 2; |
267 gap = 2; |
| 252 baseline_skip = PANGO_PIXELS(pango_font_metrics_get_ascent(font) + |
268 baseline_skip = PANGO_PIXELS(pango_font_metrics_get_ascent(font_metrics) + |
| 253 pango_font_metrics_get_descent(font)); |
269 pango_font_metrics_get_descent(font_metrics)); |
| 254 w = 8 + scr_w; |
270 w = 8 + scr_w; |
| 255 h = 8 + baseline_skip; |
271 h = 8 + baseline_skip; |
| 256 |
272 |
| 257 gdk_window_get_pointer (NULL, &x, &y, NULL); |
273 gdk_window_get_pointer (NULL, &x, &y, NULL); |
| 258 if (GTK_WIDGET_NO_WINDOW (GTK_WIDGET(imhtml))) |
274 if (GTK_WIDGET_NO_WINDOW (GTK_WIDGET(imhtml))) |
| 265 if ((x + w) > scr_w) |
281 if ((x + w) > scr_w) |
| 266 x -= (x + w) - scr_w; |
282 x -= (x + w) - scr_w; |
| 267 else if (x < 0) |
283 else if (x < 0) |
| 268 x = 0; |
284 x = 0; |
| 269 |
285 |
| 270 y = y + PANGO_PIXELS(pango_font_metrics_get_ascent(font) + |
286 y = y + PANGO_PIXELS(pango_font_metrics_get_ascent(font_metrics) + |
| 271 pango_font_metrics_get_descent(font)); |
287 pango_font_metrics_get_descent(font_metrics)); |
| 272 |
288 |
| 273 gtk_widget_set_size_request (imhtml->tip_window, w, h); |
289 gtk_widget_set_size_request (imhtml->tip_window, w, h); |
| 274 gtk_widget_show (imhtml->tip_window); |
290 gtk_widget_show (imhtml->tip_window); |
| 275 gtk_window_move (GTK_WINDOW(imhtml->tip_window), x, y); |
291 gtk_window_move (GTK_WINDOW(imhtml->tip_window), x, y); |
| 276 |
292 |
| 277 pango_font_metrics_unref(font); |
293 pango_font_metrics_unref(font_metrics); |
| 278 g_object_unref(layout); |
294 g_object_unref(layout); |
| 279 |
295 |
| 280 return FALSE; |
296 return FALSE; |
| 281 } |
297 } |
| 282 |
298 |