changeset 22016:aba0620b1a37

merge of '534709237b5a9cb6acf039eba7344401c9cf8ac4' and '80c543d5fbf1744fcd9a55288b6161233a4ed596'
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sun, 06 Jan 2008 19:02:57 +0000
parents 1278280fa0b6 (diff) 72f90ea7ae34 (current diff)
children 97d530d11cc0 d65fd48a3ad9 b0ed2ce8514d
files ChangeLog
diffstat 11 files changed, 607 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Jan 05 18:41:33 2008 +0000
+++ b/ChangeLog	Sun Jan 06 19:02:57 2008 +0000
@@ -26,6 +26,11 @@
 	* The default keybinding for dump-screen is now M-D and uses a file
 	  request dialog. M-d will properly delete-forward-word, and M-f has been
 	  fixed to imitate readline's behavior.
+	* New bindings alt+tab and alt+shift+tab to help navigating between the
+	  higlighted windows (details on the man-page).
+	* Recently signed on (or off) buddies blink in the buddy list.
+	* New action 'Room List' in the action-list can be used to get the list of
+	  available chat rooms for an online account.
 
 version 2.3.1 (12/7/2007):
 	http://developer.pidgin.im/query?status=closed&milestone=2.3.1
--- a/ChangeLog.API	Sat Jan 05 18:41:33 2008 +0000
+++ b/ChangeLog.API	Sun Jan 06 19:02:57 2008 +0000
@@ -9,6 +9,15 @@
 		  purple_micro_version variables are exported by version.h,
 		  giving the version of libpurple in use at runtime.
 		* purple_util_set_current_song, purple_util_format_song_info
+		* Some accessor functions to the Roomlist API:
+			* purple_roomlist_get_fields
+			* purple_roomlist_room_get_type
+			* purple_roomlist_room_get_name
+			* purple_roomlist_room_get_parent
+			* purple_roomlist_room_get_fields
+			* purple_roomlist_field_get_type
+			* purple_roomlist_field_get_label
+			* purple_roomlist_field_get_hidden
 
 	Pidgin:
 		Added:
@@ -32,6 +41,10 @@
 		* PIDGIN_DIALOG
 
 	Finch:
+		* finch_roomlist_get_ui_ops and finch_roomlist_show_all
+		* finch_request_field_get_widget to get the widget for a request
+		  field.
+
 		libgnt:
 		* Added gnt_tree_set_row_color to set the color for a row in a tree.
 		* Added gnt_style_get_string_list
--- a/finch/Makefile.am	Sat Jan 05 18:41:33 2008 +0000
+++ b/finch/Makefile.am	Sun Jan 06 19:02:57 2008 +0000
@@ -30,6 +30,7 @@
 	gntpounce.c \
 	gntprefs.c \
 	gntrequest.c \
+	gntroomlist.c \
 	gntsound.c \
 	gntstatus.c \
 	gntui.c
@@ -49,6 +50,7 @@
 	gntpounce.h \
 	gntprefs.h \
 	gntrequest.h \
+	gntroomlist.h \
 	gntsound.h \
 	gntstatus.h \
 	gntui.h
--- a/finch/gntrequest.c	Sat Jan 05 18:41:33 2008 +0000
+++ b/finch/gntrequest.c	Sun Jan 06 19:02:57 2008 +0000
@@ -36,6 +36,7 @@
 
 #include "finch.h"
 #include "gntrequest.h"
+#include "debug.h"
 #include "util.h"
 
 typedef struct
@@ -824,3 +825,32 @@
 	}
 }
 
+GntWidget *finch_request_field_get_widget(PurpleRequestField *field)
+{
+	GntWidget *ret = NULL;
+	switch (purple_request_field_get_type(field)) {
+		case PURPLE_REQUEST_FIELD_BOOLEAN:
+			ret = create_boolean_field(field);
+			break;
+		case PURPLE_REQUEST_FIELD_STRING:
+			ret = create_string_field(field, NULL);
+			break;
+		case PURPLE_REQUEST_FIELD_INTEGER:
+			ret = create_integer_field(field);
+			break;
+		case PURPLE_REQUEST_FIELD_CHOICE:
+			ret = create_choice_field(field);
+			break;
+		case PURPLE_REQUEST_FIELD_LIST:
+			ret = create_list_field(field);
+			break;
+		case PURPLE_REQUEST_FIELD_ACCOUNT:
+			ret = create_account_field(field);
+			break;
+		default:
+			purple_debug_error("GntRequest", "Unimplemented request-field %d\n", purple_request_field_get_type(field));
+			break;
+	}
+	return ret;
+}
+
--- a/finch/gntrequest.h	Sat Jan 05 18:41:33 2008 +0000
+++ b/finch/gntrequest.h	Sun Jan 06 19:02:57 2008 +0000
@@ -27,6 +27,7 @@
 #define _GNT_REQUEST_H
 
 #include "request.h"
