Mercurial > pidgin
changeset 32133:8e1ec44ede75
Clean up this WebKit stuff. Fix up broken merging, mark unfinished
work with FIXME/TODO, and fix this ungodly formatting.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Thu, 08 Sep 2011 22:04:35 +0000 |
parents | 7b1a94adc33f |
children | 6c814cf24b04 |
files | pidgin/gtkconv.c pidgin/gtklog.c pidgin/gtknotify.c pidgin/gtkwebview.c pidgin/gtkwebview.h pidgin/plugins/adiumthemes/message-style.c pidgin/plugins/adiumthemes/message-style.h pidgin/plugins/adiumthemes/webkit.c pidgin/smileyparser.c pidgin/smileyparser.h |
diffstat | 10 files changed, 871 insertions(+), 725 deletions(-) [+] |
line wrap: on
line diff
--- a/pidgin/gtkconv.c Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/gtkconv.c Thu Sep 08 22:04:35 2011 +0000 @@ -175,8 +175,6 @@ static GList *away_list = NULL; static GList *busy_list = NULL; static GList *xa_list = NULL; -static GList *login_list = NULL; -static GList *logout_list = NULL; static GList *offline_list = NULL; static GHashTable *prpl_lists = NULL; @@ -316,6 +314,15 @@ } static void +conversation_entry_clear(PidginConversation *gtkconv) +{ + GtkIMHtml *imhtml = GTK_IMHTML(gtkconv->entry); + gtk_source_undo_manager_begin_not_undoable_action(imhtml->undo_manager); + gtk_imhtml_clear(imhtml); + gtk_source_undo_manager_end_not_undoable_action(imhtml->undo_manager); +} + +static void clear_formatting_cb(GtkIMHtml *imhtml, PidginConversation *gtkconv) { default_formatize(gtkconv); @@ -425,15 +432,16 @@ } static void clear_conversation_scrollback_cb(PurpleConversation *conv, - void *data) + void *data) { PidginConversation *gtkconv = NULL; gtkconv = PIDGIN_CONVERSATION(conv); if (PIDGIN_CONVERSATION(conv)) - webkit_web_view_load_html_string (WEBKIT_WEB_VIEW (gtkconv->webview), "", ""); -} + webkit_web_view_load_html_string(WEBKIT_WEB_VIEW(gtkconv->webview), "", ""); +} + static PurpleCmdRet clear_command_cb(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data) @@ -613,7 +621,7 @@ account = purple_conversation_get_account(conv); if (check_for_and_do_command(conv)) { - gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); + conversation_entry_clear(gtkconv); return; } @@ -668,7 +676,7 @@ g_free(clean); g_free(buf); - gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); + conversation_entry_clear(gtkconv); gtkconv_set_unseen(gtkconv, PIDGIN_UNSEEN_NONE); } @@ -797,9 +805,9 @@ do_invite(GtkWidget *w, int resp, InviteBuddyInfo *info) { const char *buddy, *message; - PidginConversation *gtkconv; - - gtkconv = PIDGIN_CONVERSATION(info->conv); + PurpleConversation *conv; + + conv = info->conv; if (resp == GTK_RESPONSE_OK) { buddy = gtk_entry_get_text(GTK_ENTRY(info->entry)); @@ -808,8 +816,8 @@ if (!g_ascii_strcasecmp(buddy, "")) return; - serv_chat_invite(purple_conversation_get_gc(info->conv), - purple_conv_chat_get_id(PURPLE_CONV_CHAT(info->conv)), + serv_chat_invite(purple_conversation_get_gc(conv), + purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)), message, buddy); } @@ -903,7 +911,6 @@ InviteBuddyInfo *info = NULL; if (invite_dialog == NULL) { - PurpleConnection *gc; PidginWindow *gtkwin; GtkWidget *label; GtkWidget *vbox, *hbox; @@ -916,7 +923,6 @@ info = g_new0(InviteBuddyInfo, 1); info->conv = conv; - gc = purple_conversation_get_gc(conv); gtkwin = pidgin_conv_get_window(gtkconv); /* Create the new dialog. */ @@ -1583,8 +1589,19 @@ static void menu_last_said_cb(GtkWidget *w, PidginConversation *gtkconv) { - /* I don't know what this is! */ - return; +/* FIXME: This doesn't work yet, of course... */ +#if 0 + GtkTextMark *mark; + const char *who; + + who = g_object_get_data(G_OBJECT(w), "user_data"); + mark = get_mark_for_user(gtkconv, who); + + if (mark != NULL) + gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(gtkconv->imhtml), mark, 0.1, FALSE, 0, 0); + else + g_return_if_reached(); +#endif } static GtkWidget * @@ -1789,10 +1806,13 @@ chat_do_im(gtkconv, who); } else if (event->button == 2 && event->type == GDK_BUTTON_PRESS) { /* Move to user's anchor */ - //GtkTextMark *mark = get_mark_for_user(gtkconv, who); - - //if(mark != NULL) - // gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(gtkconv->imhtml), mark, 0.1, FALSE, 0, 0); +/* FIXME: This isn't implemented yet. */ +#if 0 + GtkTextMark *mark = get_mark_for_user(gtkconv, who); + + if(mark != NULL) + gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(gtkconv->imhtml), mark, 0.1, FALSE, 0, 0); +#endif } else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { GtkWidget *menu = create_chat_menu (conv, who, gc); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, @@ -2126,14 +2146,20 @@ break; case GDK_Page_Up: - case GDK_KP_Page_Up: - //gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml)); + case GDK_KP_Page_Up: +/* FIXME: Write this. */ +#if 0 + gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml)); +#endif return TRUE; break; case GDK_Page_Down: - case GDK_KP_Page_Down: - //gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml)); + case GDK_KP_Page_Down: +/* FIXME: Write this. */ +#if 0 + gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml)); +#endif return TRUE; break; @@ -2243,7 +2269,7 @@ entry = GTK_IMHTML(gtkconv->entry); protocol_name = purple_account_get_protocol_name(conv->account); gtk_imhtml_set_protocol_name(entry, protocol_name); - //gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), protocol_name); + /* FIXME: gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), protocol_name); */ if (!(conv->features & PURPLE_CONNECTION_HTML)) gtk_imhtml_clear_formatting(GTK_IMHTML(gtkconv->entry)); @@ -2608,7 +2634,6 @@ PidginConversation *gtkconv = (PidginConversation *)data; PurpleConversation *conv = gtkconv->active_conv; PurpleAccount *account; - PurplePluginProtocolInfo *prpl_info = NULL; GdkPixbuf *buf; GdkPixbuf *scale; @@ -3633,7 +3658,41 @@ static void update_typing_message(PidginConversation *gtkconv, const char *message) { - /* this is not handled at all */ + /* FIXME: this is not handled at all */ +#if 0 + GtkTextBuffer *buffer; + GtkTextMark *stmark, *enmark; + + if (g_object_get_data(G_OBJECT(gtkconv->imhtml), "disable-typing-notification")) + return; + + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml)); + stmark = gtk_text_buffer_get_mark(buffer, "typing-notification-start"); + enmark = gtk_text_buffer_get_mark(buffer, "typing-notification-end"); + if (stmark && enmark) { + GtkTextIter start, end; + gtk_text_buffer_get_iter_at_mark(buffer, &start, stmark); + gtk_text_buffer_get_iter_at_mark(buffer, &end, enmark); + gtk_text_buffer_delete_mark(buffer, stmark); + gtk_text_buffer_delete_mark(buffer, enmark); + gtk_text_buffer_delete(buffer, &start, &end); + } else if (message && *message == '\n' && message[1] == ' ' && message[2] == '\0') + message = NULL; + +#ifdef RESERVE_LINE + if (!message) + message = "\n "; /* The blank space is required to avoid a GTK+/Pango bug */ +#endif + + if (message) { + GtkTextIter iter; + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_create_mark(buffer, "typing-notification-start", &iter, TRUE); + gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, message, -1, "TYPING-NOTIFICATION", NULL); + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_create_mark(buffer, "typing-notification-end", &iter, TRUE); + } +#endif } static void @@ -4979,17 +5038,17 @@ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", CONV_EMBLEM_COLUMN, NULL); g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL); - /* Setup the gtkimhtml widget */ + /* Setup the webkit widget */ /* TODO: create a pidgin_create_webview() function in utils*/ - webview_sw = gtk_scrolled_window_new (NULL, NULL); + webview_sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(webview_sw), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (webview_sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtkconv->webview = gtk_webview_new (); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(webview_sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + gtkconv->webview = gtk_webview_new(); gtk_webview_set_vadjustment(GTK_WEBVIEW(gtkconv->webview), gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(webview_sw))); - gtk_container_add (GTK_CONTAINER (webview_sw), gtkconv->webview); - + gtk_container_add(GTK_CONTAINER(webview_sw), gtkconv->webview); + gtk_widget_set_size_request(gtkconv->webview, -1, 0); if (chat) { @@ -5737,11 +5796,8 @@ PidginConversation *gtkconv; PurpleConnection *gc; PurpleAccount *account; - PurplePluginProtocolInfo *prpl_info; int gtk_font_options = 0; int gtk_font_options_all = 0; - int max_scrollback_lines; - int line_count; char buf2[BUF_LONG]; gboolean show_date; char *mdate; @@ -5809,12 +5865,9 @@ } length = strlen(displaying) + 1; - - prpl_info = gc ? PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl) : NULL; - /* if the buffer is not empty add a <br> */ - if (!gtk_webview_is_empty (GTK_WEBVIEW(gtkconv->webview))) - gtk_webview_append_html (GTK_WEBVIEW(gtkconv->webview), "<br />"); + if (!gtk_webview_is_empty(GTK_WEBVIEW(gtkconv->webview))) + gtk_webview_append_html(GTK_WEBVIEW(gtkconv->webview), "<br />"); /* First message in a conversation. */ if (gtkconv->newday == 0) @@ -5870,7 +5923,7 @@ /* TODO: These colors should not be hardcoded so log.c can use them */ if (flags & PURPLE_MESSAGE_RAW) { - gtk_webview_append_html (GTK_WEBVIEW(gtkconv->webview), message); + gtk_webview_append_html(GTK_WEBVIEW(gtkconv->webview), message); } else if (flags & PURPLE_MESSAGE_SYSTEM) { g_snprintf(buf2, sizeof(buf2), "<font %s><font size=\"2\"><span class='timestamp'>%s</span></font><b>%s</b></font>", @@ -5985,10 +6038,10 @@ g_free(str); - if(gc){ + if (gc) { char *pre = g_strdup_printf("<font %s>", sml_attrib ? sml_attrib : ""); char *post = "</font>"; - with_font_tag = g_strdup_printf ("%s%s%s", pre, new_message, post); + with_font_tag = g_strdup_printf("%s%s%s", pre, new_message, post); g_free(pre); } else with_font_tag = g_memdup(new_message, length); @@ -6110,7 +6163,6 @@ GtkTreeIter iter; GtkTreeModel *model; GtkTextTag *tag; - int f = 1; chat = PURPLE_CONV_CHAT(conv); gtkconv = PIDGIN_CONVERSATION(conv); @@ -6904,7 +6956,6 @@ int size = 0; PurpleAccount *account; - PurplePluginProtocolInfo *prpl_info = NULL; PurpleBuddyIcon *icon; @@ -6921,8 +6972,6 @@ return; account = purple_conversation_get_account(conv); - if(account && account->gc) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl); /* Remove the current icon stuff */ children = gtk_container_get_children(GTK_CONTAINER(gtkconv->u.im->icon_container)); @@ -6971,7 +7020,6 @@ if (data == NULL) { icon = purple_conv_im_get_icon(PURPLE_CONV_IM(conv)); - if (icon == NULL) { gtk_widget_set_size_request(gtkconv->u.im->icon_container, @@ -6980,7 +7028,6 @@ } data = purple_buddy_icon_get_data(icon, &len); - if (data == NULL) { gtk_widget_set_size_request(gtkconv->u.im->icon_container, @@ -7248,8 +7295,11 @@ GTK_CHECK_MENU_ITEM(win->menu.show_timestamps), (gboolean)GPOINTER_TO_INT(value)); - gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->webview), +/* FIXME: Use WebKit version of this. */ +#if 0 + gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), (gboolean)GPOINTER_TO_INT(value)); +#endif } } @@ -9879,12 +9929,9 @@ static void conv_placement_by_group(PidginConversation *conv) { - PurpleConversationType type; PurpleGroup *group = NULL; GList *wl, *cl; - type = purple_conversation_get_type(conv->active_conv); - group = conv_get_group(conv); /* Go through the list of IMs and find one with this group. */
--- a/pidgin/gtklog.c Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/gtklog.c Thu Sep 08 22:04:35 2011 +0000 @@ -130,7 +130,7 @@ populate_log_tree(lv); g_free(lv->search); lv->search = NULL; - webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(lv->web_view)); + webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(lv->web_view)); select_first_log(lv); return; } @@ -138,7 +138,7 @@ if (lv->search != NULL && !strcmp(lv->search, search_term)) { /* Searching for the same term acts as "Find Next" */ - webkit_web_view_search_text (WEBKIT_WEB_VIEW(lv->web_view), lv->search, FALSE, TRUE, TRUE); + webkit_web_view_search_text(WEBKIT_WEB_VIEW(lv->web_view), lv->search, FALSE, TRUE, TRUE); return; } @@ -148,7 +148,7 @@ lv->search = g_strdup(search_term); gtk_tree_store_clear(lv->treestore); - webkit_web_view_open (WEBKIT_WEB_VIEW (lv->web_view), "about:blank"); /* clear the view */ + webkit_web_view_open(WEBKIT_WEB_VIEW(lv->web_view), "about:blank"); /* clear the view */ for (logs = lv->logs; logs != NULL; logs = logs->next) { char *read = purple_log_read((PurpleLog*)logs->data, NULL); @@ -419,9 +419,9 @@ static gboolean search_find_cb(gpointer data) { PidginLogViewer *viewer = data; - webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (viewer->web_view), viewer->search, FALSE, 0); - webkit_web_view_set_highlight_text_matches (WEBKIT_WEB_VIEW (viewer->web_view), TRUE); - webkit_web_view_search_text (WEBKIT_WEB_VIEW (viewer->web_view), viewer->search, FALSE, TRUE, TRUE); + webkit_web_view_mark_text_matches(WEBKIT_WEB_VIEW(viewer->web_view), viewer->search, FALSE, 0); + webkit_web_view_set_highlight_text_matches(WEBKIT_WEB_VIEW(viewer->web_view), TRUE); + webkit_web_view_search_text(WEBKIT_WEB_VIEW(viewer->web_view), viewer->search, FALSE, TRUE, TRUE); return FALSE; } @@ -462,11 +462,11 @@ read = purple_log_read(log, &flags); viewer->flags = flags; - webkit_web_view_open (WEBKIT_WEB_VIEW(viewer->web_view), "about:blank"); + webkit_web_view_open(WEBKIT_WEB_VIEW(viewer->web_view), "about:blank"); purple_signal_emit(pidgin_log_get_handle(), "log-displaying", viewer, log); - webkit_web_view_load_html_string (WEBKIT_WEB_VIEW(viewer->web_view), read, ""); + webkit_web_view_load_html_string(WEBKIT_WEB_VIEW(viewer->web_view), read, ""); g_free(read); if (viewer->search != NULL) { @@ -614,7 +614,7 @@ col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); - gtk_paned_add1(GTK_PANED(pane), + gtk_paned_add1(GTK_PANED(pane), pidgin_make_scrollable(lv->treeview, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1)); populate_log_tree(lv); @@ -649,7 +649,7 @@ gtk_paned_add2(GTK_PANED(pane), vbox); /* Viewer ************/ - /* + /* FIXME: sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
--- a/pidgin/gtknotify.c Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/gtknotify.c Thu Sep 08 22:04:35 2011 +0000 @@ -856,11 +856,11 @@ /* Add the webview */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - web_view = gtk_webview_new (); - gtk_container_add (GTK_CONTAINER (scrolled_window), web_view); + web_view = gtk_webview_new(); + gtk_container_add(GTK_CONTAINER(scrolled_window), web_view); gtk_widget_set_name(web_view, "pidgin_notify_webview"); gtk_widget_set_size_request(web_view, 300, 250); @@ -878,7 +878,7 @@ /* Make sure URLs are clickable */ linked_text = purple_markup_linkify(text); - webkit_web_view_load_html_string (WEBKIT_WEB_VIEW (web_view), linked_text, ""); + webkit_web_view_load_html_string(WEBKIT_WEB_VIEW(web_view), linked_text, ""); g_free(linked_text); g_object_set_data(G_OBJECT(window), "webview-widget", web_view); @@ -1138,9 +1138,8 @@ if (pinfo != NULL) { GtkWidget *webview = g_object_get_data(G_OBJECT(pinfo->window), "webview-widget"); char *linked_text = purple_markup_linkify(info); - g_assert (webview); - printf ("%s\n", linked_text); - gtk_webview_load_html_string_with_imgstore (GTK_WEBVIEW (webview), linked_text); + g_assert(webview); + gtk_webview_load_html_string_with_imgstore(GTK_WEBVIEW(webview), linked_text); g_free(linked_text); g_free(key); ui_handle = pinfo->window; @@ -1640,7 +1639,7 @@ gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), + gtk_box_pack_start(GTK_BOX(vbox), pidgin_make_scrollable(spec_dialog->treeview, GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1), TRUE, TRUE, 2);
--- a/pidgin/gtkwebview.c Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/gtkwebview.c Thu Sep 08 22:04:35 2011 +0000 @@ -10,7 +10,7 @@ * source distribution. * * This program is free software; you can redistribute it and/or modify - * under the terms of the GNU General Public License as published by + * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * @@ -53,82 +53,85 @@ GTimer *scroll_time; }; -GtkWidget* gtk_webview_new (void) +GtkWidget * +gtk_webview_new(void) { - GtkWebView* ret = GTK_WEBVIEW (g_object_new(gtk_webview_get_type(), NULL)); - return GTK_WIDGET (ret); + GtkWebView* ret = GTK_WEBVIEW(g_object_new(gtk_webview_get_type(), NULL)); + return GTK_WIDGET(ret); } -static char* -get_image_filename_from_id (GtkWebView* view, int id) +static char * +get_image_filename_from_id(GtkWebView* view, int id) { char *filename = NULL; FILE *file; PurpleStoredImage* img; if (!view->priv->images) - view->priv->images = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free); - - filename = (char*) g_hash_table_lookup (view->priv->images, GINT_TO_POINTER (id)); - if (filename) return filename; - + view->priv->images = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); + + filename = (char *)g_hash_table_lookup(view->priv->images, GINT_TO_POINTER(id)); + if (filename) + return filename; + /* else get from img store */ - file = purple_mkstemp (&filename, TRUE); + file = purple_mkstemp(&filename, TRUE); - img = purple_imgstore_find_by_id (id); + img = purple_imgstore_find_by_id(id); - fwrite (purple_imgstore_get_data (img), purple_imgstore_get_size (img), 1, file); - g_hash_table_insert (view->priv->images, GINT_TO_POINTER (id), filename); - fclose (file); + fwrite(purple_imgstore_get_data(img), purple_imgstore_get_size(img), 1, file); + g_hash_table_insert(view->priv->images, GINT_TO_POINTER(id), filename); + fclose(file); return filename; } static void -clear_single_image (gpointer key, gpointer value, gpointer userdata) +clear_single_image(gpointer key, gpointer value, gpointer userdata) { - g_unlink ((char*) value); + g_unlink((char *)value); } static void -clear_images (GtkWebView* view) +clear_images(GtkWebView *view) { - if (!view->priv->images) return; - g_hash_table_foreach (view->priv->images, clear_single_image, NULL); - g_hash_table_unref (view->priv->images); + if (!view->priv->images) + return; + g_hash_table_foreach(view->priv->images, clear_single_image, NULL); + g_hash_table_unref(view->priv->images); } /* * Replace all <img id=""> tags with <img src="">. I hoped to never - * write any HTML parsing code, but I'm forced to do this, until + * write any HTML parsing code, but I'm forced to do this, until * purple changes the way it works. */ -static char* -replace_img_id_with_src (GtkWebView *view, const char* html) +static char * +replace_img_id_with_src(GtkWebView *view, const char *html) { - GString *buffer = g_string_sized_new (strlen (html)); + GString *buffer = g_string_sized_new(strlen(html)); const char* cur = html; char *id; int nid; while (*cur) { - const char* img = strstr (cur, "<img"); + const char *img = strstr(cur, "<img"); if (!img) { - g_string_append (buffer, cur); + g_string_append(buffer, cur); break; } else - g_string_append_len (buffer, cur, img - cur); + g_string_append_len(buffer, cur, img - cur); - cur = strstr (img, "/>"); + cur = strstr(img, "/>"); if (!cur) - cur = strstr (img, ">"); + cur = strstr(img, ">"); if (!cur) { /* invalid html? */ - g_string_printf (buffer, "%s", html); + g_string_printf(buffer, "%s", html); break; } - if (strstr (img, "src=") || !strstr (img, "id=")) { - g_string_printf (buffer, "%s", html); + if (strstr(img, "src=") || !strstr(img, "id=")) { + g_string_printf(buffer, "%s", html); break; } @@ -138,46 +141,46 @@ * '=' cannot appear in parameters. */ - id = strstr (img, "id=") + 3; + id = strstr(img, "id=") + 3; /* *id can't be \0, since a ">" appears after this */ - if (isdigit (*id)) - nid = atoi (id); - else - nid = atoi (id+1); + if (isdigit(*id)) + nid = atoi(id); + else + nid = atoi(id + 1); /* let's dump this, tag and then dump the src information */ - g_string_append_len (buffer, img, cur - img); + g_string_append_len(buffer, img, cur - img); - g_string_append_printf (buffer, " src='file://%s' ", get_image_filename_from_id (view, nid)); + g_string_append_printf(buffer, " src='file://%s' ", get_image_filename_from_id(view, nid)); } - return g_string_free (buffer, FALSE); + return g_string_free(buffer, FALSE); } static void -gtk_webview_finalize (GObject *view) +gtk_webview_finalize(GObject *view) { gpointer temp; - - while ((temp = g_queue_pop_head (GTK_WEBVIEW(view)->priv->js_queue))) - g_free (temp); - g_queue_free (GTK_WEBVIEW(view)->priv->js_queue); - clear_images (GTK_WEBVIEW (view)); - g_free (GTK_WEBVIEW(view)->priv); - G_OBJECT_CLASS (parent_class)->finalize (G_OBJECT(view)); + while ((temp = g_queue_pop_head(GTK_WEBVIEW(view)->priv->js_queue))) + g_free(temp); + g_queue_free(GTK_WEBVIEW(view)->priv->js_queue); + + clear_images(GTK_WEBVIEW(view)); + g_free(GTK_WEBVIEW(view)->priv); + G_OBJECT_CLASS(parent_class)->finalize(G_OBJECT(view)); } static void -gtk_webview_class_init (GtkWebViewClass *klass, gpointer userdata) +gtk_webview_class_init(GtkWebViewClass *klass, gpointer userdata) { - parent_class = g_type_class_ref (webkit_web_view_get_type ()); - G_OBJECT_CLASS (klass)->finalize = gtk_webview_finalize; + parent_class = g_type_class_ref(webkit_web_view_get_type()); + G_OBJECT_CLASS(klass)->finalize = gtk_webview_finalize; } static gboolean -webview_link_clicked (WebKitWebView *view, +webview_link_clicked(WebKitWebView *view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, @@ -186,13 +189,13 @@ const gchar *uri; WebKitWebNavigationReason reason; - uri = webkit_network_request_get_uri (request); + uri = webkit_network_request_get_uri(request); reason = webkit_web_navigation_action_get_reason(navigation_action); if (reason == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED) { /* the gtk imhtml way was to create an idle cb, not sure * why, so right now just using purple_notify_uri directly */ - purple_notify_uri (NULL, uri); + purple_notify_uri(NULL, uri); } webkit_web_policy_decision_use(policy_decision); @@ -201,129 +204,131 @@ } static gboolean -process_js_script_queue (GtkWebView *view) +process_js_script_queue(GtkWebView *view) { char *script; - if (view->priv->is_loading) return FALSE; /* we will be called when loaded */ - if (!view->priv->js_queue || g_queue_is_empty (view->priv->js_queue)) + if (view->priv->is_loading) + return FALSE; /* we will be called when loaded */ + if (!view->priv->js_queue || g_queue_is_empty(view->priv->js_queue)) return FALSE; /* nothing to do! */ - script = g_queue_pop_head (view->priv->js_queue); - webkit_web_view_execute_script (WEBKIT_WEB_VIEW(view), script); - g_free (script); + script = g_queue_pop_head(view->priv->js_queue); + webkit_web_view_execute_script(WEBKIT_WEB_VIEW(view), script); + g_free(script); return TRUE; /* there may be more for now */ } static void -webview_load_started (WebKitWebView *view, +webview_load_started(WebKitWebView *view, WebKitWebFrame *frame, gpointer userdata) { /* is there a better way to test for is_loading? */ - GTK_WEBVIEW(view)->priv->is_loading = true; + GTK_WEBVIEW(view)->priv->is_loading = TRUE; } static void -webview_load_finished (WebKitWebView *view, +webview_load_finished(WebKitWebView *view, WebKitWebFrame *frame, gpointer userdata) { - GTK_WEBVIEW(view)->priv->is_loading = false; - g_idle_add ((GSourceFunc) process_js_script_queue, view); + GTK_WEBVIEW(view)->priv->is_loading = FALSE; + g_idle_add((GSourceFunc)process_js_script_queue, view); } void -gtk_webview_safe_execute_script (GtkWebView *view, const char* script) +gtk_webview_safe_execute_script(GtkWebView *view, const char *script) { - g_queue_push_tail (view->priv->js_queue, g_strdup (script)); - g_idle_add ((GSourceFunc)process_js_script_queue, view); + g_queue_push_tail(view->priv->js_queue, g_strdup(script)); + g_idle_add((GSourceFunc)process_js_script_queue, view); } static void -gtk_webview_init (GtkWebView *view, gpointer userdata) +gtk_webview_init(GtkWebView *view, gpointer userdata) { - view->priv = g_new0 (struct GtkWebViewPriv, 1); - g_signal_connect (view, "navigation-policy-decision-requested", - G_CALLBACK (webview_link_clicked), + view->priv = g_new0(struct GtkWebViewPriv, 1); + g_signal_connect(view, "navigation-policy-decision-requested", + G_CALLBACK(webview_link_clicked), view); - g_signal_connect (view, "load-started", - G_CALLBACK (webview_load_started), + g_signal_connect(view, "load-started", + G_CALLBACK(webview_load_started), view); - g_signal_connect (view, "load-finished", - G_CALLBACK (webview_load_finished), + g_signal_connect(view, "load-finished", + G_CALLBACK(webview_load_finished), view); view->priv->empty = TRUE; - view->priv->js_queue = g_queue_new (); + view->priv->js_queue = g_queue_new(); } void -gtk_webview_load_html_string_with_imgstore (GtkWebView* view, const char* html) +gtk_webview_load_html_string_with_imgstore(GtkWebView *view, const char *html) { - char* html_imged; - - clear_images (view); - html_imged = replace_img_id_with_src (view, html); - printf ("%s\n", html_imged); - webkit_web_view_load_html_string (WEBKIT_WEB_VIEW (view), html_imged, "file:///"); - g_free (html_imged); + char *html_imged; + + clear_images(view); + html_imged = replace_img_id_with_src(view, html); + webkit_web_view_load_html_string(WEBKIT_WEB_VIEW(view), html_imged, "file:///"); + g_free(html_imged); } -char *gtk_webview_quote_js_string(const char *text) +char * +gtk_webview_quote_js_string(const char *text) { - GString *str = g_string_new("\""); - const char *cur = text; + GString *str = g_string_new("\""); + const char *cur = text; - while (cur && *cur) { - switch (*cur) { - case '\\': - g_string_append(str, "\\\\"); - break; - case '\"': - g_string_append(str, "\\\""); - break; - case '\r': - g_string_append(str, "<br/>"); - break; - case '\n': - break; - default: - g_string_append_c(str, *cur); + while (cur && *cur) { + switch (*cur) { + case '\\': + g_string_append(str, "\\\\"); + break; + case '\"': + g_string_append(str, "\\\""); + break; + case '\r': + g_string_append(str, "<br/>"); + break; + case '\n': + break; + default: + g_string_append_c(str, *cur); } - cur ++; + cur++; } - g_string_append_c (str, '"'); - return g_string_free (str, FALSE); + g_string_append_c(str, '"'); + return g_string_free(str, FALSE); } -void gtk_webview_set_vadjustment(GtkWebView *webview, GtkAdjustment *vadj) +void +gtk_webview_set_vadjustment(GtkWebView *webview, GtkAdjustment *vadj) { webview->priv->vadj = vadj; } -/* this is a "hack", my plan is to eventually handle this +/* this is a "hack", my plan is to eventually handle this * correctly using a signals and a plugin: the plugin will have * the information as to what javascript function to call. It seems * wrong to hardcode that here. */ void -gtk_webview_append_html (GtkWebView* view, const char* html) +gtk_webview_append_html(GtkWebView *view, const char *html) { - char* escaped = gtk_webview_quote_js_string (html); - char* script = g_strdup_printf ("document.write(%s)", escaped); - printf ("script: %s\n", script); - webkit_web_view_execute_script (WEBKIT_WEB_VIEW (view), script); + char *escaped = gtk_webview_quote_js_string(html); + char *script = g_strdup_printf("document.write(%s)", escaped); + webkit_web_view_execute_script(WEBKIT_WEB_VIEW(view), script); view->priv->empty = FALSE; gtk_webview_scroll_to_end(view, TRUE); - g_free (script); - g_free (escaped); + g_free(script); + g_free(escaped); } -gboolean gtk_webview_is_empty (GtkWebView *view) +gboolean +gtk_webview_is_empty(GtkWebView *view) { return view->priv->empty; } @@ -336,7 +341,8 @@ * * @return TRUE if the window needs to be scrolled further, FALSE if we're at the bottom. */ -static gboolean smooth_scroll_cb(gpointer data) +static gboolean +smooth_scroll_cb(gpointer data) { struct GtkWebViewPriv *priv = data; GtkAdjustment *adj = priv->vadj; @@ -360,18 +366,20 @@ return TRUE; } -static gboolean scroll_idle_cb(gpointer data) +static gboolean +scroll_idle_cb(gpointer data) { struct GtkWebViewPriv *priv = data; GtkAdjustment *adj = priv->vadj; - if(adj) { + if (adj) { gtk_adjustment_set_value(adj, adj->upper - adj->page_size); } priv->scroll_src = 0; return FALSE; } -void gtk_webview_scroll_to_end(GtkWebView *webview, gboolean smooth) +void +gtk_webview_scroll_to_end(GtkWebView *webview, gboolean smooth) { struct GtkWebViewPriv *priv = webview->priv; if (priv->scroll_time) @@ -387,24 +395,26 @@ } } -GType gtk_webview_get_type (void) +GType +gtk_webview_get_type(void) { static GType mview_type = 0; - if (G_UNLIKELY (mview_type == 0)) { + if (G_UNLIKELY(mview_type == 0)) { static const GTypeInfo mview_info = { - sizeof (GtkWebViewClass), + sizeof(GtkWebViewClass), NULL, NULL, (GClassInitFunc) gtk_webview_class_init, NULL, NULL, - sizeof (GtkWebView), + sizeof(GtkWebView), 0, (GInstanceInitFunc) gtk_webview_init, NULL }; - mview_type = g_type_register_static(webkit_web_view_get_type (), + mview_type = g_type_register_static(webkit_web_view_get_type(), "GtkWebView", &mview_info, 0); } return mview_type; } +
--- a/pidgin/gtkwebview.h Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/gtkwebview.h Thu Sep 08 22:04:35 2011 +0000 @@ -3,12 +3,14 @@ * @ingroup pidgin */ -/* Pidgin is the legal property of its developers, whose names are too numerous +/* pidgin + * + * Pidgin is the legal property of its developers, whose names are too numerous * to list here. Please refer to the COPYRIGHT file distributed with this * source distribution. * * This program is free software; you can redistribute it and/or modify - * under the terms of the GNU General Public License as published by + * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * @@ -20,6 +22,7 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + * */ #ifndef _PIDGIN_WEBVIEW_H_ @@ -45,7 +48,7 @@ WebKitWebView webkit_web_view; /*< private >*/ - struct GtkWebViewPriv* priv; + struct GtkWebViewPriv *priv; }; typedef struct _GtkWebView GtkWebView; @@ -63,14 +66,14 @@ * * @return the GType for GtkWebView widget */ -GType gtk_webview_get_type (void); +GType gtk_webview_get_type(void); /** * Create a new GtkWebView object * * @return a GtkWidget corresponding to the GtkWebView object */ -GtkWidget* gtk_webview_new (void); +GtkWidget *gtk_webview_new(void); /** * Set the vertical adjustment for the GtkWebView. @@ -87,7 +90,7 @@ * @param webview The GtkWebView object * @param markup The html markup to append */ -void gtk_webview_append_html (GtkWebView *webview, const char* markup); +void gtk_webview_append_html(GtkWebView *webview, const char *markup); /** * Rather than use webkit_webview_load_string, this routine @@ -97,47 +100,48 @@ * @param webview The GtkWebView object * @param html The HTML content to load */ -void gtk_webview_load_html_string_with_imgstore (GtkWebView* webview, const char* html); +void gtk_webview_load_html_string_with_imgstore(GtkWebView *webview, const char *html); /** - * (To be changed, right now it just tests whether an append has been + * FIXME: (To be changed, right now it just tests whether an append has been * called since the last clear or since the Widget was created. So it * does not test for load_string's called in between. * * @param webview The GtkWebView object - * + * * @return gboolean indicating whether the webview is empty. */ -gboolean gtk_webview_is_empty (GtkWebView *webview); +gboolean gtk_webview_is_empty(GtkWebView *webview); /** * Execute the JavaScript only after the webkit_webview_load_string * loads completely. We also guarantee that the scripts are executed - * in the order they are called here.This is useful to avoid race - * conditions when calls JS functions immediately after opening the + * in the order they are called here. This is useful to avoid race + * conditions when calling JS functions immediately after opening the * page. * * @param webview the GtkWebView object * @param script the script to execute */ -void gtk_webview_safe_execute_script (GtkWebView *webview, const char* script); +void gtk_webview_safe_execute_script(GtkWebView *webview, const char *script); /** - * A convenience routine to quote a string for use as a JavaScript + * A convenience routine to quote a string for use as a JavaScript * string. For instance, "hello 'world'" becomes "'hello \\'world\\''" * * @param str The string to escape and quote * * @return the quoted string. */ -char* gtk_webview_quote_js_string (const char* str); +char *gtk_webview_quote_js_string(const char *str); /** * Scrolls the Webview to the end of its contents. * * @param webview The GtkWebView. - * @param smoth A boolean indicating if smooth scrolling should be used. + * @param smooth A boolean indicating if smooth scrolling should be used. */ void gtk_webview_scroll_to_end(GtkWebView *webview, gboolean smooth); #endif /* _PIDGIN_WEBVIEW_H_ */ +
--- a/pidgin/plugins/adiumthemes/message-style.c Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/plugins/adiumthemes/message-style.c Thu Sep 08 22:04:35 2011 +0000 @@ -1,21 +1,23 @@ -/* - * Adium Message Styles - * Copyright (C) 2009 Arnold Noronha <arnstein87@gmail.com> +/* pidgin + * + * Pidgin is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + * */ #include "message-style.h" @@ -28,42 +30,42 @@ #include <util.h> static void -glist_free_all_string (GList *list) +glist_free_all_string(GList *list) { GList *first = list; - for (; list; list = g_list_next (list)) - g_free (list->data); - g_list_free (first); + for (; list; list = g_list_next(list)) + g_free(list->data); + g_list_free(first); } -static -PidginMessageStyle* pidgin_message_style_new (const char* styledir) +static PidginMessageStyle * +pidgin_message_style_new(const char *styledir) { - PidginMessageStyle* ret = g_new0 (PidginMessageStyle, 1); + PidginMessageStyle *ret = g_new0(PidginMessageStyle, 1); ret->ref_counter = 1; - ret->style_dir = g_strdup (styledir); - + ret->style_dir = g_strdup(styledir); + return ret; } /** - * deallocate any memory used for info.plist options + * deallocate any memory used for info.plist options */ static void -pidgin_message_style_unset_info_plist (PidginMessageStyle *style) +pidgin_message_style_unset_info_plist(PidginMessageStyle *style) { style->message_view_version = 0; - g_free (style->cf_bundle_name); + g_free(style->cf_bundle_name); style->cf_bundle_name = NULL; - g_free (style->cf_bundle_identifier); + g_free(style->cf_bundle_identifier); style->cf_bundle_identifier = NULL; - g_free (style->cf_bundle_get_info_string); + g_free(style->cf_bundle_get_info_string); style->cf_bundle_get_info_string = NULL; - g_free (style->default_font_family); + g_free(style->default_font_family); style->default_font_family = NULL; style->default_font_size = 0; @@ -72,112 +74,127 @@ style->default_background_is_transparent = FALSE; style->disable_custom_background = FALSE; - g_free (style->default_background_color); + g_free(style->default_background_color); style->default_background_color = NULL; - + style->allow_text_colors = TRUE; - - g_free (style->image_mask); + + g_free(style->image_mask); style->image_mask = NULL; - g_free (style->default_variant); + g_free(style->default_variant); style->default_variant = NULL; } -void pidgin_message_style_unref (PidginMessageStyle *style) +void +pidgin_message_style_unref(PidginMessageStyle *style) { - if (!style) return; + if (!style) + return; g_assert (style->ref_counter > 0); style->ref_counter--; - if (style->ref_counter) return; + if (style->ref_counter) + return; + + g_free(style->style_dir); + g_free(style->template_path); - g_free (style->style_dir); - g_free (style->template_path); - - g_free (style->template_html); - g_free (style->incoming_content_html); - g_free (style->outgoing_content_html); - g_free (style->outgoing_next_content_html); - g_free (style->status_html); - g_free (style->basestyle_css); + g_free(style->template_html); + g_free(style->incoming_content_html); + g_free(style->outgoing_content_html); + g_free(style->outgoing_next_content_html); + g_free(style->status_html); + g_free(style->basestyle_css); - g_free (style); + g_free(style); - pidgin_message_style_unset_info_plist (style); + pidgin_message_style_unset_info_plist(style); } void -pidgin_message_style_save_state (const PidginMessageStyle *style) +pidgin_message_style_save_state(const PidginMessageStyle *style) { - char *prefname = g_strdup_printf ("/plugins/gtk/adiumthemes/%s", style->cf_bundle_identifier); - char *variant = g_strdup_printf ("%s/variant", prefname); + char *prefname = g_strdup_printf("/plugins/gtk/adiumthemes/%s", style->cf_bundle_identifier); + char *variant = g_strdup_printf("%s/variant", prefname); - purple_debug_info ("webkit", "saving state with variant %s\n", style->variant); - purple_prefs_add_none (prefname); - purple_prefs_add_string (variant, ""); - purple_prefs_set_string (variant, style->variant); - - g_free (prefname); - g_free (variant); + purple_debug_info("webkit", "saving state with variant %s\n", style->variant); + purple_prefs_add_none(prefname); + purple_prefs_add_string(variant, ""); + purple_prefs_set_string(variant, style->variant); + + g_free(prefname); + g_free(variant); } static void -pidgin_message_style_load_state (PidginMessageStyle *style) +pidgin_message_style_load_state(PidginMessageStyle *style) { - char *prefname = g_strdup_printf ("/plugins/gtk/adiumthemes/%s", style->cf_bundle_identifier); - char *variant = g_strdup_printf ("%s/variant", prefname); + char *prefname = g_strdup_printf("/plugins/gtk/adiumthemes/%s", style->cf_bundle_identifier); + char *variant = g_strdup_printf("%s/variant", prefname); + + const char* value = purple_prefs_get_string(variant); + gboolean changed = !style->variant || !g_str_equal(style->variant, value); - const char* value = purple_prefs_get_string (variant); - gboolean changed = !style->variant || !g_str_equal (style->variant, value); + g_free(style->variant); + style->variant = g_strdup(value); - g_free (style->variant); - style->variant = g_strdup (value); + if (changed) + pidgin_message_style_read_info_plist(style, style->variant); - if (changed) pidgin_message_style_read_info_plist (style, style->variant); - - g_free (prefname); + g_free(prefname); g_free(variant); } static gboolean -parse_info_plist_key_value (xmlnode* key, gpointer destination, const char* expected) +parse_info_plist_key_value(xmlnode* key, gpointer destination, const char* expected) { xmlnode *val = key->next; - for (; val && val->type != XMLNODE_TYPE_TAG; val = val->next); - if (!val) return FALSE; - - if (expected == NULL || g_str_equal (expected, "string")) { - char** dest = (char**) destination; - if (!g_str_equal (val->name, "string")) return FALSE; - if (*dest) g_free (*dest); - *dest = xmlnode_get_data_unescaped (val); - } else if (g_str_equal (expected, "integer")) { - int* dest = (int*) destination; - char* value = xmlnode_get_data_unescaped (val); + for (; val && val->type != XMLNODE_TYPE_TAG; val = val->next) + ; + if (!val) + return FALSE; - if (!g_str_equal (val->name, "integer")) return FALSE; - *dest = atoi (value); - g_free (value); - } else if (g_str_equal (expected, "boolean")) { - gboolean *dest = (gboolean*) destination; - if (g_str_equal (val->name, "true")) *dest = TRUE; - else if (g_str_equal (val->name, "false")) *dest = FALSE; - else return FALSE; + if (expected == NULL || g_str_equal(expected, "string")) { + char **dest = (char **)destination; + if (!g_str_equal(val->name, "string")) + return FALSE; + if (*dest) + g_free(*dest); + *dest = xmlnode_get_data_unescaped(val); + } else if (g_str_equal(expected, "integer")) { + int *dest = (int *)destination; + char *value = xmlnode_get_data_unescaped(val); + + if (!g_str_equal(val->name, "integer")) + return FALSE; + *dest = atoi(value); + g_free(value); + } else if (g_str_equal(expected, "boolean")) { + gboolean *dest = (gboolean *)destination; + if (g_str_equal(val->name, "true")) + *dest = TRUE; + else if (g_str_equal(val->name, "false")) + *dest = FALSE; + else + return FALSE; } else return FALSE; - + return TRUE; } -static -gboolean str_for_key (const char *key, const char *found, const char *variant){ - if (g_str_equal (key, found)) return TRUE; - if (!variant) return FALSE; - return (g_str_has_prefix (found, key) - && g_str_has_suffix (found, variant) - && strlen (found) == strlen (key) + strlen (variant) + 1); +static gboolean +str_for_key(const char *key, const char *found, const char *variant) +{ + if (g_str_equal(key, found)) + return TRUE; + if (!variant) + return FALSE; + return (g_str_has_prefix(found, key) + && g_str_has_suffix(found, variant) + && strlen(found) == strlen(key) + strlen(variant) + 1); } /** @@ -185,55 +202,55 @@ * the keys that take precedence depend on the value of the current variant. */ void -pidgin_message_style_read_info_plist (PidginMessageStyle *style, const char* variant) +pidgin_message_style_read_info_plist(PidginMessageStyle *style, const char *variant) { /* note that if a variant is used the option:VARIANTNAME takes precedence */ - char *contents = g_build_filename (style->style_dir, "Contents", NULL); - xmlnode *plist = xmlnode_from_file (contents, "Info.plist", "Info.plist", "webkit"), *iter; - xmlnode *dict = xmlnode_get_child (plist, "dict"); + char *contents = g_build_filename(style->style_dir, "Contents", NULL); + xmlnode *plist = xmlnode_from_file(contents, "Info.plist", "Info.plist", "webkit"), *iter; + xmlnode *dict = xmlnode_get_child(plist, "dict"); g_assert (dict); - for (iter = xmlnode_get_child (dict, "key"); iter; iter = xmlnode_get_next_twin (iter)) { - char* key = xmlnode_get_data_unescaped (iter); + for (iter = xmlnode_get_child(dict, "key"); iter; iter = xmlnode_get_next_twin(iter)) { + char* key = xmlnode_get_data_unescaped(iter); gboolean pr = TRUE; - if (g_str_equal ("MessageViewVersion", key)) - pr = parse_info_plist_key_value (iter, &style->message_view_version, "integer"); - else if (g_str_equal ("CFBundleName", key)) - pr = parse_info_plist_key_value (iter, &style->cf_bundle_name, "string"); - else if (g_str_equal ("CFBundleIdentifier", key)) - pr = parse_info_plist_key_value (iter, &style->cf_bundle_identifier, "string"); - else if (g_str_equal ("CFBundleGetInfoString", key)) - pr = parse_info_plist_key_value (iter, &style->cf_bundle_get_info_string, "string"); - else if (str_for_key ("DefaultFontFamily", key, variant)) - pr = parse_info_plist_key_value (iter, &style->default_font_family, "string"); - else if (str_for_key ("DefaultFontSize", key, variant)) - pr = parse_info_plist_key_value (iter, &style->default_font_size, "integer"); - else if (str_for_key ("ShowsUserIcons", key, variant)) - pr = parse_info_plist_key_value (iter, &style->shows_user_icons, "boolean"); - else if (str_for_key ("DisableCombineConsecutive", key, variant)) - pr = parse_info_plist_key_value (iter, &style->disable_combine_consecutive, "boolean"); - else if (str_for_key ("DefaultBackgroundIsTransparent", key, variant)) - pr = parse_info_plist_key_value (iter, &style->default_background_is_transparent, "boolean"); - else if (str_for_key ("DisableCustomBackground", key, variant)) - pr = parse_info_plist_key_value (iter, &style->disable_custom_background, "boolean"); - else if (str_for_key ("DefaultBackgroundColor", key, variant)) - pr = parse_info_plist_key_value (iter, &style->default_background_color, "string"); - else if (str_for_key ("AllowTextColors", key, variant)) - pr = parse_info_plist_key_value (iter, &style->allow_text_colors, "integer"); - else if (str_for_key ("ImageMask", key, variant)) - pr = parse_info_plist_key_value (iter, &style->image_mask, "string"); + if (g_str_equal("MessageViewVersion", key)) + pr = parse_info_plist_key_value(iter, &style->message_view_version, "integer"); + else if (g_str_equal("CFBundleName", key)) + pr = parse_info_plist_key_value(iter, &style->cf_bundle_name, "string"); + else if (g_str_equal("CFBundleIdentifier", key)) + pr = parse_info_plist_key_value(iter, &style->cf_bundle_identifier, "string"); + else if (g_str_equal("CFBundleGetInfoString", key)) + pr = parse_info_plist_key_value(iter, &style->cf_bundle_get_info_string, "string"); + else if (str_for_key("DefaultFontFamily", key, variant)) + pr = parse_info_plist_key_value(iter, &style->default_font_family, "string"); + else if (str_for_key("DefaultFontSize", key, variant)) + pr = parse_info_plist_key_value(iter, &style->default_font_size, "integer"); + else if (str_for_key("ShowsUserIcons", key, variant)) + pr = parse_info_plist_key_value(iter, &style->shows_user_icons, "boolean"); + else if (str_for_key("DisableCombineConsecutive", key, variant)) + pr = parse_info_plist_key_value(iter, &style->disable_combine_consecutive, "boolean"); + else if (str_for_key("DefaultBackgroundIsTransparent", key, variant)) + pr = parse_info_plist_key_value(iter, &style->default_background_is_transparent, "boolean"); + else if (str_for_key("DisableCustomBackground", key, variant)) + pr = parse_info_plist_key_value(iter, &style->disable_custom_background, "boolean"); + else if (str_for_key("DefaultBackgroundColor", key, variant)) + pr = parse_info_plist_key_value(iter, &style->default_background_color, "string"); + else if (str_for_key("AllowTextColors", key, variant)) + pr = parse_info_plist_key_value(iter, &style->allow_text_colors, "integer"); + else if (str_for_key("ImageMask", key, variant)) + pr = parse_info_plist_key_value(iter, &style->image_mask, "string"); if (!pr) - purple_debug_warning ("webkit", "Failed to parse key %s\n", key); - g_free (key); + purple_debug_warning("webkit", "Failed to parse key %s\n", key); + g_free(key); } - xmlnode_free (plist); + xmlnode_free(plist); } -PidginMessageStyle* -pidgin_message_style_load (const char* styledir) +PidginMessageStyle * +pidgin_message_style_load(const char *styledir) { /* * the loading process described: @@ -247,14 +264,11 @@ * and if that does not exist, we choose the first one in the * directory. */ - - /* is this style already loaded? */ - char *file; /* temporary variable */ + char *file; PidginMessageStyle *style = NULL; - /* else we need to load it */ - style = pidgin_message_style_new (styledir); - + style = pidgin_message_style_new(styledir); + /* load all other files */ /* The template path can either come from the theme, or can @@ -262,187 +276,187 @@ style->template_path = g_build_filename(styledir, "Contents", "Resources", "Template.html", NULL); if (!g_file_test(style->template_path, G_FILE_TEST_EXISTS)) { - g_free (style->template_path); + g_free(style->template_path); style->template_path = g_build_filename(DATADIR, "pidgin", "webkit", "Template.html", NULL); } if (!g_file_get_contents(style->template_path, &style->template_html, NULL, NULL)) { - purple_debug_error ("webkit", "Could not locate a Template.html (%s)\n", style->template_path); - pidgin_message_style_unref (style); + purple_debug_error("webkit", "Could not locate a Template.html (%s)\n", style->template_path); + pidgin_message_style_unref(style); return NULL; } file = g_build_filename(styledir, "Contents", "Resources", "Status.html", NULL); if (!g_file_get_contents(file, &style->status_html, NULL, NULL)) { - purple_debug_info ("webkit", "%s could not find Resources/Status.html", styledir); - pidgin_message_style_unref (style); - g_free (file); + purple_debug_info("webkit", "%s could not find Resources/Status.html", styledir); + pidgin_message_style_unref(style); + g_free(file); return NULL; } - g_free (file); + g_free(file); file = g_build_filename(styledir, "Contents", "Resources", "main.css", NULL); if (!g_file_get_contents(file, &style->basestyle_css, NULL, NULL)) - style->basestyle_css = g_strdup (""); - g_free (file); - + style->basestyle_css = g_strdup(""); + g_free(file); + file = g_build_filename(styledir, "Contents", "Resources", "Header.html", NULL); if (!g_file_get_contents(file, &style->header_html, NULL, NULL)) - style->header_html = g_strdup (""); - g_free (file); + style->header_html = g_strdup(""); + g_free(file); file = g_build_filename(styledir, "Contents", "Resources", "Footer.html", NULL); if (!g_file_get_contents(file, &style->footer_html, NULL, NULL)) - style->footer_html = g_strdup (""); - g_free (file); + style->footer_html = g_strdup(""); + g_free(file); file = g_build_filename(styledir, "Contents", "Resources", "Incoming", "Content.html", NULL); if (!g_file_get_contents(file, &style->incoming_content_html, NULL, NULL)) { - purple_debug_info ("webkit", "%s did not have a Incoming/Content.html\n", styledir); - pidgin_message_style_unref (style); - g_free (file); + purple_debug_info("webkit", "%s did not have a Incoming/Content.html\n", styledir); + pidgin_message_style_unref(style); + g_free(file); return NULL; } - g_free (file); + g_free(file); /* according to the spec, the following are optional files */ file = g_build_filename(styledir, "Contents", "Resources", "Incoming", "NextContent.html", NULL); if (!g_file_get_contents(file, &style->incoming_next_content_html, NULL, NULL)) { - style->incoming_next_content_html = g_strdup (style->incoming_content_html); + style->incoming_next_content_html = g_strdup(style->incoming_content_html); } - g_free (file); + g_free(file); file = g_build_filename(styledir, "Contents", "Resources", "Outgoing", "Content.html", NULL); if (!g_file_get_contents(file, &style->outgoing_content_html, NULL, NULL)) { style->outgoing_content_html = g_strdup(style->incoming_content_html); } - g_free (file); + g_free(file); file = g_build_filename(styledir, "Contents", "Resources", "Outgoing", "NextContent.html", NULL); if (!g_file_get_contents(file, &style->outgoing_next_content_html, NULL, NULL)) { - style->outgoing_next_content_html = g_strdup (style->outgoing_content_html); + style->outgoing_next_content_html = g_strdup(style->outgoing_content_html); } - pidgin_message_style_read_info_plist (style, NULL); - pidgin_message_style_load_state (style); + pidgin_message_style_read_info_plist(style, NULL); + pidgin_message_style_load_state(style); /* non variant dependent Info.plist checks */ if (style->message_view_version < 3) { - purple_debug_info ("webkit", "%s is a legacy style (version %d) and will not be loaded\n", style->cf_bundle_name, style->message_view_version); - pidgin_message_style_unref (style); + purple_debug_info("webkit", "%s is a legacy style (version %d) and will not be loaded\n", style->cf_bundle_name, style->message_view_version); + pidgin_message_style_unref(style); return NULL; } if (!style->variant) { - GList *variants = pidgin_message_style_get_variants (style); + GList *variants = pidgin_message_style_get_variants(style); if (variants) - pidgin_message_style_set_variant (style, variants->data); + pidgin_message_style_set_variant(style, variants->data); - glist_free_all_string (variants); + glist_free_all_string(variants); } return style; } -PidginMessageStyle* -pidgin_message_style_copy (const PidginMessageStyle *style) +PidginMessageStyle * +pidgin_message_style_copy(const PidginMessageStyle *style) { - /* it's at times like this that I miss C++ */ - PidginMessageStyle *ret = pidgin_message_style_new (style->style_dir); + PidginMessageStyle *ret = pidgin_message_style_new(style->style_dir); - ret->variant = g_strdup (style->variant); + ret->variant = g_strdup(style->variant); ret->message_view_version = style->message_view_version; - ret->cf_bundle_name = g_strdup (style->cf_bundle_name); - ret->cf_bundle_identifier = g_strdup (style->cf_bundle_identifier); - ret->cf_bundle_get_info_string = g_strdup (style->cf_bundle_get_info_string); - ret->default_font_family = g_strdup (style->default_font_family); + ret->cf_bundle_name = g_strdup(style->cf_bundle_name); + ret->cf_bundle_identifier = g_strdup(style->cf_bundle_identifier); + ret->cf_bundle_get_info_string = g_strdup(style->cf_bundle_get_info_string); + ret->default_font_family = g_strdup(style->default_font_family); ret->default_font_size = style->default_font_size; ret->shows_user_icons = style->shows_user_icons; ret->disable_combine_consecutive = style->disable_combine_consecutive; ret->default_background_is_transparent = style->default_background_is_transparent; ret->disable_custom_background = style->disable_custom_background; - ret->default_background_color = g_strdup (style->default_background_color); + ret->default_background_color = g_strdup(style->default_background_color); ret->allow_text_colors = style->allow_text_colors; - ret->image_mask = g_strdup (style->image_mask); - ret->default_variant = g_strdup (style->default_variant); - - ret->template_path = g_strdup (style->template_path); - ret->template_html = g_strdup (style->template_html); - ret->header_html = g_strdup (style->header_html); - ret->footer_html = g_strdup (style->footer_html); - ret->incoming_content_html = g_strdup (style->incoming_content_html); - ret->outgoing_content_html = g_strdup (style->outgoing_content_html); - ret->incoming_next_content_html = g_strdup (style->incoming_next_content_html); - ret->outgoing_next_content_html = g_strdup (style->outgoing_next_content_html); - ret->status_html = g_strdup (style->status_html); - ret->basestyle_css = g_strdup (style->basestyle_css); + ret->image_mask = g_strdup(style->image_mask); + ret->default_variant = g_strdup(style->default_variant); + + ret->template_path = g_strdup(style->template_path); + ret->template_html = g_strdup(style->template_html); + ret->header_html = g_strdup(style->header_html); + ret->footer_html = g_strdup(style->footer_html); + ret->incoming_content_html = g_strdup(style->incoming_content_html); + ret->outgoing_content_html = g_strdup(style->outgoing_content_html); + ret->incoming_next_content_html = g_strdup(style->incoming_next_content_html); + ret->outgoing_next_content_html = g_strdup(style->outgoing_next_content_html); + ret->status_html = g_strdup(style->status_html); + ret->basestyle_css = g_strdup(style->basestyle_css); return ret; } void -pidgin_message_style_set_variant (PidginMessageStyle *style, const char *variant) +pidgin_message_style_set_variant(PidginMessageStyle *style, const char *variant) { /* I'm not going to test whether this variant is valid! */ - g_free (style->variant); - style->variant = g_strdup (variant); + g_free(style->variant); + style->variant = g_strdup(variant); - pidgin_message_style_read_info_plist (style, variant); - + pidgin_message_style_read_info_plist(style, variant); + /* todo, the style has "changed". Ideally, I would like to use signals at this point. */ } -char* pidgin_message_style_get_variant (PidginMessageStyle *style) +char * +pidgin_message_style_get_variant(PidginMessageStyle *style) { - return g_strdup (style->variant); + return g_strdup(style->variant); } /** * Get a list of variants supported by the style. */ GList* -pidgin_message_style_get_variants (PidginMessageStyle *style) +pidgin_message_style_get_variants(PidginMessageStyle *style) { GList *ret = NULL; - GDir *variants; + GDir *variants; const char *css_file; char *css; char *variant_dir; - g_assert (style->style_dir); + g_assert(style->style_dir); variant_dir = g_build_filename(style->style_dir, "Contents", "Resources", "Variants", NULL); variants = g_dir_open(variant_dir, 0, NULL); - if (!variants) return NULL; + if (!variants) + return NULL; while ((css_file = g_dir_read_name(variants)) != NULL) { - if (!g_str_has_suffix (css_file, ".css")) + if (!g_str_has_suffix(css_file, ".css")) continue; - css = g_strndup (css_file, strlen (css_file) - 4); + css = g_strndup(css_file, strlen(css_file) - 4); ret = g_list_append(ret, css); } g_dir_close(variants); g_free(variant_dir); - ret = g_list_sort (ret, (GCompareFunc)g_strcmp0); - return ret; + ret = g_list_sort(ret, (GCompareFunc)g_strcmp0); + return ret; } - -char* pidgin_message_style_get_css (PidginMessageStyle *style) +char * +pidgin_message_style_get_css(PidginMessageStyle *style) { if (!style->variant) { - return g_build_filename (style->style_dir, "Contents", "Resources", "main.css", NULL); + return g_build_filename(style->style_dir, "Contents", "Resources", "main.css", NULL); } else { - char *file = g_strdup_printf ("%s.css", style->variant); - char *ret = g_build_filename (style->style_dir, "Contents", "Resources", "Variants", file, NULL); - g_free (file); + char *file = g_strdup_printf("%s.css", style->variant); + char *ret = g_build_filename(style->style_dir, "Contents", "Resources", "Variants", file, NULL); + g_free(file); return ret; } } -
--- a/pidgin/plugins/adiumthemes/message-style.h Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/plugins/adiumthemes/message-style.h Thu Sep 08 22:04:35 2011 +0000 @@ -1,3 +1,24 @@ +/* pidgin + * + * Pidgin is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + * + */ #include <glib.h> @@ -47,13 +68,14 @@ char *basestyle_css; } PidginMessageStyle; -PidginMessageStyle* pidgin_message_style_load (const char* styledir); -PidginMessageStyle* pidgin_message_style_copy (const PidginMessageStyle *style); -void pidgin_message_style_save_state (const PidginMessageStyle *style); -void pidgin_message_style_unref (PidginMessageStyle *style); -void pidgin_message_style_read_info_plist (PidginMessageStyle *style, const char* variant); -char* pidgin_message_style_get_variant (PidginMessageStyle *style); -GList* pidgin_message_style_get_variants (PidginMessageStyle *style); -void pidgin_message_style_set_variant (PidginMessageStyle *style, const char *variant); +PidginMessageStyle *pidgin_message_style_load(const char *styledir); +PidginMessageStyle *pidgin_message_style_copy(const PidginMessageStyle *style); +void pidgin_message_style_save_state(const PidginMessageStyle *style); +void pidgin_message_style_unref(PidginMessageStyle *style); +void pidgin_message_style_read_info_plist(PidginMessageStyle *style, const char *variant); +char *pidgin_message_style_get_variant(PidginMessageStyle *style); +GList *pidgin_message_style_get_variants(PidginMessageStyle *style); +void pidgin_message_style_set_variant(PidginMessageStyle *style, const char *variant); -char* pidgin_message_style_get_css (PidginMessageStyle *style); +char *pidgin_message_style_get_css(PidginMessageStyle *style); +
--- a/pidgin/plugins/adiumthemes/webkit.c Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/plugins/adiumthemes/webkit.c Thu Sep 08 22:04:35 2011 +0000 @@ -1,33 +1,34 @@ -/* - * Adium Message Styles - * Copyright (C) 2009 Arnold Noronha <arnstein87@gmail.com> - * Copyright (C) 2007 +/* pidgin + * + * Pidgin is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + * */ #define PLUGIN_ID "gtk-webview-adium-ims" #define PLUGIN_NAME "webview-adium-ims" /* - * A lot of this was originally written by Sean Egan, but I think I've - * rewrote enough to replace the author for now. + * A lot of this was originally written by Sean Egan, but I think I've + * rewrote enough to replace the author for now. */ #define PLUGIN_AUTHOR "Arnold Noronha <arnstein87@gmail.com>" -#define PURPLE_PLUGINS "Hell yeah" +#define PURPLE_PLUGINS "Hell yeah" /* System headers */ #include <string.h> @@ -59,38 +60,36 @@ static char *cur_style_dir = NULL; static void *handle = NULL; -static inline char* get_absolute_path (const char *path) +static inline char * +get_absolute_path(const char *path) { - if (g_path_is_absolute (path)) return g_strdup (path); + if (g_path_is_absolute(path)) + return g_strdup(path); else { - char* cwd = g_get_current_dir (), *ret; - ret = g_build_filename (cwd, path, NULL); - g_free (cwd); + char *cwd, *ret; + cwd = g_get_current_dir(); + ret = g_build_filename(cwd, path, NULL); + g_free(cwd); return ret; } } -static void -glist_free_all_string (GList *list) +static void webkit_on_webview_destroy(GtkObject* obj, gpointer data); + +static void * +webkit_plugin_get_handle(void) { - GList *first = list; - for (; list; list = g_list_next (list)) - g_free (list->data); - g_list_free (first); + if (handle) + return handle; + else + return (handle = g_malloc(1)); } -static void webkit_on_webview_destroy (GtkObject* obj, gpointer data); - -static void* webkit_plugin_get_handle () +static void +webkit_plugin_free_handle(void) { - if (handle) return handle; - else return (handle = g_malloc (1)); -} - -static void webkit_plugin_free_handle () -{ - purple_signals_disconnect_by_handle (handle); - g_free (handle); + purple_signals_disconnect_by_handle(handle); + g_free(handle); } static char * @@ -242,12 +241,13 @@ } static char * -replace_template_tokens(PidginMessageStyle *style, char *text, int len, char *header, char *footer) { +replace_template_tokens(PidginMessageStyle *style, char *text, int len, char *header, char *footer) +{ GString *str = g_string_new_len(NULL, len); char **ms = g_strsplit(text, "%@", 6); char *base = NULL; - char *csspath = pidgin_message_style_get_css (style); + char *csspath = pidgin_message_style_get_css(style); if (ms[0] == NULL || ms[1] == NULL || ms[2] == NULL || ms[3] == NULL || ms[4] == NULL || ms[5] == NULL) { g_strfreev(ms); g_string_free(str, TRUE); @@ -256,9 +256,9 @@ g_string_append(str, ms[0]); g_string_append(str, "file://"); - base = g_build_filename (style->style_dir, "Contents", "Resources", "Template.html", NULL); + base = g_build_filename(style->style_dir, "Contents", "Resources", "Template.html", NULL); g_string_append(str, base); - g_free (base); + g_free(base); g_string_append(str, ms[1]); @@ -269,8 +269,6 @@ g_string_append(str, "file://"); g_string_append(str, csspath); - - g_string_append(str, ms[3]); if (header) g_string_append(str, header); @@ -280,8 +278,8 @@ g_string_append(str, ms[5]); g_strfreev(ms); - g_free (csspath); - return g_string_free (str, FALSE); + g_free(csspath); + return g_string_free(str, FALSE); } static GtkWidget * @@ -295,33 +293,34 @@ return gtkconv->webview; } -static void set_theme_webkit_settings (WebKitWebView *webview, PidginMessageStyle *style) +static void +set_theme_webkit_settings(WebKitWebView *webview, PidginMessageStyle *style) { WebKitWebSettings *settings; - g_object_get (G_OBJECT(webview), "settings", &settings, NULL); + g_object_get(G_OBJECT(webview), "settings", &settings, NULL); if (style->default_font_family) - g_object_set (G_OBJECT (settings), "default-font-family", style->default_font_family, NULL); + g_object_set(G_OBJECT(settings), "default-font-family", style->default_font_family, NULL); if (style->default_font_size) - g_object_set (G_OBJECT (settings), "default-font-size", GINT_TO_POINTER (style->default_font_size), NULL); + g_object_set(G_OBJECT(settings), "default-font-size", GINT_TO_POINTER(style->default_font_size), NULL); /* this does not work :( */ - webkit_web_view_set_transparent (webview, style->default_background_is_transparent); + webkit_web_view_set_transparent(webview, style->default_background_is_transparent); } /* * The style specification says that if the conversation is a group - * chat then the <div id="Chat"> element will be given a class - * 'groupchat'. I can't add another '%@' in Template.html because + * chat then the <div id="Chat"> element will be given a class + * 'groupchat'. I can't add another '%@' in Template.html because * that breaks style-specific Template.html's. I have to either use libxml * or conveniently play with WebKit's javascript engine. The javascript * engine should work, but it's not an identical behavior. */ static void -webkit_set_groupchat (GtkWebView *webview) +webkit_set_groupchat(GtkWebView *webview) { - gtk_webview_safe_execute_script (webview, "document.getElementById('Chat').className = 'groupchat'"); + gtk_webview_safe_execute_script(webview, "document.getElementById('Chat').className = 'groupchat'"); } @@ -329,7 +328,7 @@ * Called when either a new PurpleConversation is created * or when a PidginConversation changes its active PurpleConversation * This will not change the theme if the theme is already set. - * (This is to prevent accidental theme changes if a new + * (This is to prevent accidental theme changes if a new * PurpleConversation gets added. * * FIXME: it's not at all clear to me as to how @@ -337,7 +336,7 @@ * changes. */ static void -init_theme_for_webkit (PurpleConversation *conv, char *style_dir) +init_theme_for_webkit(PurpleConversation *conv, char *style_dir) { GtkWidget *webkit = PIDGIN_CONVERSATION(conv)->webview; char *header, *footer; @@ -346,67 +345,70 @@ char* basedir; char* baseuri; PidginMessageStyle *style, *oldStyle; - oldStyle = g_object_get_data (G_OBJECT(webkit), MESSAGE_STYLE_KEY); + PidginMessageStyle *copy; - if (oldStyle) return; + oldStyle = g_object_get_data(G_OBJECT(webkit), MESSAGE_STYLE_KEY); + if (oldStyle) + return; - purple_debug_info ("webkit", "loading %s\n", style_dir); - style = pidgin_message_style_load (style_dir); - g_assert (style); - g_assert (style->template_html); /* debugging test? */ + purple_debug_info("webkit", "loading %s\n", style_dir); + style = pidgin_message_style_load(style_dir); + g_assert(style); + g_assert(style->template_html); /* debugging test? */ - basedir = g_build_filename (style->style_dir, "Contents", "Resources", "Template.html", NULL); - baseuri = g_strdup_printf ("file://%s", basedir); + basedir = g_build_filename(style->style_dir, "Contents", "Resources", "Template.html", NULL); + baseuri = g_strdup_printf("file://%s", basedir); header = replace_header_tokens(style->header_html, strlen(style->header_html), conv); - g_assert (style); + g_assert(style); footer = replace_header_tokens(style->footer_html, strlen(style->footer_html), conv); template = replace_template_tokens(style, style->template_html, strlen(style->template_html) + strlen(style->header_html), header, footer); g_assert(template); - purple_debug_info ("webkit", "template: %s\n", template); + purple_debug_info("webkit", "template: %s\n", template); - set_theme_webkit_settings (WEBKIT_WEB_VIEW(webkit), style); + set_theme_webkit_settings(WEBKIT_WEB_VIEW(webkit), style); webkit_web_view_load_string(WEBKIT_WEB_VIEW(webkit), template, "text/html", "UTF-8", baseuri); - PidginMessageStyle *copy = pidgin_message_style_copy (style); - g_object_set_data (G_OBJECT(webkit), MESSAGE_STYLE_KEY, copy); + copy = pidgin_message_style_copy(style); + g_object_set_data(G_OBJECT(webkit), MESSAGE_STYLE_KEY, copy); - pidgin_message_style_unref (style); + pidgin_message_style_unref(style); /* I need to unref this style when the webkit object destroys */ - g_signal_connect (G_OBJECT(webkit), "destroy", G_CALLBACK(webkit_on_webview_destroy), copy); + g_signal_connect(G_OBJECT(webkit), "destroy", G_CALLBACK(webkit_on_webview_destroy), copy); - if (purple_conversation_get_type (conv) == PURPLE_CONV_TYPE_CHAT) - webkit_set_groupchat (GTK_WEBVIEW (webkit)); - g_free (basedir); - g_free (baseuri); - g_free (header); - g_free (footer); - g_free (template); + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) + webkit_set_groupchat(GTK_WEBVIEW(webkit)); + g_free(basedir); + g_free(baseuri); + g_free(header); + g_free(footer); + g_free(template); } /* restore the non theme version of the conversation window */ static void -finalize_theme_for_webkit (PurpleConversation *conv) +finalize_theme_for_webkit(PurpleConversation *conv) { GtkWidget *webview = PIDGIN_CONVERSATION(conv)->webview; - PidginMessageStyle *style = g_object_get_data (G_OBJECT(webview), MESSAGE_STYLE_KEY); + PidginMessageStyle *style = g_object_get_data(G_OBJECT(webview), MESSAGE_STYLE_KEY); webkit_web_view_load_string(WEBKIT_WEB_VIEW(webview), "", "text/html", "UTF-8", ""); - g_object_set_data (G_OBJECT(webview), MESSAGE_STYLE_KEY, NULL); - pidgin_message_style_unref (style); + g_object_set_data(G_OBJECT(webview), MESSAGE_STYLE_KEY, NULL); + pidgin_message_style_unref(style); } static void -webkit_on_webview_destroy (GtkObject *object, gpointer data) +webkit_on_webview_destroy(GtkObject *object, gpointer data) { - pidgin_message_style_unref ((PidginMessageStyle*) data); - g_object_set_data (G_OBJECT(object), MESSAGE_STYLE_KEY, NULL); + pidgin_message_style_unref((PidginMessageStyle *)data); + g_object_set_data(G_OBJECT(object), MESSAGE_STYLE_KEY, NULL); } -static gboolean webkit_on_displaying_im_msg (PurpleAccount *account, +static gboolean +webkit_on_displaying_im_msg(PurpleAccount *account, const char* name, char **pmessage, PurpleConversation *conv, @@ -423,17 +425,16 @@ char *script; char *func = "appendMessage"; char *smileyed; - time_t mtime = time (NULL); /* FIXME: this should come from the write_conv calback, but the signal doesn't pass this to me */ + time_t mtime = time(NULL); /* FIXME: this should come from the write_conv calback, but the signal doesn't pass this to me */ PurpleMessageFlags old_flags = GPOINTER_TO_INT(purple_conversation_get_data(conv, "webkit-lastflags")); PidginMessageStyle *style; - fprintf (stderr, "hmm.. here %s %s\n", name, message); webkit = get_webkit(conv); stripped = g_strdup(message); - style = g_object_get_data (G_OBJECT (webkit), MESSAGE_STYLE_KEY); - g_assert (style); + style = g_object_get_data(G_OBJECT(webkit), MESSAGE_STYLE_KEY); + g_assert(style); if (flags & PURPLE_MESSAGE_SEND && old_flags & PURPLE_MESSAGE_SEND) { message_html = style->outgoing_next_content_html; @@ -452,11 +453,11 @@ smileyed = smiley_parse_markup(stripped, conv->account->protocol_id); msg = replace_message_tokens(message_html, 0, conv, name, alias, smileyed, flags, mtime); - escape = gtk_webview_quote_js_string (msg); + escape = gtk_webview_quote_js_string(msg); script = g_strdup_printf("%s(%s)", func, escape); - purple_debug_info ("webkit", "JS: %s\n", script); - gtk_webview_safe_execute_script (GTK_WEBVIEW (webkit), script); + purple_debug_info("webkit", "JS: %s\n", script); + gtk_webview_safe_execute_script(GTK_WEBVIEW(webkit), script); g_free(script); g_free(smileyed); @@ -467,7 +468,8 @@ return TRUE; /* GtkConv should not handle this IM */ } -static gboolean webkit_on_displaying_chat_msg (PurpleAccount *account, +static gboolean +webkit_on_displaying_chat_msg(PurpleAccount *account, const char *who, char **message, PurpleConversation *conv, @@ -475,43 +477,43 @@ gpointer userdata) { /* handle exactly like an IM message for now */ - return webkit_on_displaying_im_msg (account, who, message, conv, flags, NULL); + return webkit_on_displaying_im_msg(account, who, message, conv, flags, NULL); } static void -webkit_on_conversation_displayed (PidginConversation *gtkconv, gpointer data) +webkit_on_conversation_displayed(PidginConversation *gtkconv, gpointer data) { - init_theme_for_webkit (gtkconv->active_conv, cur_style_dir); + init_theme_for_webkit(gtkconv->active_conv, cur_style_dir); } static void -webkit_on_conversation_switched (PurpleConversation *conv, gpointer data) +webkit_on_conversation_switched(PurpleConversation *conv, gpointer data) { - init_theme_for_webkit (conv, cur_style_dir); + init_theme_for_webkit(conv, cur_style_dir); } static void -webkit_on_conversation_hiding (PidginConversation *gtkconv, gpointer data) +webkit_on_conversation_hiding(PidginConversation *gtkconv, gpointer data) { - /* + /* * I'm not sure if I need to do anything here, but let's keep - * this anyway. + * this anyway. */ } -static GList* -get_dir_dir_list (const char* dirname) +static GList * +get_dir_dir_list(const char *dirname) { GList *ret = NULL; - GDir *dir = g_dir_open (dirname, 0, NULL); + GDir *dir = g_dir_open(dirname, 0, NULL); const char* subdir; if (!dir) return NULL; - while ((subdir = g_dir_read_name (dir))) { - ret = g_list_append (ret, g_build_filename (dirname, subdir, NULL)); + while ((subdir = g_dir_read_name(dir))) { + ret = g_list_append(ret, g_build_filename(dirname, subdir, NULL)); } - g_dir_close (dir); + g_dir_close(dir); return ret; } @@ -520,40 +522,40 @@ * directories. I don't guarrantee that these are valid themes, just * that they are in the directories for themes. */ -static GList* -get_style_directory_list () +static GList * +get_style_directory_list(void) { char *user_dir, *user_style_dir, *global_style_dir; GList *list1, *list2; - user_dir = get_absolute_path (purple_user_dir ()); + user_dir = get_absolute_path(purple_user_dir()); - user_style_dir = g_build_filename (user_dir, "styles", NULL); - global_style_dir = g_build_filename (DATADIR, "pidgin", "styles", NULL); + user_style_dir = g_build_filename(user_dir, "styles", NULL); + global_style_dir = g_build_filename(DATADIR, "pidgin", "styles", NULL); - list1 = get_dir_dir_list (user_style_dir); - list2 = get_dir_dir_list (global_style_dir); + list1 = get_dir_dir_list(user_style_dir); + list2 = get_dir_dir_list(global_style_dir); - g_free (global_style_dir); - g_free (user_style_dir); - g_free (user_dir); + g_free(global_style_dir); + g_free(user_style_dir); + g_free(user_dir); - return g_list_concat (list1, list2); + return g_list_concat(list1, list2); } /** - * use heuristics or previous user options to figure out what + * use heuristics or previous user options to figure out what * theme to use as default in this Pidgin instance. */ static void -style_set_default () +style_set_default(void) { - GList* styles = get_style_directory_list (), *iter; - const char *stylepath = purple_prefs_get_string ("/plugins/gtk/adiumthemes/stylepath"); - g_assert (cur_style_dir == NULL); + GList *styles = get_style_directory_list(), *iter; + const char *stylepath = purple_prefs_get_string("/plugins/gtk/adiumthemes/stylepath"); + g_assert(cur_style_dir == NULL); if (stylepath && *stylepath) - styles = g_list_prepend (styles, g_strdup (stylepath)); + styles = g_list_prepend(styles, g_strdup(stylepath)); else { purple_notify_error(handle, _("Webkit themes"), _("Can't find installed styles"), @@ -563,62 +565,63 @@ /* pick any one that works. Note that we have first preference * for the one in the userdir */ - for (iter = styles; iter; iter = g_list_next (iter)) { - PidginMessageStyle *style = pidgin_message_style_load (iter->data); + for (iter = styles; iter; iter = g_list_next(iter)) { + PidginMessageStyle *style = pidgin_message_style_load(iter->data); if (style) { - cur_style_dir = (char*) g_strdup (iter->data); - pidgin_message_style_unref (style); + cur_style_dir = (char *)g_strdup(iter->data); + pidgin_message_style_unref(style); break; } - purple_debug_info ("webkit", "Style %s is invalid\n", (char*) iter->data); + purple_debug_info("webkit", "Style %s is invalid\n", (char *)iter->data); } - for (iter = styles; iter; iter = g_list_next (iter)) - g_free (iter->data); - g_list_free (styles); + for (iter = styles; iter; iter = g_list_next(iter)) + g_free(iter->data); + g_list_free(styles); } static gboolean plugin_load(PurplePlugin *plugin) { - style_set_default (); - if (!cur_style_dir) return FALSE; /* couldn't find a style */ + style_set_default(); + if (!cur_style_dir) + return FALSE; /* couldn't find a style */ - purple_signal_connect (pidgin_conversations_get_handle (), + purple_signal_connect(pidgin_conversations_get_handle(), "displaying-im-msg", - webkit_plugin_get_handle (), + webkit_plugin_get_handle(), PURPLE_CALLBACK(webkit_on_displaying_im_msg), NULL); - purple_signal_connect (pidgin_conversations_get_handle (), + purple_signal_connect(pidgin_conversations_get_handle(), "displaying-chat-msg", - webkit_plugin_get_handle (), + webkit_plugin_get_handle(), PURPLE_CALLBACK(webkit_on_displaying_chat_msg), NULL); - purple_signal_connect (pidgin_conversations_get_handle (), + purple_signal_connect(pidgin_conversations_get_handle(), "conversation-displayed", - webkit_plugin_get_handle (), + webkit_plugin_get_handle(), PURPLE_CALLBACK(webkit_on_conversation_displayed), NULL); - purple_signal_connect (pidgin_conversations_get_handle (), + purple_signal_connect(pidgin_conversations_get_handle(), "conversation-switched", - webkit_plugin_get_handle (), + webkit_plugin_get_handle(), PURPLE_CALLBACK(webkit_on_conversation_switched), NULL); - purple_signal_connect (pidgin_conversations_get_handle (), + purple_signal_connect(pidgin_conversations_get_handle(), "conversation-hiding", - webkit_plugin_get_handle (), + webkit_plugin_get_handle(), PURPLE_CALLBACK(webkit_on_conversation_hiding), NULL); /* finally update each of the existing conversation windows */ { - GList* list = purple_get_conversations (); + GList *list = purple_get_conversations(); for (;list; list = g_list_next(list)) - init_theme_for_webkit (list->data, cur_style_dir); + init_theme_for_webkit(list->data, cur_style_dir); } return TRUE; @@ -629,9 +632,9 @@ { GList *list; - webkit_plugin_free_handle (); + webkit_plugin_free_handle(); cur_style_dir = NULL; - list = purple_get_conversations (); + list = purple_get_conversations(); while (list) { finalize_theme_for_webkit(list->data); list = g_list_next(list); @@ -645,156 +648,155 @@ */ static void -style_changed (GtkWidget* combobox, gpointer null) +style_changed(GtkWidget *combobox, gpointer null) { - char *name = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combobox)); + char *name = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combobox)); GtkWidget *dialog; - GList *styles = get_style_directory_list (), *iter; + GList *styles = get_style_directory_list(), *iter; /* find the full path for this name, I wish I could store this info in the combobox itself. :( */ for (iter = styles; iter; iter = g_list_next(iter)) { - char* basename = g_path_get_basename (iter->data); - if (g_str_equal (basename, name)) { - g_free (basename); + char *basename = g_path_get_basename(iter->data); + if (g_str_equal(basename, name)) { + g_free(basename); break; } - g_free (basename); + g_free(basename); } - g_assert (iter); - g_free (name); - g_free (cur_style_dir); - cur_style_dir = g_strdup (iter->data);; - purple_prefs_set_string ("/plugins/gtk/adiumthemes/stylepath", cur_style_dir); + g_assert(iter); + g_free(name); + g_free(cur_style_dir); + cur_style_dir = g_strdup(iter->data);; + purple_prefs_set_string("/plugins/gtk/adiumthemes/stylepath", cur_style_dir); /* inform the user that existing conversations haven't changed */ - dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "The style for existing conversations have not been changed. Please close and re-open the conversation for the changes to take effect."); - g_assert (dialog); - gtk_widget_show (dialog); - g_signal_connect_swapped (dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog); + dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "The style for existing conversations have not been changed. Please close and re-open the conversation for the changes to take effect."); + g_assert(dialog); + gtk_widget_show(dialog); + g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog); } -static GtkWidget* -get_style_config_frame () +static GtkWidget * +get_style_config_frame(void) { - GtkWidget *combobox = gtk_combo_box_new_text (); - GList *styles = get_style_directory_list (), *iter; + GtkWidget *combobox = gtk_combo_box_new_text(); + GList *styles = get_style_directory_list(), *iter; int index = 0, selected = 0; - for (iter = styles; iter; iter = g_list_next (iter)) { - PidginMessageStyle *style = pidgin_message_style_load (iter->data); + for (iter = styles; iter; iter = g_list_next(iter)) { + PidginMessageStyle *style = pidgin_message_style_load(iter->data); if (style) { - char *text = g_path_get_basename (iter->data); - gtk_combo_box_append_text (GTK_COMBO_BOX(combobox), text); - g_free (text); + char *text = g_path_get_basename(iter->data); + gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), text); + g_free(text); - if (g_str_equal (iter->data, cur_style_dir)) + if (g_str_equal(iter->data, cur_style_dir)) selected = index; index++; - pidgin_message_style_unref (style); + pidgin_message_style_unref(style); } } - gtk_combo_box_set_active (GTK_COMBO_BOX(combobox), selected); - g_signal_connect_after (G_OBJECT(combobox), "changed", G_CALLBACK(style_changed), NULL); + gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), selected); + g_signal_connect_after(G_OBJECT(combobox), "changed", G_CALLBACK(style_changed), NULL); return combobox; } static void -variant_update_conversation (PurpleConversation *conv) +variant_update_conversation(PurpleConversation *conv) { - PidginConversation *gtkconv = PIDGIN_CONVERSATION (conv); - WebKitWebView *webview = WEBKIT_WEB_VIEW (gtkconv->webview); - PidginMessageStyle *style = (PidginMessageStyle*) g_object_get_data (G_OBJECT(webview), MESSAGE_STYLE_KEY); + PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); + WebKitWebView *webview = WEBKIT_WEB_VIEW(gtkconv->webview); + PidginMessageStyle *style = (PidginMessageStyle *)g_object_get_data(G_OBJECT(webview), MESSAGE_STYLE_KEY); char *script; - g_assert (style); + g_assert(style); - script = g_strdup_printf ("setStylesheet(\"mainStyle\",\"%s\")", pidgin_message_style_get_css (style)); - gtk_webview_safe_execute_script (GTK_WEBVIEW(webview), script); + script = g_strdup_printf("setStylesheet(\"mainStyle\",\"%s\")", pidgin_message_style_get_css(style)); + gtk_webview_safe_execute_script(GTK_WEBVIEW(webview), script); - set_theme_webkit_settings (WEBKIT_WEB_VIEW (gtkconv->webview), style); - g_free (script); + set_theme_webkit_settings(WEBKIT_WEB_VIEW(gtkconv->webview), style); + g_free(script); } static void -variant_changed (GtkWidget* combobox, gpointer null) +variant_changed(GtkWidget* combobox, gpointer null) { char *name; GList *list; - PidginMessageStyle *style = pidgin_message_style_load (cur_style_dir); + PidginMessageStyle *style = pidgin_message_style_load(cur_style_dir); - g_assert (style); - name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (combobox)); - pidgin_message_style_set_variant (style, name); - pidgin_message_style_save_state (style); + g_assert(style); + name = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combobox)); + pidgin_message_style_set_variant(style, name); + pidgin_message_style_save_state(style); /* update conversations */ - list = purple_get_conversations (); + list = purple_get_conversations(); while (list) { - variant_update_conversation (list->data); + variant_update_conversation(list->data); list = g_list_next(list); } - g_free (name); - pidgin_message_style_unref (style); + g_free(name); + pidgin_message_style_unref(style); } static GtkWidget * get_variant_config_frame() { - PidginMessageStyle *style = pidgin_message_style_load (cur_style_dir); - GList *variants = pidgin_message_style_get_variants (style), *iter; - char *cur_variant = pidgin_message_style_get_variant (style); + PidginMessageStyle *style = pidgin_message_style_load(cur_style_dir); + GList *variants = pidgin_message_style_get_variants(style), *iter; + char *cur_variant = pidgin_message_style_get_variant(style); GtkWidget *combobox = gtk_combo_box_new_text(); int def = -1, index = 0; - pidgin_message_style_unref (style); + pidgin_message_style_unref(style); - for (iter = variants; iter; iter = g_list_next (iter)) { - gtk_combo_box_append_text (GTK_COMBO_BOX(combobox), iter->data); + for (iter = variants; iter; iter = g_list_next(iter)) { + gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), iter->data); - if (g_str_equal (cur_variant, iter->data)) + if (g_str_equal(cur_variant, iter->data)) def = index; index ++; } - gtk_combo_box_set_active (GTK_COMBO_BOX(combobox), def); - g_signal_connect (G_OBJECT(combobox), "changed", G_CALLBACK(variant_changed), NULL); + gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), def); + g_signal_connect(G_OBJECT(combobox), "changed", G_CALLBACK(variant_changed), NULL); return combobox; } static void -style_changed_reset_variants (GtkWidget* combobox, gpointer table) +style_changed_reset_variants(GtkWidget* combobox, gpointer table) { /* I hate to do this, I swear. But I don't know how to cleanly clean an existing combobox */ - GtkWidget* variants = g_object_get_data (G_OBJECT(table), "variants-cbox"); - gtk_widget_destroy (variants); - variants = get_variant_config_frame (); - gtk_table_attach_defaults (GTK_TABLE (table), variants, 1, 2, 1, 2); - gtk_widget_show_all (GTK_WIDGET(table)); + GtkWidget* variants = g_object_get_data(G_OBJECT(table), "variants-cbox"); + gtk_widget_destroy(variants); + variants = get_variant_config_frame(); + gtk_table_attach_defaults(GTK_TABLE(table), variants, 1, 2, 1, 2); + gtk_widget_show_all(GTK_WIDGET(table)); - g_object_set_data (G_OBJECT(table), "variants-cbox", variants); + g_object_set_data(G_OBJECT(table), "variants-cbox", variants); } static GtkWidget* get_config_frame(PurplePlugin* plugin) { - GtkWidget *table = gtk_table_new (2, 2, FALSE); - GtkWidget *style_config = get_style_config_frame (); - GtkWidget *variant_config = get_variant_config_frame (); + GtkWidget *table = gtk_table_new(2, 2, FALSE); + GtkWidget *style_config = get_style_config_frame(); + GtkWidget *variant_config = get_variant_config_frame(); - gtk_table_attach_defaults (GTK_TABLE(table), gtk_label_new ("Message Style"), 0, 1, 0, 1); - gtk_table_attach_defaults (GTK_TABLE(table), style_config, 1, 2, 0, 1); - gtk_table_attach_defaults (GTK_TABLE(table), gtk_label_new ("Style Variant"), 0, 1, 1, 2); - gtk_table_attach_defaults (GTK_TABLE(table), variant_config, 1, 2, 1, 2); + gtk_table_attach_defaults(GTK_TABLE(table), gtk_label_new("Message Style"), 0, 1, 0, 1); + gtk_table_attach_defaults(GTK_TABLE(table), style_config, 1, 2, 0, 1); + gtk_table_attach_defaults(GTK_TABLE(table), gtk_label_new("Style Variant"), 0, 1, 1, 2); + gtk_table_attach_defaults(GTK_TABLE(table), variant_config, 1, 2, 1, 2); - - g_object_set_data (G_OBJECT(table), "variants-cbox", variant_config); + g_object_set_data(G_OBJECT(table), "variants-cbox", variant_config); /* to clarify, this is a second signal connected on style config */ - g_signal_connect_after (G_OBJECT(style_config), "changed", G_CALLBACK(style_changed_reset_variants), table); + g_signal_connect_after(G_OBJECT(style_config), "changed", G_CALLBACK(style_changed_reset_variants), table); return table; } @@ -818,7 +820,7 @@ PURPLE_MAJOR_VERSION, /* Purple Major Version */ PURPLE_MINOR_VERSION, /* Purple Minor Version */ PURPLE_PLUGIN_STANDARD, /* plugin type */ -PIDGIN_PLUGIN_TYPE, /* ui requirement */ + PIDGIN_PLUGIN_TYPE, /* ui requirement */ 0, /* flags */ NULL, /* dependencies */ PURPLE_PRIORITY_DEFAULT, /* priority */ @@ -851,10 +853,11 @@ info.summary = "Adium-like IMs with Pidgin"; info.description = "You can chat in Pidgin using Adium's WebKit view."; - purple_prefs_add_none ("/plugins"); - purple_prefs_add_none ("/plugins/gtk"); - purple_prefs_add_none ("/plugins/gtk/adiumthemes"); - purple_prefs_add_string ("/plugins/gtk/adiumthemes/stylepath", ""); + purple_prefs_add_none("/plugins"); + purple_prefs_add_none("/plugins/gtk"); + purple_prefs_add_none("/plugins/gtk/adiumthemes"); + purple_prefs_add_string("/plugins/gtk/adiumthemes/stylepath", ""); } PURPLE_INIT_PLUGIN(webkit, init_plugin, info) +
--- a/pidgin/smileyparser.c Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/smileyparser.c Thu Sep 08 22:04:35 2011 +0000 @@ -1,140 +1,165 @@ +/* pidgin + * + * Pidgin is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + * + */ #include <gtk/gtk.h> +#include <debug.h> #include "smileyparser.h" #include <smiley.h> #include <string.h> #include "gtkthemes.h" -static char* get_fullpath (const char* filename) +static char * +get_fullpath(const char *filename) { - if (g_path_is_absolute (filename)) return g_strdup (filename); - else return g_build_path (g_get_current_dir (), filename, NULL); + if (g_path_is_absolute(filename)) + return g_strdup(filename); + else + return g_build_path(g_get_current_dir(), filename, NULL); } static void -parse_for_shortcut_plaintext (const char* text, const char* shortcut, const char* file, GString* ret) +parse_for_shortcut_plaintext(const char *text, const char *shortcut, const char *file, GString *ret) { const char *tmp = text; - for(;*tmp;) { - const char *end = strstr (tmp, shortcut); + for (;*tmp;) { + const char *end = strstr(tmp, shortcut); char *path; char *escaped_path; if (end == NULL) { - g_string_append (ret, tmp); + g_string_append(ret, tmp); break; } - path = get_fullpath (file); - escaped_path = g_markup_escape_text (path, -1); + path = get_fullpath(file); + escaped_path = g_markup_escape_text(path, -1); - g_string_append_len (ret, tmp, end-tmp); - g_string_append_printf (ret,"<img alt='%s' src='%s' />", + g_string_append_len(ret, tmp, end-tmp); + g_string_append_printf(ret,"<img alt='%s' src='%s' />", shortcut, escaped_path); - g_free (path); - g_free (escaped_path); - g_assert (strlen (tmp) >= strlen (shortcut)); - tmp = end + strlen (shortcut); + g_free(path); + g_free(escaped_path); + g_assert(strlen(tmp) >= strlen(shortcut)); + tmp = end + strlen(shortcut); } } -static char* -parse_for_shortcut (const char* markup, const char* shortcut, const char* file) +static char * +parse_for_shortcut(const char *markup, const char *shortcut, const char *file) { - GString* ret = g_string_new (""); - char *local_markup = g_strdup (markup); - char *escaped_shortcut = g_markup_escape_text (shortcut, -1); + GString* ret = g_string_new(""); + char *local_markup = g_strdup(markup); + char *escaped_shortcut = g_markup_escape_text(shortcut, -1); char *temp = local_markup; - + for (;*temp;) { - char *end = strchr (temp, '<'); + char *end = strchr(temp, '<'); char *end_of_tag; if (!end) { - parse_for_shortcut_plaintext (temp, escaped_shortcut, file, ret); + parse_for_shortcut_plaintext(temp, escaped_shortcut, file, ret); break; } *end = 0; - parse_for_shortcut_plaintext (temp, escaped_shortcut, file, ret); + parse_for_shortcut_plaintext(temp, escaped_shortcut, file, ret); *end = '<'; /* if this is well-formed, then there should be no '>' within * the tag. TODO: handle a comment tag better :( */ - end_of_tag = strchr (end, '>'); + end_of_tag = strchr(end, '>'); if (!end_of_tag) { - g_string_append (ret, end); + g_string_append(ret, end); break; } - g_string_append_len (ret, end, end_of_tag-end+1); + g_string_append_len(ret, end, end_of_tag - end + 1); temp = end_of_tag + 1; } - g_free (local_markup); - g_free (escaped_shortcut); - return g_string_free (ret, FALSE); + g_free(local_markup); + g_free(escaped_shortcut); + return g_string_free(ret, FALSE); } -static char* -parse_for_purple_smiley (const char* markup, PurpleSmiley *smiley) +static char * +parse_for_purple_smiley(const char *markup, PurpleSmiley *smiley) { - char *file = purple_smiley_get_full_path (smiley); - char *ret = parse_for_shortcut (markup, purple_smiley_get_shortcut (smiley), file); - g_free (file); + char *file = purple_smiley_get_full_path(smiley); + char *ret = parse_for_shortcut(markup, purple_smiley_get_shortcut(smiley), file); + g_free(file); return ret; } -static char* -parse_for_smiley_list (const char* markup, GHashTable* smileys) +static char * +parse_for_smiley_list(const char *markup, GHashTable *smileys) { GHashTableIter iter; char *key, *value; - char *ret = g_strdup (markup); + char *ret = g_strdup(markup); - g_hash_table_iter_init (&iter, smileys); - while (g_hash_table_iter_next (&iter, (gpointer*)&key, (gpointer*)&value)) + g_hash_table_iter_init(&iter, smileys); + while (g_hash_table_iter_next(&iter, (gpointer *)&key, (gpointer *)&value)) { - char* temp = parse_for_shortcut (ret, key, value); - g_free (ret); + char *temp = parse_for_shortcut(ret, key, value); + g_free(ret); ret = temp; } + return ret; } -char* -smiley_parse_markup (const char* markup, const char *proto_id) +char * +smiley_parse_markup(const char *markup, const char *proto_id) { - GList *smileys = purple_smileys_get_all (); - char *temp = g_strdup (markup), *temp2; + GList *smileys = purple_smileys_get_all(); + char *temp = g_strdup(markup), *temp2; struct smiley_list *list; const char *proto_name = "default"; if (proto_id != NULL) { PurplePlugin *proto; - proto = purple_find_prpl (proto_id); + proto = purple_find_prpl(proto_id); proto_name = proto->info->name; } /* unnecessarily slow, but lets manage for now. */ - for (; smileys; smileys = g_list_next (smileys)) { - temp2 = parse_for_purple_smiley (temp, PURPLE_SMILEY (smileys->data)); - g_free (temp); + for (; smileys; smileys = g_list_next(smileys)) { + temp2 = parse_for_purple_smiley(temp, PURPLE_SMILEY(smileys->data)); + g_free(temp); temp = temp2; } /* now for each theme smiley, observe that this does look nasty */ - if (!current_smiley_theme || !(current_smiley_theme->list)) { - printf ("theme does not exist\n"); + purple_debug_warning("smiley", "theme does not exist\n"); return temp; } for (list = current_smiley_theme->list; list; list = list->next) { - if (g_str_equal (list->sml, proto_name)) { - temp2 = parse_for_smiley_list (temp, list->files); - g_free (temp); + if (g_str_equal(list->sml, proto_name)) { + temp2 = parse_for_smiley_list(temp, list->files); + g_free(temp); temp = temp2; } }
--- a/pidgin/smileyparser.h Thu Sep 08 05:13:53 2011 +0000 +++ b/pidgin/smileyparser.h Thu Sep 08 22:04:35 2011 +0000 @@ -1,3 +1,25 @@ +/* pidgin + * + * Pidgin is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + * + */ -char* -smiley_parse_markup (const char* markup, const char* sml); +char * +smiley_parse_markup(const char *markup, const char *sml); +