im.pidgin.pidgin: 534709237b5a9cb6acf039eba7344401c9cf8ac4
sadrul at pidgin.im
sadrul at pidgin.im
Sun Jan 6 14:00:49 EST 2008
-----------------------------------------------------------------
Revision: 534709237b5a9cb6acf039eba7344401c9cf8ac4
Ancestor: 1747b5c05b60cf63e250387d0e434194dff061e2
Author: sadrul at pidgin.im
Date: 2008-01-06T19:01:24
Branch: im.pidgin.pidgin
Added files:
finch/gntroomlist.c finch/gntroomlist.h
Modified files:
ChangeLog ChangeLog.API finch/Makefile.am finch/gntui.c
po/POTFILES.in
ChangeLog:
Implementation of the roomlist API.
-------------- next part --------------
============================================================
--- finch/gntroomlist.c a3f4b8231950f3ba641df2802420d09d2397fd85
+++ finch/gntroomlist.c a3f4b8231950f3ba641df2802420d09d2397fd85
@@ -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);
+}
+
============================================================
--- finch/gntroomlist.h 1a878d9ba45fd0733dcfdd7e84d37d93b4e85f8b
+++ finch/gntroomlist.h 1a878d9ba45fd0733dcfdd7e84d37d93b4e85f8b
@@ -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
+
============================================================
--- ChangeLog 055f35c7ae7e5b48011fd30b2a35fe0ef0fe2d34
+++ ChangeLog f1b1cd0dfdc0a4efd53cb6e536f00d6993dd4cd1
@@ -24,6 +24,11 @@ version 2.4.0 (??/??/????):
* 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
============================================================
--- ChangeLog.API aad5c51f87b1f48e5713119a86a6a094a9a5e088
+++ ChangeLog.API 387d9eae8d3bd6483cd62e1397fd618901f27e93
@@ -41,6 +41,7 @@ version 2.4.0 (??/??/????):
* 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.
============================================================
--- finch/Makefile.am 28e8ca3d3b64181931682c336bdb91afbefbb9c3
+++ finch/Makefile.am 076949a89a5b4446a3c86f0eb99dec6ccf5e422b
@@ -30,6 +30,7 @@ finch_SOURCES = \
gntpounce.c \
gntprefs.c \
gntrequest.c \
+ gntroomlist.c \
gntsound.c \
gntstatus.c \
gntui.c
@@ -49,6 +50,7 @@ finch_headers = \
gntpounce.h \
gntprefs.h \
gntrequest.h \
+ gntroomlist.h \
gntsound.h \
gntstatus.h \
gntui.h
============================================================
--- finch/gntui.c 48e5ab2cbf1f6a6171765050044d5462cacebe7f
+++ finch/gntui.c 7ff25ed3984fa1061440cc47f55129f607730ff5
@@ -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 @@ void gnt_ui_init()
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 @@ void gnt_ui_init()
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);
============================================================
--- po/POTFILES.in 08c46d8540cc2937fb895eaf12589e765d731123
+++ po/POTFILES.in 86619368a237bdd916cb13821159ee62f2f68e9e
@@ -12,6 +12,7 @@ finch/gntrequest.c
finch/gntpounce.c
finch/gntprefs.c
finch/gntrequest.c
+finch/gntroomlist.c
finch/gntsound.c
finch/gntstatus.c
finch/gntui.c
More information about the Commits
mailing list