+#include "gnt.h"
 
 /**********************************************************************
  * @name GNT Request API
@@ -56,6 +57,15 @@
  */
 void finch_request_save_in_prefs(gpointer null, PurpleRequestFields *fields);
 
+/**
+ * Create a widget field for a request-field.
+ *
+ * @param field   The request field.
+ *
+ * @return A GntWidget for the request field.
+ * @since 2.4.0
+ */
+GntWidget *finch_request_field_get_widget(PurpleRequestField *field);
 /*@}*/
 
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/finch/gntroomlist.c	Sun Jan 06 19:02:57 2008 +0000
@@ -0,0 +1,375 @@
+/**
+ * @file gntroomlist.c GNT Room List API
+ * @ingroup finch
+ */
+
+/* finch
+ *
+ * Finch 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 "gntrequest.h"
+#include "gntroomlist.h"
+
+#include "gntbox.h"
+#include "gntbutton.h"
+#include "gntcombobox.h"
+#include "gnttextview.h"
+#include "gnttree.h"
+#include "gntwindow.h"
+
+#include "debug.h"
+
+/* Yes, just one roomlist at a time. Let's not get greedy. Aight? */
+struct _FinchRoomlist
+{
+	GntWidget *window;
+
+	GntWidget *accounts;
+	GntWidget *tree;
+	GntWidget *details;
+
+	GntWidget *getlist;
+	GntWidget *add;
+	GntWidget *join;
+	GntWidget *stop;
+	GntWidget *close;
+
+	PurpleAccount *account;
+	PurpleRoomlist *roomlist;
+} froomlist;
+
+typedef struct _FinchRoomlist FinchRoomlist;
+
+static void
+unset_roomlist(gpointer null)
+{
+	froomlist.window = NULL;
+	if (froomlist.roomlist)
+		purple_roomlist_unref(froomlist.roomlist);
+}
+
+static void
+update_roomlist(PurpleRoomlist *list)
+{
+	if (froomlist.roomlist == list)
+		return;
+
+	if (froomlist.roomlist)
+		purple_roomlist_unref(froomlist.roomlist);
+
+	if ((froomlist.roomlist = list) != NULL)
+		purple_roomlist_ref(list);
+}
+
+static void fl_stop(GntWidget *button, gpointer null)
+{
+	if (froomlist.roomlist &&
+			purple_roomlist_get_in_progress(froomlist.roomlist))
+		purple_roomlist_cancel_get_list(froomlist.roomlist);
+}
+
+static void fl_get_list(GntWidget *button, gpointer null)
+{
+	PurpleAccount *account = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(froomlist.accounts));
+	PurpleConnection *gc = purple_account_get_connection(account);
+
+	if (!gc)
+		return;
+
+	froomlist.roomlist = purple_roomlist_get_list(gc);
+	gnt_box_give_focus_to_child(GNT_BOX(froomlist.window), froomlist.tree);
+}
+
+static void fl_add_chat(GntWidget *button, gpointer null)
+{
+	char *name;
+	PurpleRoomlistRoom *room = gnt_tree_get_selection_data(GNT_TREE(froomlist.tree));
+	PurpleConnection *gc = purple_account_get_connection(froomlist.account);
+	PurplePluginProtocolInfo *prpl_info = NULL;
+
+	if (gc == NULL || room == NULL)
+		return;
+
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+
+	if(prpl_info != NULL && prpl_info->roomlist_room_serialize)
+		name = prpl_info->roomlist_room_serialize(room);
+	else
+		name = g_strdup(purple_roomlist_room_get_name(room));
+
+	purple_blist_request_add_chat(froomlist.account, NULL, NULL, name);
+
+	g_free(name);
+}
+
+static void fl_close(GntWidget *button, gpointer null)
+{
+	gnt_widget_destroy(froomlist.window);
+}
+
+static void
+roomlist_activated(GntWidget *widget)
+{
+	PurpleRoomlistRoom *room = gnt_tree_get_selection_data(GNT_TREE(widget));
+	if (!room)
+		return;
+
+	switch (purple_roomlist_room_get_type(room)) {
+		case PURPLE_ROOMLIST_ROOMTYPE_ROOM:
+			purple_roomlist_room_join(froomlist.roomlist, room);
+			break;
+		case PURPLE_ROOMLIST_ROOMTYPE_CATEGORY:
+			purple_roomlist_expand_category(froomlist.roomlist, room);
+			break;
+	}
+}
+
+static void
+roomlist_selection_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null)
+{
+	GList *iter, *field;
+	PurpleRoomlistRoom *room = current;
+	GntTextView *tv = GNT_TEXT_VIEW(froomlist.details);
+	gboolean first = TRUE;
+
+	gnt_text_view_clear(tv);
+
+	if (!room)
+		return;
+
+	for (iter = purple_roomlist_room_get_fields(room),
+			field = purple_roomlist_get_fields(froomlist.roomlist);
+			iter && field;
+			iter = iter->next, field = field->next) {
+		PurpleRoomlistField *f = field->data;
+		char *label = NULL;
+
+		if (purple_roomlist_field_get_hidden(f)) {
+			continue;
+		}
+
+		if (!first)
+			gnt_text_view_append_text_with_flags(tv, "\n", GNT_TEXT_FLAG_NORMAL);
+
+		gnt_text_view_append_text_with_flags(tv,
+				purple_roomlist_field_get_label(f), GNT_TEXT_FLAG_BOLD);
+		gnt_text_view_append_text_with_flags(tv, ": ", GNT_TEXT_FLAG_BOLD);
+
+		switch (purple_roomlist_field_get_type(f)) {
+			case PURPLE_ROOMLIST_FIELD_BOOL:
+				label = g_strdup(iter->data ? "True" : "False");
+				break;
+			case PURPLE_ROOMLIST_FIELD_INT:
+				label = g_strdup_printf("%d", (int)iter->data);
+				break;
+			case PURPLE_ROOMLIST_FIELD_STRING:
+				label = g_strdup(iter->data);
+				break;
+		}
+		gnt_text_view_append_text_with_flags(tv, label, GNT_TEXT_FLAG_NORMAL);
+		g_free(label);
+		first = FALSE;
+	}
+
+	if (purple_roomlist_room_get_type(room) == PURPLE_ROOMLIST_ROOMTYPE_CATEGORY) {
+		gnt_text_view_append_text_with_flags(tv,
+				_("\nHit 'Enter' to find more rooms of this category."),
+				GNT_TEXT_FLAG_NORMAL);
+	}
+}
+
+static void
+roomlist_account_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null)
+{
+	if (froomlist.account == current) {
+		return;
+	}
+
+	froomlist.account = current;
+	if (froomlist.roomlist) {
+		if (purple_roomlist_get_in_progress(froomlist.roomlist))
+			purple_roomlist_cancel_get_list(froomlist.roomlist);
+		update_roomlist(NULL);
+	}
+
+	gnt_tree_remove_all(GNT_TREE(froomlist.tree));
+	gnt_widget_draw(froomlist.tree);
+}
+
+static void
+reset_account_list(PurpleAccount *account)
+{
+	GList *list;
+	GntComboBox *accounts = GNT_COMBO_BOX(froomlist.accounts);
+	gnt_combo_box_remove_all(accounts);
+	for (list = purple_connections_get_all(); list; list = list->next) {
+		PurplePluginProtocolInfo *prpl_info = NULL;
+		PurpleConnection *gc = list->data;
+
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+		if (prpl_info->roomlist_get_list != NULL) {
+			PurpleAccount *account = purple_connection_get_account(gc);
+			char *text = g_strdup_printf("%s (%s)",
+					purple_account_get_username(account),
+					purple_account_get_protocol_name(account));
+			gnt_combo_box_add_data(accounts, account, text);
+			g_free(text);
+		}
+	}
+}
+
+static void
+setup_roomlist(PurpleAccount *account)
+{
+	GntWidget *window, *tree, *hbox, *accounts;
+	int iter;
+	struct {
+		const char *label;
+		GCallback callback;
+		GntWidget **widget;
+	} buttons[] = {
+		{_("Stop"), G_CALLBACK(fl_stop), &froomlist.stop},
+		{_("Get"), G_CALLBACK(fl_get_list), &froomlist.getlist},
+		{_("Add"), G_CALLBACK(fl_add_chat), &froomlist.add},
+		{_("Close"), G_CALLBACK(fl_close), &froomlist.close},
+		{NULL, NULL, NULL}
+	};
+
+	if (froomlist.window)
+		return;
+
+	froomlist.window = window = gnt_window_new();
+	g_object_set(G_OBJECT(window), "vertical", TRUE, NULL);
+	gnt_box_set_pad(GNT_BOX(window), 0);
+	gnt_box_set_title(GNT_BOX(window), _("Room List"));
+	gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID);
+
+	froomlist.accounts = accounts = gnt_combo_box_new();
+	reset_account_list(account);
+	gnt_box_add_widget(GNT_BOX(window), froomlist.accounts);
+	g_signal_connect(G_OBJECT(froomlist.accounts), "selection-changed",
+			G_CALLBACK(roomlist_account_changed), NULL);
+	froomlist.account = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(froomlist.accounts));
+
+	froomlist.tree = tree = gnt_tree_new_with_columns(2);
+	gnt_tree_set_show_title(GNT_TREE(tree), TRUE);
+	g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(roomlist_activated), NULL);
+	gnt_tree_set_column_titles(GNT_TREE(tree), _("Name"), "");
+	gnt_tree_set_show_separator(GNT_TREE(tree), FALSE);
+	gnt_tree_set_col_width(GNT_TREE(tree), 1, 1);
+	gnt_tree_set_column_resizable(GNT_TREE(tree), 1, FALSE);
+	gnt_tree_set_search_column(GNT_TREE(tree), 0);
+
+	gnt_box_add_widget(GNT_BOX(window), tree);
+
+	froomlist.details = gnt_text_view_new();
+	gnt_text_view_set_flag(GNT_TEXT_VIEW(froomlist.details), GNT_TEXT_VIEW_TOP_ALIGN);
+	gnt_box_add_widget(GNT_BOX(window), froomlist.details);
+	gnt_widget_set_size(froomlist.details, -1, 10);
+
+	hbox = gnt_hbox_new(FALSE);
+	gnt_box_add_widget(GNT_BOX(window), hbox);
+
+	for (iter = 0; buttons[iter].label; iter++) {
+		GntWidget *button = gnt_button_new(buttons[iter].label);
+		gnt_box_add_widget(GNT_BOX(hbox), button);
+		g_signal_connect(G_OBJECT(button), "activate", buttons[iter].callback, NULL);
+		*buttons[iter].widget = button;
+		gnt_text_view_attach_scroll_widget(GNT_TEXT_VIEW(froomlist.details), button);
+	}
+
+	g_signal_connect(G_OBJECT(tree), "selection-changed", G_CALLBACK(roomlist_selection_changed), NULL);
+
+	g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(unset_roomlist), NULL);
+}
+
+static void
+fl_show_with_account(PurpleAccount *account)
+{
+	setup_roomlist(account);
+	gnt_window_present(froomlist.window);
+}
+
+static void
+fl_create(PurpleRoomlist *list)
+{
+	list->ui_data = &froomlist;
+	setup_roomlist(NULL);
+	update_roomlist(list);
+}
+
+static void
+fl_set_fields(PurpleRoomlist *list, GList *fields)
+{
+}
+
+static void
+fl_add_room(PurpleRoomlist *roomlist, PurpleRoomlistRoom *room)
+{
+	if (froomlist.roomlist != roomlist)
+		return;
+
+	gnt_tree_remove(GNT_TREE(froomlist.tree), room);
+	gnt_tree_add_row_after(GNT_TREE(froomlist.tree), room,
+			gnt_tree_create_row(GNT_TREE(froomlist.tree),
+				purple_roomlist_room_get_name(room),
+				purple_roomlist_room_get_type(room) == PURPLE_ROOMLIST_ROOMTYPE_CATEGORY ? "<" : ""),
+			purple_roomlist_room_get_parent(room), NULL);
+}
+
+static void
+fl_destroy(PurpleRoomlist *list)
+{
+	if (!froomlist.window)
+		return;
+
+	if (froomlist.roomlist == list) {
+		froomlist.roomlist = NULL;
+		gnt_tree_remove_all(GNT_TREE(froomlist.tree));
+		gnt_widget_destroy(froomlist.tree);
+	}
+}
+
+static PurpleRoomlistUiOps ui_ops =
+{
+	fl_show_with_account, /* void (*show_with_account)(PurpleAccount *account); **< Force the ui to pop up a dialog and get the list */
+	fl_create, /* void (*create)(PurpleRoomlist *list); **< A new list was created. */
+	fl_set_fields, /* void (*set_fields)(PurpleRoomlist *list, GList *fields); **< Sets the columns. */
+	fl_add_room, /* void (*add_room)(PurpleRoomlist *list, PurpleRoomlistRoom *room); **< Add a room to the list. */
+	NULL, /* void (*in_progress)(PurpleRoomlist *list, gboolean flag); **< Are we fetching stuff still? */
+	fl_destroy, /* void (*destroy)(PurpleRoomlist *list); **< We're destroying list. */
+
+	NULL, /* void (*_purple_reserved1)(void); */
+	NULL, /* void (*_purple_reserved2)(void); */
+	NULL, /* void (*_purple_reserved3)(void); */
+	NULL /* void (*_purple_reserved4)(void); */
+};
+PurpleRoomlistUiOps *finch_roomlist_get_ui_ops(void)
+{
+	return &ui_ops;
+}
+
+void finch_roomlist_show_all(void)
+{
+	purple_roomlist_show_with_account(NULL);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/finch/gntroomlist.h	Sun Jan 06 19:02:57 2008 +0000
@@ -0,0 +1,51 @@
+/**
+ * @file gntroomlist.h GNT Room List API
+ * @ingroup finch
+ */
+
+/* finch
+ *
+ * Finch 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 _GNT_ROOMLIST_H
+#define _GNT_ROOMLIST_H
+
+#include "roomlist.h"
+
+/**********************************************************************
+ * @name GNT Room List API
+ **********************************************************************/
+/*@{*/
+
+/**
+ * Get the ui-functions.
+ *
+ * @return The PurpleRoomlistUiOps structure populated with the appropriate functions.
+ */
+PurpleRoomlistUiOps *finch_roomlist_get_ui_ops(void);
+
+/**
+ * Show the roomlist dialog.
+ */
+void finch_roomlist_show_all(void);
+
+/*@}*/
+
+#endif
+
--- a/finch/gntui.c	Sat Jan 05 18:41:33 2008 +0000
+++ b/finch/gntui.c	Sun Jan 06 19:02:57 2008 +0000
@@ -35,6 +35,7 @@
 #include "gntpounce.h"
 #include "gntprefs.h"
 #include "gntrequest.h"
+#include "gntroomlist.h"
 #include "gntstatus.h"
 #include "gntsound.h"
 
@@ -71,14 +72,20 @@
 	finch_notify_init();
 	purple_notify_set_ui_ops(finch_notify_get_ui_ops());
 
+	/* Request */
 	finch_request_init();
 	purple_request_set_ui_ops(finch_request_get_ui_ops());
 
+	/* Pounce */
 	finch_pounces_init();
 
+	/* File transfer */
 	finch_xfers_init();
 	purple_xfers_set_ui_ops(finch_xfers_get_ui_ops());
 
+	/* Roomlist */
+	purple_roomlist_set_ui_ops(finch_roomlist_get_ui_ops());
+
 	gnt_register_action(_("Accounts"), finch_accounts_show_all);
 	gnt_register_action(_("Buddy List"), finch_blist_show);
 	gnt_register_action(_("Buddy Pounces"), finch_pounces_manager_show);
@@ -86,6 +93,7 @@
 	gnt_register_action(_("Debug Window"), finch_debug_window_show);
 	gnt_register_action(_("File Transfers"), finch_xfer_dialog_show);
 	gnt_register_action(_("Plugins"), finch_plugins_show_all);
+	gnt_register_action(_("Room List"), finch_roomlist_show_all);
 	gnt_register_action(_("Sounds"), finch_sounds_show_all);
 	gnt_register_action(_("Preferences"), finch_prefs_show_all);
 	gnt_register_action(_("Statuses"), finch_savedstatus_show_all);
--- a/libpurple/roomlist.c	Sat Jan 05 18:41:33 2008 +0000
+++ b/libpurple/roomlist.c	Sun Jan 06 19:02:57 2008 +0000
@@ -218,6 +218,11 @@
 		prpl_info->roomlist_expand_category(list, category);
 }
 
