Merged in rw_grim/pidgin (pull request #297)

Fri, 29 Dec 2017 03:57:44 +0000

author
Gary Kramlich <grim@reaperworld.com>
date
Fri, 29 Dec 2017 03:57:44 +0000
changeset 38849
20c80c3c31c5
parent 38817
6ac0c00dd6ad (diff)
parent 38848
22e32372b906 (current diff)
child 38851
2c1acd998186
child 38852
e80473941281
child 38854
086e15ec656d
child 38863
ec525e2a86e3

Merged in rw_grim/pidgin (pull request #297)

Moved PurpleProtocolXfer to xfer.[ch], started a testing ui

Approved-by: Eion Robb <eionrobb@gmail.com>

finch/gntblist.c file | annotate | diff | comparison | revisions
--- a/doc/reference/libpurple/libpurple-docs.xml	Thu Dec 28 21:28:09 2017 -0600
+++ b/doc/reference/libpurple/libpurple-docs.xml	Fri Dec 29 03:57:44 2017 +0000
@@ -58,6 +58,7 @@
       <xi:include href="xml/nat-pmp.xml" />
       <xi:include href="xml/network.xml" />
       <xi:include href="xml/notify.xml" />
+      <xi:include href="xml/options.xml" />
       <xi:include href="xml/plugins.xml" />
       <xi:include href="xml/prefs.xml" />
       <xi:include href="xml/pluginpref.xml" />
--- a/finch/gntblist.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/finch/gntblist.c	Fri Dec 29 03:57:44 2017 +0000
@@ -127,10 +127,6 @@
 static void add_chat(PurpleChat *chat, FinchBlist *ggblist);
 static void add_node(PurpleBlistNode *node, FinchBlist *ggblist);
 static void node_update(PurpleBuddyList *list, PurpleBlistNode *node);
-#if 0
-static gboolean is_contact_online(PurpleContact *contact);
-static gboolean is_group_online(PurpleGroup *group);
-#endif
 static void draw_tooltip(FinchBlist *ggblist);
 static void tooltip_for_buddy(PurpleBuddy *buddy, GString *str, gboolean full);
 static gboolean remove_typing_cb(gpointer null);
@@ -385,27 +381,6 @@
 		fnode = purple_blist_node_get_ui_data(node);
 		if (fnode && fnode->signed_timer)
 			flag |= GNT_TEXT_FLAG_BLINK;
-	} else if (PURPLE_IS_GROUP(node)) {
-		/* If the node is collapsed, then check to see if any of the priority buddies of
-		 * any of the contacts within this group recently signed on/off, and set the blink
-		 * flag appropriately. */
-		/* XXX: Refs #5444 */
-		/* XXX: there's no way I can ask if the node is expanded or not? *sigh*
-		 * API addition would be necessary */
-#if 0
-		if (!gnt_tree_get_expanded(GNT_TREE(ggblist->tree), node)) {
-			for (node = purple_blist_node_get_first_child(node); node;
-					node = purple_blist_node_get_sibling_next(node)) {
-				PurpleBlistNode *pnode;
-				pnode = purple_contact_get_priority_buddy((PurpleContact*)node);
-				fnode = purple_blist_node_get_ui_data(node);
-				if (fnode && fnode->signed_timer) {
-					flag |= GNT_TEXT_FLAG_BLINK;
-					break;
-				}
-			}
-		}
-#endif
 	}
 
 	return flag;
@@ -418,37 +393,6 @@
 	gnt_tree_set_row_color(GNT_TREE(ggblist->tree), node, get_display_color(node));
 }
 
-#if 0
-static gboolean
-is_contact_online(PurpleContact *contact)
-{
-	PurpleBlistNode *node;
-	for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)contact)); node;
-			node = purple_blist_node_get_sibling_next(node)) {
-		FinchBlistNode *fnode = purple_blist_node_get_ui_data(node);
-		if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) ||
-				(fnode && fnode->signed_timer))
-			return TRUE;
-	}
-	return FALSE;
-}
-
-static gboolean
-is_group_online(PurpleGroup *group)
-{
-	PurpleBlistNode *node;
-	for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)group)); node;
-			node = purple_blist_node_get_sibling_next(node)) {
-		if (PURPLE_IS_CHAT(node) &&
-				purple_account_is_connected(((PurpleChat *)node)->account))
-			return TRUE;
-		else if (is_contact_online((PurpleContact*)node))
-			return TRUE;
-	}
-	return FALSE;
-}
-#endif
-
 static void
 new_node(PurpleBlistNode *node)
 {
@@ -999,20 +943,6 @@
 		blist_update_row_flags((PurpleBlistNode*)contact);
 }
 
-#if 0
-static void
-buddy_signed_on(PurpleBuddy *buddy, FinchBlist *ggblist)
-{
-	add_node((PurpleBlistNode*)buddy, ggblist);
-}
-
-static void
-buddy_signed_off(PurpleBuddy *buddy, FinchBlist *ggblist)
-{
-	node_remove(purple_blist_get_buddy_list(), (PurpleBlistNode*)buddy);
-}
-#endif
-
 PurpleBlistUiOps *finch_blist_get_ui_ops()
 {
 	return &blist_ui_ops;
@@ -3131,17 +3061,6 @@
 	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", finch_blist_get_handle(),
 				PURPLE_CALLBACK(buddy_signed_on_off), ggblist);
 
-#if 0
-	/* These I plan to use to indicate unread-messages etc. */
-	purple_signal_connect(purple_conversations_get_handle(), "received-im-msg", finch_blist_get_handle(),
-				PURPLE_CALLBACK(received_im_msg), list);
-	purple_signal_connect(purple_conversations_get_handle(), "sent-im-msg", finch_blist_get_handle(),
-				PURPLE_CALLBACK(sent_im_msg), NULL);
-
-	purple_signal_connect(purple_conversations_get_handle(), "received-chat-msg", finch_blist_get_handle(),
-				PURPLE_CALLBACK(received_chat_msg), list);
-#endif
-
 	g_signal_connect(G_OBJECT(ggblist->tree), "selection_changed", G_CALLBACK(selection_changed), ggblist);
 	g_signal_connect(G_OBJECT(ggblist->tree), "key_pressed", G_CALLBACK(key_pressed), ggblist);
 	g_signal_connect(G_OBJECT(ggblist->tree), "context-menu", G_CALLBACK(context_menu), ggblist);
