diff --git a/pidgin/gtkroomlist.h b/pidgin/gtkroomlist.h
deleted file mode 100644
--- a/pidgin/gtkroomlist.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* 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
- */
-
-#if !defined(PIDGIN_GLOBAL_HEADER_INSIDE) && !defined(PIDGIN_COMPILATION)
-# error "only <pidgin.h> may be included directly"
-#endif
-
-#ifndef _PIDGINROOMLIST_H_
-#define _PIDGINROOMLIST_H_
-
-#include <purple.h>
-
-#include "pidginversion.h"
-
-G_BEGIN_DECLS
-
-/**
- * pidgin_roomlist_init:
- *
- * Initializes the room list subsystem.
- *
- * Since: 2.0
- */
-PIDGIN_AVAILABLE_IN_ALL
-void pidgin_roomlist_init(void);
-
-/**
- * pidgin_roomlist_is_showable:
- *
- * Determines if showing the room list dialog is a valid action.
- *
- * Returns: TRUE if there are accounts online that support listing
- *         chat rooms.  Otherwise return FALSE.
- *
- * Since: 2.0
- */
-PIDGIN_AVAILABLE_IN_ALL
-gboolean pidgin_roomlist_is_showable(void);
-
-/**
- * pidgin_roomlist_dialog_show:
- *
- * Shows a new roomlist dialog.
- *
- * Since: 2.0
- */
-PIDGIN_AVAILABLE_IN_ALL
-void pidgin_roomlist_dialog_show(void);
-
-/**
- * pidgin_roomlist_dialog_show_with_account:
- * @account: The account to use.
- *
- * Shows a new room list dialog and fetches the list for the specified account.
- *
- * Since: 2.0
- */
-PIDGIN_AVAILABLE_IN_ALL
-void pidgin_roomlist_dialog_show_with_account(PurpleAccount *account);
-
-G_END_DECLS
-
-#endif /* _PIDGINROOMLIST_H_ */
# HG changeset patch
# Node ID 58a16e7ffac7
# Parent  74be08b6ef09
diff --git a/pidgin/gtkroomlist.c b/pidgin/gtkroomlist.c
deleted file mode 100644
--- a/pidgin/gtkroomlist.c
+++ /dev/null
@@ -1,542 +0,0 @@
-/* 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/gi18n-lib.h>
-
-#include <gtk/gtk.h>
-
-#include <purple.h>
-
-#include "gtkroomlist.h"
-
-#include "pidginaccountchooser.h"
-
-#define PIDGIN_TYPE_ROOMLIST_DIALOG (pidgin_roomlist_dialog_get_type())
-G_DECLARE_FINAL_TYPE(PidginRoomlistDialog, pidgin_roomlist_dialog, PIDGIN,
-                     ROOMLIST_DIALOG, GtkDialog)
-
-#define PIDGIN_ROOMLIST_UI_DATA "pidgin-ui"
-
-enum {
-	RESPONSE_STOP = 0,
-	RESPONSE_LIST,
-	RESPONSE_ADD,
-	RESPONSE_JOIN,
-};
-
-struct _PidginRoomlistDialog {
-	GtkDialog parent;
-
-	GtkWidget *account_widget;
-	GtkWidget *progress;
-	GtkWidget *view;
-	GtkSingleSelection *selection;
-	GtkFilterListModel *filter;
-
-	GtkWidget *stop_button;
-	GtkWidget *list_button;
-	GtkWidget *add_button;
-	GtkWidget *join_button;
-	GtkWidget *close_button;
-
-	PurpleAccount *account;
-	PurpleRoomlist *roomlist;
-
-	gboolean pg_needs_pulse;
-	guint pg_update_to;
-};
-
-G_DEFINE_FINAL_TYPE(PidginRoomlistDialog, pidgin_roomlist_dialog,
-                    GTK_TYPE_DIALOG)
-
-typedef struct {
-	PidginRoomlistDialog *dialog;
-	GListStore *model;
-} PidginRoomlist;
-
-/******************************************************************************
- * Helpers
- *****************************************************************************/
-static void
-pidgin_roomlist_close(PidginRoomlistDialog *dialog)
-{
-	if (dialog->roomlist && purple_roomlist_get_in_progress(dialog->roomlist))
-		purple_roomlist_cancel_get_list(dialog->roomlist);
-
-	if (dialog->roomlist) {
-		PidginRoomlist *rl = NULL;
-
-		rl = g_object_get_data(G_OBJECT(dialog->roomlist),
-		                       PIDGIN_ROOMLIST_UI_DATA);
-
-		if (dialog->pg_update_to > 0)
-			/* yes, that's right, unref it twice. */
-			g_object_unref(dialog->roomlist);
-
-		if (rl)
-			rl->dialog = NULL;
-		g_object_unref(dialog->roomlist);
-	}
-
-	g_clear_handle_id(&dialog->pg_update_to, g_source_remove);
-
-	dialog->progress = NULL;
-}
-
-static void
-pidgin_roomlist_start_listing(PidginRoomlistDialog *dialog)
-{
-	PurpleConnection *gc;
-	PidginRoomlist *rl;
-
-	gc = purple_account_get_connection(dialog->account);
-	if (!gc)
-		return;
-
-	if (dialog->roomlist != NULL) {
-		rl = g_object_get_data(G_OBJECT(dialog->roomlist),
-		                       PIDGIN_ROOMLIST_UI_DATA);
-
-		g_clear_object(&rl->model);
-		g_object_unref(dialog->roomlist);
-	}
-
-	dialog->roomlist = purple_roomlist_get_list(gc);
-	if (!dialog->roomlist)
-		return;
-	g_object_ref(dialog->roomlist);
-
-	rl = g_object_get_data(G_OBJECT(dialog->roomlist),
-	                       PIDGIN_ROOMLIST_UI_DATA);
-	rl->dialog = dialog;
-
-	gtk_widget_set_sensitive(dialog->account_widget, FALSE);
-
-	gtk_filter_list_model_set_model(dialog->filter, G_LIST_MODEL(rl->model));
-
-	/* some protocols (not bundled with libpurple) finish getting their
-	 * room list immediately */
-	if(purple_roomlist_get_in_progress(dialog->roomlist)) {
-		gtk_widget_set_sensitive(dialog->stop_button, TRUE);
-		gtk_widget_set_sensitive(dialog->list_button, FALSE);
-	} else {
-		gtk_widget_set_sensitive(dialog->stop_button, FALSE);
-		gtk_widget_set_sensitive(dialog->list_button, TRUE);
-	}
-	gtk_widget_set_sensitive(dialog->add_button, FALSE);
-	gtk_widget_set_sensitive(dialog->join_button, FALSE);
-}
-
-static void
-pidgin_roomlist_stop_listing(PidginRoomlistDialog *dialog)
-{
-	purple_roomlist_cancel_get_list(dialog->roomlist);
-
-	gtk_widget_set_sensitive(dialog->account_widget, TRUE);
-
-	gtk_widget_set_sensitive(dialog->stop_button, FALSE);
-	gtk_widget_set_sensitive(dialog->list_button, TRUE);
-	gtk_widget_set_sensitive(dialog->add_button, FALSE);
-	gtk_widget_set_sensitive(dialog->join_button, FALSE);
-}
-
-static void
-pidgin_roomlist_add_to_blist(PidginRoomlistDialog *dialog)
-{
-	char *name = NULL;
-	PurpleAccount *account = NULL;
-	PurpleConnection *gc = NULL;
-	PurpleProtocol *protocol = NULL;
-	PurpleRoomlistRoom *room = NULL;
-
-	account = purple_roomlist_get_account(dialog->roomlist);
-	gc = purple_account_get_connection(account);
-
-	room = gtk_single_selection_get_selected_item(dialog->selection);
-	g_return_if_fail(PURPLE_IS_ROOMLIST_ROOM(room));
-
-	if(gc != NULL) {
-		protocol = purple_connection_get_protocol(gc);
-	}
-
-	if(protocol != NULL && PURPLE_PROTOCOL_IMPLEMENTS(protocol, ROOMLIST, room_serialize)) {
-		name = purple_protocol_roomlist_room_serialize(PURPLE_PROTOCOL_ROOMLIST(protocol),
-		                                               room);
-	} else {
-		name = g_strdup(purple_roomlist_room_get_name(room));
-	}
-
-	purple_blist_request_add_chat(account, NULL, NULL, name);
-
-	g_free(name);
-}
-
-static void
-pidgin_roomlist_join(PidginRoomlistDialog *dialog)
-{
-	PurpleRoomlistRoom *room = NULL;
-
-	room = gtk_single_selection_get_selected_item(dialog->selection);
-	if(PURPLE_IS_ROOMLIST_ROOM(room)) {
-		purple_roomlist_join_room(dialog->roomlist, room);
-	}
-}
-
-/******************************************************************************
- * Actions
- *****************************************************************************/
-static void
-pidgin_roomlist_add_to_blist_cb(G_GNUC_UNUSED GSimpleAction *action,
-                                G_GNUC_UNUSED GVariant *parameter,
-                                gpointer data)
-{
-	pidgin_roomlist_add_to_blist(data);
-}
-
-
-static void
-pidgin_roomlist_join_cb(G_GNUC_UNUSED GSimpleAction *action,
-                        G_GNUC_UNUSED GVariant *parameter,
-                        gpointer data)
-{
-	pidgin_roomlist_join(data);
-}
-
-static GActionEntry actions[] = {
-	{
-		.name = "add",
-		.activate = pidgin_roomlist_add_to_blist_cb,
-	}, {
-		.name = "join",
-		.activate = pidgin_roomlist_join_cb,
-	},
-};
-
-/******************************************************************************
- * Callbacks
- *****************************************************************************/
-static void
-pidgin_roomlist_response_cb(GtkDialog *gtk_dialog, gint response_id,
-                            G_GNUC_UNUSED gpointer data)
-{
-	PidginRoomlistDialog *dialog = PIDGIN_ROOMLIST_DIALOG(gtk_dialog);
-
-	switch(response_id) {
-	case RESPONSE_STOP:
-		pidgin_roomlist_stop_listing(dialog);
-		break;
-	case RESPONSE_LIST:
-		pidgin_roomlist_start_listing(dialog);
-		break;
-	case RESPONSE_ADD:
-		pidgin_roomlist_add_to_blist(dialog);
-		break;
-	case RESPONSE_JOIN:
-		pidgin_roomlist_join(dialog);
-		break;
-	case GTK_RESPONSE_CLOSE:
-	case GTK_RESPONSE_DELETE_EVENT:
-		gtk_window_destroy(GTK_WINDOW(gtk_dialog));
-		break;
-	}
-}
-
-static gboolean
-close_request_cb(GtkWidget *w, G_GNUC_UNUSED gpointer d)
-{
-	pidgin_roomlist_close(PIDGIN_ROOMLIST_DIALOG(w));
-
-	gtk_window_destroy(GTK_WINDOW(w));
-
-	return TRUE;
-}
-
-static void
-dialog_select_account_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec,
-                         gpointer data)
-{
-	PidginRoomlistDialog *dialog = data;
-	PidginAccountChooser *chooser = PIDGIN_ACCOUNT_CHOOSER(obj);
-	PurpleAccount *account = pidgin_account_chooser_get_selected(chooser);
-	gboolean change = (account != dialog->account);
-	dialog->account = account;
-
-	if (change && dialog->roomlist) {
-		PidginRoomlist *rl = NULL;
-
-		rl = g_object_get_data(G_OBJECT(dialog->roomlist),
-		                       PIDGIN_ROOMLIST_UI_DATA);
-
-		g_clear_object(&rl->model);
-		g_clear_object(&dialog->roomlist);
-	}
-}
-
-static void
-selection_changed_cb(GtkSelectionModel *self, G_GNUC_UNUSED guint position,
-                     G_GNUC_UNUSED guint n_items, gpointer data)
-{
-	PidginRoomlistDialog *dialog = data;
-	guint index = GTK_INVALID_LIST_POSITION;
-	gboolean found = FALSE;
-
-	/* The passed in position and n_items gives the *range* of selections that
-	 * have changed, so just re-query it exactly since GtkSingleSelection has
-	 * only one. */
-	index = gtk_single_selection_get_selected(GTK_SINGLE_SELECTION(self));
-	found = index != GTK_INVALID_LIST_POSITION;
-
-	gtk_widget_set_sensitive(dialog->add_button, found);
-	gtk_widget_set_sensitive(dialog->join_button, found);
-}
-
-static void
-row_activated_cb(GtkColumnView *self, guint position, gpointer data)
-{
-	PidginRoomlistDialog *dialog = data;
-	PurpleRoomlistRoom *room = NULL;
-	GtkSelectionModel *model = NULL;
-
-	model = gtk_column_view_get_model(self);
-	room = g_list_model_get_item(G_LIST_MODEL(model), position);
-
-	if(PURPLE_IS_ROOMLIST_ROOM(room)) {
-		purple_roomlist_join_room(dialog->roomlist, room);
-	}
-
-	g_clear_object(&room);
-}
-
-static gboolean
-account_filter_func(gpointer item, G_GNUC_UNUSED gpointer data) {
-	PurpleProtocol *protocol = NULL;
-
-	if(PURPLE_IS_ACCOUNT(item)) {
-		PurpleAccount *account = PURPLE_ACCOUNT(item);
-		PurpleConnection *conn = purple_account_get_connection(account);
-		if(conn && PURPLE_CONNECTION_IS_CONNECTED(conn)) {
-			protocol = purple_connection_get_protocol(conn);
-		}
-	}
-
-	return (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, ROOMLIST, get_list));
-}
-
-gboolean
-pidgin_roomlist_is_showable(void)
-{
-	GList *c;
-	PurpleConnection *gc;
-
-	for (c = purple_connections_get_all(); c != NULL; c = c->next) {
-		gc = c->data;
-
-		if(account_filter_func(purple_connection_get_account(gc), NULL)) {
-			return TRUE;
-		}
-	}
-
-	return FALSE;
-}
-
-static void
-pidgin_roomlist_dialog_class_init(PidginRoomlistDialogClass *klass)
-{
-	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
-
-	gtk_widget_class_set_template_from_resource(
-	        widget_class, "/im/pidgin/Pidgin3/Roomlist/roomlist.ui");
-
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     account_widget);
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     view);
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     selection);
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     filter);
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     add_button);
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     close_button);
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     join_button);
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     list_button);
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     progress);
-	gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
-	                                     stop_button);
-
-	gtk_widget_class_bind_template_callback(widget_class, close_request_cb);
-	gtk_widget_class_bind_template_callback(widget_class, row_activated_cb);
-	gtk_widget_class_bind_template_callback(widget_class,
-	                                        dialog_select_account_cb);
-	gtk_widget_class_bind_template_callback(widget_class,
-	                                        selection_changed_cb);
-	gtk_widget_class_bind_template_callback(widget_class,
-	                                        pidgin_roomlist_response_cb);
-}
-
-static void
-pidgin_roomlist_dialog_init(PidginRoomlistDialog *self)
-{
-	GSimpleActionGroup *group = NULL;
-	GtkCustomFilter *filter = NULL;
-
-	gtk_widget_init_template(GTK_WIDGET(self));
-
-	filter = gtk_custom_filter_new(account_filter_func, NULL, NULL);
-	pidgin_account_chooser_set_filter(
-	        PIDGIN_ACCOUNT_CHOOSER(self->account_widget),
-	        GTK_FILTER(filter));
-	g_object_unref(filter);
-
-	/* Now setup our actions. */
-	group = g_simple_action_group_new();
-	g_action_map_add_action_entries(G_ACTION_MAP(group), actions,
-	                                G_N_ELEMENTS(actions), self);
-	gtk_widget_insert_action_group(GTK_WIDGET(self), "roomlist",
-	                               G_ACTION_GROUP(group));
-}
-
-static PidginRoomlistDialog *
-pidgin_roomlist_dialog_new_with_account(PurpleAccount *account)
-{
-	PidginRoomlistDialog *dialog = NULL;
-	PidginAccountChooser *chooser = NULL;
-
-	dialog = g_object_new(PIDGIN_TYPE_ROOMLIST_DIALOG, NULL);
-	dialog->account = account;
-
-	chooser = PIDGIN_ACCOUNT_CHOOSER(dialog->account_widget);
-
-	if (!account) {
-		/* This is normally NULL, and we normally don't care what the
-		 * first selected item is */
-		dialog->account = pidgin_account_chooser_get_selected(chooser);
-	} else {
-		pidgin_account_chooser_set_selected(chooser, account);
-	}
-
-	/* show the dialog window and return the dialog */
-	gtk_widget_set_visible(GTK_WIDGET(dialog), TRUE);
-
-	return dialog;
-}
-
-void pidgin_roomlist_dialog_show_with_account(PurpleAccount *account)
-{
-	PidginRoomlistDialog *dialog = pidgin_roomlist_dialog_new_with_account(account);
-
-	pidgin_roomlist_start_listing(dialog);
-}
-
-void pidgin_roomlist_dialog_show(void)
-{
-	pidgin_roomlist_dialog_new_with_account(NULL);
-}
-
-static gboolean pidgin_progress_bar_pulse(gpointer data)
-{
-	PurpleRoomlist *list = data;
-	PidginRoomlist *rl = NULL;
-
-	rl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
-	if (!rl || !rl->dialog || !rl->dialog->pg_needs_pulse) {
-		if (rl && rl->dialog)
-			rl->dialog->pg_update_to = 0;
-		g_object_unref(list);
-		return FALSE;
-	}
-
-	gtk_progress_bar_pulse(GTK_PROGRESS_BAR(rl->dialog->progress));
-	rl->dialog->pg_needs_pulse = FALSE;
-	return TRUE;
-}
-
-static void
-pidgin_roomlist_add_room(PurpleRoomlist *list, PurpleRoomlistRoom *room) {
-	PidginRoomlist *rl = NULL;
-
-	rl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
-
-	if (rl->dialog) {
-		if (rl->dialog->pg_update_to == 0) {
-			g_object_ref(list);
-			rl->dialog->pg_update_to = g_timeout_add(100, pidgin_progress_bar_pulse, list);
-			gtk_progress_bar_pulse(GTK_PROGRESS_BAR(rl->dialog->progress));
-		} else
-			rl->dialog->pg_needs_pulse = TRUE;
-	}
-
-	g_list_store_append(rl->model, room);
-}
-
-static void
-pidgin_roomlist_in_progress(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec,
-                            gpointer data)
-{
-	PurpleRoomlist *list = PURPLE_ROOMLIST(obj);
-	PidginRoomlist *rl = data;
-
-	if (purple_roomlist_get_in_progress(list)) {
-		if (rl->dialog->account_widget) {
-			gtk_widget_set_sensitive(rl->dialog->account_widget, FALSE);
-		}
-		gtk_widget_set_sensitive(rl->dialog->stop_button, TRUE);
-		gtk_widget_set_sensitive(rl->dialog->list_button, FALSE);
-	} else {
-		rl->dialog->pg_needs_pulse = FALSE;
-		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(rl->dialog->progress), 0.0);
-		if (rl->dialog->account_widget) {
-			gtk_widget_set_sensitive(rl->dialog->account_widget, TRUE);
-		}
-		gtk_widget_set_sensitive(rl->dialog->stop_button, FALSE);
-		gtk_widget_set_sensitive(rl->dialog->list_button, TRUE);
-	}
-}
-
-static void
-pidgin_roomlist_new(PurpleRoomlist *list)
-{
-	PidginRoomlist *rl = g_new0(PidginRoomlist, 1);
-
-	g_object_set_data_full(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA, rl,
-	                       (GDestroyNotify)g_free);
-
-	rl->model = g_list_store_new(PURPLE_TYPE_ROOMLIST_ROOM);
-
-	g_signal_connect(list, "notify::in-progress",
-	                 G_CALLBACK(pidgin_roomlist_in_progress), rl);
-}
-
-static PurpleRoomlistUiOps ops = {
-	.show_with_account = pidgin_roomlist_dialog_show_with_account,
-	.create = pidgin_roomlist_new,
-	.add_room = pidgin_roomlist_add_room,
-};
-
-
-void pidgin_roomlist_init(void)
-{
-	purple_roomlist_set_ui_ops(&ops);
-}
diff --git a/pidgin/meson.build b/pidgin/meson.build
--- a/pidgin/meson.build
+++ b/pidgin/meson.build
@@ -6,7 +6,6 @@
 	'gtkmedia.c',
 	'gtknotify.c',
 	'gtkrequest.c',
