view plugins/extplacement.c @ 9165:43ea2b858112

[gaim-migrate @ 9950] Patch by Felipe Contreras, and modified slightly by me to prevent disconnects on Switchboard errors in MSN. Now, it just displays the error dialog for switchboards, but keeps the disconnects for everything else. I was sure I committed this before 0.78, but something happened. *baffled* committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Wed, 02 Jun 2004 04:50:31 +0000
parents bd1ea0a717d7
children fb09ed68fbd2
line wrap: on
line source

#include "internal.h"
#include "conversation.h"

#define EXTPLACEMENT_OPT "/plugins/core/nosnilmot/extplacement"

static void
conv_placement_last_created_win_split(GaimConversation *conv)
{
	GaimConvWindow *win;

	win = gaim_get_last_window_with_type(gaim_conversation_get_type(conv));

	if (win == NULL) {
		win = gaim_conv_window_new();

		gaim_conv_window_add_conversation(win, conv);
		gaim_conv_window_show(win);
	}
	else
		gaim_conv_window_add_conversation(win, conv);
}

static void
conv_placement_by_number(GaimConversation *conv)
{
	GaimConvWindow *win = NULL;

	if (gaim_prefs_get_bool("/core/conversations/combine_chat_im"))
		win = g_list_last(gaim_get_windows())->data;
	else
		win = gaim_get_last_window_with_type(gaim_conversation_get_type(conv));

	if (win == NULL) {
		win = gaim_conv_window_new();

		gaim_conv_window_add_conversation(win, conv);
		gaim_conv_window_show(win);
	} else {
		int max_count = gaim_prefs_get_int(EXTPLACEMENT_OPT "/placement_number");
		int count = gaim_conv_window_get_conversation_count(win);

		if (count < max_count)
			gaim_conv_window_add_conversation(win, conv);
		else {
			GList *l = NULL;

			for (l = gaim_get_windows(); l != NULL; l = l->next) {
				win = (GaimConvWindow *)l->data;

				count = gaim_conv_window_get_conversation_count(win);
				if (count < max_count) {
					gaim_conv_window_add_conversation(win, conv);
					return;
				}
			}
			win = gaim_conv_window_new();

			gaim_conv_window_add_conversation(win, conv);
			gaim_conv_window_show(win);
		}
	}
}

static gboolean
plugin_load(GaimPlugin *plugin)
{
	gaim_prefs_add_none("/plugins/core/nosnilmot");
	gaim_prefs_add_none("/plugins/core/nosnilmot/extplacement");
	gaim_prefs_add_int(EXTPLACEMENT_OPT "/placement_number", 4);
	gaim_conv_placement_add_fnc("im_chat", _("Separate IM and Chat windows"),
							   &conv_placement_last_created_win_split);
	gaim_conv_placement_add_fnc("number", _("By conversation count"),
							   &conv_placement_by_number);
	return TRUE;
}

static gboolean
plugin_unload(GaimPlugin *plugin)
{
	gaim_conv_placement_remove_fnc("im_chat");
	gaim_conv_placement_remove_fnc("number");
	return TRUE;
}

static GaimPluginPrefFrame *
get_plugin_pref_frame(GaimPlugin *plugin) {
	GaimPluginPrefFrame *frame;
	GaimPluginPref *ppref;

	frame = gaim_plugin_pref_frame_new();

	ppref = gaim_plugin_pref_new_with_label("Conversation Placement");
	gaim_plugin_pref_frame_add(frame, ppref);

	ppref = gaim_plugin_pref_new_with_name_and_label(
									EXTPLACEMENT_OPT "/placement_number",
									"Number of conversations per window");
	gaim_plugin_pref_set_bounds(ppref, 1, 50);
	gaim_plugin_pref_frame_add(frame, ppref);

	return frame;
}

static GaimPluginUiInfo prefs_info = {
	get_plugin_pref_frame
};

static GaimPluginInfo info =
{
	GAIM_PLUGIN_API_VERSION,						/**< api_version	*/
	GAIM_PLUGIN_STANDARD,							/**< type			*/
	NULL,											/**< ui_requirement	*/
	0,												/**< flags			*/
	NULL,											/**< dependencies	*/
	GAIM_PRIORITY_DEFAULT,							/**< priority		*/

	"core-nosnilmot-extplacement",					/**< id				*/
	N_("ExtPlacement"),								/**< name			*/
	VERSION,										/**< version		*/
													/**  summary		*/
	N_("Extra conversation placement options."),
													/**  description	*/
	N_("Either restrict the number of conversations per windows"
	   " or use separate windows for IMs and Chats"),
	"Stu Tomlinson <stu@nosnilmot.com>",			/**< author			*/
	"http://www.nosnilmot.com/gaim/plugins/",		/**< homepage		*/

	plugin_load,									/**< load			*/
	plugin_unload,									/**< unload			*/
	NULL,											/**< destroy		*/

	NULL,											/**< ui_info		*/
	NULL,											/**< extra_info		*/
	&prefs_info,									/**< prefs_info		*/
	NULL											/**< actions		*/
};

static void
init_plugin(GaimPlugin *plugin)
{
}

GAIM_INIT_PLUGIN(extplacement, init_plugin, info)