--- a/finch/gntplugin.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/finch/gntplugin.c	Fri Dec 29 03:57:44 2017 +0000
@@ -446,95 +446,6 @@
 	}
 }
 
-#if 0
-static void
-install_selected_file_cb(gpointer handle, const char *filename)
-{
-	/* Try to init the selected file.
-	 * If it succeeds, try to make a copy of the file in $USERDIR/plugins/.
-	 * If the copy succeeds, unload and destroy the plugin in the original
-	 *  location and init+load the new one.
-	 * Select the plugin in the plugin list.
-	 */
-	char *path;
-	PurplePlugin *plugin;
-
-	g_return_if_fail(plugins.window);
-
-	plugin = purple_plugin_probe(filename);
-	if (!plugin) {
-		purple_notify_error(handle, _("Error loading plugin"),
-				_("The selected file is not a valid plugin."),
-				_("Please open the debug window and try again to see the exact error message."), NULL);
-		return;
-	}
-	if (g_list_find(gnt_tree_get_rows(GNT_TREE(plugins.tree)), plugin)) {
-		purple_plugin_load(plugin);
-		gnt_tree_set_choice(GNT_TREE(plugins.tree), plugin, purple_plugin_is_loaded(plugin));
-		gnt_tree_set_selected(GNT_TREE(plugins.tree), plugin);
-		return;
-	}
-
-	path = g_build_filename(purple_user_dir(), "plugins", NULL);
-	if (purple_build_dir(path, S_IRUSR | S_IWUSR | S_IXUSR) == 0) {
-		char *content = NULL;
-		gsize length = 0;
-
-		if (g_file_get_contents(filename, &content, &length, NULL)) {
-			char *file = g_path_get_basename(filename);
-			g_free(path);
-			path = g_build_filename(purple_user_dir(), "plugins", file, NULL);
-			if (purple_util_write_data_to_file_absolute(path, content, length)) {
-				purple_plugin_destroy(plugin);
-				plugin = purple_plugin_probe(path);
-				if (!plugin) {
-					purple_debug_warning("gntplugin", "This is really strange. %s can be loaded, but %s can't!\n",
-							filename, path);
-					g_unlink(path);
-					plugin = purple_plugin_probe(filename);
-				}
-			} else {
-			}
-		}
-		g_free(content);
-	}
-	g_free(path);
-
-	purple_plugin_load(plugin);
-
-	if (plugin->info->type == PURPLE_PLUGIN_LOADER) {
-		GList *cur;
-		for (cur = PURPLE_PLUGIN_LOADER_INFO(plugin)->exts; cur != NULL;
-				cur = cur->next)
-			purple_plugins_probe(cur->data);
-		return;
-	}
-
-	if (plugin->info->type != PURPLE_PLUGIN_STANDARD ||
-			(plugin->info->flags & PURPLE_PLUGIN_FLAG_INVISIBLE) ||
-			plugin->error)
-		return;
-
-	gnt_tree_add_choice(GNT_TREE(plugins.tree), plugin,
-			gnt_tree_create_row(GNT_TREE(plugins.tree), plugin->info->name), NULL, NULL);
-	gnt_tree_set_choice(GNT_TREE(plugins.tree), plugin, purple_plugin_is_loaded(plugin));
-	gnt_tree_set_row_flags(GNT_TREE(plugins.tree), plugin, GNT_TEXT_FLAG_BOLD);
-	gnt_tree_set_selected(GNT_TREE(plugins.tree), plugin);
-}
-
-static void
-install_plugin_cb(GntWidget *w, gpointer null)
-{
-	static int handle;
-
-	purple_request_close_with_handle(&handle);
-	purple_request_file(&handle, _("Select plugin to install"), NULL,
-			FALSE, G_CALLBACK(install_selected_file_cb), NULL,
-			NULL, &handle);
-	g_signal_connect_swapped(G_OBJECT(w), "destroy", G_CALLBACK(purple_request_close_with_handle), &handle);
-}
-#endif
-
 void finch_plugins_show_all(void)
 {
 	GntWidget *window, *tree, *box, *aboot, *button;
@@ -603,13 +514,6 @@
 	box = gnt_hbox_new(FALSE);
 	gnt_box_add_widget(GNT_BOX(window), box);
 
-#if 0
-	button = gnt_button_new(_("Install Plugin..."));
-	gnt_box_add_widget(GNT_BOX(box), button);
-	gnt_util_set_trigger_widget(GNT_WIDGET(tree), GNT_KEY_INS, button);
-	g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(install_plugin_cb), NULL);
-#endif
-
 	button = gnt_button_new(_("Close"));
 	gnt_box_add_widget(GNT_BOX(box), button);
 	g_signal_connect_swapped(G_OBJECT(button), "activate",
--- a/finch/libfinch.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/finch/libfinch.c	Fri Dec 29 03:57:44 2017 +0000
@@ -29,6 +29,7 @@
 #include "glibcompat.h"
 #include "log.h"
 #include "notify.h"
+#include "options.h"
 #include "plugins.h"
 #include "protocol.h"
 #include "pounce.h"
@@ -146,9 +147,6 @@
 		{"config", 'c', 0,
 			G_OPTION_ARG_FILENAME, &opt_config_dir_arg,
 			_("use DIR for config files"), _("DIR")},
-		{"debug", 'd', 0,
-			G_OPTION_ARG_NONE, &debug_enabled,
-			_("print debugging messages to stderr"), NULL},
 		{"nologin", 'n', 0,
 			G_OPTION_ARG_NONE, &opt_nologin,
 			_("don't automatically login"), NULL},
@@ -170,6 +168,9 @@
 	g_option_context_set_summary(context, DISPLAY_VERSION);
 	g_option_context_add_main_entries(context, option_entries, PACKAGE);
 
+	g_option_context_add_group(context, purple_get_option_group());
+	g_option_context_add_group(context, gplugin_get_option_group());
+
 #ifdef G_OS_WIN32
 	/* Handle Unicode filenames on Windows. See GOptionContext docs. */
 	args = g_win32_get_command_line();
--- a/finch/libgnt/gntfilesel.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/finch/libgnt/gntfilesel.c	Fri Dec 29 03:57:44 2017 +0000
@@ -38,10 +38,6 @@
 
 #include <glib/gstdio.h>
 
-#if 0
-#include <glob.h>
-#endif
-
 enum
 {
 	SIG_FILE_SELECTED,
@@ -281,12 +277,7 @@
 {
 	char *path;
 	char *str;
-#if 0
-	int count;
-	glob_t gl;
-	GStatBuf st;
-	int glob_ret;
-#endif
+
 	if (strcmp(key, "\r") && strcmp(key, "\n"))
 		return FALSE;
 
@@ -309,39 +300,9 @@
 		g_free(path);
 		return FALSE;
 	}
-#if 0
-	/* XXX: there needs to be a way to allow other methods for globbing,
-	 * like the read_fn stuff. */
-	glob_ret = glob(path, GLOB_MARK, NULL, &gl);
-	if (!glob_ret) {  /* XXX: do something with the return value */
-		char *loc = g_path_get_dirname(gl.gl_pathv[0]);
 
-		g_stat(gl.gl_pathv[0], &st);
-		gnt_file_sel_set_current_location(sel, loc);  /* XXX: check the return value */
-		g_free(loc);
-		if (!S_ISDIR(st.st_mode) && !sel->dirsonly) {
-			gnt_tree_remove_all(GNT_TREE(sel->files));
-			for (count = 0; count < gl.gl_pathc; count++) {
-				char *tmp = process_path(gl.gl_pathv[count]);
-				loc = g_path_get_dirname(tmp);
-				if (g_utf8_collate(sel->current, loc) == 0) {
-					char *base = g_path_get_basename(tmp);
-					char size[128];
-					snprintf(size, sizeof(size), "%ld", (long)st.st_size);
-					gnt_tree_add_row_after(GNT_TREE(sel->files), base,
-							gnt_tree_create_row(GNT_TREE(sel->files), base, size, ""), NULL, NULL);
-				}
-				g_free(loc);
-				g_free(tmp);
-			}
-			gnt_widget_draw(sel->files);
-		}
-	} else if (sel->files) {
-		gnt_tree_remove_all(GNT_TREE(sel->files));
-		gnt_widget_draw(sel->files);
-	}
-	globfree(&gl);
-#endif
+	/* XXX: Add support for globbing via g_pattern_spec_* */
+
 success:
 	g_free(path);
 	return TRUE;
--- a/finch/libgnt/gntmain.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/finch/libgnt/gntmain.c	Fri Dec 29 03:57:44 2017 +0000
@@ -340,12 +340,6 @@
 	}
 	*k = '\0';
 
-#if 0
-	gnt_warning("a key: [%s] %#x %#x %#x %#x %#x %#x", keys,
-		(guchar)keys[0], (guchar)keys[1], (guchar)keys[2],
-		(guchar)keys[3], (guchar)keys[4], (guchar)keys[5]);
-#endif
-
 	/* TODO: we could call detect_mouse_action here, but no
 	 * events are triggered (yet?) for mouse on win32.
 	 */
@@ -395,17 +389,6 @@
 	if (mouse_enabled && detect_mouse_action(k))
 		goto end;
 
-#if 0
-	/* I am not sure what's happening here. If this actually does something,
-	 * then this needs to go in gnt_keys_refine. */
-	if (*k < 0) { /* Alt not sending ESC* */
-		*(k + 1) = 128 - *k;
-		*k = 27;
-		*(k + 2) = 0;
-		rd++;
-	}
-#endif
-
 	while (rd) {
 		char back;
 		int p;
@@ -450,12 +433,6 @@
 
 	g_io_channel_set_close_on_unref(channel, TRUE);
 
-#if 0
-	g_io_channel_set_encoding(channel, NULL, NULL);
-	g_io_channel_set_buffered(channel, FALSE);
-	g_io_channel_set_flags(channel, G_IO_FLAG_NONBLOCK, NULL );
-#endif
-
 	channel_read_callback = result = g_io_add_watch_full(channel,  G_PRIORITY_HIGH,
 					(G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI),
 					io_invoke, NULL, NULL);
@@ -465,10 +442,6 @@
 					io_invoke_error, GINT_TO_POINTER(result), NULL);
 
 	g_io_channel_unref(channel);
-
-#if 0
-	gnt_warning("setting up IO (%d)", channel_read_callback);
-#endif
 }
 
 static gboolean
