Mercurial > pidgin
comparison src/gtkimhtml.c @ 3465:ec437d73b2ee
[gaim-migrate @ 3515]
This looks better.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Thu, 29 Aug 2002 01:43:23 +0000 |
parents | 66c7cca774f5 |
children | 3122c2eec3e8 |
comparison
equal
deleted
inserted
replaced
3464:01af3b8338a2 | 3465:ec437d73b2ee |
---|---|
41 #include <gdk-pixbuf/gdk-pixbuf-loader.h> | 41 #include <gdk-pixbuf/gdk-pixbuf-loader.h> |
42 #else | 42 #else |
43 #include "pixmaps/broken.xpm" | 43 #include "pixmaps/broken.xpm" |
44 #endif | 44 #endif |
45 | 45 |
46 #if GTK_CHECK_VERSION(1,3,0) | |
47 # define GTK_IMHTML_GET_STYLE_FONT(style) gtk_style_get_font (style) | |
48 #else | |
49 # define GTK_IMHTML_GET_STYLE_FONT(style) (style)->font | |
50 # define GTK_CLASS_TYPE(class) (class)->type | |
51 #endif | |
52 | |
53 #include "pixmaps/angel.xpm" | 46 #include "pixmaps/angel.xpm" |
54 #include "pixmaps/bigsmile.xpm" | 47 #include "pixmaps/bigsmile.xpm" |
55 #include "pixmaps/burp.xpm" | 48 #include "pixmaps/burp.xpm" |
56 #include "pixmaps/crossedlips.xpm" | 49 #include "pixmaps/crossedlips.xpm" |
57 #include "pixmaps/cry.xpm" | 50 #include "pixmaps/cry.xpm" |
88 #define TYPE_SMILEY 1 | 81 #define TYPE_SMILEY 1 |
89 #define TYPE_IMG 2 | 82 #define TYPE_IMG 2 |
90 #define TYPE_SEP 3 | 83 #define TYPE_SEP 3 |
91 #define TYPE_BR 4 | 84 #define TYPE_BR 4 |
92 #define TYPE_COMMENT 5 | 85 #define TYPE_COMMENT 5 |
86 | |
87 #define GTK_IMHTML_GET_STYLE_FONT(style) gtk_style_get_font (style) | |
93 | 88 |
94 #define DRAW_IMG(x) (((x)->type == TYPE_IMG) || (imhtml->smileys && ((x)->type == TYPE_SMILEY))) | 89 #define DRAW_IMG(x) (((x)->type == TYPE_IMG) || (imhtml->smileys && ((x)->type == TYPE_SMILEY))) |
95 | 90 |
96 typedef struct _GtkIMHtmlBit GtkIMHtmlBit; | 91 typedef struct _GtkIMHtmlBit GtkIMHtmlBit; |
97 typedef struct _FontDetail FontDetail; | 92 typedef struct _FontDetail FontDetail; |
1436 } | 1431 } |
1437 | 1432 |
1438 static gint | 1433 static gint |
1439 gtk_imhtml_tip_paint (GtkIMHtml *imhtml) | 1434 gtk_imhtml_tip_paint (GtkIMHtml *imhtml) |
1440 { | 1435 { |
1436 int x,y; | |
1441 GtkStyle *style; | 1437 GtkStyle *style; |
1442 GdkFont *font; | 1438 PangoLayout *layout; |
1443 gint y, baseline_skip, gap; | 1439 if (imhtml->tip_bit->url) |
1444 | 1440 layout = gtk_widget_create_pango_layout (imhtml->tip_window, imhtml->tip_bit->url); |
1441 else if (imhtml->tip_bit->img) | |
1442 layout = gtk_widget_create_pango_layout (imhtml->tip_window, imhtml->tip_bit->img->filename); | |
1443 else | |
1444 return FALSE; | |
1445 | |
1445 style = imhtml->tip_window->style; | 1446 style = imhtml->tip_window->style; |
1446 font = GTK_IMHTML_GET_STYLE_FONT (style); | 1447 pango_layout_get_size (layout, &x, &y); |
1447 | |
1448 gap = (font->ascent + font->descent) / 4; | |
1449 if (gap < 2) | |
1450 gap = 2; | |
1451 baseline_skip = font->ascent + font->descent + gap; | |
1452 | 1448 |
1453 if (!imhtml->tip_bit) | 1449 if (!imhtml->tip_bit) |
1454 return FALSE; | 1450 return FALSE; |
1455 | 1451 |
1456 gtk_paint_flat_box (style, imhtml->tip_window->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, | 1452 gtk_paint_flat_box (style, imhtml->tip_window->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, |
1457 NULL, imhtml->tip_window, "tooltip", 0, 0, -1, -1); | 1453 NULL, imhtml->tip_window, "tooltip", 0, 0, -1, -1); |
1458 | 1454 |
1459 y = font->ascent + 4; | 1455 gtk_paint_layout (style, imhtml->tip_window->window, GTK_STATE_NORMAL, TRUE, |
1460 if (imhtml->tip_bit->url) | 1456 NULL, imhtml->tip_window, "tooltip", 4, 4, layout); |
1461 gtk_paint_string (style, imhtml->tip_window->window, GTK_STATE_NORMAL, NULL, | 1457 |
1462 imhtml->tip_window, "tooltip", 4, y, imhtml->tip_bit->url); | 1458 g_object_unref (layout); |
1463 else if (imhtml->tip_bit->img) | |
1464 gtk_paint_string (style, imhtml->tip_window->window, GTK_STATE_NORMAL, NULL, | |
1465 imhtml->tip_window, "tooltip", 4, y, imhtml->tip_bit->img->filename); | |
1466 | |
1467 return FALSE; | 1459 return FALSE; |
1468 } | 1460 } |
1469 | 1461 |
1470 static gint | 1462 static gint |
1471 gtk_imhtml_tip (gpointer data) | 1463 gtk_imhtml_tip (gpointer data) |
1472 { | 1464 { |
1473 GtkIMHtml *imhtml = data; | 1465 GtkIMHtml *imhtml = data; |
1474 GtkWidget *widget = GTK_WIDGET (imhtml); | 1466 GtkWidget *widget = GTK_WIDGET (imhtml); |
1475 GtkStyle *style; | 1467 GtkStyle *style; |
1476 GdkFont *font; | 1468 PangoLayout *layout; |
1477 gint gap, x, y, w, h, scr_w, scr_h, baseline_skip; | 1469 gint x, y, w, h, scr_w, scr_h; |
1478 | 1470 |
1479 if (!imhtml->tip_bit || !GTK_WIDGET_DRAWABLE (widget)) { | 1471 if (!imhtml->tip_bit || !GTK_WIDGET_DRAWABLE (widget)) { |
1480 imhtml->tip_timer = 0; | 1472 imhtml->tip_timer = 0; |
1481 return FALSE; | 1473 return FALSE; |
1482 } | 1474 } |
1488 gtk_widget_set_app_paintable (imhtml->tip_window, TRUE); | 1480 gtk_widget_set_app_paintable (imhtml->tip_window, TRUE); |
1489 gtk_window_set_policy (GTK_WINDOW (imhtml->tip_window), FALSE, FALSE, TRUE); | 1481 gtk_window_set_policy (GTK_WINDOW (imhtml->tip_window), FALSE, FALSE, TRUE); |
1490 gtk_widget_set_name (imhtml->tip_window, "gtk-tooltips"); | 1482 gtk_widget_set_name (imhtml->tip_window, "gtk-tooltips"); |
1491 gtk_signal_connect_object (GTK_OBJECT (imhtml->tip_window), "expose_event", | 1483 gtk_signal_connect_object (GTK_OBJECT (imhtml->tip_window), "expose_event", |
1492 GTK_SIGNAL_FUNC (gtk_imhtml_tip_paint), GTK_OBJECT (imhtml)); | 1484 GTK_SIGNAL_FUNC (gtk_imhtml_tip_paint), GTK_OBJECT (imhtml)); |
1493 gtk_signal_connect_object (GTK_OBJECT (imhtml->tip_window), "draw", | |
1494 GTK_SIGNAL_FUNC (gtk_imhtml_tip_paint), GTK_OBJECT (imhtml)); | |
1495 | 1485 |
1496 gtk_widget_ensure_style (imhtml->tip_window); | 1486 gtk_widget_ensure_style (imhtml->tip_window); |
1497 style = imhtml->tip_window->style; | 1487 style = imhtml->tip_window->style; |
1498 font = GTK_IMHTML_GET_STYLE_FONT (style); | 1488 layout = gtk_widget_create_pango_layout(imhtml->tip_window, |
1489 imhtml->tip_bit->url ? imhtml->tip_bit->url : imhtml->tip_bit->img->filename); | |
1499 | 1490 |
1500 scr_w = gdk_screen_width (); | 1491 scr_w = gdk_screen_width (); |
1501 scr_h = gdk_screen_height (); | 1492 scr_h = gdk_screen_height (); |
1502 | 1493 |
1503 gap = (font->ascent + font->descent) / 4; | 1494 pango_layout_get_size(layout, &w, &h); |
1504 if (gap < 2) | 1495 |
1505 gap = 2; | 1496 w = PANGO_PIXELS(w) + 8; |
1506 baseline_skip = font->ascent + font->descent + gap; | 1497 h = PANGO_PIXELS(h) + 8; |
1507 | |
1508 w = 8 + gdk_string_width (font, imhtml->tip_bit->img ? imhtml->tip_bit->img->filename : | |
1509 imhtml->tip_bit->url); | |
1510 h = 8 - gap + baseline_skip; | |
1511 | 1498 |
1512 gdk_window_get_pointer (NULL, &x, &y, NULL); | 1499 gdk_window_get_pointer (NULL, &x, &y, NULL); |
1513 if (GTK_WIDGET_NO_WINDOW (widget)) | 1500 if (GTK_WIDGET_NO_WINDOW (widget)) |
1514 y += widget->allocation.y; | 1501 y += widget->allocation.y; |
1515 | 1502 |
1519 x -= (x + w) - scr_w; | 1506 x -= (x + w) - scr_w; |
1520 else if (x < 0) | 1507 else if (x < 0) |
1521 x = 0; | 1508 x = 0; |
1522 | 1509 |
1523 if ((y + h + + 4) > scr_h) | 1510 if ((y + h + + 4) > scr_h) |
1524 y = y - imhtml->tip_bit->font->ascent + imhtml->tip_bit->font->descent; | 1511 y = y - h; |
1525 else | 1512 else |
1526 if (imhtml->tip_bit->font) | 1513 y = y + h - 4; |
1527 y = y + imhtml->tip_bit->font->ascent + imhtml->tip_bit->font->descent; | 1514 |
1528 else | |
1529 y = y + font->ascent + font->descent; | |
1530 | |
1531 gtk_widget_set_usize (imhtml->tip_window, w, h); | 1515 gtk_widget_set_usize (imhtml->tip_window, w, h); |
1532 gtk_widget_set_uposition (imhtml->tip_window, x, y); | 1516 gtk_widget_set_uposition (imhtml->tip_window, x, y); |
1533 gtk_widget_show (imhtml->tip_window); | 1517 gtk_widget_show (imhtml->tip_window); |
1534 | 1518 |
1535 imhtml->tip_timer = 0; | 1519 imhtml->tip_timer = 0; |
1520 g_object_unref(layout); | |
1521 | |
1536 return FALSE; | 1522 return FALSE; |
1537 } | 1523 } |
1538 | 1524 |
1539 static gint | 1525 static gint |
1540 gtk_imhtml_motion_notify_event (GtkWidget *widget, | 1526 gtk_imhtml_motion_notify_event (GtkWidget *widget, |
1588 GList *click = imhtml->click; | 1574 GList *click = imhtml->click; |
1589 struct clickable *uw; | 1575 struct clickable *uw; |
1590 | 1576 |
1591 while (click) { | 1577 while (click) { |
1592 uw = (struct clickable *) click->data; | 1578 uw = (struct clickable *) click->data; |
1593 if ((x > uw->x) && (x < uw->x + uw->width) && | 1579 if ((uw->bit->url) && (x > uw->x) && (x < uw->x + uw->width) && |
1594 (y > uw->y) && (y < uw->y + uw->height) && | 1580 (y > uw->y) && (y < uw->y + uw->height) && |
1595 (uw->bit->url || uw->bit->img)) { | 1581 (uw->bit->url || uw->bit->img)) { |
1596 if (imhtml->tip_bit != uw->bit) { | 1582 if (imhtml->tip_bit != uw->bit) { |
1597 imhtml->tip_bit = uw->bit; | 1583 imhtml->tip_bit = uw->bit; |
1598 if (imhtml->tip_timer != 0) | 1584 if (imhtml->tip_timer != 0) |
2074 #define ENCDNG 14 | 2060 #define ENCDNG 14 |
2075 | 2061 |
2076 static const gchar* | 2062 static const gchar* |
2077 gtk_imhtml_get_font_name (GdkFont *font) | 2063 gtk_imhtml_get_font_name (GdkFont *font) |
2078 { | 2064 { |
2079 #if GTK_CHECK_VERSION(1,3,0) | |
2080 return gdk_x11_font_get_name(font); | 2065 return gdk_x11_font_get_name(font); |
2081 #else | |
2082 GdkFontPrivate *fontpriv = (GdkFontPrivate *) font; | |
2083 return fontpriv->names->data; | |
2084 #endif | |
2085 } | 2066 } |
2086 | 2067 |
2087 static GdkFont* | 2068 static GdkFont* |
2088 gtk_imhtml_font_load (GtkIMHtml *imhtml, | 2069 gtk_imhtml_font_load (GtkIMHtml *imhtml, |
2089 gchar *name, | 2070 gchar *name, |