| 1 /** |
|
| 2 * @file gtkblist.h GTK+ Buddy List API |
|
| 3 * @ingroup gtkui |
|
| 4 * |
|
| 5 * gaim |
|
| 6 * |
|
| 7 * Gaim is the legal property of its developers, whose names are too numerous |
|
| 8 * to list here. Please refer to the COPYRIGHT file distributed with this |
|
| 9 * source distribution. |
|
| 10 * |
|
| 11 * This program is free software; you can redistribute it and/or modify |
|
| 12 * it under the terms of the GNU General Public License as published by |
|
| 13 * the Free Software Foundation; either version 2 of the License, or |
|
| 14 * (at your option) any later version. |
|
| 15 * |
|
| 16 * This program is distributed in the hope that it will be useful, |
|
| 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 19 * GNU General Public License for more details. |
|
| 20 * |
|
| 21 * You should have received a copy of the GNU General Public License |
|
| 22 * along with this program; if not, write to the Free Software |
|
| 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
| 24 */ |
|
| 25 #ifndef _GAIM_GTKBLIST_H_ |
|
| 26 #define _GAIM_GTKBLIST_H_ |
|
| 27 |
|
| 28 typedef struct _GaimGtkBuddyList GaimGtkBuddyList; |
|
| 29 |
|
| 30 enum { |
|
| 31 STATUS_ICON_COLUMN, |
|
| 32 STATUS_ICON_VISIBLE_COLUMN, |
|
| 33 NAME_COLUMN, |
|
| 34 IDLE_COLUMN, |
|
| 35 BUDDY_ICON_COLUMN, |
|
| 36 NODE_COLUMN, |
|
| 37 BLIST_COLUMNS |
|
| 38 |
|
| 39 }; |
|
| 40 |
|
| 41 typedef enum { |
|
| 42 GAIM_STATUS_ICON_LARGE, |
|
| 43 GAIM_STATUS_ICON_SMALL |
|
| 44 |
|
| 45 } GaimStatusIconSize; |
|
| 46 |
|
| 47 #include "gtkgaim.h" |
|
| 48 #include "blist.h" |
|
| 49 |
|
| 50 /************************************************************************** |
|
| 51 * @name Structures |
|
| 52 **************************************************************************/ |
|
| 53 /** |
|
| 54 * Like, everything you need to know about the gtk buddy list |
|
| 55 */ |
|
| 56 struct _GaimGtkBuddyList { |
|
| 57 GtkWidget *window; |
|
| 58 GtkWidget *vbox; /**< This is the vbox that everything gets packed into. Your plugin might |
|
| 59 want to pack something in it itself. Go, plugins! */ |
|
| 60 |
|
| 61 GtkWidget *treeview; /**< It's a treeview... d'uh. */ |
|
| 62 GtkTreeStore *treemodel; /**< This is the treemodel. */ |
|
| 63 GtkTreeViewColumn *idle_column, |
|
| 64 *warning_column, |
|
| 65 *buddy_icon_column, |
|
| 66 *text_column; |
|
| 67 |
|
| 68 GtkCellRenderer *text_rend; |
|
| 69 |
|
| 70 GtkItemFactory *ift; |
|
| 71 GtkWidget *menutray; /**< The menu tray widget. */ |
|
| 72 GtkWidget *menutrayicon; /**< The menu tray icon. */ |
|
| 73 |
|
| 74 GHashTable *connection_errors; /**< Caches connection error messages and accounts. */ |
|
| 75 |
|
| 76 guint refresh_timer; /**< The timer for refreshing every 30 seconds */ |
|
| 77 |
|
| 78 guint timeout; /**< The timeout for the tooltip. */ |
|
| 79 guint drag_timeout; /**< The timeout for expanding contacts on drags */ |
|
| 80 GdkRectangle tip_rect; /**< This is the bounding rectangle of the |
|
| 81 cell we're currently hovering over. This is |
|
| 82 used for tooltips. */ |
|
| 83 GdkRectangle contact_rect; /**< This is the bounding rectangle of the contact node |
|
| 84 and its children. This is used for auto-expand on |
|
| 85 mouseover. */ |
|
| 86 GaimBlistNode *mouseover_contact; /**< This is the contact currently mouse-over expanded */ |
|
| 87 |
|
| 88 GtkWidget *tipwindow; /**< The window used by the tooltip */ |
|
| 89 GList *tooltipdata; /**< The data for each "chunk" of the tooltip */ |
|
| 90 |
|
| 91 GaimBlistNode *selected_node; /**< The currently selected node */ |
|
| 92 GtkWidget *error_buttons; /**< Box containing the connection error buttons */ |
|
| 93 GtkWidget *statusbox; /**< The status selector dropdown */ |
|
| 94 GdkPixbuf *east, *south; /**< Drop shadow stuff */ |
|
| 95 GdkWindow *east_shadow, *south_shadow; /**< Drop shadow stuff */ |
|
| 96 |
|
| 97 }; |
|
| 98 |
|
| 99 #define GAIM_GTK_BLIST(list) ((GaimGtkBuddyList *)(list)->ui_data) |
|
| 100 #define GAIM_IS_GTK_BLIST(list) \ |
|
| 101 ((list)->ui_ops == gaim_gtk_blist_get_ui_ops()) |
|
| 102 |
|
| 103 /************************************************************************** |
|
| 104 * @name GTK+ Buddy List API |
|
| 105 **************************************************************************/ |
|
| 106 |
|
| 107 /** |
|
| 108 * Get the handle for the GTK+ blist system. |
|
| 109 * |
|
| 110 * @return the handle to the blist system |
|
| 111 */ |
|
| 112 void *gaim_gtk_blist_get_handle(void); |
|
| 113 |
|
| 114 /** |
|
| 115 * Initializes the GTK+ blist system. |
|
| 116 */ |
|
| 117 void gaim_gtk_blist_init(void); |
|
| 118 |
|
| 119 /** |
|
| 120 * Uninitializes the GTK+ blist system. |
|
| 121 */ |
|
| 122 void gaim_gtk_blist_uninit(void); |
|
| 123 |
|
| 124 /** |
|
| 125 * Returns the UI operations structure for the buddy list. |
|
| 126 * |
|
| 127 * @return The GTK+ list operations structure. |
|
| 128 */ |
|
| 129 GaimBlistUiOps *gaim_gtk_blist_get_ui_ops(void); |
|
| 130 |
|
| 131 /** |
|
| 132 * Returns the default gtk buddy list |
|
| 133 * |
|
| 134 * There's normally only one buddy list window, but that isn't a necessity. This function |
|
| 135 * returns the GaimGtkBuddyList we're most likely wanting to work with. This is slightly |
|
| 136 * cleaner than an externed global. |
|
| 137 * |
|
| 138 * @return The default GTK+ buddy list |
|
| 139 */ |
|
| 140 GaimGtkBuddyList *gaim_gtk_blist_get_default_gtk_blist(void); |
|
| 141 |
|
| 142 /** |
|
| 143 * Populates a menu with the items shown on the buddy list for a buddy. |
|
| 144 * |
|
| 145 * @param menu The menu to populate |
|
| 146 * @param buddy The buddy whose menu to get |
|
| 147 * @param sub TRUE if this is a sub-menu, FALSE otherwise |
|
| 148 */ |
|
| 149 void gaim_gtk_blist_make_buddy_menu(GtkWidget *menu, GaimBuddy *buddy, gboolean sub); |
|
| 150 |
|
| 151 /** |
|
| 152 * Refreshes all the nodes of the buddy list. |
|
| 153 * This should only be called when something changes to affect most of the nodes (such as a ui preference changing) |
|
| 154 * |
|
| 155 * @param list This is the core list that gets updated from |
|
| 156 */ |
|
| 157 void gaim_gtk_blist_refresh(GaimBuddyList *list); |
|
| 158 |
|
| 159 /** |
|
| 160 * Tells the buddy list to update its toolbar based on the preferences |
|
| 161 * |
|
| 162 */ |
|
| 163 void gaim_gtk_blist_update_toolbar(void); |
|
| 164 |
|
| 165 void gaim_gtk_blist_update_columns(void); |
|
| 166 void gaim_gtk_blist_update_refresh_timeout(void); |
|
| 167 |
|
| 168 /** |
|
| 169 * Useful for the buddy ticker |
|
| 170 */ |
|
| 171 GdkPixbuf *gaim_gtk_blist_get_status_icon(GaimBlistNode *node, |
|
| 172 GaimStatusIconSize size); |
|
| 173 |
|
| 174 /** |
|
| 175 * Returns a boolean indicating if @a node is part of an expanded contact. |
|
| 176 * |
|
| 177 * This only makes sense for contact and buddy nodes. @c FALSE is returned |
|
| 178 * for other types of nodes. |
|
| 179 * |
|
| 180 * @param node The node in question. |
|
| 181 * @return A boolean indicating if @a node is part of an expanded contact. |
|
| 182 */ |
|
| 183 gboolean gaim_gtk_blist_node_is_contact_expanded(GaimBlistNode *node); |
|
| 184 |
|
| 185 /** |
|
| 186 * Intelligently toggles the visibility of the buddy list. If the buddy |
|
| 187 * list is obscured, it is brought to the front. If it is not obscured, |
|
| 188 * it is hidden. If it is hidden it is shown. |
|
| 189 */ |
|
| 190 void gaim_gtk_blist_toggle_visibility(void); |
|
| 191 |
|
| 192 /** |
|
| 193 * Increases the reference count of visibility managers. Callers should |
|
| 194 * call the complementary remove function when no longer managing |
|
| 195 * visibility. |
|
| 196 * |
|
| 197 * A visibility manager is something that provides some method for |
|
| 198 * showing the buddy list after it is hidden (e.g. docklet plugin). |
|
| 199 */ |
|
| 200 void gaim_gtk_blist_visibility_manager_add(void); |
|
| 201 |
|
| 202 /** |
|
| 203 * Decreases the reference count of visibility managers. If the count |
|
| 204 * drops below zero, the buddy list is shown. |
|
| 205 */ |
|
| 206 void gaim_gtk_blist_visibility_manager_remove(void); |
|
| 207 |
|
| 208 |
|
| 209 /************************************************************************** |
|
| 210 * @name GTK+ Buddy List sorting functions |
|
| 211 **************************************************************************/ |
|
| 212 |
|
| 213 typedef void (*gaim_gtk_blist_sort_function)(GaimBlistNode *new, GaimBuddyList *blist, GtkTreeIter group, GtkTreeIter *cur, GtkTreeIter *iter); |
|
| 214 |
|
| 215 /** |
|
| 216 * Gets the current list of sort methods. |
|
| 217 * |
|
| 218 * @return A GSlist of sort methods |
|
| 219 */ |
|
| 220 GList *gaim_gtk_blist_get_sort_methods(void); |
|
| 221 |
|
| 222 struct gaim_gtk_blist_sort_method { |
|
| 223 char *id; |
|
| 224 char *name; |
|
| 225 gaim_gtk_blist_sort_function func; |
|
| 226 }; |
|
| 227 |
|
| 228 typedef struct gaim_gtk_blist_sort_method GaimGtkBlistSortMethod; |
|
| 229 |
|
| 230 /** |
|
| 231 * Registers a buddy list sorting method. |
|
| 232 * |
|
| 233 * @param id The unique ID of the sorting method |
|
| 234 * @param name The method's name. |
|
| 235 * @param func A pointer to the function. |
|
| 236 * |
|
| 237 */ |
|
| 238 void gaim_gtk_blist_sort_method_reg(const char *id, const char *name, gaim_gtk_blist_sort_function func); |
|
| 239 |
|
| 240 /** |
|
| 241 * Unregisters a buddy list sorting method. |
|
| 242 * |
|
| 243 * @param id The method's id |
|
| 244 */ |
|
| 245 void gaim_gtk_blist_sort_method_unreg(const char *id); |
|
| 246 |
|
| 247 /** |
|
| 248 * Sets a buddy list sorting method. |
|
| 249 * |
|
| 250 * @param id The method's id. |
|
| 251 */ |
|
| 252 void gaim_gtk_blist_sort_method_set(const char *id); |
|
| 253 |
|
| 254 /** |
|
| 255 * Sets up the programs default sort methods |
|
| 256 */ |
|
| 257 void gaim_gtk_blist_setup_sort_methods(void); |
|
| 258 |
|
| 259 /** |
|
| 260 * Updates the accounts menu on the GTK+ buddy list window. |
|
| 261 */ |
|
| 262 void gaim_gtk_blist_update_accounts_menu(void); |
|
| 263 |
|
| 264 /** |
|
| 265 * Updates the plugin actions menu on the GTK+ buddy list window. |
|
| 266 */ |
|
| 267 void gaim_gtk_blist_update_plugin_actions(void); |
|
| 268 |
|
| 269 /** |
|
| 270 * Updates the Sorting menu on the GTK+ buddy list window. |
|
| 271 */ |
|
| 272 void gaim_gtk_blist_update_sort_methods(void); |
|
| 273 |
|
| 274 /** |
|
| 275 * Determines if showing the join chat dialog is a valid action. |
|
| 276 * |
|
| 277 * @return Returns TRUE if there are accounts online capable of |
|
| 278 * joining chat rooms. Otherwise returns FALSE. |
|
| 279 */ |
|
| 280 gboolean gaim_gtk_blist_joinchat_is_showable(void); |
|
| 281 |
|
| 282 /** |
|
| 283 * Shows the join chat dialog. |
|
| 284 */ |
|
| 285 void gaim_gtk_blist_joinchat_show(void); |
|
| 286 |
|
| 287 /** |
|
| 288 * Appends the protocol specific menu items for a GaimBlistNode |
|
| 289 * TODO: Rename these. |
|
| 290 */ |
|
| 291 void gaim_gtk_append_blist_node_proto_menu (GtkWidget *menu, GaimConnection *gc, GaimBlistNode *node); |
|
| 292 |
|
| 293 /** |
|
| 294 * Appends the extended menu items for a GaimBlistNode |
|
| 295 * TODO: Rename these. |
|
| 296 */ |
|
| 297 void gaim_gtk_append_blist_node_extended_menu(GtkWidget *menu, GaimBlistNode *node); |
|
| 298 |
|
| 299 /** |
|
| 300 * Used by the connection API to tell the blist if an account |
|
| 301 * has a connection error or no longer has a connection error. |
|
| 302 * |
|
| 303 * @param account The account that either has a connection error |
|
| 304 * or no longer has a connection error. |
|
| 305 * @param message The connection error message, or NULL if this |
|
| 306 * account is no longer in an error state. |
|
| 307 */ |
|
| 308 void gaim_gtk_blist_update_account_error_state(GaimAccount *account, const char *message); |
|
| 309 |
|
| 310 #endif /* _GAIM_GTKBLIST_H_ */ |
|