示例#1
0
文件: gtklog.c 项目: bf4/pidgin-mac
void pidgin_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account) {
	struct log_viewer_hash_t *ht;
	PidginLogViewer *lv = NULL;
	const char *name = screenname;
	char *title;
	GdkPixbuf *prpl_icon;

	g_return_if_fail(account != NULL);
	g_return_if_fail(screenname != NULL);

	ht = g_new0(struct log_viewer_hash_t, 1);

	ht->type = type;
	ht->screenname = g_strdup(screenname);
	ht->account = account;

	if (log_viewers == NULL) {
		log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal);
	} else if ((lv = g_hash_table_lookup(log_viewers, ht))) {
		gtk_window_present(GTK_WINDOW(lv->window));
		g_free(ht->screenname);
		g_free(ht);
		return;
	}

	if (type == PURPLE_LOG_CHAT) {
		PurpleChat *chat;

		chat = purple_blist_find_chat(account, screenname);
		if (chat != NULL)
			name = purple_chat_get_name(chat);

		title = g_strdup_printf(_("Conversations in %s"), name);
	} else {
		PurpleBuddy *buddy;

		buddy = purple_find_buddy(account, screenname);
		if (buddy != NULL)
			name = purple_buddy_get_contact_alias(buddy);

		title = g_strdup_printf(_("Conversations with %s"), name);
	}

	prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM);

	display_log_viewer(ht, purple_log_get_logs(type, screenname, account),
			title, gtk_image_new_from_pixbuf(prpl_icon),
			purple_log_get_total_size(type, screenname, account));

	if (prpl_icon)
		g_object_unref(prpl_icon);
	g_free(title);
}
static gint compare_logsize(PurpleBlistNode *node1, PurpleBlistNode *node2) {
	PurpleBlistNode *child;
	int logsize1=0, logsize2=0;
	
	if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) {
		for (child = node1->child; child; child = child->next) {
			if(PURPLE_BLIST_NODE_IS_BUDDY(child)) {
				logsize1 += purple_log_get_total_size(
					PURPLE_LOG_IM,
					((PurpleBuddy*)(child))->name, ((PurpleBuddy*)(child))->account
				);
			}
		}
	}
	if(PURPLE_BLIST_NODE_IS_BUDDY(node1)) {
		logsize1 = purple_log_get_total_size(
			PURPLE_LOG_IM,
			PURPLE_BLIST_NODE_NAME(node1), ((PurpleBuddy *)node1)->account
		);
	}
	if(PURPLE_BLIST_NODE_IS_CHAT(node1)) {
		logsize1 = purple_log_get_total_size(
			PURPLE_LOG_CHAT,
			PURPLE_BLIST_NODE_NAME(node1), ((PurpleChat *)node1)->account
		);
	}

	if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) {
		for (child = node2->child; child; child = child->next) {
			if(PURPLE_BLIST_NODE_IS_BUDDY(child)) {
				logsize2 += purple_log_get_total_size(
					PURPLE_LOG_IM,
					((PurpleBuddy*)(child))->name, ((PurpleBuddy*)(child))->account
				);
			}
		}
	}
	if(PURPLE_BLIST_NODE_IS_BUDDY(node2)) {
		logsize2 = purple_log_get_total_size(
			PURPLE_LOG_IM,
			PURPLE_BLIST_NODE_NAME(node2), ((PurpleBuddy *)node2)->account
		);
	}
	if(PURPLE_BLIST_NODE_IS_CHAT(node2)) {
		logsize2 = purple_log_get_total_size(
			PURPLE_LOG_CHAT,
			PURPLE_BLIST_NODE_NAME(node2), ((PurpleChat *)node2)->account
		);
	}
	
	if(logsize1 > logsize2) return -1;
	if(logsize2 > logsize1) return 1;
	return 0;
}
示例#3
0
文件: gtklog.c 项目: bf4/pidgin-mac
void pidgin_log_show_contact(PurpleContact *contact) {
	struct log_viewer_hash_t *ht;
	PurpleBlistNode *child;
	PidginLogViewer *lv = NULL;
	GList *logs = NULL;
	GdkPixbuf *pixbuf;
	GtkWidget *image;
	const char *name = NULL;
	char *title;
	int total_log_size = 0;

	g_return_if_fail(contact != NULL);

	ht = g_new0(struct log_viewer_hash_t, 1);
	ht->type = PURPLE_LOG_IM;
	ht->contact = contact;

	if (log_viewers == NULL) {
		log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal);
	} else if ((lv = g_hash_table_lookup(log_viewers, ht))) {
		gtk_window_present(GTK_WINDOW(lv->window));
		g_free(ht);
		return;
	}

	for (child = contact->node.child ; child ; child = child->next) {
		if (!PURPLE_BLIST_NODE_IS_BUDDY(child))
			continue;

		logs = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name,
						((PurpleBuddy *)child)->account), logs);
		total_log_size += purple_log_get_total_size(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, ((PurpleBuddy *)child)->account);
	}
	logs = g_list_sort(logs, purple_log_compare);

	image = gtk_image_new();
	pixbuf = gtk_widget_render_icon(image, PIDGIN_STOCK_STATUS_PERSON,
					gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow");
	if (pixbuf) {
		gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
		g_object_unref(pixbuf);
	} else {
		gtk_widget_destroy(image);
		image = NULL;
	}

	if (contact->alias != NULL)
		name = contact->alias;
	else if (contact->priority != NULL)
		name = purple_buddy_get_contact_alias(contact->priority);

	/* This will happen if the contact doesn't have an alias,
	 * and none of the contact's buddies are online.
	 * There is probably a better way to deal with this. */
	if (name == NULL) {
		if (contact->node.child != NULL && PURPLE_BLIST_NODE_IS_BUDDY(contact->node.child))
			name = purple_buddy_get_contact_alias((PurpleBuddy *) contact->node.child);
		if (name == NULL)
			name = "";
	}

	title = g_strdup_printf(_("Conversations with %s"), name);
	display_log_viewer(ht, logs, title, image, total_log_size);
	g_free(title);
}