-	'gtkroomlist.c',
 	'gtkutils.c',
 	'gtkwhiteboard.c',
 	'libpidgin.c',
@@ -60,7 +59,6 @@
 	'gtkmedia.h',
 	'gtknotify.h',
 	'gtkrequest.h',
-	'gtkroomlist.h',
 	'gtkutils.h',
 	'gtkwhiteboard.h',
 	'pidginabout.h',
diff --git a/pidgin/pidginapplication.c b/pidgin/pidginapplication.c
--- a/pidgin/pidginapplication.c
+++ b/pidgin/pidginapplication.c
@@ -33,7 +33,6 @@
 
 #include "pidginapplication.h"
 
-#include "gtkroomlist.h"
 #include "pidginabout.h"
 #include "pidginaccounteditor.h"
 #include "pidginaccountmanager.h"
@@ -221,16 +220,6 @@
 	"join-channel",
 };
 
-/*< private >
- * pidgin_application_room_list_actions:
- *
- * This list keeps track of which actions should only be enabled if an online
- * account supports room lists.
- */
-static const gchar *pidgin_application_room_list_actions[] = {
-	"room-list",
-};
-
 /**
  * pidgin_action_group_actions_set_enable: (skip)
  * @group: The #PidginActionGroup instance.
@@ -494,14 +483,6 @@
 	purple_core_quit();
 }
 
-static void
-pidgin_application_room_list(G_GNUC_UNUSED GSimpleAction *simple,
-                             G_GNUC_UNUSED GVariant *parameter,
-                             G_GNUC_UNUSED gpointer data)
-{
-	pidgin_roomlist_dialog_show();
-}
-
 static GActionEntry app_entries[] = {
 	{
 		.name = "about",
@@ -549,9 +530,6 @@
 	}, {
 		.name = "quit",
 		.activate = pidgin_application_quit,
-	}, {
-		.name = "room-list",
-		.activate = pidgin_application_room_list,
 	}
 };
 
@@ -597,7 +575,6 @@
 	PidginApplication *application = data;
 	PurpleProtocol *protocol = NULL;
 	gboolean should_enable_channel = FALSE;
-	gboolean should_enable_room_list = FALSE;
 	guint n_actions = 0;
 
 	n_actions = G_N_ELEMENTS(pidgin_application_online_actions);
@@ -622,19 +599,6 @@
 		                                       n_actions,
 		                                       TRUE);
 	}
-
-	/* likewise, for the room list, we only care about enabling in this
-	 * handler.
-	 */
-	should_enable_room_list = PURPLE_PROTOCOL_IMPLEMENTS(protocol, ROOMLIST,
-	                                                     get_list);
-	if(should_enable_room_list) {
-		n_actions = G_N_ELEMENTS(pidgin_application_room_list_actions);
-		pidgin_application_actions_set_enabled(application,
-		                                       pidgin_application_room_list_actions,
-		                                       n_actions,
-		                                       TRUE);
-	}
 }
 
 static void