--- a/finch/libgnt/gntmenuitem.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/finch/libgnt/gntmenuitem.c	Fri Dec 29 03:57:44 2017 +0000
@@ -65,13 +65,8 @@
 gnt_menuitem_init(GTypeInstance *instance, gpointer klass)
 {
 	GntMenuItem *item = GNT_MENU_ITEM(instance);
-#if 0
-	GntMenuItemPriv *priv = &item->priv;
 
-	priv->visible = TRUE;
-#else
 	item->visible = TRUE;
-#endif
 }
 
 /******************************************************************************
@@ -167,13 +162,7 @@
 void
 gnt_menuitem_set_visible(GntMenuItem *item, gboolean visible)
 {
-#if 0
-	GntMenuItemPriv *priv = &item->priv;
-
-	priv->visible = visible;
-#else
 	item->visible = visible;
-#endif
 }
 
 gboolean
@@ -181,11 +170,7 @@
 {
 	g_return_val_if_fail(GNT_IS_MENU_ITEM(item), FALSE);
 
-#if 0
-	return item->priv.visible;
-#else
 	return item->visible;
-#endif
 }
 
 void
--- a/finch/libgnt/gntwidget.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/finch/libgnt/gntwidget.c	Fri Dec 29 03:57:44 2017 +0000
@@ -322,42 +322,8 @@
 
 	if (widget->window == NULL)
 	{
-#if 0
-		int x, y, maxx, maxy, w, h;
-		int oldw, oldh;
-		gboolean shadow = TRUE;
-
-		if (!gnt_widget_has_shadow(widget))
-			shadow = FALSE;
-
-		x = widget->priv.x;
-		y = widget->priv.y;
-		w = oldw = widget->priv.width + shadow;
-		h = oldh = widget->priv.height + shadow;
-
-		getmaxyx(stdscr, maxy, maxx);
-		maxy -= 1;		/* room for the taskbar */
+		widget->window = newpad(widget->priv.height + 20, widget->priv.width + 20);
 
