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