+GList * purple_roomlist_get_fields(PurpleRoomlist *list)
+{
+	return list->fields;
+}
+
 /*@}*/
 
 /**************************************************************************/
@@ -293,6 +298,26 @@
 	g_hash_table_destroy(components);
 }
 
+PurpleRoomlistRoomType purple_roomlist_room_get_type(PurpleRoomlistRoom *room)
+{
+	return room->type;
+}
+
+const char * purple_roomlist_room_get_name(PurpleRoomlistRoom *room)
+{
+	return room->name;
+}
+
+PurpleRoomlistRoom * purple_roomlist_room_get_parent(PurpleRoomlistRoom *room)
+{
+	return room->parent;
+}
+
+GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom *room)
+{
+	return room->fields;
+}
+
 /*@}*/
 
 /**************************************************************************/
@@ -319,6 +344,21 @@
 	return f;
 }
 
+PurpleRoomlistFieldType purple_roomlist_field_get_type(PurpleRoomlistField *field)
+{
+	return field->type;
+}
+
+const char * purple_roomlist_field_get_label(PurpleRoomlistField *field)
+{
+	return field->label;
+}
+
+gboolean purple_roomlist_field_get_hidden(PurpleRoomlistField *field)
+{
+	return field->hidden;
+}
+
 /*@}*/
 
 /**************************************************************************/