-		x = MAX(0, x);
-		y = MAX(0, y);
-		if (x + w >= maxx)
-			x = MAX(0, maxx - w);
-		if (y + h >= maxy)
-			y = MAX(0, maxy - h);
-
-		w = MIN(w, maxx);
-		h = MIN(h, maxy);
-
-		widget->priv.x = x;
-		widget->priv.y = y;
-		if (w != oldw || h != oldh) {
-			widget->priv.width = w - shadow;
-			widget->priv.height = h - shadow;
-			g_signal_emit(widget, signals[SIG_SIZE_CHANGED], 0, oldw, oldh);
-		}
-#else
-		widget->window = newpad(widget->priv.height + 20, widget->priv.width + 20);  /* XXX: */
-#endif
 		init_widget(widget);
 	}
 
@@ -403,11 +369,6 @@
 {
 	g_signal_emit(widget, signals[SIG_HIDE], 0);
 	wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_NORMAL));
-#if 0
-	/* XXX: I have no clue why, but this seemed to be necessary. */
-	if (gnt_widget_has_shadow(widget))
-		mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height);
-#endif
 	gnt_screen_release(widget);
 	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_INVISIBLE);
 	GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_MAPPED);
--- a/finch/libgnt/test.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/finch/libgnt/test.c	Fri Dec 29 03:57:44 2017 +0000
@@ -16,25 +16,6 @@
 	gnt_box_set_title(GNT_BOX(box), "This is a test");
 
 	gnt_widget_show(box);
-#if 0
-
-	gnt_widget_set_focus(w, TRUE);
-
-	/* XXX: This is to just test stuff */
-	if (text[0] == 27)
-	{
-		if (strcmp(text+1, GNT_KEY_LEFT) == 0 && w->priv.x)
-			(w->priv.x)--;
-		else if (strcmp(text+1, GNT_KEY_RIGHT) == 0)
-			(w->priv.x)++;
-		else if (strcmp(text+1, GNT_KEY_UP) == 0 && w->priv.y)
-			(w->priv.y)--;
-		else if (strcmp(text+1, GNT_KEY_DOWN) == 0)
-			(w->priv.y)++;
-	}
-
-	gnt_widget_draw(w);
-#endif
 
 	return FALSE;
 }
@@ -57,11 +38,7 @@
 {
 	g_return_val_if_fail(GNT_IS_TREE(tree), FALSE);
 	gnt_tree_scroll(GNT_TREE(tree), 1);
-	/*wscrl(tree->window, 1);*/
-	/*box(tree->window, ACS_VLINE, ACS_HLINE);*/
-	/*wrefresh(tree->window);*/
-	/*char *s = 0;*/
-	/**s = 'a';*/
+
 	return TRUE;
 }
 
@@ -90,7 +67,6 @@
 	gnt_box_add_widget(GNT_BOX(vbox), widget2);
 
 	gnt_box_add_widget(GNT_BOX(hbox), label);
-	/*gnt_box_add_widget(GNT_BOX(hbox), vbox);*/
 
 	gnt_box_add_widget(GNT_BOX(hbox), gnt_entry_new("a"));
 
@@ -106,18 +82,12 @@
 	GNT_WIDGET_UNSET_FLAGS(hbox, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW);
 	gnt_box_set_title(GNT_BOX(hbox), "111111111111111111111111111111111111111111111111111111111111111This is the title …");
 
-	/*gnt_widget_set_take_focus(vbox, TRUE);*/
-	/*gnt_widget_set_take_focus(hbox, TRUE);*/
-	/*gnt_widget_set_position(hbox, 10, 10);*/
-
 	gnt_widget_show(hbox);
 
 	g_signal_connect(hbox, "key_pressed", G_CALLBACK(key_pressed), tree);
 	g_signal_connect(widget, "activate", G_CALLBACK(button1), hbox);
 	g_signal_connect(widget2, "activate", G_CALLBACK(button2), hbox);
 
-	/*g_timeout_add(1000, (GSourceFunc)w_scroll, tree);*/
-
 	gnt_main();
 
 	return 0;
--- a/libpurple/conversationtypes.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/conversationtypes.c	Fri Dec 29 03:57:44 2017 +0000
@@ -806,14 +806,6 @@
 		return;
 	}
 
