| 101 * Globals |
101 * Globals |
| 102 *****************************************************************************/ |
102 *****************************************************************************/ |
| 103 |
103 |
| 104 static GtkHBoxClass *parent_class = NULL; |
104 static GtkHBoxClass *parent_class = NULL; |
| 105 |
105 |
| 106 /* XXX: I would bet, there is a better way to do this */ |
|
| 107 static guint resources_ref_cnt = 0; |
|
| 108 static GRegex *color_parse_rgb = NULL; |
|
| 109 |
|
| 110 /****************************************************************************** |
106 /****************************************************************************** |
| 111 * Prototypes |
107 * Prototypes |
| 112 *****************************************************************************/ |
108 *****************************************************************************/ |
| 113 |
109 |
| 114 static void |
110 static void |
| 118 /****************************************************************************** |
114 /****************************************************************************** |
| 119 * Helpers |
115 * Helpers |
| 120 *****************************************************************************/ |
116 *****************************************************************************/ |
| 121 |
117 |
| 122 static gboolean |
118 static gboolean |
| 123 pidgin_color_parse(const gchar *str, GdkColor *color) |
119 pidgin_color_parse(const gchar *str, GdkRGBA *color) |
| 124 { |
120 { |
| 125 GdkColor dummy_color; |
121 GdkRGBA dummy_color; |
| 126 gboolean succ; |
|
| 127 |
122 |
| 128 if (str == NULL) |
123 if (str == NULL) |
| 129 return FALSE; |
124 return FALSE; |
| 130 |
125 |
| 131 while (isspace(str[0])) |
126 while (isspace(str[0])) |
| 137 if (color == NULL) |
132 if (color == NULL) |
| 138 color = &dummy_color; |
133 color = &dummy_color; |
| 139 |
134 |
| 140 if (strcmp(str, "inherit") == 0) { |
135 if (strcmp(str, "inherit") == 0) { |
| 141 return FALSE; |
136 return FALSE; |
| 142 } else if (strncmp(str, "rgb", 3) == 0) { |
137 } else { |
| 143 GMatchInfo *match; |
138 return gdk_rgba_parse(color, str); |
| 144 |
139 } |
| 145 g_regex_match(color_parse_rgb, str, 0, &match); |
|
| 146 succ = g_match_info_matches(match); |
|
| 147 if (succ) { |
|
| 148 int m_start, val; |
|
| 149 |
|
| 150 g_match_info_fetch_pos(match, 1, &m_start, NULL); |
|
| 151 val = strtoul(str + m_start, NULL, 10); |
|
| 152 if (val >= 0 && val <= 255) |
|
| 153 color->red = val * 256; |
|
| 154 else |
|
| 155 succ = FALSE; |
|
| 156 |
|
| 157 g_match_info_fetch_pos(match, 2, &m_start, NULL); |
|
| 158 val = strtoul(str + m_start, NULL, 10); |
|
| 159 if (val >= 0 && val <= 255) |
|
| 160 color->green = val * 256; |
|
| 161 else |
|
| 162 succ = FALSE; |
|
| 163 |
|
| 164 g_match_info_fetch_pos(match, 3, &m_start, NULL); |
|
| 165 val = strtoul(str + m_start, NULL, 10); |
|
| 166 if (val >= 0 && val <= 255) |
|
| 167 color->blue = val * 256; |
|
| 168 else |
|
| 169 succ = FALSE; |
|
| 170 } |
|
| 171 |
|
| 172 g_match_info_free(match); |
|
| 173 return succ; |
|
| 174 } |
|
| 175 |
|
| 176 purple_debug_warning("gtkwebviewtoolbar", |
|
| 177 "Invalid color format: \"%s\"", str); |
|
| 178 return FALSE; |
|
| 179 } |
140 } |
| 180 |
141 |
| 181 static gchar* |
142 static gchar* |
| 182 pidgin_color_to_str(GdkColor *color) |
143 pidgin_color_to_str(GdkRGBA *color) |
| 183 { |
144 { |
| 184 return g_strdup_printf("#%02X%02X%02X", color->red / 256, |
145 return g_strdup_printf("#%02X%02X%02X", |
| 185 color->green / 256, color->blue / 256); |
146 (unsigned int)(color->red * 255), |
| |
147 (unsigned int)(color->green * 255), |
| |
148 (unsigned int)(color->blue * 255)); |
| 186 } |
149 } |
| 187 |
150 |
| 188 static void |
151 static void |
| 189 do_bold(GtkAction *bold, PidginWebViewToolbar *toolbar) |
152 do_bold(GtkAction *bold, PidginWebViewToolbar *toolbar) |
| 190 { |
153 { |
| 339 |
302 |
| 340 static void |
303 static void |
| 341 do_fgcolor(GtkDialog *dialog, gint response, gpointer _toolbar) |
304 do_fgcolor(GtkDialog *dialog, gint response, gpointer _toolbar) |
| 342 { |
305 { |
| 343 PidginWebViewToolbar *toolbar = _toolbar; |
306 PidginWebViewToolbar *toolbar = _toolbar; |
| 344 GdkColor text_color; |
307 GdkRGBA text_color; |
| 345 gchar *open_tag; |
308 gchar *open_tag; |
| 346 |
309 |
| 347 if (response != GTK_RESPONSE_OK) { |
310 if (response != GTK_RESPONSE_OK) { |
| 348 destroy_toolbar_fgcolor(GTK_WIDGET(toolbar), NULL, toolbar); |
311 destroy_toolbar_fgcolor(GTK_WIDGET(toolbar), NULL, toolbar); |
| 349 return; |
312 return; |
| 350 } |
313 } |
| 351 |
314 |
| 352 pidgin_color_chooser_get_rgb(GTK_COLOR_CHOOSER(dialog), &text_color); |
315 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(dialog), &text_color); |
| 353 open_tag = pidgin_color_to_str(&text_color); |
316 open_tag = pidgin_color_to_str(&text_color); |
| 354 pidgin_webview_toggle_forecolor(PIDGIN_WEBVIEW(toolbar->webview), |
317 pidgin_webview_toggle_forecolor(PIDGIN_WEBVIEW(toolbar->webview), |
| 355 open_tag); |
318 open_tag); |
| 356 g_free(open_tag); |
319 g_free(open_tag); |
| 357 |
320 |
| 363 { |
326 { |
| 364 PidginWebViewToolbarPriv *priv = |
327 PidginWebViewToolbarPriv *priv = |
| 365 PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
328 PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
| 366 |
329 |
| 367 if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(color))) { |
330 if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(color))) { |
| 368 GdkColor fgcolor; |
331 GdkRGBA fgcolor; |
| 369 gchar *color = pidgin_webview_get_current_forecolor( |
332 gchar *color = pidgin_webview_get_current_forecolor( |
| 370 PIDGIN_WEBVIEW(toolbar->webview)); |
333 PIDGIN_WEBVIEW(toolbar->webview)); |
| 371 |
334 |
| 372 if (!priv->fgcolor_dialog) { |
335 if (!priv->fgcolor_dialog) { |
| 373 priv->fgcolor_dialog = gtk_color_chooser_dialog_new( |
336 priv->fgcolor_dialog = gtk_color_chooser_dialog_new( |
| 376 GTK_TYPE_WINDOW))); |
339 GTK_TYPE_WINDOW))); |
| 377 gtk_color_chooser_set_use_alpha( |
340 gtk_color_chooser_set_use_alpha( |
| 378 GTK_COLOR_CHOOSER(priv->fgcolor_dialog), FALSE); |
341 GTK_COLOR_CHOOSER(priv->fgcolor_dialog), FALSE); |
| 379 |
342 |
| 380 if (pidgin_color_parse(color, &fgcolor)) { |
343 if (pidgin_color_parse(color, &fgcolor)) { |
| 381 pidgin_color_chooser_set_rgb( |
344 gtk_color_chooser_set_rgba( |
| 382 GTK_COLOR_CHOOSER(priv->fgcolor_dialog), |
345 GTK_COLOR_CHOOSER(priv->fgcolor_dialog), |
| 383 &fgcolor); |
346 &fgcolor); |
| 384 } |
347 } |
| 385 |
348 |
| 386 g_signal_connect(G_OBJECT(priv->fgcolor_dialog), |
349 g_signal_connect(G_OBJECT(priv->fgcolor_dialog), |
| 423 |
386 |
| 424 static void |
387 static void |
| 425 do_bgcolor(GtkDialog *dialog, gint response, gpointer _toolbar) |
388 do_bgcolor(GtkDialog *dialog, gint response, gpointer _toolbar) |
| 426 { |
389 { |
| 427 PidginWebViewToolbar *toolbar = _toolbar; |
390 PidginWebViewToolbar *toolbar = _toolbar; |
| 428 GdkColor text_color; |
391 GdkRGBA text_color; |
| 429 gchar *open_tag; |
392 gchar *open_tag; |
| 430 |
393 |
| 431 if (response != GTK_RESPONSE_OK) { |
394 if (response != GTK_RESPONSE_OK) { |
| 432 destroy_toolbar_bgcolor(GTK_WIDGET(toolbar), NULL, toolbar); |
395 destroy_toolbar_bgcolor(GTK_WIDGET(toolbar), NULL, toolbar); |
| 433 return; |
396 return; |
| 434 } |
397 } |
| 435 |
398 |
| 436 pidgin_color_chooser_get_rgb(GTK_COLOR_CHOOSER(dialog), &text_color); |
399 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(dialog), &text_color); |
| 437 open_tag = pidgin_color_to_str(&text_color); |
400 open_tag = pidgin_color_to_str(&text_color); |
| 438 pidgin_webview_toggle_backcolor(PIDGIN_WEBVIEW(toolbar->webview), |
401 pidgin_webview_toggle_backcolor(PIDGIN_WEBVIEW(toolbar->webview), |
| 439 open_tag); |
402 open_tag); |
| 440 g_free(open_tag); |
403 g_free(open_tag); |
| 441 |
404 |
| 447 { |
410 { |
| 448 PidginWebViewToolbarPriv *priv = |
411 PidginWebViewToolbarPriv *priv = |
| 449 PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
412 PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
| 450 |
413 |
| 451 if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(color))) { |
414 if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(color))) { |
| 452 GdkColor bgcolor; |
415 GdkRGBA bgcolor; |
| 453 gchar *color = pidgin_webview_get_current_backcolor( |
416 gchar *color = pidgin_webview_get_current_backcolor( |
| 454 PIDGIN_WEBVIEW(toolbar->webview)); |
417 PIDGIN_WEBVIEW(toolbar->webview)); |
| 455 |
418 |
| 456 if (!priv->bgcolor_dialog) { |
419 if (!priv->bgcolor_dialog) { |
| 457 priv->bgcolor_dialog = gtk_color_chooser_dialog_new( |
420 priv->bgcolor_dialog = gtk_color_chooser_dialog_new( |
| 460 GTK_TYPE_WINDOW))); |
423 GTK_TYPE_WINDOW))); |
| 461 gtk_color_chooser_set_use_alpha( |
424 gtk_color_chooser_set_use_alpha( |
| 462 GTK_COLOR_CHOOSER(priv->bgcolor_dialog), FALSE); |
425 GTK_COLOR_CHOOSER(priv->bgcolor_dialog), FALSE); |
| 463 |
426 |
| 464 if (pidgin_color_parse(color, &bgcolor)) { |
427 if (pidgin_color_parse(color, &bgcolor)) { |
| 465 pidgin_color_chooser_set_rgb( |
428 gtk_color_chooser_set_rgba( |
| 466 GTK_COLOR_CHOOSER(priv->bgcolor_dialog), |
429 GTK_COLOR_CHOOSER(priv->bgcolor_dialog), |
| 467 &bgcolor); |
430 &bgcolor); |
| 468 } |
431 } |
| 469 |
432 |
| 470 g_signal_connect(G_OBJECT(priv->bgcolor_dialog), |
433 g_signal_connect(G_OBJECT(priv->bgcolor_dialog), |
| 1103 { |
1066 { |
| 1104 PidginWebViewToolbarPriv *priv = PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
1067 PidginWebViewToolbarPriv *priv = PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
| 1105 gboolean bold, italic, underline, strike; |
1068 gboolean bold, italic, underline, strike; |
| 1106 char *tmp, *color_str; |
1069 char *tmp, *color_str; |
| 1107 char *label; |
1070 char *label; |
| 1108 GdkColor color; |
1071 GdkRGBA color; |
| 1109 |
1072 |
| 1110 label = g_strdup(_("_Font")); |
1073 label = g_strdup(_("_Font")); |
| 1111 |
1074 |
| 1112 pidgin_webview_get_current_format(PIDGIN_WEBVIEW(toolbar->webview), |
1075 pidgin_webview_get_current_format(PIDGIN_WEBVIEW(toolbar->webview), |
| 1113 &bold, &italic, &underline, &strike); |
1076 &bold, &italic, &underline, &strike); |
| 1163 |
1126 |
| 1164 tmp = pidgin_webview_get_current_forecolor( |
1127 tmp = pidgin_webview_get_current_forecolor( |
| 1165 PIDGIN_WEBVIEW(toolbar->webview)); |
1128 PIDGIN_WEBVIEW(toolbar->webview)); |
| 1166 color_str = NULL; |
1129 color_str = NULL; |
| 1167 if (pidgin_color_parse(tmp, &color) && |
1130 if (pidgin_color_parse(tmp, &color) && |
| 1168 (color.red != 0 || color.green != 0 || color.blue != 0)) |
1131 (color.red > 0 || color.green > 0 || color.blue > 0)) |
| 1169 { |
1132 { |
| 1170 color_str = pidgin_color_to_str(&color); |
1133 color_str = pidgin_color_to_str(&color); |
| 1171 } |
1134 } |
| 1172 g_free(tmp); |
1135 g_free(tmp); |
| 1173 |
1136 |
| 1362 gtk_widget_destroy(priv->font_menu); |
1325 gtk_widget_destroy(priv->font_menu); |
| 1363 if (priv->insert_menu) |
1326 if (priv->insert_menu) |
| 1364 gtk_widget_destroy(priv->insert_menu); |
1327 gtk_widget_destroy(priv->insert_menu); |
| 1365 |
1328 |
| 1366 purple_prefs_disconnect_by_handle(object); |
1329 purple_prefs_disconnect_by_handle(object); |
| 1367 |
|
| 1368 if (--resources_ref_cnt == 0) { |
|
| 1369 g_regex_unref(color_parse_rgb); |
|
| 1370 color_parse_rgb = NULL; |
|
| 1371 } |
|
| 1372 |
1330 |
| 1373 G_OBJECT_CLASS(parent_class)->finalize(object); |
1331 G_OBJECT_CLASS(parent_class)->finalize(object); |
| 1374 } |
1332 } |
| 1375 |
1333 |
| 1376 static void |
1334 static void |
| 1607 pidgin_webviewtoolbar_init(PidginWebViewToolbar *toolbar) |
1565 pidgin_webviewtoolbar_init(PidginWebViewToolbar *toolbar) |
| 1608 { |
1566 { |
| 1609 PidginWebViewToolbarPriv *priv = PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
1567 PidginWebViewToolbarPriv *priv = PIDGIN_WEBVIEWTOOLBAR_GET_PRIVATE(toolbar); |
| 1610 GtkWidget *hbox = GTK_WIDGET(toolbar); |
1568 GtkWidget *hbox = GTK_WIDGET(toolbar); |
| 1611 |
1569 |
| 1612 if (resources_ref_cnt++ == 0) { |
|
| 1613 color_parse_rgb = g_regex_new("^rgb\\s*\\(\\s*" |
|
| 1614 "([0-9]+),\\s*([0-9]+),\\s*([0-9]+)\\s*\\)", |
|
| 1615 G_REGEX_OPTIMIZE, 0, NULL); |
|
| 1616 } |
|
| 1617 |
|
| 1618 pidgin_webviewtoolbar_create_actions(toolbar); |
1570 pidgin_webviewtoolbar_create_actions(toolbar); |
| 1619 pidgin_webviewtoolbar_create_wide_view(toolbar); |
1571 pidgin_webviewtoolbar_create_wide_view(toolbar); |
| 1620 pidgin_webviewtoolbar_create_lean_view(toolbar); |
1572 pidgin_webviewtoolbar_create_lean_view(toolbar); |
| 1621 |
1573 |
| 1622 gtk_box_pack_start(GTK_BOX(hbox), priv->wide_view, TRUE, TRUE, 0); |
1574 gtk_box_pack_start(GTK_BOX(hbox), priv->wide_view, TRUE, TRUE, 0); |