pidgin/gtkwebviewtoolbar.c

changeset 37992
0185eb26ac7d
parent 37991
b344343d3cf0
child 37994
11829debec7a
equal deleted inserted replaced
37991:b344343d3cf0 37992:0185eb26ac7d
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);

mercurial