-#if 0
-	PurpleAccount *account = purple_conversation_get_account(conv);
-	/* XXX: this should not be necessary */
-	if (purple_strequal(purple_normalize(account, who), priv->nick)) {
-		flags |= PURPLE_MESSAGE_SEND;
-	}
-#endif
-
 	flags = purple_message_get_flags(msg);
 	if (flags & PURPLE_MESSAGE_RECV) {
 		if (purple_utf8_has_word(purple_message_get_contents(msg), priv->nick)) {
@@ -1455,36 +1447,11 @@
 	{
 		/* Still connected */
 		int chat_id = purple_chat_conversation_get_id(chat);
-#if 0
+
 		/*
-		 * This is unfortunately necessary, because calling
-		 * purple_serv_chat_leave() calls this purple_conversation_destroy(),
-		 * which leads to two calls here.. We can't just return after
-		 * this, because then it'll return on the next pass. So, since
-		 * purple_serv_got_chat_left(), which is eventually called from the
-		 * protocol that purple_serv_chat_leave() calls, removes this conversation
-		 * from the gc's buddy_chats list, we're going to check to see
-		 * if this exists in the list. If so, we want to return after
-		 * calling this, because it'll be called again. If not, fall
-		 * through, because it'll have already been removed, and we'd
-		 * be on the 2nd pass.
-		 *
-		 * Long paragraph. <-- Short sentence.
-		 *
-		 *   -- ChipX86
-		 */
-
-		if (gc && g_slist_find(gc->buddy_chats, conv) != NULL) {
-			purple_serv_chat_leave(gc, chat_id);
-
-			return;
-		}
-#endif
-		/*
-		 * Instead of all of that, lets just close the window when
-		 * the user tells us to, and let the protocol deal with the
-		 * internals on it's own time. Don't do this if the protocol already
-		 * knows it left the chat.
+		 * Close the window when the user tells us to, and let the protocol
+		 * deal with the internals on it's own time. Don't do this if the
+		 * protocol already knows it left the chat.
 		 */
 		if (!purple_chat_conversation_has_left(chat))
 			purple_serv_chat_leave(gc, chat_id);
--- a/libpurple/dbus-server.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/dbus-server.c	Fri Dec 29 03:57:44 2017 +0000
@@ -691,13 +691,7 @@
 		gboolean xboolean;
 		gpointer ptr = NULL;
 		gpointer val;
-#if 0
-		if (purple_value_is_outgoing(purple_values[i]))
-		{
-			ptr = my_arg(gpointer);
-			g_return_val_if_fail(ptr, TRUE);
-		}
-#endif
+
 		switch (types[i])
 		{
 		case G_TYPE_INT:
@@ -768,13 +762,8 @@
 	DBusMessageIter iter;
 	char *newname;
 
-#if 0 /* this is noisy with no dbus connection */
-	g_return_if_fail(purple_dbus_connection);
-#else
 	if (purple_dbus_connection == NULL)
 		return;
-#endif
-
 
 	/*
 	 * The test below is a hack that prevents our "dbus-method-called"
--- a/libpurple/http.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/http.c	Fri Dec 29 03:57:44 2017 +0000
@@ -236,11 +236,6 @@
 	guint16 host_len1;       /* host string length */
 	guint16 host_len2;       /* host string length */
 	guint32 host_off;        /* host string offset (always 0x00000020) */
-
-#if 0
-	guint8  host[*];         /* host string (ASCII) */
-	guint8  dom[*];          /* domain string (ASCII) */
-#endif
 };
 
 static time_t purple_http_rfc1123_to_time(const gchar *str);
--- a/libpurple/log.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/log.c	Fri Dec 29 03:57:44 2017 +0000
@@ -364,19 +364,6 @@
 
 PurpleLogLogger *purple_log_logger_new(const char *id, const char *name, int functions, ...)
 {
-#if 0
-				void(*create)(PurpleLog *),
-				gsize(*write)(PurpleLog *, PurpleMessageFlags, const char *, GDateTime *, const char *),
-				void(*finalize)(PurpleLog *),
-				GList*(*list)(PurpleLogType type, const char*, PurpleAccount*),
-				char*(*read)(PurpleLog*, PurpleLogReadFlags*),
-				int(*size)(PurpleLog*),
-				int(*total_size)(PurpleLogType type, const char *name, PurpleAccount *account),
-				GList*(*list_syslog)(PurpleAccount *account),
-				void(*get_log_sets)(PurpleLogSetCallback cb, GHashTable *sets),
-				gboolean(*remove)(PurpleLog *log),
-				gboolean(*is_deletable)(PurpleLog *log))
-#endif
 	PurpleLogLogger *logger;
 	va_list args;
 
--- a/libpurple/media.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/media.c	Fri Dec 29 03:57:44 2017 +0000
@@ -499,15 +499,6 @@
 	g_hash_table_insert(media->priv->sessions, g_strdup(session->id), session);
 }
 
-#if 0
-static gboolean
-purple_media_remove_session(PurpleMedia *media, PurpleMediaSession *session)
-{
-	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
-	return g_hash_table_remove(media->priv->sessions, session->id);
-}
-#endif
-
 static PurpleMediaStream *
 purple_media_insert_stream(PurpleMediaSession *session,
 		const gchar *name, gboolean initiator)
--- a/libpurple/meson.build	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/meson.build	Fri Dec 29 03:57:44 2017 +0000
@@ -39,6 +39,7 @@
 	'nat-pmp.c',
 	'network.c',
 	'notify.c',
+	'options.c',
 	'plugins.c',
 	'pluginpref.c',
 	'pounce.c',
@@ -118,6 +119,7 @@
 	'nat-pmp.h',
 	'network.h',
 	'notify.h',
+	'options.h',
 	'plugins.h',
 	'pluginpref.h',
 	'pounce.h',
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/options.c	Fri Dec 29 03:57:44 2017 +0000
@@ -0,0 +1,96 @@
+/* purple
+ *
+ * Purple 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 "internal.h"
+
+#include "options.h"
+
+#include "network.h"
+
+/******************************************************************************
+ * Callbacks
+ *****************************************************************************/
+static gboolean
+debug_cb(const gchar *option_name, const gchar *value,
+		gpointer data, GError **error)
+{
+	purple_debug_set_enabled(TRUE);
+
+	if (purple_strequal(value, "colored")) {
+		purple_debug_set_colored(TRUE);
+	}
+
+	return TRUE;
+}
+
+static gboolean
+force_online_cb(const gchar *option_name, const gchar *value,
+                gpointer data, GError **error)
+{
+	purple_network_force_online();
+
+	return TRUE;
+}
+
+/******************************************************************************
+ * API
+ *****************************************************************************/
+
+/**
+ * purple_get_option_group:
+ *
+ * Returns a #GOptionGroup for the commandline arguments recognized by
+ * LibPurple.  You should add this option group to your #GOptionContext with
+ * g_option_context_add_group(), if you are using g_option_context_parse() to
+ * parse your commandline arguments.
+ *
+ * Return Value: (transfer full): a #GOptionGroup for the commandline arguments
+ *                                recognized by LibPurple.
+ */
+GOptionGroup *
+purple_get_option_group(void) {
+	GOptionGroup *group = NULL;
+	GOptionEntry entries[] = {
+		{
+			"debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
+			G_OPTION_ARG_CALLBACK, &debug_cb,
+			_("print debugging messages to stdout"),
+			_("[colored]")
+		}, {
+			"force-online", 'f', 0,
+			G_OPTION_ARG_NONE, &force_online_cb,
+			_("force online, regardless of network status"),
+			NULL
+		},
+	};
+
+	group = g_option_group_new(
+		"libpurple",
+		_("LibPurple options"),
+		_("Show LibPurple Options"),
+		NULL,
+		NULL
+	);
+
+	g_option_group_add_entries(group, entries);
+
+	return group;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/options.h	Fri Dec 29 03:57:44 2017 +0000
@@ -0,0 +1,42 @@
+/* purple
+ *
+ * Purple 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
+ */
+
+#ifndef PURPLE_OPTIONS_H
+#define PURPLE_OPTIONS_H
+
+/**
+ * SECTION:options
+ * @section_id: libpurple-options
+ * @short_description: <filename>options.h</filename>
+ * @title: Options API
+ *
+ * The functions defined here are to help in handling command line options.
+ */
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+GOptionGroup *purple_get_option_group(void);
+
+G_END_DECLS
+
+#endif /* PURPLE_OPTIONS_H */
--- a/libpurple/plugins/filectl.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/plugins/filectl.c	Fri Dec 29 03:57:44 2017 +0000
@@ -86,27 +86,6 @@
 			free(arg1);
 			free(arg2);
 
-/* purple_find_conversation() is gone in 2.0.0. */
-#if 0
-		} else if (!g_ascii_strncasecmp(command, "send", 4)) {
-			PurpleConversation *conv;
-
-			arg1 = getarg(buffer, 1, 0);
-			arg2 = getarg(buffer, 2, 1);
-
-			conv = purple_find_conversation(PURPLE_CONV_TYPE_ANY, arg1);
-			if (conv != NULL)
-			{
-				/*
-				purple_conversation_write(conv, arg2, WFLAG_SEND, NULL, time(NULL), -1);
-				purple_serv_send_im(conv->gc, arg1, arg2, 0);
-				*/
-			}
-
-			free(arg1);
-			free(arg2);
-#endif
-
 		} else if (!g_ascii_strncasecmp(command, "away", 4)) {
 			arg1 = getarg(buffer, 1, 1);
 			/* serv_set_away_all(arg1); */
--- a/libpurple/plugins/log_reader.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/plugins/log_reader.c	Fri Dec 29 03:57:44 2017 +0000
@@ -2444,35 +2444,6 @@
 	if (path) {
 		/* Read talk.ini file to find the log directory. */
 		GError *error = NULL;
-
-#if 0 /* FIXME: Not tested yet. */
-		GKeyFile *key_file;
-
-		purple_debug_info("Trillian talk.ini read", "Reading %s\n", path);
-
-		error = NULL;
-		if (!g_key_file_load_from_file(key_file, path, G_KEY_FILE_NONE, GError &error)) {
-			purple_debug_error("Trillian talk.ini read",
-			                   "Error reading talk.ini\n");
-			if (error)
-				g_error_free(error);
-		} else {
-			char *logdir = g_key_file_get_string(key_file, "Logging", "Directory", &error);
-			if (error) {
-				purple_debug_error("Trillian talk.ini read",
-				                   "Error reading Directory value from Logging section\n");
-				g_error_free(error);
-			}
-
-			if (logdir) {
-				g_strchomp(logdir);
-				purple_prefs_add_string("/plugins/core/log_reader/trillian/log_directory", logdir);
-				found = TRUE;
-			}
-
-			g_key_file_free(key_file);
-		}
-#else
 		gchar *contents = NULL;
 
 		if (g_file_test(path, G_FILE_TEST_IS_REGULAR)) {
@@ -2514,7 +2485,6 @@
 			g_free(contents);
 		}
 		g_free(path);
-#endif
 	} /* path */
 
 	if (!found) {
--- a/libpurple/stun.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/stun.c	Fri Dec 29 03:57:44 2017 +0000
@@ -63,14 +63,6 @@
 	guint16 len;
 };
 
-#if 0
-struct stun_change {
-	struct stun_header hdr;
-	struct stun_attrib attrib;
-	char value[4];
-};
-#endif	/* 0 */
-
 struct stun_conn {
 	int fd;
 	struct sockaddr_in addr;
@@ -150,27 +142,6 @@
 	return TRUE;
 }
 
-#if 0
-static void do_test2(struct stun_conn *sc) {
-	struct stun_change data;
-	data.hdr.type = htons(0x0001);
-	data.hdr.len = 0;
-	data.hdr.transid[0] = rand();
-	data.hdr.transid[1] = ntohl(((int)'g' << 24) + ((int)'a' << 16) + ((int)'i' << 8) + (int)'m');
-	data.hdr.transid[2] = rand();
-	data.hdr.transid[3] = rand();
-	data.attrib.type = htons(0x003);
-	data.attrib.len = htons(4);
-	data.value[3] = 6;
-	sc->packet = (struct stun_header*)&data;
-	sc->packetsize = sizeof(struct stun_change);
-	sc->retry = 0;
-	sc->test = 2;
-	sendto(sc->fd, sc->packet, sc->packetsize, 0, (struct sockaddr *)&(sc->addr), sizeof(struct sockaddr_in));
-	sc->timeout = g_timeout_add(500, (GSourceFunc) timeoutfunc, sc);
-}
-#endif	/* 0 */
-
 static void reply_cb(gpointer data, gint source, PurpleInputCondition cond) {
 	struct stun_conn *sc = data;
 	guchar buffer[65536];
--- a/libpurple/tests/test_util.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/tests/test_util.c	Fri Dec 29 03:57:44 2017 +0000
@@ -472,6 +472,10 @@
 			"aaaa\xef\xbb\xbf",
 			"aaaa\xef\xbb\xbf",
 		}, {
+			/* U+FFFE (should be stripped) */
+			"aaaa\xef\xbf\xbe",
+			"aaaa",
+		}, {
 			NULL,
 			NULL,
 		}
@@ -484,20 +488,12 @@
 
 		g_free(result);
 
+		/* NULL as input is a valid test, but it's the last test, so we break
+		 * after it.
+		 */
 		if(data[i].input == NULL)
 			break;
 	}
-
-#if 0
-	/* invalid UTF-8 */
-	/* disabled because make check fails on an assertion */
-	fail_unless(NULL == purple_utf8_strip_unprintables("abc\x80\x7f"));
-	/* disabled because make check fails on an assertion */
-	/* U+DB80 (Private Use High Surrogate, First) -- should be stripped */
-	assert_string_equal_free("aaaa", purple_utf8_strip_unprintables("aaaa\xed\xa0\x80"));
-	/* U+FFFE (should be stripped) */
-	assert_string_equal_free("aaaa", purple_utf8_strip_unprintables("aaaa\xef\xbf\xbe"));
-#endif
 }
 
 /******************************************************************************
--- a/libpurple/trie.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/trie.c	Fri Dec 29 03:57:44 2017 +0000
@@ -244,44 +244,6 @@
 	return state;
 }
 
-#if 0
-static gchar *
-purple_trie_print(PurpleTrieState *state, int limit)
-{
-	GString *str = g_string_new(NULL);
-	int i;
-
-	if (limit < 0)
-		return g_strdup("{ LIMIT }");
-
-	if (state->found_word)
-		g_string_append(str, "*");
-	g_string_append(str, "{ ");
-	for (i = 0; i < 256; i++) {
-		gchar *chp;
-		if (!state->children)
-			continue;
-		if (!state->children[i])
-			continue;
-		if (i == 0)
-			g_string_append(str, "(null)->");
-		else
-			g_string_append_printf(str, "%c->", i);
-		if (state->children[i] == state)
-			g_string_append(str, "loop");
-		else {
-			chp = purple_trie_print(state->children[i], limit - 1);
-			g_string_append(str, chp);
-			g_string_append_c(str, ' ');
-			g_free(chp);
-		}
-	}
-	g_string_append(str, "}");
-
-	return g_string_free(str, FALSE);
-}
-#endif
-
 static gboolean
 purple_trie_states_build(PurpleTrie *trie)
 {
--- a/libpurple/upnp.h	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/upnp.h	Fri Dec 29 03:57:44 2017 +0000
@@ -62,19 +62,6 @@
  */
 void purple_upnp_discover(PurpleUPnPCallback cb, gpointer cb_data);
 
-#if 0
-/**
- * purple_upnp_get_control_info:
- *
- * Retrieve the current UPnP control info, if there is any available.
- * This will only be filled in if purple_upnp_discover() had been called,
- * and finished discovering.
- *
- * Returns: The control URL for the IGD we'll use to use the IGD services
- */
-const PurpleUPnPControlInfo* purple_upnp_get_control_info(void);
-#endif
-
 /**
  * purple_upnp_get_public_ip:
  *
--- a/libpurple/util.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/util.c	Fri Dec 29 03:57:44 2017 +0000
@@ -2538,13 +2538,6 @@
 					str2[j++] = '\n';
 				}
 				/* Check for tags which begin CDATA and need to be closed */
-#if 0 /* FIXME.. option is end tag optional, we can't handle this right now */
-				else if (g_ascii_strncasecmp(str2 + i, "<option", 7) == 0)
-				{
-					/* FIXME: We should not do this if the OPTION is SELECT'd */
-					cdata_close_tag = "</option>";
-				}
-#endif
 				else if (g_ascii_strncasecmp(str2 + i, "<script", 7) == 0)
 				{
 					cdata_close_tag = "</script>";
@@ -5074,69 +5067,3 @@
 
 	return ret;
 }
-
-#if 0
-
-/* Temporarily removed - re-add this when you need ini file support. */
-
-#define PURPLE_KEY_FILE_DEFAULT_MAX_SIZE 102400
-#define PURPLE_KEY_FILE_HARD_LIMIT 10485760
-
-gboolean
-purple_key_file_load_from_ini(GKeyFile *key_file, const gchar *file,
-	gsize max_size)
-{
-	const gchar *header = "[default]\n\n";
-	int header_len = strlen(header);
-	int fd;
-	GStatBuf st;
-	gsize file_size, buff_size;
-	gchar *buff;
-	GError *error = NULL;
-
-	g_return_val_if_fail(key_file != NULL, FALSE);
-	g_return_val_if_fail(file != NULL, FALSE);
-	g_return_val_if_fail(max_size < PURPLE_KEY_FILE_HARD_LIMIT, FALSE);
-
-	if (max_size == 0)
-		max_size = PURPLE_KEY_FILE_DEFAULT_MAX_SIZE;
-
-	fd = g_open(file, O_RDONLY, S_IREAD);
-	if (fd == -1) {
-		purple_debug_error("util", "Failed to read ini file %s", file);
-		return FALSE;
-	}
-
-	if (_purple_fstat(fd, &st) != 0) {
-		purple_debug_error("util", "Failed to fstat ini file %s", file);
-		return FALSE;
-	}
-
-	file_size = (st.st_size > max_size) ? max_size : st.st_size;
-
-	buff_size = file_size + header_len;
-	buff = g_new(gchar, buff_size);
-	memcpy(buff, header, header_len);
-	if (read(fd, buff + header_len, file_size) != (gssize)file_size) {
-		purple_debug_error("util",
-			"Failed to read whole ini file %s", file);
-		g_close(fd, NULL);
-		free(buff);
-		return FALSE;
-	}
-	g_close(fd, NULL);
-
-	g_key_file_load_from_data(key_file, buff, buff_size,
-		G_KEY_FILE_NONE, &error);
-
-	free(buff);
-
-	if (error) {
-		purple_debug_error("util", "Failed parsing ini file %s: %s",
-			file, error->message);
-		return FALSE;
-	}
-
-	return TRUE;
-}
-#endif
--- a/libpurple/xmlnode.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/libpurple/xmlnode.c	Fri Dec 29 03:57:44 2017 +0000
@@ -74,19 +74,6 @@
 	node = new_node(name, PURPLE_XMLNODE_TYPE_TAG);
 
 	purple_xmlnode_insert_child(parent, node);
-#if 0
-	/* This would give PurpleXmlNodes more appropriate namespacing
-	 * when creating them.  Otherwise, unless an explicit namespace
-	 * is set, purple_xmlnode_get_namespace() will return NULL, when
-	 * there may be a default namespace.
-	 *
-	 * I'm unconvinced that it's useful, and concerned it may break things.
-	 *
-	 * _insert_child would need the same thing, probably (assuming
-	 * xmlns->node == NULL)
-	 */
-	purple_xmlnode_set_namespace(node, purple_xmlnode_get_default_namespace(node))
-#endif
 
 	return node;
 }