@@ -646,7 +610,6 @@
 	GList *connected = NULL;
 	gboolean should_disable_actions = TRUE;
 	gboolean should_disable_channel = TRUE;
-	gboolean should_disable_room_list = TRUE;
 	guint n_actions = 0;
 
 	connected = purple_account_manager_get_connected(manager);
@@ -667,13 +630,8 @@
 			should_disable_channel = FALSE;
 		}
 
-		/* Check if the protocol implements the room list interface. */
-		if(PURPLE_PROTOCOL_IMPLEMENTS(protocol, ROOMLIST, get_list)) {
-			should_disable_room_list = FALSE;
-		}
-
 		/* If we can't disable anything we can exit the loop early. */
-		if(!should_disable_channel && !should_disable_room_list) {
+		if(!should_disable_channel) {
 			g_clear_list(&connected, NULL);
 
 			break;
@@ -697,14 +655,6 @@
 		                                       n_actions,
 		                                       FALSE);
 	}
-
-	if(should_disable_room_list) {
-		n_actions = G_N_ELEMENTS(pidgin_application_room_list_actions);
-		pidgin_application_actions_set_enabled(application,
-		                                       pidgin_application_room_list_actions,
-		                                       n_actions,
-		                                       FALSE);
-	}
 }
 
 static void
