Mercurial > pidgin
annotate src/gtkimhtmltoolbar.c @ 11261:b53606580f68
[gaim-migrate @ 13439]
Patch #1226486 from Levi Bard
Fixes bug #1224178
If you change the topic in a chat room and that topic change is rejected, the
topic field is wrong -- it shows the new topic even thought it didn't get set.
This patch resets the GUI's topic immediately when you hit enter. Then, if the
topic change is successful, the server will echo the topic change back to us
and we'll update the GUI to the new topic.
The only question is, does the server always echo the topic back to us? From the
core's point of view, I'm ready to assume yes. It's the case for both IRC and
Jabber*. If someone could test changing a topic in SILC or Zephyr, that'd be
great. If servers using those protocols do not echo the topic back, the prpl
will have to fake it as appropriate.
* I didn't actually test on Jabber, but Nathan said the server will echo the
topic change back. If it's broken, let me know.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sun, 14 Aug 2005 06:55:57 +0000 |
parents | a511b77a368b |
children | 477e5cca8287 |
rev | line source |
---|---|
8317 | 1 /* |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10138
diff
changeset
|
2 * @file gtkimhtmltoolbar.c GTK+ IMHtml Toolbar |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10138
diff
changeset
|
3 * @ingroup gtkui |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10138
diff
changeset
|
4 * |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10138
diff
changeset
|
5 * gaim |
8317 | 6 * |
7 * Gaim is the legal property of its developers, whose names are too numerous | |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 * | |
25 */ | |
9791 | 26 #include "internal.h" |
27 #include "gtkgaim.h" | |
8317 | 28 |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
29 #include "imgstore.h" |
8317 | 30 #include "notify.h" |
31 #include "request.h" | |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10138
diff
changeset
|
32 #include "gtkstock.h" |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
33 #include "util.h" |
8317 | 34 |
9730 | 35 #include "gtkdialogs.h" |
36 #include "gtkimhtmltoolbar.h" | |
37 #include "gtkutils.h" | |
38 | |
10080 | 39 static GtkHBoxClass *parent_class = NULL; |
8317 | 40 |
41 static void do_bold(GtkWidget *bold, GtkIMHtmlToolbar *toolbar) | |
42 { | |
8481 | 43 GObject *object; |
10134 | 44 |
8317 | 45 g_return_if_fail(toolbar); |
10134 | 46 |
8481 | 47 /* block the format_function_toggle handler */ |
48 object = g_object_ref(G_OBJECT(GTK_IMHTML(toolbar->imhtml))); | |
49 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, | |
50 NULL, toolbar); | |
8317 | 51 gtk_imhtml_toggle_bold(GTK_IMHTML(toolbar->imhtml)); |
8481 | 52 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, |
53 NULL, toolbar); | |
54 g_object_unref(object); | |
10134 | 55 |
8317 | 56 gtk_widget_grab_focus(toolbar->imhtml); |
57 } | |
58 | |
59 static void | |
60 do_italic(GtkWidget *italic, GtkIMHtmlToolbar *toolbar) | |
61 { | |
8481 | 62 GObject *object; |
10134 | 63 |
8317 | 64 g_return_if_fail(toolbar); |
10134 | 65 |
8481 | 66 /* block the format_function_toggle handler */ |
67 object = g_object_ref(G_OBJECT(GTK_IMHTML(toolbar->imhtml))); | |
68 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, | |
69 NULL, toolbar); | |
8317 | 70 gtk_imhtml_toggle_italic(GTK_IMHTML(toolbar->imhtml)); |
8481 | 71 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, |
72 NULL, toolbar); | |
73 g_object_unref(object); | |
10134 | 74 |
8317 | 75 gtk_widget_grab_focus(toolbar->imhtml); |
76 } | |
77 | |
78 static void | |
79 do_underline(GtkWidget *underline, GtkIMHtmlToolbar *toolbar) | |
80 { | |
8481 | 81 GObject *object; |
10134 | 82 |
8317 | 83 g_return_if_fail(toolbar); |
10134 | 84 |
8481 | 85 /* block the format_function_toggle handler */ |
86 object = g_object_ref(G_OBJECT(GTK_IMHTML(toolbar->imhtml))); | |
87 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, | |
88 NULL, toolbar); | |
8317 | 89 gtk_imhtml_toggle_underline(GTK_IMHTML(toolbar->imhtml)); |
8481 | 90 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, |
91 NULL, toolbar); | |
92 g_object_unref(object); | |
10134 | 93 |
8317 | 94 gtk_widget_grab_focus(toolbar->imhtml); |
95 } | |
96 | |
97 static void | |
98 do_small(GtkWidget *smalltb, GtkIMHtmlToolbar *toolbar) | |
99 { | |
100 g_return_if_fail(toolbar); | |
8380 | 101 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->smaller_size))) |
102 gtk_imhtml_font_shrink(GTK_IMHTML(toolbar->imhtml)); | |
8317 | 103 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smaller_size), FALSE); |
104 gtk_widget_grab_focus(toolbar->imhtml); | |
105 } | |
106 | |
107 static void | |
108 do_big(GtkWidget *large, GtkIMHtmlToolbar *toolbar) | |
109 { | |
110 g_return_if_fail(toolbar); | |
8380 | 111 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->larger_size))) |
112 gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml)); | |
8317 | 113 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->larger_size), FALSE); |
114 gtk_widget_grab_focus(toolbar->imhtml); | |
115 } | |
116 | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
117 static void |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
118 destroy_toolbar_font(GtkWidget *widget, GdkEvent *event, |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
119 GtkIMHtmlToolbar *toolbar) |
8317 | 120 { |
10135 | 121 if (widget != NULL) |
122 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->font), FALSE); | |
8317 | 123 |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
124 if (toolbar->font_dialog != NULL) |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
125 { |
8317 | 126 gtk_widget_destroy(toolbar->font_dialog); |
127 toolbar->font_dialog = NULL; | |
128 } | |
129 } | |
130 | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
131 static void |
10125 | 132 realize_toolbar_font(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) |
133 { | |
134 GtkFontSelection *sel; | |
135 | |
136 sel = GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog)->fontsel); | |
137 gtk_widget_hide_all(gtk_widget_get_parent(sel->size_entry)); | |
138 gtk_widget_show_all(sel->family_list); | |
139 gtk_widget_show(gtk_widget_get_parent(sel->family_list)); | |
140 gtk_widget_show(gtk_widget_get_parent(gtk_widget_get_parent(sel->family_list))); | |
141 } | |
142 | |
143 static void | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
144 cancel_toolbar_font(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
145 { |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
146 destroy_toolbar_font(widget, NULL, toolbar); |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
147 } |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
148 |
8317 | 149 static void apply_font(GtkWidget *widget, GtkFontSelection *fontsel) |
150 { | |
151 /* this could be expanded to include font size, weight, etc. | |
152 but for now only works with font face */ | |
153 char *fontname; | |
154 char *space; | |
155 GtkIMHtmlToolbar *toolbar = g_object_get_data(G_OBJECT(fontsel), "gaim_toolbar"); | |
156 | |
157 fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(fontsel)); | |
158 | |
159 space = strrchr(fontname, ' '); | |
160 if(space && isdigit(*(space+1))) | |
161 *space = '\0'; | |
162 | |
163 gtk_imhtml_toggle_fontface(GTK_IMHTML(toolbar->imhtml), fontname); | |
164 | |
165 g_free(fontname); | |
166 | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
167 cancel_toolbar_font(NULL, toolbar); |
8317 | 168 } |
169 | |
170 static void | |
171 toggle_font(GtkWidget *font, GtkIMHtmlToolbar *toolbar) | |
172 { | |
10504 | 173 char *fontname; |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
174 |
8317 | 175 g_return_if_fail(toolbar); |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
176 |
9025 | 177 fontname = gtk_imhtml_get_current_fontface(GTK_IMHTML(toolbar->imhtml)); |
178 | |
8317 | 179 if (!toolbar->font_dialog) { |
180 toolbar->font_dialog = gtk_font_selection_dialog_new(_("Select Font")); | |
181 | |
182 g_object_set_data(G_OBJECT(toolbar->font_dialog), "gaim_toolbar", toolbar); | |
10134 | 183 |
9025 | 184 if(fontname) { |
185 char fonttif[128]; | |
186 g_snprintf(fonttif, sizeof(fonttif), "%s 12", fontname); | |
187 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog), | |
188 fonttif); | |
10504 | 189 g_free(fontname); |
9025 | 190 } else { |
191 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog), | |
192 DEFAULT_FONT_FACE); | |
193 } | |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
194 |
8317 | 195 g_signal_connect(G_OBJECT(toolbar->font_dialog), "delete_event", |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
196 G_CALLBACK(destroy_toolbar_font), toolbar); |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
197 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog)->ok_button), "clicked", |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
198 G_CALLBACK(apply_font), toolbar->font_dialog); |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
199 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog)->cancel_button), "clicked", |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
200 G_CALLBACK(cancel_toolbar_font), toolbar); |
10125 | 201 g_signal_connect_after(G_OBJECT(toolbar->font_dialog), "realize", |
202 G_CALLBACK(realize_toolbar_font), toolbar); | |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
203 |
8317 | 204 gtk_window_present(GTK_WINDOW(toolbar->font_dialog)); |
205 } else { | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
206 cancel_toolbar_font(NULL, toolbar); |
8317 | 207 } |
208 gtk_widget_grab_focus(toolbar->imhtml); | |
209 } | |
210 | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
211 static void |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
212 destroy_toolbar_fgcolor(GtkWidget *widget, GdkEvent *event, |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
213 GtkIMHtmlToolbar *toolbar) |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
214 { |
10135 | 215 if (widget != NULL) |
216 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->fgcolor), FALSE); | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
217 |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
218 if (toolbar->fgcolor_dialog != NULL) |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
219 { |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
220 gtk_widget_destroy(toolbar->fgcolor_dialog); |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
221 toolbar->fgcolor_dialog = NULL; |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
222 } |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
223 } |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
224 |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
225 static void cancel_toolbar_fgcolor(GtkWidget *widget, |
8321
eb269b81fff8
[gaim-migrate @ 9045]
Christian Hammond <chipx86@chipx86.com>
parents:
8320
diff
changeset
|
226 GtkIMHtmlToolbar *toolbar) |
8317 | 227 { |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
228 destroy_toolbar_fgcolor(widget, NULL, toolbar); |
8317 | 229 } |
230 | |
231 static void do_fgcolor(GtkWidget *widget, GtkColorSelection *colorsel) | |
232 { | |
233 GdkColor text_color; | |
234 GtkIMHtmlToolbar *toolbar = g_object_get_data(G_OBJECT(colorsel), "gaim_toolbar"); | |
235 char *open_tag; | |
236 | |
237 open_tag = g_malloc(30); | |
238 gtk_color_selection_get_current_color(colorsel, &text_color); | |
239 g_snprintf(open_tag, 23, "#%02X%02X%02X", | |
240 text_color.red / 256, | |
241 text_color.green / 256, | |
242 text_color.blue / 256); | |
243 gtk_imhtml_toggle_forecolor(GTK_IMHTML(toolbar->imhtml), open_tag); | |
244 | |
245 g_free(open_tag); | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
246 cancel_toolbar_fgcolor(NULL, toolbar); |
8317 | 247 } |
248 | |
249 static void | |
250 toggle_fg_color(GtkWidget *color, GtkIMHtmlToolbar *toolbar) | |
251 { | |
252 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(color))) { | |
253 GtkWidget *colorsel; | |
9025 | 254 GdkColor fgcolor; |
10504 | 255 char *color = gtk_imhtml_get_current_forecolor(GTK_IMHTML(toolbar->imhtml)); |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
256 |
8317 | 257 if (!toolbar->fgcolor_dialog) { |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
258 |
8317 | 259 toolbar->fgcolor_dialog = gtk_color_selection_dialog_new(_("Select Text Color")); |
260 colorsel = GTK_COLOR_SELECTION_DIALOG(toolbar->fgcolor_dialog)->colorsel; | |
9025 | 261 if (color) { |
262 gdk_color_parse(color, &fgcolor); | |
263 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &fgcolor); | |
10504 | 264 g_free(color); |
9025 | 265 } |
266 | |
8317 | 267 g_object_set_data(G_OBJECT(colorsel), "gaim_toolbar", toolbar); |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
268 |
8317 | 269 g_signal_connect(G_OBJECT(toolbar->fgcolor_dialog), "delete_event", |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
270 G_CALLBACK(destroy_toolbar_fgcolor), toolbar); |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
271 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(toolbar->fgcolor_dialog)->ok_button), "clicked", |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
272 G_CALLBACK(do_fgcolor), colorsel); |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
273 g_signal_connect(G_OBJECT (GTK_COLOR_SELECTION_DIALOG(toolbar->fgcolor_dialog)->cancel_button), "clicked", |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
274 G_CALLBACK(cancel_toolbar_fgcolor), toolbar); |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
275 |
8317 | 276 } |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
277 gtk_window_present(GTK_WINDOW(toolbar->fgcolor_dialog)); |
8317 | 278 } else if (toolbar->fgcolor_dialog != NULL) { |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
279 cancel_toolbar_fgcolor(color, toolbar); |
8317 | 280 } else { |
9863 | 281 /* gaim_gtk_advance_past(gtkconv, "<FONT COLOR>", "</FONT>"); */ |
8317 | 282 } |
283 gtk_widget_grab_focus(toolbar->imhtml); | |
284 } | |
285 | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
286 static void |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
287 destroy_toolbar_bgcolor(GtkWidget *widget, GdkEvent *event, |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
288 GtkIMHtmlToolbar *toolbar) |
8317 | 289 { |
10135 | 290 if (widget != NULL) |
291 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->bgcolor), FALSE); | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
292 |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
293 if (toolbar->bgcolor_dialog != NULL) |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
294 { |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
295 gtk_widget_destroy(toolbar->bgcolor_dialog); |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
296 toolbar->bgcolor_dialog = NULL; |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
297 } |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
298 } |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
299 |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
300 static void |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
301 cancel_toolbar_bgcolor(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
302 { |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
303 destroy_toolbar_bgcolor(widget, NULL, toolbar); |
8317 | 304 } |
305 | |
306 static void do_bgcolor(GtkWidget *widget, GtkColorSelection *colorsel) | |
307 { | |
308 GdkColor text_color; | |
309 GtkIMHtmlToolbar *toolbar = g_object_get_data(G_OBJECT(colorsel), "gaim_toolbar"); | |
310 char *open_tag; | |
311 | |
312 open_tag = g_malloc(30); | |
313 gtk_color_selection_get_current_color(colorsel, &text_color); | |
314 g_snprintf(open_tag, 23, "#%02X%02X%02X", | |
315 text_color.red / 256, | |
316 text_color.green / 256, | |
317 text_color.blue / 256); | |
10777 | 318 if (gtk_text_buffer_get_selection_bounds(GTK_IMHTML(toolbar->imhtml)->text_buffer, NULL, NULL)) |
319 gtk_imhtml_toggle_backcolor(GTK_IMHTML(toolbar->imhtml), open_tag); | |
320 else | |
321 gtk_imhtml_toggle_background(GTK_IMHTML(toolbar->imhtml), open_tag); | |
8317 | 322 |
323 g_free(open_tag); | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
324 cancel_toolbar_bgcolor(NULL, toolbar); |
8317 | 325 } |
326 | |
327 static void | |
328 toggle_bg_color(GtkWidget *color, GtkIMHtmlToolbar *toolbar) | |
329 { | |
330 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(color))) { | |
331 GtkWidget *colorsel; | |
9025 | 332 GdkColor bgcolor; |
10504 | 333 char *color = gtk_imhtml_get_current_backcolor(GTK_IMHTML(toolbar->imhtml)); |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
334 |
8317 | 335 if (!toolbar->bgcolor_dialog) { |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
336 |
8359 | 337 toolbar->bgcolor_dialog = gtk_color_selection_dialog_new(_("Select Background Color")); |
8317 | 338 colorsel = GTK_COLOR_SELECTION_DIALOG(toolbar->bgcolor_dialog)->colorsel; |
9025 | 339 if (color) { |
340 gdk_color_parse(color, &bgcolor); | |
341 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &bgcolor); | |
10504 | 342 g_free(color); |
9025 | 343 } |
344 | |
8317 | 345 g_object_set_data(G_OBJECT(colorsel), "gaim_toolbar", toolbar); |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
346 |
8317 | 347 g_signal_connect(G_OBJECT(toolbar->bgcolor_dialog), "delete_event", |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
348 G_CALLBACK(destroy_toolbar_bgcolor), toolbar); |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
349 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(toolbar->bgcolor_dialog)->ok_button), "clicked", |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
350 G_CALLBACK(do_bgcolor), colorsel); |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
351 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(toolbar->bgcolor_dialog)->cancel_button), "clicked", |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
352 G_CALLBACK(cancel_toolbar_bgcolor), toolbar); |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
353 |
8317 | 354 } |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
355 gtk_window_present(GTK_WINDOW(toolbar->bgcolor_dialog)); |
8317 | 356 } else if (toolbar->bgcolor_dialog != NULL) { |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
357 cancel_toolbar_bgcolor(color, toolbar); |
8317 | 358 } else { |
9863 | 359 /* gaim_gtk_advance_past(gtkconv, "<FONT COLOR>", "</FONT>"); */ |
8317 | 360 } |
361 gtk_widget_grab_focus(toolbar->imhtml); | |
362 } | |
363 | |
364 static void | |
365 cancel_link_cb(GtkIMHtmlToolbar *toolbar, GaimRequestFields *fields) | |
366 { | |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
367 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->link), FALSE); |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
368 |
8317 | 369 toolbar->link_dialog = NULL; |
370 } | |
371 | |
372 static void | |
373 close_link_dialog(GtkIMHtmlToolbar *toolbar) | |
374 { | |
375 if (toolbar->link_dialog != NULL) | |
376 { | |
377 gaim_request_close(GAIM_REQUEST_FIELDS, toolbar->link_dialog); | |
378 toolbar->link_dialog = NULL; | |
379 } | |
380 } | |
381 | |
382 static void | |
383 do_insert_link_cb(GtkIMHtmlToolbar *toolbar, GaimRequestFields *fields) | |
384 { | |
385 const char *url, *description; | |
386 | |
387 url = gaim_request_fields_get_string(fields, "url"); | |
9041 | 388 if (GTK_IMHTML(toolbar->imhtml)->format_functions & GTK_IMHTML_LINKDESC) |
389 description = gaim_request_fields_get_string(fields, "description"); | |
390 else | |
391 description = NULL; | |
8317 | 392 |
393 if (description == NULL) | |
394 description = url; | |
395 | |
8677 | 396 gtk_imhtml_insert_link(GTK_IMHTML(toolbar->imhtml), |
397 gtk_text_buffer_get_insert(GTK_IMHTML(toolbar->imhtml)->text_buffer), | |
398 url, description); | |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
399 |
8317 | 400 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->link), FALSE); |
401 | |
402 toolbar->link_dialog = NULL; | |
403 } | |
404 | |
405 static void | |
406 insert_link_cb(GtkWidget *w, GtkIMHtmlToolbar *toolbar) | |
407 { | |
408 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->link))) { | |
409 GaimRequestFields *fields; | |
410 GaimRequestFieldGroup *group; | |
411 GaimRequestField *field; | |
9599 | 412 GtkTextIter start, end; |
9041 | 413 char *msg; |
9599 | 414 char *desc = NULL; |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
415 |
8317 | 416 fields = gaim_request_fields_new(); |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
417 |
8317 | 418 group = gaim_request_field_group_new(NULL); |
419 gaim_request_fields_add_group(fields, group); | |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
420 |
8317 | 421 field = gaim_request_field_string_new("url", _("_URL"), NULL, FALSE); |
422 gaim_request_field_set_required(field, TRUE); | |
423 gaim_request_field_group_add_field(group, field); | |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
424 |
9041 | 425 if(GTK_IMHTML(toolbar->imhtml)->format_functions & GTK_IMHTML_LINKDESC) { |
9599 | 426 if (gtk_text_buffer_get_selection_bounds(GTK_IMHTML(toolbar->imhtml)->text_buffer, &start, &end)) { |
427 desc = gtk_imhtml_get_text(GTK_IMHTML(toolbar->imhtml), &start, &end); | |
428 } | |
9041 | 429 field = gaim_request_field_string_new("description", _("_Description"), |
9599 | 430 desc, FALSE); |
9041 | 431 gaim_request_field_group_add_field(group, field); |
432 msg = g_strdup(_("Please enter the URL and description of the " | |
433 "link that you want to insert. The description " | |
434 "is optional.")); | |
435 } else { | |
436 msg = g_strdup(_("Please enter the URL of the " | |
437 "link that you want to insert.")); | |
438 } | |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
439 |
8317 | 440 toolbar->link_dialog = |
441 gaim_request_fields(toolbar, _("Insert Link"), | |
442 NULL, | |
9041 | 443 msg, |
8317 | 444 fields, |
445 _("_Insert"), G_CALLBACK(do_insert_link_cb), | |
446 _("Cancel"), G_CALLBACK(cancel_link_cb), | |
447 toolbar); | |
9041 | 448 g_free(msg); |
9599 | 449 g_free(desc); |
8322
ffb601c6b833
[gaim-migrate @ 9046]
Christian Hammond <chipx86@chipx86.com>
parents:
8321
diff
changeset
|
450 } else { |
8317 | 451 close_link_dialog(toolbar); |
452 } | |
453 gtk_widget_grab_focus(toolbar->imhtml); | |
454 } | |
455 | |
456 | |
457 static void | |
9522 | 458 do_insert_image_cb(GtkWidget *widget, int response, GtkIMHtmlToolbar *toolbar) |
8317 | 459 { |
9522 | 460 gchar *filename, *name, *buf; |
461 char *filedata; | |
8317 | 462 size_t size; |
463 GError *error = NULL; | |
464 int id; | |
8962 | 465 GtkTextIter iter; |
466 GtkTextMark *ins; | |
8317 | 467 |
9522 | 468 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
469 if (response != GTK_RESPONSE_ACCEPT) { | |
470 #else /* FILECHOOSER */ | |
471 if (response != GTK_RESPONSE_OK) { | |
472 #endif /* FILECHOOSER */ | |
8317 | 473 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
474 return; | |
475 } | |
476 | |
9522 | 477 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
478 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); | |
479 #else /* FILECHOOSER */ | |
480 filename = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(widget))); | |
481 #endif /* FILECHOOSER */ | |
8317 | 482 |
9522 | 483 if (filename == NULL) { |
8317 | 484 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
485 return; | |
486 } | |
487 | |
9522 | 488 #if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
489 if (gaim_gtk_check_if_dir(filename, GTK_FILE_SELECTION(widget))) { | |
490 g_free(filename); | |
491 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); | |
492 return; | |
493 } | |
494 #endif /* FILECHOOSER */ | |
495 | |
496 /* The following triggers a callback that closes the widget */ | |
8317 | 497 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
498 | |
9522 | 499 if (!g_file_get_contents(filename, &filedata, &size, &error)) { |
8317 | 500 gaim_notify_error(NULL, NULL, error->message, NULL); |
501 | |
502 g_error_free(error); | |
9522 | 503 g_free(filename); |
8317 | 504 |
505 return; | |
506 } | |
507 | |
9522 | 508 name = strrchr(filename, G_DIR_SEPARATOR) + 1; |
8317 | 509 |
9522 | 510 id = gaim_imgstore_add(filedata, size, name); |
8317 | 511 g_free(filedata); |
512 | |
9522 | 513 if (id == 0) { |
514 buf = g_strdup_printf(_("Failed to store image: %s\n"), filename); | |
8317 | 515 gaim_notify_error(NULL, NULL, buf, NULL); |
516 | |
517 g_free(buf); | |
9522 | 518 g_free(filename); |
8317 | 519 |
520 return; | |
521 } | |
522 | |
9522 | 523 g_free(filename); |
524 | |
8962 | 525 ins = gtk_text_buffer_get_insert(gtk_text_view_get_buffer(GTK_TEXT_VIEW(toolbar->imhtml))); |
526 gtk_text_buffer_get_iter_at_mark(gtk_text_view_get_buffer(GTK_TEXT_VIEW(toolbar->imhtml)), | |
9522 | 527 &iter, ins); |
8962 | 528 gtk_imhtml_insert_image_at_iter(GTK_IMHTML(toolbar->imhtml), id, &iter); |
529 gaim_imgstore_unref(id); | |
8317 | 530 } |
531 | |
532 | |
533 static void | |
534 insert_image_cb(GtkWidget *save, GtkIMHtmlToolbar *toolbar) | |
535 { | |
536 GtkWidget *window; | |
537 | |
538 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))) { | |
9522 | 539 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
540 window = gtk_file_chooser_dialog_new(_("Insert Image"), | |
541 NULL, | |
542 GTK_FILE_CHOOSER_ACTION_OPEN, | |
543 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
544 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, | |
545 NULL); | |
546 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT); | |
547 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(window)), | |
548 "response", G_CALLBACK(do_insert_image_cb), toolbar); | |
549 #else /* FILECHOOSER */ | |
8317 | 550 window = gtk_file_selection_new(_("Insert Image")); |
551 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_OK); | |
552 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)), | |
553 "response", G_CALLBACK(do_insert_image_cb), toolbar); | |
9522 | 554 #endif /* FILECHOOSER */ |
8317 | 555 |
556 gtk_widget_show(window); | |
557 toolbar->image_dialog = window; | |
558 } else { | |
559 gtk_widget_destroy(toolbar->image_dialog); | |
560 toolbar->image_dialog = NULL; | |
561 } | |
9522 | 562 |
8317 | 563 gtk_widget_grab_focus(toolbar->imhtml); |
564 } | |
565 | |
10894 | 566 |
10138 | 567 static void |
568 destroy_smiley_dialog(GtkIMHtmlToolbar *toolbar) | |
569 { | |
570 if (toolbar->smiley_dialog != NULL) | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
571 { |
10138 | 572 gtk_widget_destroy(toolbar->smiley_dialog); |
573 toolbar->smiley_dialog = NULL; | |
8317 | 574 } |
575 } | |
576 | |
10134 | 577 static void |
10138 | 578 close_smiley_dialog(GtkWidget *widget, GdkEvent *event, |
579 GtkIMHtmlToolbar *toolbar) | |
10134 | 580 { |
581 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smiley), FALSE); | |
582 } | |
10894 | 583 |
8317 | 584 |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
585 static void |
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
586 insert_smiley_text(GtkWidget *widget, GtkIMHtmlToolbar *toolbar) |
8317 | 587 { |
9027 | 588 char *smiley_text, *escaped_smiley; |
589 | |
590 smiley_text = g_object_get_data(G_OBJECT(widget), "smiley_text"); | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10504
diff
changeset
|
591 escaped_smiley = g_markup_escape_text(smiley_text, -1); |
8317 | 592 |
8456 | 593 gtk_imhtml_insert_smiley(GTK_IMHTML(toolbar->imhtml), |
594 GTK_IMHTML(toolbar->imhtml)->protocol_name, | |
9027 | 595 escaped_smiley); |
8317 | 596 |
9027 | 597 g_free(escaped_smiley); |
10138 | 598 |
599 close_smiley_dialog(NULL, NULL, toolbar); | |
8317 | 600 } |
601 | |
10894 | 602 /* smiley buttons list */ |
603 struct smiley_button_list { | |
604 int width, height; | |
605 GtkWidget *button; | |
606 struct smiley_button_list *next; | |
607 }; | |
8317 | 608 |
10894 | 609 struct smiley_button_list * |
610 sort_smileys(struct smiley_button_list *ls, GtkIMHtmlToolbar *toolbar, int *width, char *filename, char *face) | |
10138 | 611 { |
612 GtkWidget *image; | |
613 GtkWidget *button; | |
10894 | 614 GtkRequisition size; |
615 struct smiley_button_list *cur; | |
616 struct smiley_button_list *it, *it_last; | |
8317 | 617 |
10894 | 618 cur = malloc(sizeof(struct smiley_button_list)); |
619 it = ls; | |
620 it_last = ls; /* list iterators*/ | |
10138 | 621 image = gtk_image_new_from_file(filename); |
10894 | 622 |
623 gtk_widget_size_request(image, &size); | |
624 (*width) += size.width; | |
625 | |
10138 | 626 button = gtk_button_new(); |
627 gtk_container_add(GTK_CONTAINER(button), image); | |
10894 | 628 |
10138 | 629 g_object_set_data(G_OBJECT(button), "smiley_text", face); |
630 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(insert_smiley_text), toolbar); | |
631 | |
632 gtk_tooltips_set_tip(toolbar->tooltips, button, face, NULL); | |
633 | |
634 /* these look really weird with borders */ | |
635 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
636 | |
10894 | 637 /* set current element to add */ |
638 cur->height = size.height; | |
639 cur->width = size.width; | |
640 cur->button = button; | |
641 cur->next = ls; | |
642 | |
643 /* check where to insert by height */ | |
644 if (ls == NULL) | |
645 return cur; | |
646 while (it != NULL) { | |
647 it_last = it; | |
648 it = it->next; | |
649 } | |
650 cur->next = it; | |
651 it_last->next = cur; | |
652 return ls; | |
10138 | 653 } |
10894 | 654 |
10138 | 655 |
656 static gboolean | |
10894 | 657 smiley_is_unique(GSList *list, GtkIMHtmlSmiley *smiley) |
658 { | |
659 while (list) { | |
8317 | 660 GtkIMHtmlSmiley *cur = list->data; |
10894 | 661 if (!strcmp(cur->file, smiley->file)) |
8317 | 662 return FALSE; |
663 list = list->next; | |
664 } | |
665 return TRUE; | |
666 } | |
667 | |
668 | |
10138 | 669 static void |
670 insert_smiley_cb(GtkWidget *smiley, GtkIMHtmlToolbar *toolbar) | |
671 { | |
672 GtkWidget *dialog; | |
673 GtkWidget *smiley_table = NULL; | |
674 GSList *smileys, *unique_smileys = NULL; | |
675 | |
676 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smiley))) { | |
677 destroy_smiley_dialog(toolbar); | |
678 gtk_widget_grab_focus(toolbar->imhtml); | |
679 return; | |
680 } | |
681 | |
682 if (toolbar->sml) | |
683 smileys = get_proto_smileys(toolbar->sml); | |
684 else | |
685 smileys = get_proto_smileys(NULL); | |
686 | |
687 while(smileys) { | |
688 GtkIMHtmlSmiley *smiley = smileys->data; | |
689 if(!smiley->hidden) { | |
690 if(smiley_is_unique(unique_smileys, smiley)) | |
691 unique_smileys = g_slist_append(unique_smileys, smiley); | |
692 } | |
693 smileys = smileys->next; | |
694 } | |
695 | |
696 GAIM_DIALOG(dialog); | |
697 | |
698 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); | |
699 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog"); | |
700 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); | |
701 | |
10894 | 702 if (g_slist_length(unique_smileys)) { |
703 struct smiley_button_list *ls, *it, *it_tmp; | |
704 GtkWidget *line; | |
705 int line_width = 0; | |
706 int max_line_width, num_lines; | |
707 int col=0; | |
10138 | 708 |
10894 | 709 /* We use hboxes packed in a vbox */ |
710 ls = NULL; | |
711 line = gtk_hbox_new(FALSE, 0); | |
712 line_width = 0; | |
713 max_line_width = 0; | |
714 num_lines = floor(sqrt(g_slist_length(unique_smileys))); | |
715 smiley_table = gtk_vbox_new(FALSE, 0); | |
716 | |
717 /* create list of smileys sorted by height */ | |
718 while (unique_smileys) { | |
10138 | 719 GtkIMHtmlSmiley *smiley = unique_smileys->data; |
10894 | 720 if (!smiley->hidden) { |
721 fflush(stdout); | |
722 ls = sort_smileys(ls, toolbar, &max_line_width, smiley->file, smiley->smile); | |
10138 | 723 } |
724 unique_smileys = unique_smileys->next; | |
725 } | |
10894 | 726 /* pack buttons of the list */ |
727 max_line_width = max_line_width / num_lines; | |
728 it = ls; | |
729 while (it != NULL) | |
730 { | |
731 it_tmp = it; | |
732 gtk_box_pack_start(GTK_BOX(line), it->button, TRUE, TRUE, 0); | |
733 gtk_widget_show(it->button); | |
734 line_width += it->width; | |
735 if (line_width >= max_line_width) { | |
736 gtk_box_pack_start(GTK_BOX(smiley_table), line, FALSE, TRUE, 0); | |
737 line = gtk_hbox_new(FALSE, 0); | |
738 line_width = 0; | |
739 col = 0; | |
740 } | |
741 col++; | |
742 it = it->next; | |
743 free(it_tmp); | |
744 } | |
745 gtk_box_pack_start(GTK_BOX(smiley_table), line, FALSE, TRUE, 0); | |
10138 | 746 } |
747 else { | |
748 smiley_table = gtk_label_new(_("This theme has no available smileys.")); | |
749 } | |
750 | |
751 gtk_container_add(GTK_CONTAINER(dialog), smiley_table); | |
752 | |
753 gtk_widget_show(smiley_table); | |
754 | |
755 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); | |
756 | |
757 /* connect signals */ | |
758 g_signal_connect(G_OBJECT(dialog), "delete_event", | |
759 G_CALLBACK(close_smiley_dialog), toolbar); | |
760 | |
761 /* show everything */ | |
762 gtk_window_set_title(GTK_WINDOW(dialog), _("Smile!")); | |
763 gtk_widget_show_all(dialog); | |
764 | |
765 toolbar->smiley_dialog = dialog; | |
766 | |
767 gtk_widget_grab_focus(toolbar->imhtml); | |
768 } | |
8317 | 769 |
8420 | 770 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) |
771 { | |
772 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD); | |
773 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->italic), buttons & GTK_IMHTML_ITALIC); | |
774 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->underline), buttons & GTK_IMHTML_UNDERLINE); | |
775 | |
776 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->larger_size), buttons & GTK_IMHTML_GROW); | |
777 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->smaller_size), buttons & GTK_IMHTML_SHRINK); | |
778 | |
779 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->font), buttons & GTK_IMHTML_FACE); | |
780 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->fgcolor), buttons & GTK_IMHTML_FORECOLOR); | |
781 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bgcolor), buttons & GTK_IMHTML_BACKCOLOR); | |
782 | |
783 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->image), buttons & GTK_IMHTML_IMAGE); | |
784 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->link), buttons & GTK_IMHTML_LINK); | |
785 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->smiley), buttons & GTK_IMHTML_SMILEY); | |
8481 | 786 } |
8420 | 787 |
8481 | 788 /* we call this when we want to _set_active the toggle button, it'll |
789 * block the callback thats connected to the button so we don't have to | |
790 * do the double toggling hack | |
791 */ | |
792 static void toggle_button_set_active_block(GtkToggleButton *button, | |
793 gboolean is_active, | |
794 GtkIMHtmlToolbar *toolbar) | |
795 { | |
796 GObject *object; | |
797 g_return_if_fail(toolbar); | |
798 | |
799 object = g_object_ref(button); | |
800 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, | |
801 0, 0, NULL, NULL, toolbar); | |
802 gtk_toggle_button_set_active(button, is_active); | |
803 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, | |
804 0, 0, NULL, NULL, toolbar); | |
805 g_object_unref(object); | |
8420 | 806 } |
807 | |
808 static void toggle_button_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) | |
809 { | |
8481 | 810 if (buttons & GTK_IMHTML_BOLD) |
811 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold), | |
812 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->bold)), | |
813 toolbar); | |
8420 | 814 |
8481 | 815 if (buttons & GTK_IMHTML_ITALIC) |
816 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic), | |
817 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->italic)), | |
818 toolbar); | |
8420 | 819 |
8481 | 820 if (buttons & GTK_IMHTML_UNDERLINE) |
821 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline), | |
822 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->underline)), | |
823 toolbar); | |
8420 | 824 } |
825 | |
8427 | 826 static void reset_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlToolbar *toolbar) |
827 { | |
8481 | 828 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->bold))) |
829 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold), FALSE, | |
830 toolbar); | |
10134 | 831 |
8481 | 832 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->italic))) |
833 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic), | |
834 FALSE, toolbar); | |
10134 | 835 |
8481 | 836 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->underline))) |
837 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline), | |
838 FALSE, toolbar); | |
839 } | |
8516 | 840 |
841 static void update_buttons(GtkIMHtmlToolbar *toolbar) { | |
8506 | 842 gboolean bold, italic, underline; |
10134 | 843 |
8506 | 844 bold = italic = underline = FALSE; |
8516 | 845 gtk_imhtml_get_current_format(GTK_IMHTML(toolbar->imhtml), |
846 &bold, &italic, &underline); | |
8506 | 847 |
848 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->bold)) != bold) | |
849 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold), bold, | |
850 toolbar); | |
8516 | 851 |
8506 | 852 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->italic)) != italic) |
853 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic), italic, | |
854 toolbar); | |
8516 | 855 |
8506 | 856 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->underline)) != underline) |
857 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline), | |
8677 | 858 underline, toolbar); |
8506 | 859 } |
8481 | 860 |
8516 | 861 static void update_format_cb(GtkIMHtml *imhtml, GtkIMHtmlToolbar *toolbar) { |
862 update_buttons(toolbar); | |
863 } | |
8481 | 864 |
8516 | 865 static void mark_set_cb(GtkTextBuffer *buffer, GtkTextIter *location, |
866 GtkTextMark *mark, GtkIMHtmlToolbar *toolbar) | |
867 { | |
868 if(mark != gtk_text_buffer_get_insert(buffer)) | |
869 return; | |
870 | |
871 update_buttons(toolbar); | |
8427 | 872 } |
873 | |
8317 | 874 enum { |
875 LAST_SIGNAL | |
876 }; | |
9863 | 877 /* static guint signals [LAST_SIGNAL] = { 0 }; */ |
8317 | 878 |
879 static void | |
880 gtk_imhtmltoolbar_finalize (GObject *object) | |
881 { | |
8391 | 882 GtkIMHtmlToolbar *toolbar = GTK_IMHTMLTOOLBAR(object); |
8317 | 883 |
8685
2ac2f4cf1de5
[gaim-migrate @ 9438]
Christian Hammond <chipx86@chipx86.com>
parents:
8677
diff
changeset
|
884 if (toolbar->image_dialog != NULL) |
2ac2f4cf1de5
[gaim-migrate @ 9438]
Christian Hammond <chipx86@chipx86.com>
parents:
8677
diff
changeset
|
885 { |
2ac2f4cf1de5
[gaim-migrate @ 9438]
Christian Hammond <chipx86@chipx86.com>
parents:
8677
diff
changeset
|
886 gtk_widget_destroy(toolbar->image_dialog); |
2ac2f4cf1de5
[gaim-migrate @ 9438]
Christian Hammond <chipx86@chipx86.com>
parents:
8677
diff
changeset
|
887 toolbar->image_dialog = NULL; |
2ac2f4cf1de5
[gaim-migrate @ 9438]
Christian Hammond <chipx86@chipx86.com>
parents:
8677
diff
changeset
|
888 } |
2ac2f4cf1de5
[gaim-migrate @ 9438]
Christian Hammond <chipx86@chipx86.com>
parents:
8677
diff
changeset
|
889 |
10134 | 890 destroy_toolbar_font(NULL, NULL, toolbar); |
10138 | 891 #if !GTK_CHECK_VERSION(2,4,0) /* Smiley selection menu */ |
892 destroy_smiley_dialog(toolbar); | |
893 #endif | |
10134 | 894 destroy_toolbar_bgcolor(NULL, NULL, toolbar); |
895 destroy_toolbar_fgcolor(NULL, NULL, toolbar); | |
896 close_link_dialog(toolbar); | |
8784
48dd097eb475
[gaim-migrate @ 9546]
Christian Hammond <chipx86@chipx86.com>
parents:
8756
diff
changeset
|
897 |
8427 | 898 if (toolbar->sml) |
899 free(toolbar->sml); | |
8391 | 900 gtk_object_sink(GTK_OBJECT(toolbar->tooltips)); |
8317 | 901 |
8391 | 902 G_OBJECT_CLASS(parent_class)->finalize (object); |
8317 | 903 } |
904 | |
10814
364a2ef907ae
[gaim-migrate @ 12468]
Luke Schierer <lschiere@pidgin.im>
parents:
10777
diff
changeset
|
905 /* Boring GTK+ stuff */ |
8317 | 906 static void gtk_imhtmltoolbar_class_init (GtkIMHtmlToolbarClass *class) |
907 { | |
908 GtkObjectClass *object_class; | |
909 GObjectClass *gobject_class; | |
910 object_class = (GtkObjectClass*) class; | |
911 gobject_class = (GObjectClass*) class; | |
10080 | 912 parent_class = gtk_type_class(GTK_TYPE_HBOX); |
8317 | 913 gobject_class->finalize = gtk_imhtmltoolbar_finalize; |
914 } | |
915 | |
916 static void gtk_imhtmltoolbar_init (GtkIMHtmlToolbar *toolbar) | |
917 { | |
10085 | 918 GtkWidget *hbox = GTK_WIDGET(toolbar); |
8317 | 919 GtkWidget *button; |
920 GtkWidget *sep; | |
921 GtkSizeGroup *sg; | |
922 | |
923 toolbar->imhtml = NULL; | |
924 toolbar->font_dialog = NULL; | |
925 toolbar->fgcolor_dialog = NULL; | |
926 toolbar->bgcolor_dialog = NULL; | |
927 toolbar->link_dialog = NULL; | |
10138 | 928 toolbar->smiley_dialog = NULL; |
8317 | 929 toolbar->image_dialog = NULL; |
930 | |
931 toolbar->tooltips = gtk_tooltips_new(); | |
10134 | 932 |
11243 | 933 gtk_box_set_spacing(GTK_BOX(toolbar), GAIM_HIG_BOX_SPACE); |
8317 | 934 sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); |
935 | |
936 /* Bold */ | |
937 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_BOLD); | |
938 gtk_size_group_add_widget(sg, button); | |
939 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
940 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Bold"), NULL); | |
941 | |
942 g_signal_connect(G_OBJECT(button), "clicked", | |
943 G_CALLBACK(do_bold), toolbar); | |
944 | |
945 toolbar->bold = button; | |
946 | |
947 /* Italic */ | |
948 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_ITALIC); | |
949 gtk_size_group_add_widget(sg, button); | |
950 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
951 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Italic"), NULL); | |
952 | |
953 g_signal_connect(G_OBJECT(button), "clicked", | |
954 G_CALLBACK(do_italic), toolbar); | |
955 | |
956 toolbar->italic = button; | |
957 | |
958 /* Underline */ | |
959 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_UNDERLINE); | |
960 gtk_size_group_add_widget(sg, button); | |
961 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
962 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Underline"), NULL); | |
963 | |
964 g_signal_connect(G_OBJECT(button), "clicked", | |
965 G_CALLBACK(do_underline), toolbar); | |
966 | |
967 toolbar->underline = button; | |
968 | |
969 /* Sep */ | |
970 sep = gtk_vseparator_new(); | |
971 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | |
972 | |
973 /* Increase font size */ | |
974 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_BIGGER); | |
975 gtk_size_group_add_widget(sg, button); | |
976 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
977 gtk_tooltips_set_tip(toolbar->tooltips, button, | |
978 _("Larger font size"), NULL); | |
979 | |
980 g_signal_connect(G_OBJECT(button), "clicked", | |
981 G_CALLBACK(do_big), toolbar); | |
982 | |
983 toolbar->larger_size = button; | |
984 | |
985 /* Decrease font size */ | |
986 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_SMALLER); | |
987 gtk_size_group_add_widget(sg, button); | |
988 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
989 gtk_tooltips_set_tip(toolbar->tooltips, button, | |
990 _("Smaller font size"), NULL); | |
991 | |
992 g_signal_connect(G_OBJECT(button), "clicked", | |
993 G_CALLBACK(do_small), toolbar); | |
994 | |
995 toolbar->smaller_size = button; | |
996 | |
997 /* Sep */ | |
998 sep = gtk_vseparator_new(); | |
999 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | |
1000 | |
1001 /* Font Face */ | |
1002 | |
1003 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_SELECT_FONT); | |
1004 gtk_size_group_add_widget(sg, button); | |
1005 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1006 gtk_tooltips_set_tip(toolbar->tooltips, button, | |
1007 _("Font Face"), NULL); | |
1008 | |
1009 g_signal_connect(G_OBJECT(button), "clicked", | |
1010 G_CALLBACK(toggle_font), toolbar); | |
1011 | |
1012 toolbar->font = button; | |
1013 | |
1014 /* Foreground Color */ | |
1015 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_FGCOLOR); | |
1016 gtk_size_group_add_widget(sg, button); | |
1017 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1018 gtk_tooltips_set_tip(toolbar->tooltips, button, | |
1019 _("Foreground font color"), NULL); | |
1020 | |
1021 g_signal_connect(G_OBJECT(button), "clicked", | |
1022 G_CALLBACK(toggle_fg_color), toolbar); | |
1023 | |
1024 toolbar->fgcolor = button; | |
1025 | |
1026 /* Background Color */ | |
1027 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_BGCOLOR); | |
1028 gtk_size_group_add_widget(sg, button); | |
1029 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1030 gtk_tooltips_set_tip(toolbar->tooltips, button, | |
1031 _("Background color"), NULL); | |
1032 | |
1033 g_signal_connect(G_OBJECT(button), "clicked", | |
1034 G_CALLBACK(toggle_bg_color), toolbar); | |
1035 | |
1036 toolbar->bgcolor = button; | |
1037 | |
1038 /* Sep */ | |
1039 sep = gtk_vseparator_new(); | |
1040 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | |
1041 | |
1042 /* Insert Link */ | |
1043 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_LINK); | |
1044 gtk_size_group_add_widget(sg, button); | |
1045 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1046 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Insert link"), NULL); | |
1047 g_signal_connect(G_OBJECT(button), "clicked", | |
1048 G_CALLBACK(insert_link_cb), toolbar); | |
8319
a2c5537a814b
[gaim-migrate @ 9043]
Christian Hammond <chipx86@chipx86.com>
parents:
8317
diff
changeset
|
1049 |
8317 | 1050 toolbar->link = button; |
1051 | |
1052 /* Insert IM Image */ | |
1053 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_IMAGE); | |
1054 gtk_size_group_add_widget(sg, button); | |
1055 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1056 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Insert image"), NULL); | |
1057 | |
1058 g_signal_connect(G_OBJECT(button), "clicked", | |
1059 G_CALLBACK(insert_image_cb), toolbar); | |
1060 | |
1061 toolbar->image = button; | |
1062 | |
1063 /* Insert Smiley */ | |
1064 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_SMILEY); | |
1065 gtk_size_group_add_widget(sg, button); | |
1066 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1067 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Insert smiley"), NULL); | |
1068 | |
10138 | 1069 g_signal_connect(G_OBJECT(button), "clicked", |
8317 | 1070 G_CALLBACK(insert_smiley_cb), toolbar); |
1071 | |
1072 toolbar->smiley = button; | |
1073 | |
8427 | 1074 toolbar->sml = NULL; |
8317 | 1075 gtk_widget_show_all(hbox); |
1076 } | |
1077 | |
1078 GtkWidget *gtk_imhtmltoolbar_new() | |
1079 { | |
1080 return GTK_WIDGET(g_object_new(gtk_imhtmltoolbar_get_type(), NULL)); | |
1081 } | |
1082 | |
1083 GType gtk_imhtmltoolbar_get_type() | |
1084 { | |
1085 static GType imhtmltoolbar_type = 0; | |
1086 | |
1087 if (!imhtmltoolbar_type) { | |
1088 static const GTypeInfo imhtmltoolbar_info = { | |
1089 sizeof(GtkIMHtmlToolbarClass), | |
1090 NULL, | |
1091 NULL, | |
1092 (GClassInitFunc) gtk_imhtmltoolbar_class_init, | |
1093 NULL, | |
1094 NULL, | |
1095 sizeof (GtkIMHtmlToolbar), | |
1096 0, | |
1097 (GInstanceInitFunc) gtk_imhtmltoolbar_init | |
1098 }; | |
1099 | |
10080 | 1100 imhtmltoolbar_type = g_type_register_static(GTK_TYPE_HBOX, |
8317 | 1101 "GtkIMHtmlToolbar", &imhtmltoolbar_info, 0); |
1102 } | |
1103 | |
1104 return imhtmltoolbar_type; | |
1105 } | |
1106 | |
1107 | |
8324
2df8b01af581
[gaim-migrate @ 9048]
Christian Hammond <chipx86@chipx86.com>
parents:
8322
diff
changeset
|
1108 void gtk_imhtmltoolbar_attach(GtkIMHtmlToolbar *toolbar, GtkWidget *imhtml) |
8317 | 1109 { |
8788 | 1110 GtkIMHtmlButtons buttons; |
8481 | 1111 gboolean bold, italic, underline; |
1112 | |
8325
415283e39bce
[gaim-migrate @ 9049]
Christian Hammond <chipx86@chipx86.com>
parents:
8324
diff
changeset
|
1113 g_return_if_fail(toolbar != NULL); |
415283e39bce
[gaim-migrate @ 9049]
Christian Hammond <chipx86@chipx86.com>
parents:
8324
diff
changeset
|
1114 g_return_if_fail(GTK_IS_IMHTMLTOOLBAR(toolbar)); |
415283e39bce
[gaim-migrate @ 9049]
Christian Hammond <chipx86@chipx86.com>
parents:
8324
diff
changeset
|
1115 g_return_if_fail(imhtml != NULL); |
415283e39bce
[gaim-migrate @ 9049]
Christian Hammond <chipx86@chipx86.com>
parents:
8324
diff
changeset
|
1116 g_return_if_fail(GTK_IS_IMHTML(imhtml)); |
415283e39bce
[gaim-migrate @ 9049]
Christian Hammond <chipx86@chipx86.com>
parents:
8324
diff
changeset
|
1117 |
8317 | 1118 toolbar->imhtml = imhtml; |
8506 | 1119 g_signal_connect(G_OBJECT(imhtml), "format_buttons_update", G_CALLBACK(update_buttons_cb), toolbar); |
8420 | 1120 g_signal_connect(G_OBJECT(imhtml), "format_function_toggle", G_CALLBACK(toggle_button_cb), toolbar); |
8427 | 1121 g_signal_connect(G_OBJECT(imhtml), "format_function_clear", G_CALLBACK(reset_buttons_cb), toolbar); |
8506 | 1122 g_signal_connect(G_OBJECT(imhtml), "format_function_update", G_CALLBACK(update_format_cb), toolbar); |
8516 | 1123 g_signal_connect_after(G_OBJECT(GTK_IMHTML(imhtml)->text_buffer), "mark-set", G_CALLBACK(mark_set_cb), toolbar); |
8481 | 1124 |
8788 | 1125 buttons = gtk_imhtml_get_format_functions(GTK_IMHTML(imhtml)); |
8807 | 1126 update_buttons_cb(GTK_IMHTML(imhtml), buttons, toolbar); |
8788 | 1127 |
8481 | 1128 bold = italic = underline = FALSE; |
1129 | |
8516 | 1130 gtk_imhtml_get_current_format(GTK_IMHTML(imhtml), &bold, &italic, &underline); |
10134 | 1131 |
8481 | 1132 if(bold) |
1133 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->bold), bold, | |
1134 toolbar); | |
10134 | 1135 |
8481 | 1136 if(italic) |
1137 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->italic), italic, | |
1138 toolbar); | |
1139 | |
1140 if(underline) | |
1141 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->underline), | |
1142 underline, toolbar); | |
8317 | 1143 } |
8427 | 1144 |
1145 void gtk_imhtmltoolbar_associate_smileys(GtkIMHtmlToolbar *toolbar, const char *proto_id) | |
1146 { | |
1147 if (toolbar->sml) | |
1148 g_free(toolbar->sml); | |
10134 | 1149 |
8427 | 1150 toolbar->sml = g_strdup(proto_id); |
1151 } |