--- a/pidgin/gtkstyle.h	Thu Dec 28 21:28:09 2017 -0600
+++ b/pidgin/gtkstyle.h	Fri Dec 29 03:57:44 2017 +0000
@@ -1,8 +1,3 @@
-/**
- * @file gtkstyle.h GTK+ Style utility functions
- * @ingroup pidgin
- */
-
 /* pidgin
  *
  * Pidgin is the legal property of its developers, whose names are too numerous
@@ -23,6 +18,14 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
+
+/**
+ * SECTION:gtkstyle
+ * @section_id: pidgin-gtkstyle
+ * @short_description: <filename>gtkstyle.h</filename>
+ * @title: Style API
+ */
+
 #ifndef _PIDGINSTYLE_H_
 #define _PIDGINSTYLE_H_
 
@@ -30,30 +33,27 @@
 
 G_BEGIN_DECLS
 
-/*@{*/
-
 /**
- * Returns TRUE if dark mode is enabled and foreground colours should be invertred
+ * pidgin_style_is_dark:
+ * @style: The GtkStyle in use, or NULL to use a cached version.
  *
- * @param style The GtkStyle in use, or NULL to use a cached version.
+ * Returns whether or not dark mode is enabled.
  *
- * @return @c TRUE if dark mode, @c FALSE otherwise
+ * Returns: TRUE if dark mode is enabled and foreground colours should be invertred
  */
 
 gboolean pidgin_style_is_dark(GtkStyle *style);
 
 /**
- * Lighten a color if dark mode is enabled.
+ * pidgin_style_adjust_contrast:
+ * @style: The GtkStyle in use.
+ * @color: Color to be lightened. Transformed color will be written here.
  *
- * @param style The GtkStyle in use.
- *
- * @param color Color to be lightened. Transformed color will be written here.
+ * Lighten a color if dark mode is enabled.
  */
 
 void pidgin_style_adjust_contrast(GtkStyle *style, GdkColor *color);
 