@@ -949,12 +899,6 @@
 	                                       pidgin_application_channel_actions,
 	                                       n_actions,
 	                                       online);
-
-	n_actions = G_N_ELEMENTS(pidgin_application_room_list_actions);
-	pidgin_application_actions_set_enabled(application,
-	                                       pidgin_application_room_list_actions,
-	                                       n_actions,
-	                                       online);
 }
 
 static void
diff --git a/pidgin/pidginui.c b/pidgin/pidginui.c
--- a/pidgin/pidginui.c
+++ b/pidgin/pidginui.c
@@ -32,7 +32,6 @@
 
 #include "gtkmedia.h"
 #include "gtknotify.h"
-#include "gtkroomlist.h"
 #include "gtkrequest.h"
 #include "gtkwhiteboard.h"
 #include "pidgincore.h"
@@ -131,7 +130,6 @@
 
 	pidgin_request_init();
 	pidgin_commands_init();
-	pidgin_roomlist_init();
 	pidgin_medias_init();
 	pidgin_notify_init();
 
diff --git a/pidgin/resources/Roomlist/roomlist.ui b/pidgin/resources/Roomlist/roomlist.ui
deleted file mode 100644
--- a/pidgin/resources/Roomlist/roomlist.ui
+++ /dev/null
@@ -1,212 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Pidgin - Internet Messenger
-Copyright (C) Pidgin Developers <devel@pidgin.im>
-
-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 library; if not, see <https://www.gnu.org/licenses/>.
--->
-<interface>
-  <requires lib="gtk" version="4.0"/>
-  <requires lib="pidgin" version="3.0"/>
-  <!-- interface-license-type gplv2 -->
-  <!-- interface-name Pidgin -->
-  <!-- interface-description Internet Messenger -->
-  <!-- interface-copyright Pidgin Developers <devel@pidgin.im> -->
-  <template class="PidginRoomlistDialog" parent="GtkDialog">
-    <property name="title" translatable="1">Room List</property>
-    <signal name="close-request" handler="close_request_cb" swapped="no"/>
-    <signal name="response" handler="pidgin_roomlist_response_cb" swapped="no"/>
-    <child internal-child="content_area">
-      <object class="GtkBox">
-        <property name="orientation">vertical</property>
-        <property name="spacing">12</property>
-        <child>
-          <object class="GtkBox">
-            <property name="spacing">5</property>
-            <child>
-              <object class="GtkLabel" id="label1">
-                <property name="halign">start</property>
-                <property name="label" translatable="1">_Account:</property>
-                <property name="use-underline">1</property>
-                <property name="mnemonic-widget">account_widget</property>
-              </object>
-            </child>
-            <child>
-              <object class="PidginAccountChooser" id="account_widget">
-                <property name="hexpand">1</property>
-                <property name="can-focus">1</property>
-                <signal name="notify::account" handler="dialog_select_account_cb" swapped="no"/>
-                <accessibility>
-                  <relation name="labelled-by">label1</relation>
-                </accessibility>
-              </object>
-            </child>
-          </object>
-        </child>
-        <child>
-          <object class="GtkScrolledWindow" id="sw">
-            <property name="vexpand">1</property>
-            <property name="focusable">1</property>
-            <property name="min-content-height">250</property>
-            <property name="child">
-              <object class="GtkColumnView" id="view">
-                <property name="focusable">1</property>
-                <property name="model">
-                  <object class="GtkSingleSelection" id="selection">
-                    <property name="model">
-                      <object class="GtkFilterListModel" id="filter">
-                        <property name="filter">
-                          <object class="GtkStringFilter">
-                            <property name="expression">
-                              <lookup name="name" type="PurpleRoomlistRoom"></lookup>
-                            </property>
-                            <binding name="search">
-                              <lookup name="text">search-entry</lookup>
-                            </binding>
-                          </object>
-                        </property>
-                      </object>
-                    </property>
-                    <signal name="selection-changed" handler="selection_changed_cb" swapped="no"/>
-                  </object>
-                </property>
-                <signal name="activate" handler="row_activated_cb" swapped="no"/>
-                <child>
-                  <object class="GtkColumnViewColumn">
-                    <property name="title" translatable="1">Name</property>
-                    <property name="factory">
-                      <object class="GtkBuilderListItemFactory">
-                        <property name="bytes">
-<![CDATA[
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
-  <template class="GtkListItem">
-    <property name="child">
-      <object class="GtkLabel">
-        <property name="xalign">0</property>
-        <binding name="label">
-          <lookup name="name" type="PurpleRoomlistRoom">
-            <lookup name="item">GtkListItem</lookup>
-          </lookup>
-        </binding>
-      </object>
-    </property>
-  </template>
-</interface>
-]]>
-                        </property>
-                      </object>
-                    </property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkColumnViewColumn">
-                    <property name="expand">1</property>
-                    <property name="title" translatable="1">Description</property>
-                    <property name="factory">
-                      <object class="GtkBuilderListItemFactory">
-                        <property name="bytes">
-<![CDATA[
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
-  <template class="GtkListItem">
-    <property name="child">
-      <object class="GtkLabel">
-        <property name="xalign">0</property>
-        <binding name="label">
-          <lookup name="description" type="PurpleRoomlistRoom">
-            <lookup name="item">GtkListItem</lookup>
-          </lookup>
-        </binding>
-      </object>
-    </property>
-  </template>
-</interface>
-]]>
-                        </property>
-                      </object>
-                    </property>
-                  </object>
-                </child>
-              </object>
-            </property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkSearchBar">
-            <property name="key-capture-widget">PidginRoomlistDialog</property>
-            <property name="child">
-              <object class="GtkSearchEntry" id="search-entry">
-              </object>
-            </property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkProgressBar" id="progress">
-          </object>
-        </child>
-      </object>
-    </child>
-    <child type="action">
-      <object class="GtkButton" id="stop_button">
-        <property name="label">_Stop</property>
-        <property name="sensitive">0</property>
-        <property name="focusable">1</property>
-        <property name="receives-default">1</property>
-        <property name="use-underline">1</property>
-      </object>
-    </child>
-    <child type="action">
-      <object class="GtkButton" id="list_button">
-        <property name="label" translatable="1">_Get List</property>
-        <property name="focusable">1</property>
-        <property name="receives-default">1</property>
-        <property name="use-underline">1</property>
-      </object>
-    </child>
-    <child type="action">
-      <object class="GtkButton" id="add_button">
-        <property name="label" translatable="1">_Add Chat</property>
-        <property name="sensitive">0</property>
-        <property name="focusable">1</property>
-        <property name="receives-default">1</property>
-        <property name="use-underline">1</property>
-      </object>
-    </child>
-    <child type="action">
-      <object class="GtkButton" id="join_button">
-        <property name="label" translatable="1">_Join</property>
-        <property name="sensitive">0</property>
-        <property name="focusable">1</property>
-        <property name="receives-default">1</property>
-        <property name="use-underline">1</property>
-      </object>
-    </child>
-    <child type="action">
-      <object class="GtkButton" id="close_button">
-        <property name="label">_Close</property>
-        <property name="focusable">1</property>
-        <property name="receives-default">1</property>
-        <property name="use-underline">1</property>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="0">stop_button</action-widget>
-      <action-widget response="1">list_button</action-widget>
-      <action-widget response="2">add_button</action-widget>
-      <action-widget response="3">join_button</action-widget>
-      <action-widget response="close">close_button</action-widget>
-    </action-widgets>
-  </template>
-</interface>
diff --git a/pidgin/resources/gtk/menus.ui b/pidgin/resources/gtk/menus.ui
--- a/pidgin/resources/gtk/menus.ui
+++ b/pidgin/resources/gtk/menus.ui
@@ -72,10 +72,6 @@
           <attribute name="label" translatable="yes">_File Transfers</attribute>
           <attribute name="action">app.file-transfers</attribute>
         </item>
