src/gtkimhtml.c

Sat, 12 Jul 2003 19:08:19 +0000

author
Mark Doliner <markdoliner@pidgin.im>
date
Sat, 12 Jul 2003 19:08:19 +0000
changeset 6101
c3762fa398c4
parent 6066
444d1ed0a273
child 6124
322206d79652
permissions
-rw-r--r--

[gaim-migrate @ 6560]
This should fix some icon uploading looping.

Sean, the problem was that, when adding the md5 sum to ssi, the code was
checking if it existed by looking for an item named "0", but it was
actually adding an item named "1." So for accounts with no icon info yet,
Gaim would end up getting in a loop and spiraling into oblivion, only far
less dramatic.

1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1 /*
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
2 * GtkIMHtml
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
3 *
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
4 * Copyright (C) 2000, Eric Warmenhoven <warmenhoven@yahoo.com>
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
5 *
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
7 * under the terms of the GNU General Public License as published by
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
9 * (at your option) any later version.
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
10 *
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful,
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
14 * GNU General Public License for more details.
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
15 *
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
19 *
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
20 */
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
21
2541
0afd3aaba327 [gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2365
diff changeset
22 #ifdef HAVE_CONFIG_H
0afd3aaba327 [gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2365
diff changeset
23 #include <config.h>
0afd3aaba327 [gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2365
diff changeset
24 #endif
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
25 #include "gtkimhtml.h"
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
26 #include <gtk/gtk.h>
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
27 #include <glib/gerror.h>
4046
3b7f7799fe5b [gaim-migrate @ 4254]
Sean Egan <seanegan@pidgin.im>
parents: 4041
diff changeset
28 #include <gdk/gdkkeysyms.h>
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
29 #include <string.h>
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
30 #include <ctype.h>
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
31 #include <stdio.h>
4629
7ac4830de853 [gaim-migrate @ 4920]
Mark Doliner <markdoliner@pidgin.im>
parents: 4612
diff changeset
32 #include <stdlib.h>
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
33 #include <math.h>
2541
0afd3aaba327 [gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2365
diff changeset
34 #ifdef HAVE_LANGINFO_CODESET
0afd3aaba327 [gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2365
diff changeset
35 #include <langinfo.h>
0afd3aaba327 [gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2365
diff changeset
36 #include <locale.h>
0afd3aaba327 [gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2365
diff changeset
37 #endif
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
38
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
39 #ifdef ENABLE_NLS
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
40 # include <libintl.h>
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
41 # define _(x) gettext(x)
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
42 # ifdef gettext_noop
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
43 # define N_(String) gettext_noop (String)
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
44 # else
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
45 # define N_(String) (String)
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
46 # endif
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
47 #else
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
48 # define N_(String) (String)
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
49 # define _(x) (x)
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
50 #endif
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
51
4735
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
52 #include <pango/pango-font.h>
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
53
5105
3565a4c4de6a [gaim-migrate @ 5468]
David J. Brigada <brigada@prism.net>
parents: 5104
diff changeset
54 /* GTK+ < 2.2.2 hack, see ui.h for details. */
3565a4c4de6a [gaim-migrate @ 5468]
David J. Brigada <brigada@prism.net>
parents: 5104
diff changeset
55 #ifndef GTK_WRAP_WORD_CHAR
3565a4c4de6a [gaim-migrate @ 5468]
David J. Brigada <brigada@prism.net>
parents: 5104
diff changeset
56 #define GTK_WRAP_WORD_CHAR GTK_WRAP_WORD
3565a4c4de6a [gaim-migrate @ 5468]
David J. Brigada <brigada@prism.net>
parents: 5104
diff changeset
57 #endif
3565a4c4de6a [gaim-migrate @ 5468]
David J. Brigada <brigada@prism.net>
parents: 5104
diff changeset
58
4735
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
59 #define TOOLTIP_TIMEOUT 500
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
60
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
61 /* POINT_SIZE converts from AIM font sizes to point sizes. It probably should be redone in such a
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
62 * way that it base the sizes off the default font size rather than using arbitrary font sizes. */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
63 #define MAX_FONT_SIZE 7
5367
a2f9e6418413 [gaim-migrate @ 5743]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5293
diff changeset
64 #define POINT_SIZE(x) (options & GTK_IMHTML_USE_POINTSIZE ? x : _point_sizes [MIN ((x), MAX_FONT_SIZE) - 1])
3928
28b91dfe3124 [gaim-migrate @ 4100]
Sean Egan <seanegan@pidgin.im>
parents: 3922
diff changeset
65 static gint _point_sizes [] = { 8, 10, 12, 14, 20, 30, 40 };
2349
9832b57ded64 [gaim-migrate @ 2362]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2348
diff changeset
66
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
67 static GtkSmileyTree*
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
68 gtk_smiley_tree_new ()
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
69 {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
70 return g_new0 (GtkSmileyTree, 1);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
71 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
72
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
73 static void
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
74 gtk_smiley_tree_insert (GtkSmileyTree *tree,
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
75 GtkIMHtmlSmiley *smiley)
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
76 {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
77 GtkSmileyTree *t = tree;
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
78 const gchar *x = smiley->smile;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
79
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
80 if (!strlen (x))
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
81 return;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
82
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
83 while (*x) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
84 gchar *pos;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
85 gint index;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
86
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
87 if (!t->values)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
88 t->values = g_string_new ("");
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
89
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
90 pos = strchr (t->values->str, *x);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
91 if (!pos) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
92 t->values = g_string_append_c (t->values, *x);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
93 index = t->values->len - 1;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
94 t->children = g_realloc (t->children, t->values->len * sizeof (GtkSmileyTree *));
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
95 t->children [index] = g_new0 (GtkSmileyTree, 1);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
96 } else
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
97 index = (int) pos - (int) t->values->str;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
98
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
99 t = t->children [index];
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
100
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
101 x++;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
102 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
103
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
104 t->image = smiley;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
105 }
4041
6336d3d3785e [gaim-migrate @ 4249]
Sean Egan <seanegan@pidgin.im>
parents: 4032
diff changeset
106
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
107
4264
cf1229a7563c [gaim-migrate @ 4515]
Sean Egan <seanegan@pidgin.im>
parents: 4263
diff changeset
108 void gtk_smiley_tree_destroy (GtkSmileyTree *tree)
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
109 {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
110 GSList *list = g_slist_append (NULL, tree);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
111
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
112 while (list) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
113 GtkSmileyTree *t = list->data;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
114 gint i;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
115 list = g_slist_remove(list, t);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
116 if (t->values) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
117 for (i = 0; i < t->values->len; i++)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
118 list = g_slist_append (list, t->children [i]);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
119 g_string_free (t->values, TRUE);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
120 g_free (t->children);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
121 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
122 g_free (t);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
123 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
124 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
125
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
126 static gboolean gtk_size_allocate_cb(GtkIMHtml *widget, GtkAllocation *alloc, gpointer user_data)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
127 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
128 GdkRectangle rect;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
129
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
130 gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(widget), &rect);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
131 if(widget->old_rect.width != rect.width || widget->old_rect.height != rect.height){
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
132 GList *iter = GTK_IMHTML(widget)->scalables;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
133
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
134 while(iter){
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
135 GtkIMHtmlScalable *scale = GTK_IMHTML_SCALABLE(iter->data);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
136 scale->scale(scale, rect.width, rect.height);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
137
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
138 iter = iter->next;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
139 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
140 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
141
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
142 widget->old_rect = rect;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
143 return FALSE;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
144 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
145
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
146 static gint
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
147 gtk_imhtml_tip_paint (GtkIMHtml *imhtml)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
148 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
149 PangoLayout *layout;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
150
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
151 g_return_val_if_fail(GTK_IS_IMHTML(imhtml), FALSE);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
152
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
153 layout = gtk_widget_create_pango_layout(imhtml->tip_window, imhtml->tip);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
154
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
155 gtk_paint_flat_box (imhtml->tip_window->style, imhtml->tip_window->window,
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
156 GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, imhtml->tip_window,
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
157 "tooltip", 0, 0, -1, -1);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
158
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
159 gtk_paint_layout (imhtml->tip_window->style, imhtml->tip_window->window, GTK_STATE_NORMAL,
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
160 FALSE, NULL, imhtml->tip_window, NULL, 4, 4, layout);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
161
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
162 g_object_unref(layout);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
163 return FALSE;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
164 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
165
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
166 static gint
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
167 gtk_imhtml_tip (gpointer data)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
168 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
169 GtkIMHtml *imhtml = data;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
170 PangoFontMetrics *font;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
171 PangoLayout *layout;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
172
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
173 gint gap, x, y, h, w, scr_w, baseline_skip;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
174
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
175 g_return_val_if_fail(GTK_IS_IMHTML(imhtml), FALSE);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
176
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
177 if (!imhtml->tip || !GTK_WIDGET_DRAWABLE (GTK_WIDGET(imhtml))) {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
178 imhtml->tip_timer = 0;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
179 return FALSE;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
180 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
181
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
182 if (imhtml->tip_window){
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
183 gtk_widget_destroy (imhtml->tip_window);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
184 imhtml->tip_window = NULL;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
185 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
186
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
187 imhtml->tip_timer = 0;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
188 imhtml->tip_window = gtk_window_new (GTK_WINDOW_POPUP);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
189 gtk_widget_set_app_paintable (imhtml->tip_window, TRUE);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
190 gtk_window_set_resizable (GTK_WINDOW (imhtml->tip_window), FALSE);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
191 gtk_widget_set_name (imhtml->tip_window, "gtk-tooltips");
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
192 g_signal_connect_swapped (G_OBJECT (imhtml->tip_window), "expose_event",
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
193 G_CALLBACK (gtk_imhtml_tip_paint), imhtml);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
194
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
195 gtk_widget_ensure_style (imhtml->tip_window);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
196 layout = gtk_widget_create_pango_layout(imhtml->tip_window, imhtml->tip);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
197 font = pango_font_get_metrics(pango_context_load_font(pango_layout_get_context(layout),
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
198 imhtml->tip_window->style->font_desc),
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
199 NULL);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
200
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
201
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
202 pango_layout_get_pixel_size(layout, &scr_w, NULL);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
203 gap = PANGO_PIXELS((pango_font_metrics_get_ascent(font) +
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
204 pango_font_metrics_get_descent(font))/ 4);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
205
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
206 if (gap < 2)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
207 gap = 2;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
208 baseline_skip = PANGO_PIXELS(pango_font_metrics_get_ascent(font) +
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
209 pango_font_metrics_get_descent(font));
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
210 w = 8 + scr_w;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
211 h = 8 + baseline_skip;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
212
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
213 gdk_window_get_pointer (NULL, &x, &y, NULL);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
214 if (GTK_WIDGET_NO_WINDOW (GTK_WIDGET(imhtml)))
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
215 y += GTK_WIDGET(imhtml)->allocation.y;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
216
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
217 scr_w = gdk_screen_width();
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
218
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
219 x -= ((w >> 1) + 4);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
220
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
221 if ((x + w) > scr_w)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
222 x -= (x + w) - scr_w;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
223 else if (x < 0)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
224 x = 0;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
225
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
226 y = y + PANGO_PIXELS(pango_font_metrics_get_ascent(font) +
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
227 pango_font_metrics_get_descent(font));
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
228
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
229 gtk_widget_set_size_request (imhtml->tip_window, w, h);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
230 gtk_widget_show (imhtml->tip_window);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
231 gtk_window_move (GTK_WINDOW(imhtml->tip_window), x, y);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
232
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
233 pango_font_metrics_unref(font);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
234 g_object_unref(layout);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
235
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
236 return FALSE;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
237 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
238
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
239 gboolean gtk_motion_event_notify(GtkWidget *imhtml, GdkEventMotion *event, gpointer data)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
240 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
241 GtkTextIter iter;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
242 GdkWindow *win = event->window;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
243 int x, y;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
244 char *tip = NULL;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
245 GSList *tags = NULL, *templist = NULL;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
246 gdk_window_get_pointer(GTK_WIDGET(imhtml)->window, NULL, NULL, NULL);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
247 gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(imhtml), GTK_TEXT_WINDOW_WIDGET,
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
248 event->x, event->y, &x, &y);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
249 gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(imhtml), &iter, x, y);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
250 tags = gtk_text_iter_get_tags(&iter);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
251
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
252 templist = tags;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
253 while (templist) {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
254 GtkTextTag *tag = templist->data;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
255 tip = g_object_get_data(G_OBJECT(tag), "link_url");
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
256 if (tip)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
257 break;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
258 templist = templist->next;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
259 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
260
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
261 if (GTK_IMHTML(imhtml)->tip) {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
262 if ((tip == GTK_IMHTML(imhtml)->tip)) {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
263 return FALSE;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
264 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
265 /* We've left the cell. Remove the timeout and create a new one below */
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
266 if (GTK_IMHTML(imhtml)->tip_window) {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
267 gtk_widget_destroy(GTK_IMHTML(imhtml)->tip_window);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
268 GTK_IMHTML(imhtml)->tip_window = NULL;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
269 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
270 gdk_window_set_cursor(win, GTK_IMHTML(imhtml)->arrow_cursor);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
271 if (GTK_IMHTML(imhtml)->tip_timer)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
272 g_source_remove(GTK_IMHTML(imhtml)->tip_timer);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
273 GTK_IMHTML(imhtml)->tip_timer = 0;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
274 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
275
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
276 if(tip){
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
277 gdk_window_set_cursor(win, GTK_IMHTML(imhtml)->hand_cursor);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
278 GTK_IMHTML(imhtml)->tip_timer = g_timeout_add (TOOLTIP_TIMEOUT,
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
279 gtk_imhtml_tip, imhtml);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
280 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
281
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
282 GTK_IMHTML(imhtml)->tip = tip;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
283 g_slist_free(tags);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
284 return FALSE;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
285 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
286
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
287 gboolean gtk_leave_event_notify(GtkWidget *imhtml, GdkEventCrossing *event, gpointer data)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
288 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
289 /* when leaving the widget, clear any current & pending tooltips and restore the cursor */
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
290 if (GTK_IMHTML(imhtml)->tip_window) {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
291 gtk_widget_destroy(GTK_IMHTML(imhtml)->tip_window);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
292 GTK_IMHTML(imhtml)->tip_window = NULL;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
293 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
294 if (GTK_IMHTML(imhtml)->tip_timer) {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
295 g_source_remove(GTK_IMHTML(imhtml)->tip_timer);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
296 GTK_IMHTML(imhtml)->tip_timer = 0;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
297 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
298 gdk_window_set_cursor(event->window, GTK_IMHTML(imhtml)->arrow_cursor);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
299
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
300 /* propogate the event normally */
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
301 return FALSE;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
302 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
303
6066
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
304 /*
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
305 * XXX - This should be removed eventually.
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
306 *
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
307 * This function exists to work around a gross bug in GtkTextView.
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
308 * Basically, we short circuit ctrl+a and ctrl+end because they make
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
309 * el program go boom.
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
310 *
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
311 * It's supposed to be fixed in gtk2.2. You can view the bug report at
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
312 * http://bugzilla.gnome.org/show_bug.cgi?id=107939
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
313 */
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
314 gboolean gtk_key_pressed_cb(GtkWidget *imhtml, GdkEventKey *event, gpointer data)
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
315 {
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
316 if (event->state & GDK_CONTROL_MASK)
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
317 switch (event->keyval) {
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
318 case 'a':
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
319 return TRUE;
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
320 break;
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
321
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
322 case GDK_Home:
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
323 return TRUE;
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
324 break;
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
325
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
326 case GDK_End:
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
327 return TRUE;
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
328 break;
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
329 }
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
330
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
331 return FALSE;
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
332 }
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
333
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
334
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
335
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
336 static GtkTextViewClass *parent_class = NULL;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
337
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
338 /* GtkIMHtml has one signal--URL_CLICKED */
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
339 enum {
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
340 URL_CLICKED,
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
341 LAST_SIGNAL
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
342 };
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
343 static guint signals [LAST_SIGNAL] = { 0 };
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
344
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
345 static void
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
346 gtk_imhtml_finalize (GObject *object)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
347 {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
348 GtkIMHtml *imhtml = GTK_IMHTML(object);
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
349 GList *scalables;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
350
4138
727cb2d2b93c [gaim-migrate @ 4356]
Ari Pollak <ari@debian.org>
parents: 4046
diff changeset
351 g_hash_table_destroy(imhtml->smiley_data);
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
352 gtk_smiley_tree_destroy(imhtml->default_smilies);
4138
727cb2d2b93c [gaim-migrate @ 4356]
Ari Pollak <ari@debian.org>
parents: 4046
diff changeset
353 gdk_cursor_unref(imhtml->hand_cursor);
727cb2d2b93c [gaim-migrate @ 4356]
Ari Pollak <ari@debian.org>
parents: 4046
diff changeset
354 gdk_cursor_unref(imhtml->arrow_cursor);
4735
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
355 if(imhtml->tip_window){
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
356 gtk_widget_destroy(imhtml->tip_window);
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
357 }
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
358 if(imhtml->tip_timer)
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
359 gtk_timeout_remove(imhtml->tip_timer);
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
360
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
361 for(scalables = imhtml->scalables; scalables; scalables = scalables->next) {
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
362 GtkIMHtmlScalable *scale = GTK_IMHTML_SCALABLE(scalables->data);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
363 scale->free(scale);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
364 }
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
365
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
366 g_list_free(imhtml->scalables);
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
367 G_OBJECT_CLASS(parent_class)->finalize (object);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
368 }
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
369
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
370 /* Boring GTK stuff */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
371 static void gtk_imhtml_class_init (GtkIMHtmlClass *class)
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
372 {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
373 GtkObjectClass *object_class;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
374 GObjectClass *gobject_class;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
375 object_class = (GtkObjectClass*) class;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
376 gobject_class = (GObjectClass*) class;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
377 parent_class = gtk_type_class(GTK_TYPE_TEXT_VIEW);
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
378 signals[URL_CLICKED] = g_signal_new("url_clicked",
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
379 G_TYPE_FROM_CLASS(gobject_class),
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
380 G_SIGNAL_RUN_FIRST,
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
381 G_STRUCT_OFFSET(GtkIMHtmlClass, url_clicked),
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
382 NULL,
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
383 0,
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
384 g_cclosure_marshal_VOID__POINTER,
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
385 G_TYPE_NONE, 1,
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
386 G_TYPE_POINTER);
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
387 gobject_class->finalize = gtk_imhtml_finalize;
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
388 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
389
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
390 static void gtk_imhtml_init (GtkIMHtml *imhtml)
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
391 {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
392 GtkTextIter iter;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
393 imhtml->text_buffer = gtk_text_buffer_new(NULL);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
394 gtk_text_buffer_get_end_iter (imhtml->text_buffer, &iter);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
395 imhtml->end = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, FALSE);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
396 gtk_text_view_set_buffer(GTK_TEXT_VIEW(imhtml), imhtml->text_buffer);
5105
3565a4c4de6a [gaim-migrate @ 5468]
David J. Brigada <brigada@prism.net>
parents: 5104
diff changeset
397 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(imhtml), GTK_WRAP_WORD_CHAR);
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
398 gtk_text_view_set_editable(GTK_TEXT_VIEW(imhtml), FALSE);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
399 gtk_text_view_set_pixels_below_lines(GTK_TEXT_VIEW(imhtml), 5);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
400 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(imhtml), FALSE);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
401 /*gtk_text_view_set_justification(GTK_TEXT_VIEW(imhtml), GTK_JUSTIFY_FILL);*/
3465
12a1286832c5 [gaim-migrate @ 3515]
Sean Egan <seanegan@pidgin.im>
parents: 3460
diff changeset
402
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
403 /* These tags will be used often and can be reused--we create them on init and then apply them by name
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
404 * other tags (color, size, face, etc.) will have to be created and applied dynamically */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
405 gtk_text_buffer_create_tag(imhtml->text_buffer, "BOLD", "weight", PANGO_WEIGHT_BOLD, NULL);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
406 gtk_text_buffer_create_tag(imhtml->text_buffer, "ITALICS", "style", PANGO_STYLE_ITALIC, NULL);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
407 gtk_text_buffer_create_tag(imhtml->text_buffer, "UNDERLINE", "underline", PANGO_UNDERLINE_SINGLE, NULL);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
408 gtk_text_buffer_create_tag(imhtml->text_buffer, "STRIKE", "strikethrough", TRUE, NULL);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
409 gtk_text_buffer_create_tag(imhtml->text_buffer, "SUB", "rise", -5000, NULL);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
410 gtk_text_buffer_create_tag(imhtml->text_buffer, "SUP", "rise", 5000, NULL);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
411 gtk_text_buffer_create_tag(imhtml->text_buffer, "PRE", "family", "Monospace", NULL);
3465
12a1286832c5 [gaim-migrate @ 3515]
Sean Egan <seanegan@pidgin.im>
parents: 3460
diff changeset
412
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
413 /* When hovering over a link, we show the hand cursor--elsewhere we show the plain ol' pointer cursor */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
414 imhtml->hand_cursor = gdk_cursor_new (GDK_HAND2);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
415 imhtml->arrow_cursor = gdk_cursor_new (GDK_LEFT_PTR);
2993
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
416
4253
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
417 imhtml->show_smileys = TRUE;
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
418
4892
37b4a5ac5ebe [gaim-migrate @ 5222]
Nathan Walp <nwalp@pidgin.im>
parents: 4793
diff changeset
419 imhtml->smiley_data = g_hash_table_new_full(g_str_hash, g_str_equal,
4902
e7cb2fed937e [gaim-migrate @ 5236]
Nathan Walp <nwalp@pidgin.im>
parents: 4895
diff changeset
420 g_free, (GDestroyNotify)gtk_smiley_tree_destroy);
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
421 imhtml->default_smilies = gtk_smiley_tree_new();
4735
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
422
4944
032dac83798e [gaim-migrate @ 5278]
Robert McQueen <robot101@debian.org>
parents: 4926
diff changeset
423 g_signal_connect(G_OBJECT(imhtml), "size-allocate", G_CALLBACK(gtk_size_allocate_cb), NULL);
4735
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
424 g_signal_connect(G_OBJECT(imhtml), "motion-notify-event", G_CALLBACK(gtk_motion_event_notify), NULL);
4944
032dac83798e [gaim-migrate @ 5278]
Robert McQueen <robot101@debian.org>
parents: 4926
diff changeset
425 g_signal_connect(G_OBJECT(imhtml), "leave-notify-event", G_CALLBACK(gtk_leave_event_notify), NULL);
6066
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
426 g_signal_connect(G_OBJECT(imhtml), "key_press_event", G_CALLBACK(gtk_key_pressed_cb), NULL);
4944
032dac83798e [gaim-migrate @ 5278]
Robert McQueen <robot101@debian.org>
parents: 4926
diff changeset
427 gtk_widget_add_events(GTK_WIDGET(imhtml), GDK_LEAVE_NOTIFY_MASK);
4735
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
428
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
429 imhtml->tip = NULL;
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
430 imhtml->tip_timer = 0;
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
431 imhtml->tip_window = NULL;
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
432
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
433 imhtml->scalables = NULL;
6066
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
434
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
435 gtk_text_buffer_create_tag(imhtml->text_buffer, "comment", "invisible", FALSE, NULL);
2993
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
436 }
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
437
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
438 GtkWidget *gtk_imhtml_new(void *a, void *b)
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
439 {
4635
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
440 return GTK_WIDGET(g_object_new(gtk_imhtml_get_type(), NULL));
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
441 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
442
4635
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
443 GType gtk_imhtml_get_type()
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
444 {
4635
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
445 static GType imhtml_type = 0;
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
446
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
447 if (!imhtml_type) {
4635
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
448 static const GTypeInfo imhtml_info = {
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
449 sizeof(GtkIMHtmlClass),
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
450 NULL,
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
451 NULL,
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
452 (GClassInitFunc) gtk_imhtml_class_init,
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
453 NULL,
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
454 NULL,
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
455 sizeof (GtkIMHtml),
4635
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
456 0,
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
457 (GInstanceInitFunc) gtk_imhtml_init
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
458 };
4635
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
459
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
460 imhtml_type = g_type_register_static(gtk_text_view_get_type(),
475ccd9dc3ac [gaim-migrate @ 4942]
Nathan Walp <nwalp@pidgin.im>
parents: 4630
diff changeset
461 "GtkIMHtml", &imhtml_info, 0);
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
462 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
463
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
464 return imhtml_type;
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
465 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
466
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
467 struct url_data {
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
468 GObject *object;
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
469 gchar *url;
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
470 };
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
471
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
472 static void url_open(GtkWidget *w, struct url_data *data) {
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
473 if(!data) return;
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
474
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
475 g_signal_emit(data->object, signals[URL_CLICKED], 0, data->url);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
476
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
477 g_object_unref(data->object);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
478 g_free(data->url);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
479 g_free(data);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
480 }
5582
2e5da5db947b [gaim-migrate @ 5986]
Robert McQueen <robot101@debian.org>
parents: 5367
diff changeset
481
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
482 static void url_copy(GtkWidget *w, gchar *url) {
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
483 GtkClipboard *clipboard;
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
484
5293
53c5041ea95a [gaim-migrate @ 5665]
Etan Reisner <deryni@pidgin.im>
parents: 5282
diff changeset
485 clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
486 gtk_clipboard_set_text(clipboard, url, -1);
5582
2e5da5db947b [gaim-migrate @ 5986]
Robert McQueen <robot101@debian.org>
parents: 5367
diff changeset
487
2e5da5db947b [gaim-migrate @ 5986]
Robert McQueen <robot101@debian.org>
parents: 5367
diff changeset
488 clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2e5da5db947b [gaim-migrate @ 5986]
Robert McQueen <robot101@debian.org>
parents: 5367
diff changeset
489 gtk_clipboard_set_text(clipboard, url, -1);
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
490 }
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
491
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
492 /* The callback for an event on a link tag. */
5091
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
493 gboolean tag_event(GtkTextTag *tag, GObject *imhtml, GdkEvent *event, GtkTextIter *arg2, char *url) {
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
494 GdkEventButton *event_button = (GdkEventButton *) event;
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
495
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
496 if (event->type == GDK_BUTTON_RELEASE) {
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
497 if (event_button->button == 1) {
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
498 GtkTextIter start, end;
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
499 /* we shouldn't open a URL if the user has selected something: */
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
500 gtk_text_buffer_get_selection_bounds(
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
501 gtk_text_iter_get_buffer(arg2), &start, &end);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
502 if(gtk_text_iter_get_offset(&start) !=
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
503 gtk_text_iter_get_offset(&end))
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
504 return FALSE;
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
505
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
506 /* A link was clicked--we emit the "url_clicked" signal
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
507 * with the URL as the argument */
5091
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
508 g_signal_emit(imhtml, signals[URL_CLICKED], 0, url);
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
509 return FALSE;
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
510 } else if(event_button->button == 3) {
4745
24867c379d37 [gaim-migrate @ 5060]
Nathan Walp <nwalp@pidgin.im>
parents: 4740
diff changeset
511 GtkWidget *img, *item, *menu;
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
512 struct url_data *tempdata = g_new(struct url_data, 1);
5091
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
513 tempdata->object = g_object_ref(imhtml);
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
514 tempdata->url = g_strdup(url);
4745
24867c379d37 [gaim-migrate @ 5060]
Nathan Walp <nwalp@pidgin.im>
parents: 4740
diff changeset
515
5091
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
516 /* Don't want the tooltip around if user right-clicked on link */
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
517 if (GTK_IMHTML(imhtml)->tip_window) {
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
518 gtk_widget_destroy(GTK_IMHTML(imhtml)->tip_window);
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
519 GTK_IMHTML(imhtml)->tip_window = NULL;
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
520 }
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
521 if (GTK_IMHTML(imhtml)->tip_timer) {
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
522 g_source_remove(GTK_IMHTML(imhtml)->tip_timer);
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
523 GTK_IMHTML(imhtml)->tip_timer = 0;
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
524 }
aee60723c147 [gaim-migrate @ 5453]
Ari Pollak <ari@debian.org>
parents: 5046
diff changeset
525 gdk_window_set_cursor(event_button->window, GTK_IMHTML(imhtml)->arrow_cursor);
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
526 menu = gtk_menu_new();
4745
24867c379d37 [gaim-migrate @ 5060]
Nathan Walp <nwalp@pidgin.im>
parents: 4740
diff changeset
527
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
528 /* buttons and such */
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
529 img = gtk_image_new_from_stock(GTK_STOCK_COPY, GTK_ICON_SIZE_MENU);
4420
10d689e71c1b [gaim-migrate @ 4693]
Sean Egan <seanegan@pidgin.im>
parents: 4419
diff changeset
530 item = gtk_image_menu_item_new_with_mnemonic(_("_Copy Link Location"));
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
531 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
532 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(url_copy),
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
533 url);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
534 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
535
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
536 img = gtk_image_new_from_stock(GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU);
4420
10d689e71c1b [gaim-migrate @ 4693]
Sean Egan <seanegan@pidgin.im>
parents: 4419
diff changeset
537 item = gtk_image_menu_item_new_with_mnemonic(_("_Open Link in Browser"));
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
538 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
539 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(url_open),
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
540 tempdata);
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
541 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
4756
ee19a87a495f [gaim-migrate @ 5073]
Mark Doliner <markdoliner@pidgin.im>
parents: 4745
diff changeset
542
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
543 gtk_widget_show_all(menu);
4756
ee19a87a495f [gaim-migrate @ 5073]
Mark Doliner <markdoliner@pidgin.im>
parents: 4745
diff changeset
544 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
ee19a87a495f [gaim-migrate @ 5073]
Mark Doliner <markdoliner@pidgin.im>
parents: 4745
diff changeset
545 event_button->button, event_button->time);
4745
24867c379d37 [gaim-migrate @ 5060]
Nathan Walp <nwalp@pidgin.im>
parents: 4740
diff changeset
546
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
547 return TRUE;
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
548 }
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
549 }
4417
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
550 if(event->type == GDK_BUTTON_PRESS && event_button->button == 3)
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
551 return TRUE; /* Clicking the right mouse button on a link shouldn't
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
552 be caught by the regular GtkTextView menu */
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
553 else
43ddfb896fb5 [gaim-migrate @ 4690]
Ari Pollak <ari@debian.org>
parents: 4371
diff changeset
554 return FALSE; /* Let clicks go through if we didn't catch anything */
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
555 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
556
4298
af01cbb94efe [gaim-migrate @ 4552]
Sean Egan <seanegan@pidgin.im>
parents: 4288
diff changeset
557 /* this isn't used yet
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
558 static void
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
559 gtk_smiley_tree_remove (GtkSmileyTree *tree,
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
560 GtkIMHtmlSmiley *smiley)
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
561 {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
562 GtkSmileyTree *t = tree;
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
563 const gchar *x = smiley->smile;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
564 gint len = 0;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
565
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
566 while (*x) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
567 gchar *pos;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
568
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
569 if (!t->values)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
570 return;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
571
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
572 pos = strchr (t->values->str, *x);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
573 if (pos)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
574 t = t->children [(int) pos - (int) t->values->str];
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
575 else
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
576 return;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
577
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
578 x++; len++;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
579 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
580
4141
03df791352aa [gaim-migrate @ 4359]
Ari Pollak <ari@debian.org>
parents: 4140
diff changeset
581 if (t->image) {
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
582 t->image = NULL;
4141
03df791352aa [gaim-migrate @ 4359]
Ari Pollak <ari@debian.org>
parents: 4140
diff changeset
583 }
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
584 }
4298
af01cbb94efe [gaim-migrate @ 4552]
Sean Egan <seanegan@pidgin.im>
parents: 4288
diff changeset
585 */
af01cbb94efe [gaim-migrate @ 4552]
Sean Egan <seanegan@pidgin.im>
parents: 4288
diff changeset
586
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
587
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
588 static gint
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
589 gtk_smiley_tree_lookup (GtkSmileyTree *tree,
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
590 const gchar *text)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
591 {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
592 GtkSmileyTree *t = tree;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
593 const gchar *x = text;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
594 gint len = 0;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
595
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
596 while (*x) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
597 gchar *pos;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
598
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
599 if (!t->values)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
600 break;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
601
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
602 pos = strchr (t->values->str, *x);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
603 if (pos)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
604 t = t->children [(int) pos - (int) t->values->str];
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
605 else
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
606 break;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
607
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
608 x++; len++;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
609 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
610
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
611 if (t->image)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
612 return len;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
613
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
614 return 0;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
615 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
616
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
617 void
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
618 gtk_imhtml_associate_smiley (GtkIMHtml *imhtml,
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
619 gchar *sml,
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
620 GtkIMHtmlSmiley *smiley)
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
621 {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
622 GtkSmileyTree *tree;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
623 g_return_if_fail (imhtml != NULL);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
624 g_return_if_fail (GTK_IS_IMHTML (imhtml));
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
625
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
626 if (sml == NULL)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
627 tree = imhtml->default_smilies;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
628 else if ((tree = g_hash_table_lookup(imhtml->smiley_data, sml))) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
629 } else {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
630 tree = gtk_smiley_tree_new();
4892
37b4a5ac5ebe [gaim-migrate @ 5222]
Nathan Walp <nwalp@pidgin.im>
parents: 4793
diff changeset
631 g_hash_table_insert(imhtml->smiley_data, g_strdup(sml), tree);
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
632 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
633
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
634 gtk_smiley_tree_insert (tree, smiley);
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
635 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
636
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
637 static gboolean
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
638 gtk_imhtml_is_smiley (GtkIMHtml *imhtml,
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
639 GSList *fonts,
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
640 const gchar *text,
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
641 gint *len)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
642 {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
643 GtkSmileyTree *tree;
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
644 GtkIMHtmlFontDetail *font;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
645 char *sml = NULL;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
646
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
647 if (fonts) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
648 font = fonts->data;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
649 sml = font->sml;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
650 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
651
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
652 if (sml == NULL)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
653 tree = imhtml->default_smilies;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
654 else {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
655 tree = g_hash_table_lookup(imhtml->smiley_data, sml);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
656 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
657 if (tree == NULL)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
658 return FALSE;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
659
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
660 *len = gtk_smiley_tree_lookup (tree, text);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
661 return (*len > 0);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
662 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
663
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
664 GdkPixbuf*
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
665 gtk_smiley_tree_image (GtkIMHtml *imhtml,
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
666 const gchar *sml,
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
667 const gchar *text)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
668 {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
669 GtkSmileyTree *t;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
670 const gchar *x = text;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
671 if (sml == NULL)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
672 t = imhtml->default_smilies;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
673 else
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
674 t = g_hash_table_lookup(imhtml->smiley_data, sml);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
675
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
676
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
677 if (t == NULL)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
678 return sml ? gtk_smiley_tree_image(imhtml, NULL, text) : NULL;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
679
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
680 while (*x) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
681 gchar *pos;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
682
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
683 if (!t->values) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
684 return sml ? gtk_smiley_tree_image(imhtml, NULL, text) : NULL;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
685 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
686
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
687 pos = strchr (t->values->str, *x);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
688 if (pos) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
689 t = t->children [(int) pos - (int) t->values->str];
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
690 } else {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
691 return sml ? gtk_smiley_tree_image(imhtml, NULL, text) : NULL;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
692 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
693 x++;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
694 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
695
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
696 if (!t->image->icon)
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
697 t->image->icon = gdk_pixbuf_new_from_file(t->image->file, NULL);
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
698
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
699 return t->image->icon;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
700 }
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
701 #define VALID_TAG(x) if (!g_ascii_strncasecmp (string, x ">", strlen (x ">"))) { \
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
702 *tag = g_strndup (string, strlen (x)); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
703 *len = strlen (x) + 1; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
704 return TRUE; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
705 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
706 (*type)++
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
707
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
708 #define VALID_OPT_TAG(x) if (!g_ascii_strncasecmp (string, x " ", strlen (x " "))) { \
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
709 const gchar *c = string + strlen (x " "); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
710 gchar e = '"'; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
711 gboolean quote = FALSE; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
712 while (*c) { \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
713 if (*c == '"' || *c == '\'') { \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
714 if (quote && (*c == e)) \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
715 quote = !quote; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
716 else if (!quote) { \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
717 quote = !quote; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
718 e = *c; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
719 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
720 } else if (!quote && (*c == '>')) \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
721 break; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
722 c++; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
723 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
724 if (*c) { \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
725 *tag = g_strndup (string, c - string); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
726 *len = c - string + 1; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
727 return TRUE; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
728 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
729 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
730 (*type)++
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
731
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
732
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
733 static gboolean
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
734 gtk_imhtml_is_amp_escape (const gchar *string,
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
735 gchar *replace,
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
736 gint *length)
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
737 {
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
738 g_return_val_if_fail (string != NULL, FALSE);
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
739 g_return_val_if_fail (replace != NULL, FALSE);
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
740 g_return_val_if_fail (length != NULL, FALSE);
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
741
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
742 if (!g_ascii_strncasecmp (string, "&amp;", 5)) {
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
743 *replace = '&';
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
744 *length = 5;
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
745 } else if (!g_ascii_strncasecmp (string, "&lt;", 4)) {
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
746 *replace = '<';
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
747 *length = 4;
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
748 } else if (!g_ascii_strncasecmp (string, "&gt;", 4)) {
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
749 *replace = '>';
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
750 *length = 4;
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
751 } else if (!g_ascii_strncasecmp (string, "&nbsp;", 6)) {
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
752 *replace = ' ';
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
753 *length = 6;
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
754 } else if (!g_ascii_strncasecmp (string, "&copy;", 6)) {
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3705
diff changeset
755 *replace = '©'; /* was: '©' */
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
756 *length = 6;
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
757 } else if (!g_ascii_strncasecmp (string, "&quot;", 6)) {
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
758 *replace = '\"';
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
759 *length = 6;
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
760 } else if (!g_ascii_strncasecmp (string, "&reg;", 5)) {
3717
2fc0789e04e8 [gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents: 3705
diff changeset
761 *replace = '®'; /* was: '®' */
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
762 *length = 5;
5093
7761492245e6 [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 5091
diff changeset
763 } else if (!g_ascii_strncasecmp (string, "&apos;", 6)) {
7761492245e6 [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 5091
diff changeset
764 *replace = '\'';
7761492245e6 [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 5091
diff changeset
765 *length = 6;
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
766 } else if (*(string + 1) == '#') {
2022
c47ca971fd2f [gaim-migrate @ 2032]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2002
diff changeset
767 guint pound = 0;
3004
4fc45282aab6 [gaim-migrate @ 3017]
Sean Egan <seanegan@pidgin.im>
parents: 3000
diff changeset
768 if ((sscanf (string, "&#%u;", &pound) == 1) && pound != 0) {
1472
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
769 if (*(string + 3 + (gint)log10 (pound)) != ';')
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
770 return FALSE;
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
771 *replace = (gchar)pound;
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
772 *length = 2;
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
773 while (isdigit ((gint) string [*length])) (*length)++;
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
774 if (string [*length] == ';') (*length)++;
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
775 } else {
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
776 return FALSE;
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
777 }
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
778 } else {
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
779 return FALSE;
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
780 }
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
781
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
782 return TRUE;
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
783 }
ce83d12b7df9 [gaim-migrate @ 1482]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1463
diff changeset
784
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
785 static gboolean
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
786 gtk_imhtml_is_tag (const gchar *string,
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
787 gchar **tag,
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
788 gint *len,
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
789 gint *type)
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
790 {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
791 *type = 1;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
792
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
793 if (!strchr (string, '>'))
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
794 return FALSE;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
795
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
796 VALID_TAG ("B");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
797 VALID_TAG ("BOLD");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
798 VALID_TAG ("/B");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
799 VALID_TAG ("/BOLD");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
800 VALID_TAG ("I");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
801 VALID_TAG ("ITALIC");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
802 VALID_TAG ("/I");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
803 VALID_TAG ("/ITALIC");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
804 VALID_TAG ("U");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
805 VALID_TAG ("UNDERLINE");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
806 VALID_TAG ("/U");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
807 VALID_TAG ("/UNDERLINE");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
808 VALID_TAG ("S");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
809 VALID_TAG ("STRIKE");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
810 VALID_TAG ("/S");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
811 VALID_TAG ("/STRIKE");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
812 VALID_TAG ("SUB");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
813 VALID_TAG ("/SUB");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
814 VALID_TAG ("SUP");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
815 VALID_TAG ("/SUP");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
816 VALID_TAG ("PRE");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
817 VALID_TAG ("/PRE");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
818 VALID_TAG ("TITLE");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
819 VALID_TAG ("/TITLE");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
820 VALID_TAG ("BR");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
821 VALID_TAG ("HR");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
822 VALID_TAG ("/FONT");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
823 VALID_TAG ("/A");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
824 VALID_TAG ("P");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
825 VALID_TAG ("/P");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
826 VALID_TAG ("H3");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
827 VALID_TAG ("/H3");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
828 VALID_TAG ("HTML");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
829 VALID_TAG ("/HTML");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
830 VALID_TAG ("BODY");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
831 VALID_TAG ("/BODY");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
832 VALID_TAG ("FONT");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
833 VALID_TAG ("HEAD");
2993
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
834 VALID_TAG ("/HEAD");
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
835 VALID_TAG ("BINARY");
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
836 VALID_TAG ("/BINARY");
5093
7761492245e6 [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 5091
diff changeset
837
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
838 VALID_OPT_TAG ("HR");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
839 VALID_OPT_TAG ("FONT");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
840 VALID_OPT_TAG ("BODY");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
841 VALID_OPT_TAG ("A");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
842 VALID_OPT_TAG ("IMG");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
843 VALID_OPT_TAG ("P");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
844 VALID_OPT_TAG ("H3");
5093
7761492245e6 [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 5091
diff changeset
845 VALID_OPT_TAG ("HTML");
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
846
5101
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
847 VALID_TAG ("CITE");
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
848 VALID_TAG ("/CITE");
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
849 VALID_TAG ("EM");
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
850 VALID_TAG ("/EM");
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
851 VALID_TAG ("STRONG");
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
852 VALID_TAG ("/STRONG");
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
853
5104
2a09bf67e875 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
854 VALID_OPT_TAG ("SPAN");
2a09bf67e875 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
855 VALID_TAG ("/SPAN");
5174
7d34d000f3fa [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5118
diff changeset
856 VALID_TAG ("BR/"); /* hack until gtkimhtml handles things better */
5104
2a09bf67e875 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
857
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
858 if (!g_ascii_strncasecmp(string, "!--", strlen ("!--"))) {
2954
fc07d855731d [gaim-migrate @ 2967]
Christian Hammond <chipx86@chipx86.com>
parents: 2898
diff changeset
859 gchar *e = strstr (string + strlen("!--"), "-->");
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
860 if (e) {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
861 *len = e - string + strlen ("-->");
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
862 *tag = g_strndup (string + strlen ("!--"), *len - strlen ("!---->"));
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
863 return TRUE;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
864 }
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
865 }
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
866
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
867 return FALSE;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
868 }
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
869
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
870 static gchar*
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
871 gtk_imhtml_get_html_opt (gchar *tag,
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
872 const gchar *opt)
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
873 {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
874 gchar *t = tag;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
875 gchar *e, *a;
5177
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
876 gchar *val;
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
877 gint len;
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
878 gchar c;
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
879 GString *ret;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
880
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
881 while (g_ascii_strncasecmp (t, opt, strlen (opt))) {
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
882 gboolean quote = FALSE;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
883 if (*t == '\0') break;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
884 while (*t && !((*t == ' ') && !quote)) {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
885 if (*t == '\"')
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
886 quote = ! quote;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
887 t++;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
888 }
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
889 while (*t && (*t == ' ')) t++;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
890 }
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
891
4793
1da93f6c80f3 [gaim-migrate @ 5113]
Nathan Walp <nwalp@pidgin.im>
parents: 4764
diff changeset
892 if (!g_ascii_strncasecmp (t, opt, strlen (opt))) {
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
893 t += strlen (opt);
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
894 } else {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
895 return NULL;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
896 }
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
897
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
898 if ((*t == '\"') || (*t == '\'')) {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
899 e = a = ++t;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
900 while (*e && (*e != *(t - 1))) e++;
2993
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
901 if (*e == '\0') {
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
902 return NULL;
5177
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
903 } else
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
904 val = g_strndup(a, e - a);
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
905 } else {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
906 e = a = t;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
907 while (*e && !isspace ((gint) *e)) e++;
5177
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
908 val = g_strndup(a, e - a);
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
909 }
5177
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
910
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
911 ret = g_string_new("");
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
912 e = val;
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
913 while(*e) {
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
914 if(gtk_imhtml_is_amp_escape(e, &c, &len)) {
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
915 ret = g_string_append_c(ret, c);
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
916 e += len;
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
917 } else {
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
918 ret = g_string_append_c(ret, *e);
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
919 e++;
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
920 }
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
921 }
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
922
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
923 g_free(val);
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
924 val = ret->str;
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
925 g_string_free(ret, FALSE);
7f8a27af0846 [gaim-migrate @ 5541]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
926 return val;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
927 }
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
928
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
929
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
930
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
931 #define NEW_TEXT_BIT 0
4343
48ef0638639a [gaim-migrate @ 4608]
Rob Flynn <gaim@robflynn.com>
parents: 4298
diff changeset
932 #define NEW_COMMENT_BIT 2
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
933 #define NEW_SCALABLE_BIT 1
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
934 #define NEW_BIT(x) ws [wpos] = '\0'; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
935 mark2 = gtk_text_buffer_create_mark(imhtml->text_buffer, NULL, &iter, TRUE); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
936 gtk_text_buffer_insert(imhtml->text_buffer, &iter, ws, -1); \
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
937 gtk_text_buffer_get_end_iter(imhtml->text_buffer, &iter); \
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
938 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &siter, mark2); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
939 gtk_text_buffer_delete_mark(imhtml->text_buffer, mark2); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
940 if (bold) \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
941 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "BOLD", &siter, &iter); \
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
942 if (italics) \
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
943 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "ITALICS", &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
944 if (underline) \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
945 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "UNDERLINE", &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
946 if (strike) \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
947 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "STRIKE", &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
948 if (sub) \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
949 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "SUB", &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
950 if (sup) \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
951 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "SUP", &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
952 if (pre) \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
953 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "PRE", &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
954 if (bg) { \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
955 texttag = gtk_text_buffer_create_tag(imhtml->text_buffer, NULL, "background", bg, NULL); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
956 gtk_text_buffer_apply_tag(imhtml->text_buffer, texttag, &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
957 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
958 if (fonts) { \
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
959 GtkIMHtmlFontDetail *fd = fonts->data; \
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
960 if (fd->fore) { \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
961 texttag = gtk_text_buffer_create_tag(imhtml->text_buffer, NULL, "foreground", fd->fore, NULL); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
962 gtk_text_buffer_apply_tag(imhtml->text_buffer, texttag, &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
963 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
964 if (fd->back) { \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
965 texttag = gtk_text_buffer_create_tag(imhtml->text_buffer, NULL, "background", fd->back, NULL); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
966 gtk_text_buffer_apply_tag(imhtml->text_buffer, texttag, &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
967 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
968 if (fd->face) { \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
969 texttag = gtk_text_buffer_create_tag(imhtml->text_buffer, NULL, "font", fd->face, NULL); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
970 gtk_text_buffer_apply_tag(imhtml->text_buffer, texttag, &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
971 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
972 if (fd->size) { \
5118
b78004b3c6cd [gaim-migrate @ 5481]
Luke Schierer <lschiere@pidgin.im>
parents: 5117
diff changeset
973 texttag = gtk_text_buffer_create_tag(imhtml->text_buffer, NULL, "size-points", (double)POINT_SIZE(fd->size), NULL); \
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
974 gtk_text_buffer_apply_tag(imhtml->text_buffer, texttag, &siter, &iter); \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
975 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
976 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
977 if (url) { \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
978 texttag = gtk_text_buffer_create_tag(imhtml->text_buffer, NULL, "foreground", "blue", "underline", PANGO_UNDERLINE_SINGLE, NULL); \
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
979 g_signal_connect(G_OBJECT(texttag), "event", G_CALLBACK(tag_event), g_strdup(url)); \
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
980 gtk_text_buffer_apply_tag(imhtml->text_buffer, texttag, &siter, &iter); \
4735
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
981 texttag = gtk_text_buffer_create_tag(imhtml->text_buffer, NULL, NULL); \
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
982 g_object_set_data(G_OBJECT(texttag), "link_url", g_strdup(url)); \
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
983 gtk_text_buffer_apply_tag(imhtml->text_buffer, texttag, &siter, &iter); \
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
984 } \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
985 wpos = 0; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
986 ws[0] = 0; \
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
987 gtk_text_buffer_get_end_iter(imhtml->text_buffer, &iter); \
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
988 if (x == NEW_SCALABLE_BIT) { \
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
989 GdkRectangle rect; \
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
990 gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(imhtml), &rect); \
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
991 scalable->add_to(scalable, imhtml, &iter); \
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
992 scalable->scale(scalable, rect.width, rect.height); \
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
993 imhtml->scalables = g_list_append(imhtml->scalables, scalable); \
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
994 gtk_text_buffer_get_end_iter(imhtml->text_buffer, &iter); \
4343
48ef0638639a [gaim-migrate @ 4608]
Rob Flynn <gaim@robflynn.com>
parents: 4298
diff changeset
995 } \
6066
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
996 if (x == NEW_COMMENT_BIT) { \
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
997 gtk_text_buffer_apply_tag_by_name(imhtml->text_buffer, "comment", &siter, &iter); \
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
998 } \
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
999
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1000
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1001
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1002 GString* gtk_imhtml_append_text (GtkIMHtml *imhtml,
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1003 const gchar *text,
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1004 gint len,
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1005 GtkIMHtmlOptions options)
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1006 {
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1007 gint pos = 0;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1008 GString *str = NULL;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1009 GtkTextIter iter, siter;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1010 GtkTextMark *mark, *mark2;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1011 GtkTextTag *texttag;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1012 gchar *ws;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1013 gchar *tag;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1014 gchar *url = NULL;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1015 gchar *bg = NULL;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1016 gint tlen, smilelen, wpos=0;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1017 gint type;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1018 const gchar *c;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1019 gchar amp;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1020
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1021 guint bold = 0,
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1022 italics = 0,
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1023 underline = 0,
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1024 strike = 0,
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1025 sub = 0,
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1026 sup = 0,
1691
c8bd41036372 [gaim-migrate @ 1701]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1647
diff changeset
1027 title = 0,
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1028 pre = 0;
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1029
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1030 GSList *fonts = NULL;
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1031
4612
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1032 GdkRectangle rect;
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1033 int y, height;
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1034
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1035 GtkIMHtmlScalable *scalable = NULL;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1036
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1037 g_return_val_if_fail (imhtml != NULL, NULL);
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1038 g_return_val_if_fail (GTK_IS_IMHTML (imhtml), NULL);
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1039 g_return_val_if_fail (text != NULL, NULL);
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1040 g_return_val_if_fail (len != 0, NULL);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1041
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1042 c = text;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1043 if (len == -1)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1044 len = strlen(text);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1045 ws = g_malloc(len + 1);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1046 ws[0] = 0;
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1047
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1048 if (options & GTK_IMHTML_RETURN_LOG)
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1049 str = g_string_new("");
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1050
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1051 gtk_text_buffer_get_end_iter(imhtml->text_buffer, &iter);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1052 mark = gtk_text_buffer_create_mark (imhtml->text_buffer, NULL, &iter, /* right grav */ FALSE);
4612
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1053
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1054 gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(imhtml), &rect);
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1055 gtk_text_view_get_line_yrange(GTK_TEXT_VIEW(imhtml), &iter, &y, &height);
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1056
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1057 if(((y + height) - (rect.y + rect.height)) > height
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1058 && gtk_text_buffer_get_char_count(imhtml->text_buffer)){
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1059 options |= GTK_IMHTML_NO_SCROLL;
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1060 }
c27625e13a26 [gaim-migrate @ 4901]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4477
diff changeset
1061
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1062 while (pos < len) {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1063 if (*c == '<' && gtk_imhtml_is_tag (c + 1, &tag, &tlen, &type)) {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1064 c++;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1065 pos++;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1066 switch (type)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1067 {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1068 case 1: /* B */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1069 case 2: /* BOLD */
5101
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
1070 case 54: /* STRONG */
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1071 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1072 bold++;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1073 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1074 case 3: /* /B */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1075 case 4: /* /BOLD */
5101
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
1076 case 55: /* /STRONG */
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1077 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1078 if (bold)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1079 bold--;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1080 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1081 case 5: /* I */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1082 case 6: /* ITALIC */
5101
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
1083 case 52: /* EM */
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1084 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1085 italics++;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1086 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1087 case 7: /* /I */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1088 case 8: /* /ITALIC */
5101
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
1089 case 53: /* /EM */
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1090 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1091 if (italics)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1092 italics--;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1093 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1094 case 9: /* U */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1095 case 10: /* UNDERLINE */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1096 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1097 underline++;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1098 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1099 case 11: /* /U */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1100 case 12: /* /UNDERLINE */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1101 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1102 if (underline)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1103 underline--;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1104 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1105 case 13: /* S */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1106 case 14: /* STRIKE */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1107 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1108 strike++;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1109 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1110 case 15: /* /S */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1111 case 16: /* /STRIKE */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1112 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1113 if (strike)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1114 strike--;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1115 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1116 case 17: /* SUB */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1117 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1118 sub++;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1119 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1120 case 18: /* /SUB */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1121 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1122 if (sub)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1123 sub--;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1124 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1125 case 19: /* SUP */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1126 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1127 sup++;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1128 break;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1129 case 20: /* /SUP */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1130 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1131 if (sup)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1132 sup--;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1133 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1134 case 21: /* PRE */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1135 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1136 pre++;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1137 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1138 case 22: /* /PRE */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1139 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1140 if (pre)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1141 pre--;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1142 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1143 case 23: /* TITLE */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1144 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1145 title++;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1146 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1147 case 24: /* /TITLE */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1148 if (title) {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1149 if (options & GTK_IMHTML_NO_TITLE) {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1150 wpos = 0;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1151 ws [wpos] = '\0';
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1152 }
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1153 title--;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1154 }
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1155 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1156 case 25: /* BR */
5174
7d34d000f3fa [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5118
diff changeset
1157 case 58: /* BR/ */
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1158 ws[wpos] = '\n';
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1159 wpos++;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1160 NEW_BIT (NEW_TEXT_BIT);
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1161 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1162 case 26: /* HR */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1163 case 42: /* HR (opt) */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1164 ws[wpos++] = '\n';
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1165 scalable = gtk_imhtml_hr_new();
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1166 NEW_BIT(NEW_SCALABLE_BIT);
4343
48ef0638639a [gaim-migrate @ 4608]
Rob Flynn <gaim@robflynn.com>
parents: 4298
diff changeset
1167 ws[wpos++] = '\n';
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1168 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1169 case 27: /* /FONT */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1170 if (fonts) {
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1171 GtkIMHtmlFontDetail *font = fonts->data;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1172 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1173 fonts = g_slist_remove (fonts, font);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1174 if (font->face)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1175 g_free (font->face);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1176 if (font->fore)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1177 g_free (font->fore);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1178 if (font->back)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1179 g_free (font->back);
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1180 if (font->sml)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1181 g_free (font->sml);
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1182 g_free (font);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1183 }
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1184 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1185 case 28: /* /A */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1186 if (url) {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1187 NEW_BIT(NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1188 g_free(url);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1189 url = NULL;
2993
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
1190 break;
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
1191 }
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1192 case 29: /* P */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1193 case 30: /* /P */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1194 case 31: /* H3 */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1195 case 32: /* /H3 */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1196 case 33: /* HTML */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1197 case 34: /* /HTML */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1198 case 35: /* BODY */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1199 case 36: /* /BODY */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1200 case 37: /* FONT */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1201 case 38: /* HEAD */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1202 case 39: /* /HEAD */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1203 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1204 case 40: /* BINARY */
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1205 NEW_BIT (NEW_TEXT_BIT);
4997
98022a16490b [gaim-migrate @ 5332]
Nathan Walp <nwalp@pidgin.im>
parents: 4947
diff changeset
1206 while (pos < len && g_ascii_strncasecmp("</BINARY>", c, strlen("</BINARY>"))) {
98022a16490b [gaim-migrate @ 5332]
Nathan Walp <nwalp@pidgin.im>
parents: 4947
diff changeset
1207 c++;
98022a16490b [gaim-migrate @ 5332]
Nathan Walp <nwalp@pidgin.im>
parents: 4947
diff changeset
1208 pos++;
98022a16490b [gaim-migrate @ 5332]
Nathan Walp <nwalp@pidgin.im>
parents: 4947
diff changeset
1209 }
98022a16490b [gaim-migrate @ 5332]
Nathan Walp <nwalp@pidgin.im>
parents: 4947
diff changeset
1210 c = c - tlen; /* Because it will add this later */
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1211 break;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1212 case 41: /* /BINARY */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1213 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1214 case 43: /* FONT (opt) */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1215 {
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1216 gchar *color, *back, *face, *size, *sml;
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1217 GtkIMHtmlFontDetail *font, *oldfont = NULL;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1218 color = gtk_imhtml_get_html_opt (tag, "COLOR=");
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1219 back = gtk_imhtml_get_html_opt (tag, "BACK=");
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1220 face = gtk_imhtml_get_html_opt (tag, "FACE=");
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1221 size = gtk_imhtml_get_html_opt (tag, "SIZE=");
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1222 sml = gtk_imhtml_get_html_opt (tag, "SML=");
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1223 if (!(color || back || face || size || sml))
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1224 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1225
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1226 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1227
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1228 font = g_new0 (GtkIMHtmlFontDetail, 1);
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1229 if (fonts)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1230 oldfont = fonts->data;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1231
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1232 if (color && !(options & GTK_IMHTML_NO_COLOURS))
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1233 font->fore = color;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1234 else if (oldfont && oldfont->fore)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1235 font->fore = g_strdup(oldfont->fore);
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1236
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1237 if (back && !(options & GTK_IMHTML_NO_COLOURS))
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1238 font->back = back;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1239 else if (oldfont && oldfont->back)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1240 font->back = g_strdup(oldfont->back);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1241
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1242 if (face && !(options & GTK_IMHTML_NO_FONTS))
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1243 font->face = face;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1244 else if (oldfont && oldfont->face)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1245 font->face = g_strdup(oldfont->face);
4629
7ac4830de853 [gaim-migrate @ 4920]
Mark Doliner <markdoliner@pidgin.im>
parents: 4612
diff changeset
1246 if (font->face && (atoi(font->face) > 100)) {
7ac4830de853 [gaim-migrate @ 4920]
Mark Doliner <markdoliner@pidgin.im>
parents: 4612
diff changeset
1247 g_free(font->face);
7ac4830de853 [gaim-migrate @ 4920]
Mark Doliner <markdoliner@pidgin.im>
parents: 4612
diff changeset
1248 font->face = g_strdup("100");
7ac4830de853 [gaim-migrate @ 4920]
Mark Doliner <markdoliner@pidgin.im>
parents: 4612
diff changeset
1249 }
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1250
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1251 if (sml)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1252 font->sml = sml;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1253 else if (oldfont && oldfont->sml)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1254 font->sml = g_strdup(oldfont->sml);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1255
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1256 if (size && !(options & GTK_IMHTML_NO_SIZES)) {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1257 if (*size == '+') {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1258 sscanf (size + 1, "%hd", &font->size);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1259 font->size += 3;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1260 } else if (*size == '-') {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1261 sscanf (size + 1, "%hd", &font->size);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1262 font->size = MAX (0, 3 - font->size);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1263 } else if (isdigit (*size)) {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1264 sscanf (size, "%hd", &font->size);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1265 }
6042
e329fe962c9a [gaim-migrate @ 6492]
Mark Doliner <markdoliner@pidgin.im>
parents: 5967
diff changeset
1266 if (font->size > 100)
e329fe962c9a [gaim-migrate @ 6492]
Mark Doliner <markdoliner@pidgin.im>
parents: 5967
diff changeset
1267 font->size = 100;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1268 } else if (oldfont)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1269 font->size = oldfont->size;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1270 g_free(size);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1271 fonts = g_slist_prepend (fonts, font);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1272 }
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1273 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1274 case 44: /* BODY (opt) */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1275 if (!(options & GTK_IMHTML_NO_COLOURS)) {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1276 char *bgcolor = gtk_imhtml_get_html_opt (tag, "BGCOLOR=");
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1277 if (bgcolor) {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1278 NEW_BIT(NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1279 if (bg)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1280 g_free(bg);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1281 bg = bgcolor;
2885
213e2a58cbf6 [gaim-migrate @ 2898]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2871
diff changeset
1282 }
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1283 }
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1284 break;
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1285 case 45: /* A (opt) */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1286 {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1287 gchar *href = gtk_imhtml_get_html_opt (tag, "HREF=");
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1288 if (href) {
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1289 NEW_BIT (NEW_TEXT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1290 if (url)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1291 g_free (url);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1292 url = href;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1293 }
2993
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
1294 }
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1295 break;
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1296 case 46: /* IMG (opt) */
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1297 {
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1298 gchar *src = gtk_imhtml_get_html_opt (tag, "SRC=");
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1299 gchar *id = gtk_imhtml_get_html_opt (tag, "ID=");
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1300 gchar *datasize = gtk_imhtml_get_html_opt (tag, "DATASIZE=");
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1301 gint im_len = datasize?atoi(datasize):0;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1302
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1303 if (src && id && im_len && im_len <= len - pos) {
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1304 /* This is an embedded IM image, or is it? */
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1305 char *tmp = NULL;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1306 const char *alltext;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1307 guchar *imagedata = NULL;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1308
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1309 GdkPixbufLoader *load;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1310 GdkPixbuf *imagepb = NULL;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1311 GError *error = NULL;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1312
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1313 tmp = g_strdup_printf("<DATA ID=\"%s\" SIZE=\"%s\">", id, datasize);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1314 alltext = strstr(c, tmp);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1315 imagedata = g_memdup(alltext + strlen(tmp), im_len);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1316
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1317 g_free(tmp);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1318
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1319 load = gdk_pixbuf_loader_new();
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1320 if (!gdk_pixbuf_loader_write(load, imagedata, im_len, &error)){
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1321 fprintf(stderr, "IM Image corrupted or unreadable.: %s\n", error->message);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1322 } else {
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1323 imagepb = gdk_pixbuf_loader_get_pixbuf(load);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1324 if (imagepb) {
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1325 scalable = gtk_imhtml_image_new(imagepb, g_strdup(src));
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1326 NEW_BIT(NEW_SCALABLE_BIT);
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1327 g_object_unref(imagepb);
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1328 }
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1329 }
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1330
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1331 gdk_pixbuf_loader_close(load, NULL);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1332
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1333
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1334 g_free(imagedata);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1335 g_free(id);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1336 g_free(datasize);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1337 g_free(src);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1338
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1339 break;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1340 }
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1341 g_free(id);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1342 g_free(datasize);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1343 g_free(src);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1344 }
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1345 case 47: /* P (opt) */
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1346 case 48: /* H3 (opt) */
5093
7761492245e6 [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 5091
diff changeset
1347 case 49: /* HTML (opt) */
5101
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
1348 case 50: /* CITE */
b771f92a4f10 [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
1349 case 51: /* /CITE */
5104
2a09bf67e875 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
1350 case 56: /* SPAN */
2a09bf67e875 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
1351 case 57: /* /SPAN */
2993
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
1352 break;
5174
7d34d000f3fa [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5118
diff changeset
1353 case 59: /* comment */
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1354 NEW_BIT (NEW_TEXT_BIT);
6066
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
1355 wpos = g_snprintf (ws, len, "%s", tag);
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1356 NEW_BIT (NEW_COMMENT_BIT);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1357 break;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1358 default:
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1359 break;
2993
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
1360 }
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1361 c += tlen;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1362 pos += tlen;
4138
727cb2d2b93c [gaim-migrate @ 4356]
Ari Pollak <ari@debian.org>
parents: 4046
diff changeset
1363 if(tag)
727cb2d2b93c [gaim-migrate @ 4356]
Ari Pollak <ari@debian.org>
parents: 4046
diff changeset
1364 g_free(tag); /* This was allocated back in VALID_TAG() */
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1365 } else if (*c == '&' && gtk_imhtml_is_amp_escape (c, &amp, &tlen)) {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1366 ws [wpos++] = amp;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1367 c += tlen;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1368 pos += tlen;
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1369 } else if (*c == '\n') {
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1370 if (!(options & GTK_IMHTML_NO_NEWLINE)) {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1371 ws[wpos] = '\n';
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1372 wpos++;
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1373 NEW_BIT (NEW_TEXT_BIT);
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1374 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1375 c++;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1376 pos++;
4253
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
1377 } else if (imhtml->show_smileys && (gtk_imhtml_is_smiley (imhtml, fonts, c, &smilelen) || gtk_imhtml_is_smiley(imhtml, NULL, c, &smilelen))) {
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1378 GtkIMHtmlFontDetail *fd;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1379 gchar *sml = NULL;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1380 if (fonts) {
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1381 fd = fonts->data;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1382 sml = fd->sml;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1383 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1384 NEW_BIT (NEW_TEXT_BIT);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1385 wpos = g_snprintf (ws, smilelen + 1, "%s", c);
4263
054b3ea4e7c5 [gaim-migrate @ 4514]
Sean Egan <seanegan@pidgin.im>
parents: 4253
diff changeset
1386 gtk_text_buffer_insert_pixbuf(imhtml->text_buffer, &iter, gtk_smiley_tree_image (imhtml, sml, ws));
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1387 c += smilelen;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1388 pos += smilelen;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1389 wpos = 0;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1390 ws[0] = 0;
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1391 } else if (*c) {
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1392 ws [wpos++] = *c++;
2856
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1393 pos++;
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1394 } else {
046ed5e89321 [gaim-migrate @ 2869]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2826
diff changeset
1395 break;
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1396 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1397 }
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1398
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1399 NEW_BIT(NEW_TEXT_BIT);
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1400 if (url) {
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1401 g_free (url);
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1402 if (str)
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1403 str = g_string_append (str, "</A>");
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1404 }
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1405
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1406 while (fonts) {
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1407 GtkIMHtmlFontDetail *font = fonts->data;
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1408 fonts = g_slist_remove (fonts, font);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1409 if (font->face)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1410 g_free (font->face);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1411 if (font->fore)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1412 g_free (font->fore);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1413 if (font->back)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1414 g_free (font->back);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1415 if (font->sml)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1416 g_free (font->sml);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1417 g_free (font);
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1418 if (str)
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1419 str = g_string_append (str, "</FONT>");
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1420 }
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1421
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1422 if (str) {
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1423 while (bold) {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1424 str = g_string_append (str, "</B>");
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1425 bold--;
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1426 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1427 while (italics) {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1428 str = g_string_append (str, "</I>");
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1429 italics--;
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1430 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1431 while (underline) {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1432 str = g_string_append (str, "</U>");
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1433 underline--;
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1434 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1435 while (strike) {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1436 str = g_string_append (str, "</S>");
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1437 strike--;
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1438 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1439 while (sub) {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1440 str = g_string_append (str, "</SUB>");
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1441 sub--;
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1442 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1443 while (sup) {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1444 str = g_string_append (str, "</SUP>");
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1445 sup--;
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1446 }
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1447 while (title) {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1448 str = g_string_append (str, "</TITLE>");
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1449 title--;
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1450 }
1691
c8bd41036372 [gaim-migrate @ 1701]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1647
diff changeset
1451 while (pre) {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1452 str = g_string_append (str, "</PRE>");
1691
c8bd41036372 [gaim-migrate @ 1701]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1647
diff changeset
1453 pre--;
c8bd41036372 [gaim-migrate @ 1701]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1647
diff changeset
1454 }
1428
c14bab2b74bb [gaim-migrate @ 1438]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1455 }
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1456 g_free (ws);
4630
14945964677b [gaim-migrate @ 4921]
Nathan Walp <nwalp@pidgin.im>
parents: 4629
diff changeset
1457 if(bg)
14945964677b [gaim-migrate @ 4921]
Nathan Walp <nwalp@pidgin.im>
parents: 4629
diff changeset
1458 g_free(bg);
4032
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1459 if (!(options & GTK_IMHTML_NO_SCROLL))
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1460 gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (imhtml), mark,
e93f7af4a610 [gaim-migrate @ 4238]
Sean Egan <seanegan@pidgin.im>
parents: 3941
diff changeset
1461 0, TRUE, 0.0, 1.0);
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1462 gtk_text_buffer_delete_mark (imhtml->text_buffer, mark);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1463 return str;
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1464 }
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1465
4892
37b4a5ac5ebe [gaim-migrate @ 5222]
Nathan Walp <nwalp@pidgin.im>
parents: 4793
diff changeset
1466 void gtk_imhtml_remove_smileys(GtkIMHtml *imhtml)
37b4a5ac5ebe [gaim-migrate @ 5222]
Nathan Walp <nwalp@pidgin.im>
parents: 4793
diff changeset
1467 {
4288
a93533dc8be2 [gaim-migrate @ 4541]
Sean Egan <seanegan@pidgin.im>
parents: 4264
diff changeset
1468 g_hash_table_destroy(imhtml->smiley_data);
a93533dc8be2 [gaim-migrate @ 4541]
Sean Egan <seanegan@pidgin.im>
parents: 4264
diff changeset
1469 gtk_smiley_tree_destroy(imhtml->default_smilies);
4892
37b4a5ac5ebe [gaim-migrate @ 5222]
Nathan Walp <nwalp@pidgin.im>
parents: 4793
diff changeset
1470 imhtml->smiley_data = g_hash_table_new_full(g_str_hash, g_str_equal,
4902
e7cb2fed937e [gaim-migrate @ 5236]
Nathan Walp <nwalp@pidgin.im>
parents: 4895
diff changeset
1471 g_free, (GDestroyNotify)gtk_smiley_tree_destroy);
4288
a93533dc8be2 [gaim-migrate @ 4541]
Sean Egan <seanegan@pidgin.im>
parents: 4264
diff changeset
1472 imhtml->default_smilies = gtk_smiley_tree_new();
a93533dc8be2 [gaim-migrate @ 4541]
Sean Egan <seanegan@pidgin.im>
parents: 4264
diff changeset
1473 }
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1474 void gtk_imhtml_show_smileys (GtkIMHtml *imhtml,
4253
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
1475 gboolean show)
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
1476 {
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
1477 imhtml->show_smileys = show;
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
1478 }
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1479
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1480 void gtk_imhtml_show_comments (GtkIMHtml *imhtml,
4253
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
1481 gboolean show)
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
1482 {
6066
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
1483 GtkTextIter iter;
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
1484 GtkTextTagTable *table = gtk_text_buffer_get_tag_table(imhtml->text_buffer);
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
1485 GtkTextTag *tag = gtk_text_tag_table_lookup(table, "comment");
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
1486 g_object_set(G_OBJECT(tag), "invisible", !show, NULL);
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
1487 gtk_text_buffer_get_end_iter(imhtml->text_buffer, &iter);
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
1488 gtk_text_buffer_move_mark_by_name(imhtml->text_buffer, "insert", &iter);
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
1489 gtk_text_buffer_move_mark_by_name(imhtml->text_buffer, "selection_bound", &iter);
444d1ed0a273 [gaim-migrate @ 6516]
Ka-Hing Cheung <khc@pidgin.im>
parents: 6056
diff changeset
1490
4253
a1fa2170cb2d [gaim-migrate @ 4504]
Sean Egan <seanegan@pidgin.im>
parents: 4201
diff changeset
1491 }
1780
431333222954 [gaim-migrate @ 1790]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1738
diff changeset
1492
431333222954 [gaim-migrate @ 1790]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1738
diff changeset
1493 void
431333222954 [gaim-migrate @ 1790]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1738
diff changeset
1494 gtk_imhtml_clear (GtkIMHtml *imhtml)
431333222954 [gaim-migrate @ 1790]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1738
diff changeset
1495 {
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1496 GtkTextIter start, end;
2993
0340d0a8b810 [gaim-migrate @ 3006]
Rob Flynn <gaim@robflynn.com>
parents: 2982
diff changeset
1497
3922
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1498 gtk_text_buffer_get_start_iter(imhtml->text_buffer, &start);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1499 gtk_text_buffer_get_end_iter(imhtml->text_buffer, &end);
61808e62e68e [gaim-migrate @ 4094]
Sean Egan <seanegan@pidgin.im>
parents: 3717
diff changeset
1500 gtk_text_buffer_delete(imhtml->text_buffer, &start, &end);
1780
431333222954 [gaim-migrate @ 1790]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1738
diff changeset
1501 }
2363
0767c14d7879 [gaim-migrate @ 2376]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 2349
diff changeset
1502
4046
3b7f7799fe5b [gaim-migrate @ 4254]
Sean Egan <seanegan@pidgin.im>
parents: 4041
diff changeset
1503 void gtk_imhtml_page_up (GtkIMHtml *imhtml)
3b7f7799fe5b [gaim-migrate @ 4254]
Sean Egan <seanegan@pidgin.im>
parents: 4041
diff changeset
1504 {
5282
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1505 GdkRectangle rect;
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1506 GtkTextIter iter;
4046
3b7f7799fe5b [gaim-migrate @ 4254]
Sean Egan <seanegan@pidgin.im>
parents: 4041
diff changeset
1507
5282
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1508 gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(imhtml), &rect);
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1509 gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(imhtml), &iter, rect.x,
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1510 rect.y - rect.height);
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1511 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(imhtml), &iter, 0, TRUE, 0, 0);
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1512
4046
3b7f7799fe5b [gaim-migrate @ 4254]
Sean Egan <seanegan@pidgin.im>
parents: 4041
diff changeset
1513 }
5282
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1514 void gtk_imhtml_page_down (GtkIMHtml *imhtml)
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1515 {
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1516 GdkRectangle rect;
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1517 GtkTextIter iter;
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1518
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1519 gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(imhtml), &rect);
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1520 gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(imhtml), &iter, rect.x,
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1521 rect.y + rect.height);
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1522 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(imhtml), &iter, 0, TRUE, 0, 0);
bd9ed6f2175c [gaim-migrate @ 5654]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5177
diff changeset
1523 }
4735
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
1524
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1525 /* GtkIMHtmlScalable, gtk_imhtml_image, gtk_imhtml_hr */
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1526 GtkIMHtmlScalable *gtk_imhtml_image_new(GdkPixbuf *img, gchar *filename)
4735
ac5f2489f6ee [gaim-migrate @ 5050]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4635
diff changeset
1527 {
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1528 GtkIMHtmlImage *im_image = g_malloc(sizeof(GtkIMHtmlImage));
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1529 GtkImage *image = GTK_IMAGE(gtk_image_new_from_pixbuf(img));
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1530
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1531 GTK_IMHTML_SCALABLE(im_image)->scale = gtk_imhtml_image_scale;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1532 GTK_IMHTML_SCALABLE(im_image)->add_to = gtk_imhtml_image_add_to;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1533 GTK_IMHTML_SCALABLE(im_image)->free = gtk_imhtml_image_free;
5046
ba5af38017fa [gaim-migrate @ 5394]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5020
diff changeset
1534
ba5af38017fa [gaim-migrate @ 5394]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5020
diff changeset
1535 im_image->pixbuf = img;
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1536 im_image->image = image;
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1537 im_image->width = gdk_pixbuf_get_width(img);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1538 im_image->height = gdk_pixbuf_get_height(img);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1539 im_image->mark = NULL;
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1540 im_image->filename = filename;
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1541
5046
ba5af38017fa [gaim-migrate @ 5394]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5020
diff changeset
1542 g_object_ref(img);
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1543 return GTK_IMHTML_SCALABLE(im_image);
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1544 }
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1545
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1546 void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height)
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1547 {
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1548 GtkIMHtmlImage *image = (GtkIMHtmlImage *)scale;
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1549
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1550 if(image->width > width || image->height > height){
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1551 GdkPixbuf *new_image = NULL;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1552 float factor;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1553 int new_width = image->width, new_height = image->height;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1554
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1555 if(image->width > width){
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1556 factor = (float)(width)/image->width;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1557 new_width = width;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1558 new_height = image->height * factor;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1559 }
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1560 if(new_height > height){
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1561 factor = (float)(height)/new_height;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1562 new_height = height;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1563 new_width = new_width * factor;
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1564 }
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1565
5046
ba5af38017fa [gaim-migrate @ 5394]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5020
diff changeset
1566 new_image = gdk_pixbuf_scale_simple(image->pixbuf, new_width, new_height, GDK_INTERP_BILINEAR);
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1567 gtk_image_set_from_pixbuf(image->image, new_image);
4895
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1568 g_object_unref(G_OBJECT(new_image));
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1569 }
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1570 }
51794f61995e [gaim-migrate @ 5227]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4892
diff changeset
1571
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1572 static void write_img_to_file(GtkWidget *w, GtkFileSelection *sel)
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1573 {
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1574 const gchar *filename = gtk_file_selection_get_filename(sel);
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1575 gchar *dirname;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1576 GtkIMHtmlImage *image = g_object_get_data(G_OBJECT(sel), "GtkIMHtmlImage");
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1577 gchar *type = NULL;
5019
ac3e5e1f588a [gaim-migrate @ 5355]
Luke Schierer <lschiere@pidgin.im>
parents: 5015
diff changeset
1578 GError *error = NULL;
5015
3a8f6559f866 [gaim-migrate @ 5351]
Nathan Walp <nwalp@pidgin.im>
parents: 5012
diff changeset
1579 #if GTK_CHECK_VERSION(2,2,0)
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1580 GSList *formats = gdk_pixbuf_get_formats();
5959
827dbe4b5bb2 [gaim-migrate @ 6405]
Mark Doliner <markdoliner@pidgin.im>
parents: 5582
diff changeset
1581 #endif
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1582
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1583 if (g_file_test(filename, G_FILE_TEST_IS_DIR)) {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1584 /* append a / if needed */
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1585 if (filename[strlen(filename) - 1] != '/') {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1586 dirname = g_strconcat(filename, "/", NULL);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1587 } else {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1588 dirname = g_strdup(filename);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1589 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1590 gtk_file_selection_set_filename(sel, dirname);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1591 g_free(dirname);
5959
827dbe4b5bb2 [gaim-migrate @ 6405]
Mark Doliner <markdoliner@pidgin.im>
parents: 5582
diff changeset
1592 return;
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1593 }
5959
827dbe4b5bb2 [gaim-migrate @ 6405]
Mark Doliner <markdoliner@pidgin.im>
parents: 5582
diff changeset
1594
827dbe4b5bb2 [gaim-migrate @ 6405]
Mark Doliner <markdoliner@pidgin.im>
parents: 5582
diff changeset
1595 #if GTK_CHECK_VERSION(2,2,0)
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1596 while(formats){
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1597 GdkPixbufFormat *format = formats->data;
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1598 gchar **extensions = gdk_pixbuf_format_get_extensions(format);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1599 gpointer p = extensions;
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1600
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1601 while(gdk_pixbuf_format_is_writable(format) && extensions && extensions[0]){
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1602 gchar *fmt_ext = extensions[0];
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1603 const gchar* file_ext = filename + strlen(filename) - strlen(fmt_ext);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1604
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1605 if(!strcmp(fmt_ext, file_ext)){
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1606 type = gdk_pixbuf_format_get_name(format);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1607 break;
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1608 }
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1609
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1610 extensions++;
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1611 }
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1612
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1613 g_strfreev(p);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1614
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1615 if(type)
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1616 break;
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1617
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1618 formats = formats->next;
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1619 }
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1620
5020
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1621 g_slist_free(formats);
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1622 #else
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1623 /* this is really ugly code, but I think it will work */
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1624 char *basename = g_path_get_basename(filename);
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1625 char *ext = strrchr(basename, '.');
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1626
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1627 if(ext) {
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1628 ext++;
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1629 if(!g_ascii_strcasecmp(ext, "jpeg") || !g_ascii_strcasecmp(ext, "jpg"))
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1630 type = g_strdup("jpeg");
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1631 else if(!g_ascii_strcasecmp(ext, "png"))
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1632 type = g_strdup("png");
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1633 }
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1634
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1635 g_free(basename);
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1636 #endif
2c5a2fbb55b5 [gaim-migrate @ 5356]
Nathan Walp <nwalp@pidgin.im>
parents: 5019
diff changeset
1637
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1638 /* If I can't find a valid type, I will just tell the user about it and then assume
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1639 it's a png */
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1640 if(!type){
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1641 gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1642 _("Unable to guess the image type based on the file extension supplied. Defaulting to PNG."));
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1643 type = g_strdup("png");
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1644 }
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1645
5046
ba5af38017fa [gaim-migrate @ 5394]
Ka-Hing Cheung <khc@pidgin.im>
parents: 5020
diff changeset
1646 gdk_pixbuf_save(image->pixbuf, filename, type, &error, NULL);
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1647
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1648 if(error){
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1649 gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1650 _("Error saving image: %s"), error->message);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1651 g_error_free(error);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1652 }
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1653
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1654 g_free(type);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1655 }
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1656
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1657 static void gtk_imhtml_image_save(GtkWidget *w, GtkIMHtmlImage *image)
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1658 {
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1659 GtkWidget *sel = gtk_file_selection_new(_("Save Image"));
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1660
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1661 gtk_file_selection_set_filename(GTK_FILE_SELECTION(sel), image->filename);
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1662 g_object_set_data(G_OBJECT(sel), "GtkIMHtmlImage", image);
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1663 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(sel)->ok_button), "clicked",
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1664 G_CALLBACK(write_img_to_file), sel);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1665
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1666 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(sel)->ok_button), "clicked",
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1667 G_CALLBACK(gtk_widget_destroy), sel);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1668 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(sel)->cancel_button), "clicked",
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1669 G_CALLBACK(gtk_widget_destroy), sel);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1670
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1671 gtk_widget_show(sel);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1672 }
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1673
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1674 static gboolean gtk_imhtml_image_clicked(GtkWidget *w, GdkEvent *event, GtkIMHtmlImage *image)
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1675 {
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1676 GdkEventButton *event_button = (GdkEventButton *) event;
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1677
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1678 if (event->type == GDK_BUTTON_RELEASE) {
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1679 if(event_button->button == 3) {
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1680 GtkWidget *img, *item, *menu;
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1681 gchar *text = g_strdup_printf(_("_Save Image..."));
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1682 menu = gtk_menu_new();
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1683
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1684 /* buttons and such */
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1685 img = gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1686 item = gtk_image_menu_item_new_with_mnemonic(text);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1687 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img);
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1688 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(gtk_imhtml_image_save), image);
5012
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1689 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1690
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1691 gtk_widget_show_all(menu);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1692 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1693 event_button->button, event_button->time);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1694
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1695 g_free(text);
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1696 return TRUE;
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1697 }
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1698 }
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1699 if(event->type == GDK_BUTTON_PRESS && event_button->button == 3)
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1700 return TRUE; /* Clicking the right mouse button on a link shouldn't
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1701 be caught by the regular GtkTextView menu */
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1702 else
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1703 return FALSE; /* Let clicks go through if we didn't catch anything */
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1704
a6e5bbd44d89 [gaim-migrate @ 5348]
Ka-Hing Cheung <khc@pidgin.im>
parents: 4997
diff changeset
1705 }
5967
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1706 void gtk_imhtml_image_free(GtkIMHtmlScalable *scale)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1707 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1708 GtkIMHtmlImage *image = (GtkIMHtmlImage *)scale;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1709
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1710 g_object_unref(image->pixbuf);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1711 g_free(image->filename);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1712 g_free(scale);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1713 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1714
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1715 void gtk_imhtml_image_add_to(GtkIMHtmlScalable *scale, GtkIMHtml *imhtml, GtkTextIter *iter)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1716 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1717 GtkIMHtmlImage *image = (GtkIMHtmlImage *)scale;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1718 GtkWidget *box = gtk_event_box_new();
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1719 GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(imhtml->text_buffer, iter);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1720
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1721 gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(image->image));
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1722
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1723 gtk_widget_show(GTK_WIDGET(image->image));
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1724 gtk_widget_show(box);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1725
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1726 gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(imhtml), box, anchor);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1727 g_signal_connect(G_OBJECT(box), "event", G_CALLBACK(gtk_imhtml_image_clicked), image);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1728 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1729
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1730 GtkIMHtmlScalable *gtk_imhtml_hr_new()
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1731 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1732 GtkIMHtmlHr *hr = g_malloc(sizeof(GtkIMHtmlHr));
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1733
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1734 GTK_IMHTML_SCALABLE(hr)->scale = gtk_imhtml_hr_scale;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1735 GTK_IMHTML_SCALABLE(hr)->add_to = gtk_imhtml_hr_add_to;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1736 GTK_IMHTML_SCALABLE(hr)->free = gtk_imhtml_hr_free;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1737
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1738 hr->sep = gtk_hseparator_new();
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1739 gtk_widget_set_size_request(hr->sep, 5000, 2);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1740 gtk_widget_show(hr->sep);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1741
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1742 return GTK_IMHTML_SCALABLE(hr);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1743 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1744
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1745 void gtk_imhtml_hr_scale(GtkIMHtmlScalable *scale, int width, int height)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1746 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1747 gtk_widget_set_size_request(((GtkIMHtmlHr *)scale)->sep, width, 2);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1748 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1749
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1750 void gtk_imhtml_hr_add_to(GtkIMHtmlScalable *scale, GtkIMHtml *imhtml, GtkTextIter *iter)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1751 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1752 GtkIMHtmlHr *hr = (GtkIMHtmlHr *)scale;
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1753 GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(imhtml->text_buffer, iter);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1754
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1755 gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(imhtml), hr->sep, anchor);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1756 }
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1757
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1758 void gtk_imhtml_hr_free(GtkIMHtmlScalable *scale)
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1759 {
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1760 /* gtk_widget_destroy(((GtkIMHtmlHr *)scale)->sep); */
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1761 g_free(scale);
df8268ccde45 [gaim-migrate @ 6414]
Mark Doliner <markdoliner@pidgin.im>
parents: 5966
diff changeset
1762 }

mercurial