--- a/libpurple/roomlist.h	Sat Jan 05 18:41:33 2008 +0000
+++ b/libpurple/roomlist.h	Sun Jan 06 19:02:57 2008 +0000
@@ -237,6 +237,15 @@
  */
 void purple_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category);
 
+/**
+ * Get the list of fields for a roomlist.
+ *
+ * @param roomlist  The roomlist, which must not be @c NULL.
+ * @constreturn A list of fields
+ * @since 2.4.0
+ */
+GList * purple_roomlist_get_fields(PurpleRoomlist *roomlist);
+
 /*@}*/
 
 /**************************************************************************/
@@ -273,6 +282,39 @@
  */
 void purple_roomlist_room_join(PurpleRoomlist *list, PurpleRoomlistRoom *room);
 
+/**
+ * Get the type of a room.
+ * @param room  The room, which must not be @c NULL.
+ * @return The type of the room.
+ * @since 2.4.0
+ */
+PurpleRoomlistRoomType purple_roomlist_room_get_type(PurpleRoomlistRoom *room);
+
+/**
+ * Get the name of a room.
+ * @param room  The room, which must not be @c NULL.
+ * @return The name of the room.
+ * @since 2.4.0
+ */
+const char * purple_roomlist_room_get_name(PurpleRoomlistRoom *room);
+
+/**
+ * Get the parent of a room.
+ * @param room  The room, which must not be @c NULL.
+ * @return The parent of the room, which can be @c NULL.
+ * @since 2.4.0
+ */
+PurpleRoomlistRoom * purple_roomlist_room_get_parent(PurpleRoomlistRoom *room);
+
+/**
+ * Get the list of fields for a room.
+ *
+ * @param room  The room, which must not be @c NULL.
+ * @constreturn A list of fields
+ * @since 2.4.0
+ */
+GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom *room);
+
 /*@}*/
 
 /**************************************************************************/