-        <item>
-          <attribute name="label" translatable="yes">R_oom List</attribute>
-          <attribute name="action">app.room-list</attribute>
-        </item>
       </section>
 
       <section>
diff --git a/pidgin/resources/pidgin.gresource.xml b/pidgin/resources/pidgin.gresource.xml
--- a/pidgin/resources/pidgin.gresource.xml
+++ b/pidgin/resources/pidgin.gresource.xml
@@ -29,7 +29,6 @@
     <file compressed="true" preprocess="xml-stripblanks">Prefs/vv.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">Protocols/chooser.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">Protocols/detailed-view.ui</file>
-    <file compressed="true" preprocess="xml-stripblanks">Roomlist/roomlist.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">Whiteboard/whiteboard.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">gtk/menus.ui</file>
diff --git a/po/POTFILES.in b/po/POTFILES.in
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -116,7 +116,6 @@
 pidgin/gtkmedia.c
 pidgin/gtknotify.c
 pidgin/gtkrequest.c
-pidgin/gtkroomlist.c
 pidgin/gtkutils.c
 pidgin/gtkwhiteboard.c
 pidgin/libpidgin.c
@@ -183,7 +182,6 @@
 pidgin/resources/Prefs/vv.ui
 pidgin/resources/Protocols/chooser.ui
 pidgin/resources/Protocols/detailed-view.ui
-pidgin/resources/Roomlist/roomlist.ui
 pidgin/resources/Whiteboard/whiteboard.ui
 pidgin/resources/gtk/menus.ui
 pidgin/resources/account-row.ui
