Mercurial > pidgin
changeset 22006:1278280fa0b6
Implementation of the roomlist API.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sun, 06 Jan 2008 19:01:24 +0000 |
parents | 829d054f4f1a |
children | aba0620b1a37 |
files | ChangeLog ChangeLog.API finch/Makefile.am finch/gntroomlist.c finch/gntroomlist.h finch/gntui.c po/POTFILES.in |
diffstat | 7 files changed, 443 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Sun Jan 06 18:53:47 2008 +0000 +++ b/ChangeLog Sun Jan 06 19:01:24 2008 +0000 @@ -24,6 +24,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 Sun Jan 06 18:53:47 2008 +0000 +++ b/ChangeLog.API Sun Jan 06 19:01:24 2008 +0000 @@ -41,6 +41,7 @@ * 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.
--- a/finch/Makefile.am Sun Jan 06 18:53:47 2008 +0000 +++ b/finch/Makefile.am Sun Jan 06 19:01:24 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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finch/gntroomlist.c Sun Jan 06 19:01:24 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:01:24 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 Sun Jan 06 18:53:47 2008 +0000 +++ b/finch/gntui.c Sun Jan 06 19:01:24 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);