-/*@}*/
-
 G_END_DECLS
 
 #endif /* _PIDGINSTYLE_H_ */
--- a/pidgin/libpidgin.c	Thu Dec 28 21:28:09 2017 -0600
+++ b/pidgin/libpidgin.c	Fri Dec 29 03:57:44 2017 +0000
@@ -33,6 +33,7 @@
 #include "log.h"
 #include "network.h"
 #include "notify.h"
+#include "options.h"
 #include "prefs.h"
 #include "protocol.h"
 #include "pounce.h"
@@ -375,25 +376,10 @@
 	purple_blist_set_visible(TRUE);
 }
 
-static gboolean debug_colored = FALSE;
-static gboolean debug_enabled = FALSE;
 static gboolean opt_login = FALSE;
 static gchar *opt_login_arg = NULL;
 
 static gboolean
-debug_opt_arg_func(const gchar *option_name, const gchar *value,
-		gpointer data, GError **error)
-{
-	debug_enabled = TRUE;
-
-	if (purple_strequal(value, "colored")) {
-		debug_colored = TRUE;
-	}
-
-	return TRUE;
-}
-
-static gboolean
 login_opt_arg_func(const gchar *option_name, const gchar *value,
 		gpointer data, GError **error)
 {
@@ -408,7 +394,6 @@
 int pidgin_start(int argc, char *argv[])
 {
 	GApplication *app;
-	gboolean opt_force_online = FALSE;
 	gboolean opt_nologin = FALSE;
 	gboolean opt_version = FALSE;
 	gboolean opt_si = TRUE;     /* Check for single instance? */
@@ -441,13 +426,6 @@
 		{"config", 'c', 0,
 			G_OPTION_ARG_FILENAME, &opt_config_dir_arg,
 			_("use DIR for config files"), _("DIR")},
-		{"debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
-			G_OPTION_ARG_CALLBACK, &debug_opt_arg_func,
-			_("print debugging messages to stdout"),
-			_("[colored]")},
-		{"force-online", 'f', 0,
-			G_OPTION_ARG_NONE, &opt_force_online,
-			_("force online, regardless of network status"), NULL},
 		{"login", 'l', G_OPTION_FLAG_OPTIONAL_ARG,
 			G_OPTION_ARG_CALLBACK, &login_opt_arg_func,
 			_("enable specified account(s) (optional argument NAME\n"
@@ -468,11 +446,8 @@
 		{NULL}
 	};
 
-	debug_colored = FALSE;
 #ifdef DEBUG
-	debug_enabled = TRUE;
-#else
-	debug_enabled = FALSE;
+	purple_debug_set_enabled(TRUE);
 #endif
 
 #ifdef ENABLE_NLS
@@ -594,6 +569,8 @@
 	g_free(summary);
 
 	g_option_context_add_main_entries(context, option_entries, PACKAGE);
+	g_option_context_add_group(context, purple_get_option_group());
+	g_option_context_add_group(context, gplugin_get_option_group());
 	g_option_context_add_group(context, gtk_get_option_group(TRUE));
 
 #ifdef G_OS_WIN32
@@ -646,11 +623,6 @@
 	 * Fire up this baby.
 	 */
 
-	if (g_getenv("PIDGIN_DEBUG_COLORED") != NULL)
-		debug_colored = TRUE;
-	purple_debug_set_enabled(debug_enabled);
-	purple_debug_set_colored(debug_colored);
-
 	app = G_APPLICATION(gtk_application_new("im.pidgin.Pidgin",
 				G_APPLICATION_NON_UNIQUE));
 
@@ -741,11 +713,6 @@
 	g_free(opt_config_dir_arg);
 	opt_config_dir_arg = NULL;
 
-	/* This needs to be before purple_blist_show() so the
-	 * statusbox gets the forced online status. */
-	if (opt_force_online)
-		purple_network_force_online();
-
 	/*
 	 * We want to show the blist early in the init process so the
 	 * user feels warm and fuzzy (not cold and prickley).
--- a/po/POTFILES.in	Thu Dec 28 21:28:09 2017 -0600
+++ b/po/POTFILES.in	Fri Dec 29 03:57:44 2017 +0000
@@ -54,6 +54,7 @@
 libpurple/mediamanager.c
 libpurple/media/backend-fs2.c
 libpurple/message.c
+libpurple/options.c
 libpurple/plugins.c
 libpurple/plugins/autoaccept.c
 libpurple/plugins/buddynote.c

mercurial