@@ -294,6 +336,36 @@
 PurpleRoomlistField *purple_roomlist_field_new(PurpleRoomlistFieldType type,
                                            const gchar *label, const gchar *name,
                                            gboolean hidden);
+
+/**
+ * Get the type of a field.
+ *
+ * @param field  A PurpleRoomlistField, which must not be @c NULL.
+ *
+ * @return  The type of the field.
+ * @since 2.4.0
+ */
+PurpleRoomlistFieldType purple_roomlist_field_get_type(PurpleRoomlistField *field);
+
+/**
+ * Get the label of a field.
+ *
+ * @param field  A PurpleRoomlistField, which must not be @c NULL.
+ *
+ * @return  The label of the field.
+ * @since 2.4.0
+ */
+const char * purple_roomlist_field_get_label(PurpleRoomlistField *field);
+
+/**
+ * Check whether a roomlist-field is hidden.
+ * @param field  A PurpleRoomlistField, which must not be @c NULL.
+ *
+ * @return  @c TRUE if the field is hidden, @c FALSE otherwise.
+ * @since 2.4.0
+ */
+gboolean purple_roomlist_field_get_hidden(PurpleRoomlistField *field);
+
 /*@}*/
 
 /**************************************************************************/
--- a/po/POTFILES.in	Sat Jan 05 18:41:33 2008 +0000
+++ b/po/POTFILES.in	Sun Jan 06 19:02:57 2008 +0000
@@ -12,6 +12,7 @@
 finch/gntpounce.c
 finch/gntprefs.c
 finch/gntrequest.c
+finch/gntroomlist.c
 finch/gntsound.c
 finch/gntstatus.c
 finch/gntui.c