Mercurial > pidgin
annotate src/buddy.c @ 5205:fefad67de2c7
[gaim-migrate @ 5573]
I had a damn good commit message, but it was eaten. Let's try it again.
Announcing, Gaim Plugin API version 2.0, or GPAPIV2.0 for short.
There are lots'a cool thingies here.
Okay now, this isn't as cool as the previous message, but:
1) There's now a single entry function for all plugin types. It returns a
detailed information structure on the plugin. This removes a lot of the
ugliness from old plugins. Oh yeah, libicq wasn't converted to this, so
if you use it, well, you shouldn't have used it anyway, but now you
can't! bwahahaha. Use AIM/ICQ.
2) There are now 3 types of plugins: Standard, Loader, and Protocol
plugins.
Standard plugins are, well, standard, compiled plugins.
Loader plugins load other plugins. For example, the perl support is now
a loader plugin. It loads perl scripts. In the future, we'll have
Ruby and Python loader plugins.
Protocol plugins are, well, protocol plugins... yeah...
3) Plugins have unique IDs, so they can be referred to or automatically
updated from a plugin database in the future. Neat, huh?
4) Plugins will have dependency support in the future, and can be hidden,
so if you have, say, a logging core plugin, it won't have to show up,
but then you load the GTK+ logging plugin and it'll auto-load the core
plugin. Core/UI split plugins!
5) There will eventually be custom plugin signals and RPC of some sort, for
the core/ui split plugins.
So, okay, back up .gaimrc.
I'd like to thank my parents for their support, javabsp for helping convert
a bunch of protocol plugins, and Etan for helping convert a bunch of
standard plugins.
Have fun. If you have any problems, please let me know, but you probably
won't have anything major happen. You will have to convert your plugins,
though, and I'm not guaranteeing that all perl scripts will still work.
I'll end up changing the perl script API eventually, so I know they won't
down the road. Don't worry, though. It'll be mass cool.
faceprint wants me to just commit the damn code already. So, here we go!!!
..
..
I need a massage. From a young, cute girl. Are there any young, cute girls
in the audience? IM me plz k thx.
committer: Tailor Script <tailor@pidgin.im>
| author | Christian Hammond <chipx86@chipx86.com> |
|---|---|
| date | Fri, 25 Apr 2003 06:47:33 +0000 |
| parents | b81e3c496598 |
| children | 0241d6b6702d |
| rev | line source |
|---|---|
| 1 | 1 /* |
| 2 * gaim | |
| 3 * | |
| 4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
| 5 * | |
| 6 * This program is free software; you can redistribute it and/or modify | |
| 7 * it under the terms of the GNU General Public License as published by | |
| 8 * the Free Software Foundation; either version 2 of the License, or | |
| 9 * (at your option) any later version. | |
| 10 * | |
| 11 * This program is distributed in the hope that it will be useful, | |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 * GNU General Public License for more details. | |
| 15 * | |
| 16 * You should have received a copy of the GNU General Public License | |
| 17 * along with this program; if not, write to the Free Software | |
| 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 * | |
| 20 */ | |
| 21 | |
|
349
b402a23f35df
[gaim-migrate @ 359]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
342
diff
changeset
|
22 #ifdef HAVE_CONFIG_H |
|
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2048
diff
changeset
|
23 #include <config.h> |
|
349
b402a23f35df
[gaim-migrate @ 359]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
342
diff
changeset
|
24 #endif |
|
391
be408b41c172
[gaim-migrate @ 401]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
350
diff
changeset
|
25 #ifdef GAIM_PLUGINS |
| 3630 | 26 #ifndef _WIN32 |
|
391
be408b41c172
[gaim-migrate @ 401]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
350
diff
changeset
|
27 #include <dlfcn.h> |
| 3630 | 28 #endif |
|
391
be408b41c172
[gaim-migrate @ 401]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
350
diff
changeset
|
29 #endif /* GAIM_PLUGINS */ |
| 1 | 30 #include <string.h> |
| 31 #include <stdio.h> | |
| 32 #include <stdlib.h> | |
| 3159 | 33 #include <ctype.h> |
| 1 | 34 #include <math.h> |
| 35 #include <time.h> | |
| 3630 | 36 #include <ctype.h> |
| 37 | |
| 38 #ifdef _WIN32 | |
| 39 #include <gdk/gdkwin32.h> | |
| 40 #else | |
|
1233
728a90516211
[gaim-migrate @ 1243]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1230
diff
changeset
|
41 #include <unistd.h> |
| 3630 | 42 #include <gdk/gdkx.h> |
| 43 #endif | |
| 1 | 44 |
|
1634
d029dc28a61e
[gaim-migrate @ 1644]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1625
diff
changeset
|
45 #include <gdk/gdkkeysyms.h> |
| 1 | 46 #include <gtk/gtk.h> |
|
1030
38452403563b
[gaim-migrate @ 1040]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1002
diff
changeset
|
47 #include "prpl.h" |
| 4561 | 48 #include "sound.h" |
| 1 | 49 #include "gaim.h" |
| 4687 | 50 #include "gtklist.h" |
| 5054 | 51 #include "gtkpounce.h" |
| 4687 | 52 #include "gtkft.h" |
| 3630 | 53 |
| 54 #ifdef _WIN32 | |
| 55 #include "win32dep.h" | |
| 56 #endif | |
| 57 | |
|
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
58 static struct gaim_gtk_buddy_list *gtkblist = NULL; |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
59 |
| 4840 | 60 /* part of the best damn Docklet code this side of Tahiti */ |
| 4698 | 61 static gboolean gaim_gtk_blist_obscured = FALSE; |
| 62 | |
| 4810 | 63 static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data); |
| 4687 | 64 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node); |
| 4724 | 65 static char *gaim_get_tooltip_text(struct buddy *b); |
| 4834 | 66 static char *item_factory_translate_func (const char *path, gpointer func_data); |
|
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
67 |
| 4687 | 68 /*************************************************** |
| 69 * Callbacks * | |
| 70 ***************************************************/ | |
| 3869 | 71 |
| 4840 | 72 static gboolean gtk_blist_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data) |
| 4698 | 73 { |
| 74 if (docklet_count) | |
| 75 gaim_blist_set_visible(FALSE); | |
| 76 else | |
| 77 do_quit(); | |
| 4840 | 78 |
| 79 /* we handle everything, event should not propogate further */ | |
| 80 return TRUE; | |
| 81 } | |
| 82 | |
| 83 static gboolean gtk_blist_save_prefs_cb(gpointer data) | |
| 84 { | |
| 85 save_prefs(); | |
| 86 | |
| 87 /* only run once */ | |
| 88 return FALSE; | |
| 89 } | |
| 90 | |
| 91 static gboolean gtk_blist_configure_cb(GtkWidget *w, GdkEventConfigure *event, gpointer data) | |
| 92 { | |
| 93 /* unfortunately GdkEventConfigure ignores the window gravity, but * | |
| 94 * the only way we have of setting the position doesn't. we have to * | |
| 95 * call get_position and get_size because they do pay attention to * | |
| 96 * the gravity. this is inefficient and I agree it sucks, but it's * | |
| 97 * more likely to work correctly. - Robot101 */ | |
| 98 gint x, y; | |
| 99 | |
| 100 /* check for visibility because when we aren't visible, this will * | |
| 101 * give us bogus (0,0) coordinates. - xOr */ | |
| 102 if (GTK_WIDGET_VISIBLE(w)) { | |
| 103 gtk_window_get_position(GTK_WINDOW(w), &x, &y); | |
| 104 | |
| 105 if (x != blist_pos.x || | |
| 106 y != blist_pos.y || | |
| 107 event->width != blist_pos.width || | |
| 108 event->height != blist_pos.height) { | |
| 109 blist_pos.x = x; | |
| 110 blist_pos.y = y; | |
| 111 blist_pos.width = event->width; | |
| 112 blist_pos.height = event->height; | |
| 113 | |
| 114 if (!g_main_context_find_source_by_user_data(NULL, >k_blist_save_prefs_cb)) { | |
| 115 g_timeout_add(5000, gtk_blist_save_prefs_cb, >k_blist_save_prefs_cb); | |
| 116 } | |
| 117 } | |
| 118 } | |
| 119 | |
| 120 /* continue to handle event normally */ | |
| 121 return FALSE; | |
| 122 } | |
| 123 | |
| 124 static gboolean gtk_blist_visibility_cb(GtkWidget *w, GdkEventVisibility *event, gpointer data) | |
| 125 { | |
| 126 if (event->state == GDK_VISIBILITY_FULLY_OBSCURED) | |
| 127 gaim_gtk_blist_obscured = TRUE; | |
| 128 else | |
| 129 gaim_gtk_blist_obscured = FALSE; | |
| 130 | |
| 131 /* continue to handle event normally */ | |
| 132 return FALSE; | |
| 4698 | 133 } |
| 134 | |
| 4732 | 135 static void gtk_blist_menu_info_cb(GtkWidget *w, struct buddy *b) |
| 136 { | |
| 137 serv_get_info(b->account->gc, b->name); | |
| 138 } | |
| 139 | |
| 4697 | 140 static void gtk_blist_menu_im_cb(GtkWidget *w, struct buddy *b) |
| 141 { | |
| 142 gaim_conversation_new(GAIM_CONV_IM, b->account, b->name); | |
| 143 } | |
| 144 | |
| 145 static void gtk_blist_menu_alias_cb(GtkWidget *w, struct buddy *b) | |
| 146 { | |
| 147 alias_dialog_bud(b); | |
| 148 } | |
| 149 | |
| 150 static void gtk_blist_menu_bp_cb(GtkWidget *w, struct buddy *b) | |
| 151 { | |
|
5032
cb700c07ee07
[gaim-migrate @ 5375]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
152 gaim_gtkpounce_dialog_show(b, NULL); |
| 4697 | 153 } |
| 154 | |
| 155 static void gtk_blist_menu_showlog_cb(GtkWidget *w, struct buddy *b) | |
| 156 { | |
| 157 show_log(b->name); | |
| 158 } | |
| 159 | |
| 160 static void gtk_blist_show_systemlog_cb() | |
| 161 { | |
| 162 show_log(NULL); | |
| 163 } | |
| 164 | |
| 4776 | 165 static void gtk_blist_show_onlinehelp_cb() |
| 166 { | |
| 4916 | 167 open_url(NULL, WEBSITE "documentation.php"); |
| 4776 | 168 } |
| 169 | |
| 4692 | 170 static void gtk_blist_button_im_cb(GtkWidget *w, GtkTreeView *tv) |
| 171 { | |
| 172 GtkTreeIter iter; | |
| 173 GtkTreeModel *model = gtk_tree_view_get_model(tv); | |
| 174 GtkTreeSelection *sel = gtk_tree_view_get_selection(tv); | |
| 175 | |
| 176 if(gtk_tree_selection_get_selected(sel, &model, &iter)){ | |
| 177 GaimBlistNode *node; | |
| 178 | |
| 179 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
| 4999 | 180 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 4692 | 181 gaim_conversation_new(GAIM_CONV_IM, ((struct buddy*)node)->account, ((struct buddy*)node)->name); |
| 4999 | 182 return; |
| 183 } | |
| 4692 | 184 } |
| 4999 | 185 show_im_dialog(); |
| 4694 | 186 } |
| 4692 | 187 |
| 4694 | 188 static void gtk_blist_button_info_cb(GtkWidget *w, GtkTreeView *tv) |
| 189 { | |
| 190 GtkTreeIter iter; | |
| 191 GtkTreeModel *model = gtk_tree_view_get_model(tv); | |
| 192 GtkTreeSelection *sel = gtk_tree_view_get_selection(tv); | |
| 4692 | 193 |
| 4694 | 194 if(gtk_tree_selection_get_selected(sel, &model, &iter)){ |
| 195 GaimBlistNode *node; | |
| 196 | |
| 197 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
| 198 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 199 serv_get_info(((struct buddy*)node)->account->gc, ((struct buddy*)node)->name); | |
| 200 return; | |
| 201 } | |
| 202 } | |
| 203 show_info_dialog(); | |
| 204 } | |
| 205 | |
| 206 static void gtk_blist_button_chat_cb(GtkWidget *w, gpointer data) | |
| 207 { | |
| 208 /* FIXME: someday, we can check to see if we've selected a chat node */ | |
| 209 join_chat(); | |
| 210 } | |
| 211 | |
| 212 static void gtk_blist_button_away_cb(GtkWidget *w, gpointer data) | |
| 213 { | |
| 214 gtk_menu_popup(GTK_MENU(awaymenu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME); | |
| 4692 | 215 } |
| 216 | |
| 5142 | 217 static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { |
| 218 GaimBlistNode *node; | |
| 219 GValue val = {0,}; | |
| 220 | |
| 221 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); | |
| 222 | |
| 223 node = g_value_get_pointer(&val); | |
| 224 | |
| 225 if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 226 gaim_group_set_setting((struct group *)node, "collapsed", NULL); | |
| 227 gaim_blist_save(); | |
| 228 } | |
| 229 } | |
| 230 | |
| 231 static void gtk_blist_row_collapsed_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { | |
| 232 GaimBlistNode *node; | |
| 233 GValue val = {0,}; | |
| 234 | |
| 235 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); | |
| 236 | |
| 237 node = g_value_get_pointer(&val); | |
| 238 | |
| 239 if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 240 gaim_group_set_setting((struct group *)node, "collapsed", "true"); | |
| 241 gaim_blist_save(); | |
| 242 } | |
| 243 } | |
| 244 | |
| 4687 | 245 static void gtk_blist_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { |
| 246 GaimBlistNode *node; | |
| 247 GtkTreeIter iter; | |
| 248 GValue val = { 0, }; | |
| 4936 | 249 |
| 4687 | 250 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); |
| 4936 | 251 |
| 4687 | 252 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
| 253 node = g_value_get_pointer(&val); | |
| 4936 | 254 |
| 4687 | 255 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 4911 | 256 struct gaim_conversation *conv = |
| 257 gaim_conversation_new(GAIM_CONV_IM, ((struct buddy*)node)->account, ((struct buddy*)node)->name); | |
| 258 if(conv) { | |
| 259 gaim_window_raise(gaim_conversation_get_window(conv)); | |
| 260 gaim_window_switch_conversation( | |
| 261 gaim_conversation_get_window(conv), | |
| 262 gaim_conversation_get_index(conv)); | |
| 263 } | |
| 4697 | 264 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
| 265 if (gtk_tree_view_row_expanded(tv, path)) | |
| 266 gtk_tree_view_collapse_row(tv, path); | |
| 267 else | |
| 268 gtk_tree_view_expand_row(tv,path,FALSE); | |
| 1 | 269 } |
| 270 } | |
| 271 | |
| 4916 | 272 static void gaim_gtk_blist_add_buddy_cb() |
| 273 { | |
| 274 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | |
| 275 GtkTreeIter iter; | |
| 276 GaimBlistNode *node; | |
| 277 | |
| 278 if(gtk_tree_selection_get_selected(sel, NULL, &iter)){ | |
| 279 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
| 280 if (GAIM_BLIST_NODE_IS_BUDDY(node)) | |
| 281 show_add_buddy(NULL, NULL, ((struct group*)node->parent)->name, NULL); | |
| 282 else if (GAIM_BLIST_NODE_IS_GROUP(node)) | |
| 283 show_add_buddy(NULL, NULL, ((struct group*)node)->name, NULL); | |
| 284 } | |
| 285 else { | |
| 286 show_add_buddy(NULL, NULL, NULL, NULL); | |
| 287 } | |
| 288 } | |
| 5018 | 289 |
| 4921 | 290 static void |
| 4916 | 291 gaim_gtk_blist_remove_cb (GtkWidget *w, GaimBlistNode *node) |
| 292 { | |
| 293 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 294 struct buddy *b = (struct buddy*)node; | |
| 295 show_confirm_del(b->account->gc, b->name); | |
| 296 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 297 struct group *g = (struct group*)node; | |
| 298 show_confirm_del_group(g); | |
| 299 } | |
| 300 } | |
| 301 | |
| 4687 | 302 static void gaim_proto_menu_cb(GtkMenuItem *item, struct buddy *b) |
| 1 | 303 { |
| 4687 | 304 struct proto_buddy_menu *pbm = g_object_get_data(G_OBJECT(item), "gaimcallback"); |
| 305 if (pbm->callback) | |
| 306 pbm->callback(pbm->gc, b->name); | |
|
1396
df7c3cacac92
[gaim-migrate @ 1406]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1392
diff
changeset
|
307 } |
| 1 | 308 |
| 4687 | 309 static gboolean gtk_blist_button_press_cb(GtkWidget *tv, GdkEventButton *event, gpointer null) |
|
1391
d606da211acb
[gaim-migrate @ 1401]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1376
diff
changeset
|
310 { |
| 4687 | 311 GtkTreePath *path; |
| 312 GaimBlistNode *node; | |
| 313 GValue val = { 0, }; | |
| 314 GtkTreeIter iter; | |
| 315 GtkWidget *menu, *menuitem; | |
| 4702 | 316 GtkTreeSelection *sel; |
| 4687 | 317 GList *list; |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
318 GaimPlugin *prpl = NULL; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
319 GaimPluginProtocolInfo *prpl_info = NULL; |
|
1391
d606da211acb
[gaim-migrate @ 1401]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1376
diff
changeset
|
320 |
| 4687 | 321 if (event->button != 3) |
| 322 return FALSE; | |
| 4718 | 323 |
| 4687 | 324 /* Here we figure out which node was clicked */ |
| 325 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL)) | |
| 326 return FALSE; | |
| 327 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
| 328 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); | |
| 329 node = g_value_get_pointer(&val); | |
| 330 menu = gtk_menu_new(); | |
| 3251 | 331 |
| 4916 | 332 if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
| 5156 | 333 gaim_new_item_from_stock(menu, _("_Add a Buddy"), GTK_STOCK_ADD, G_CALLBACK(gaim_gtk_blist_add_buddy_cb), node, 0, 0, NULL); |
| 334 gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE, G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); | |
| 335 gaim_new_item_from_stock(menu, _("_Rename"), NULL, G_CALLBACK(show_rename_group), node, 0, 0, NULL); | |
| 4916 | 336 } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 337 /* Protocol specific options */ | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
338 prpl = gaim_find_prpl(((struct buddy*)node)->account->protocol); |
| 4916 | 339 |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
340 if (prpl != NULL) |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
341 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
342 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
343 if (prpl && prpl_info->get_info) |
| 5156 | 344 gaim_new_item_from_stock(menu, _("_Get Info"), GAIM_STOCK_INFO, G_CALLBACK(gtk_blist_menu_info_cb), node, 0, 0, NULL); |
| 4732 | 345 |
| 5156 | 346 gaim_new_item_from_stock(menu, _("_IM"), GAIM_STOCK_IM, G_CALLBACK(gtk_blist_menu_im_cb), node, 0, 0, NULL); |
| 347 gaim_new_item_from_stock(menu, _("Add Buddy _Pounce"), NULL, G_CALLBACK(gtk_blist_menu_bp_cb), node, 0, 0, NULL); | |
| 348 gaim_new_item_from_stock(menu, _("View _Log"), NULL, G_CALLBACK(gtk_blist_menu_showlog_cb), node, 0, 0, NULL); | |
| 4916 | 349 |
| 350 if (prpl) { | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
351 list = prpl_info->buddy_menu(((struct buddy*)node)->account->gc, ((struct buddy*)node)->name); |
| 4916 | 352 while (list) { |
| 353 struct proto_buddy_menu *pbm = list->data; | |
| 354 menuitem = gtk_menu_item_new_with_mnemonic(pbm->label); | |
| 355 g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pbm); | |
| 356 g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gaim_proto_menu_cb), node); | |
| 357 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | |
| 358 list = list->next; | |
| 359 } | |
| 360 } | |
| 5017 | 361 |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
362 gaim_event_broadcast (event_draw_menu, menu, ((struct buddy *) node)->name); |
| 5156 | 363 |
| 4916 | 364 gaim_separator(menu); |
| 5156 | 365 gaim_new_item_from_stock(menu, _("_Alias"), GAIM_STOCK_EDIT, G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); |
| 366 gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); | |
| 4732 | 367 } |
| 4916 | 368 |
| 4687 | 369 gtk_widget_show_all(menu); |
| 370 | |
| 371 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); | |
| 1 | 372 |
| 4702 | 373 #if (1) /* This code only exists because GTK doesn't work. If we return FALSE here, as would be normal |
| 374 * the event propoagates down and somehow gets interpreted as the start of a drag event. */ | |
| 375 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); | |
| 376 gtk_tree_selection_select_path(sel, path); | |
| 4721 | 377 gtk_tree_path_free(path); |
| 4702 | 378 return TRUE; |
| 379 #endif | |
| 1 | 380 } |
| 381 | |
| 5000 | 382 static void gaim_gtk_blist_show_empty_groups_cb(gpointer data, guint action, GtkWidget *item) |
| 383 { | |
| 384 if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))) | |
| 385 blist_options &= ~OPT_BLIST_NO_MT_GRP; | |
| 386 else | |
| 387 blist_options |= OPT_BLIST_NO_MT_GRP; | |
| 388 save_prefs(); | |
| 389 gaim_gtk_blist_refresh(gaim_get_blist()); | |
| 390 } | |
| 391 | |
| 4944 | 392 static void gaim_gtk_blist_edit_mode_cb(gpointer callback_data, guint callback_action, |
| 4936 | 393 GtkWidget *checkitem) { |
| 5135 | 394 if(gtkblist->window->window) { |
| 395 GdkCursor *cursor = gdk_cursor_new(GDK_WATCH); | |
| 396 gdk_window_set_cursor(gtkblist->window->window, cursor); | |
| 397 while (gtk_events_pending()) | |
| 398 gtk_main_iteration(); | |
| 399 gdk_cursor_unref(cursor); | |
| 400 } | |
| 401 | |
| 4936 | 402 if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(checkitem))) |
| 403 blist_options |= OPT_BLIST_SHOW_OFFLINE; | |
| 404 else | |
| 405 blist_options &= ~OPT_BLIST_SHOW_OFFLINE; | |
| 4929 | 406 save_prefs(); |
| 5135 | 407 |
| 408 if(gtkblist->window->window) { | |
| 409 GdkCursor *cursor = gdk_cursor_new(GDK_LEFT_PTR); | |
| 410 gdk_window_set_cursor(gtkblist->window->window, cursor); | |
| 411 gdk_cursor_unref(cursor); | |
| 412 } | |
| 413 | |
| 4916 | 414 gaim_gtk_blist_refresh(gaim_get_blist()); |
| 415 } | |
|
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4349
diff
changeset
|
416 |
| 4702 | 417 static void gaim_gtk_blist_drag_data_get_cb (GtkWidget *widget, |
| 418 GdkDragContext *dc, | |
| 419 GtkSelectionData *data, | |
| 420 guint info, | |
| 421 guint time, | |
| 422 gpointer *null) | |
| 423 { | |
| 4781 | 424 if (data->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) { |
| 4702 | 425 GtkTreeRowReference *ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); |
| 426 GtkTreePath *sourcerow = gtk_tree_row_reference_get_path(ref); | |
| 427 GtkTreeIter iter; | |
| 428 GaimBlistNode *node = NULL; | |
| 429 GValue val = {0}; | |
| 430 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, sourcerow); | |
| 431 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); | |
| 432 node = g_value_get_pointer(&val); | |
| 4781 | 433 gtk_selection_data_set (data, |
| 434 gdk_atom_intern ("GAIM_BLIST_NODE", FALSE), | |
| 435 8, /* bits */ | |
| 436 (void*)&node, | |
| 437 sizeof (node)); | |
| 438 | |
| 4721 | 439 gtk_tree_path_free(sourcerow); |
| 4702 | 440 } |
| 4781 | 441 |
| 4702 | 442 } |
| 443 | |
| 444 static void gaim_gtk_blist_drag_data_rcv_cb(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, | |
| 445 GtkSelectionData *sd, guint info, guint t) | |
| 446 { | |
| 4781 | 447 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE) && sd->data) { |
| 448 GaimBlistNode *n = NULL; | |
| 4702 | 449 GtkTreePath *path = NULL; |
| 4704 | 450 GtkTreeViewDropPosition position; |
| 4781 | 451 memcpy(&n, sd->data, sizeof(n)); |
| 4704 | 452 if(gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), x, y, &path, &position)) { |
| 453 /* if we're here, I think it means the drop is ok */ | |
| 4770 | 454 GtkTreeIter iter; |
| 455 GaimBlistNode *node; | |
| 456 GValue val = {0}; | |
| 457 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
| 458 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); | |
| 459 node = g_value_get_pointer(&val); | |
| 4781 | 460 |
| 461 if (GAIM_BLIST_NODE_IS_BUDDY(n)) { | |
| 462 struct buddy *b = (struct buddy*)n; | |
| 463 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 4795 | 464 switch(position) { |
| 465 case GTK_TREE_VIEW_DROP_AFTER: | |
| 466 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
| 467 gaim_blist_add_buddy(b, (struct group*)node->parent, node); | |
| 468 break; | |
| 469 case GTK_TREE_VIEW_DROP_BEFORE: | |
| 470 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
| 471 gaim_blist_add_buddy(b, (struct group*)node->parent, node->prev); | |
| 472 break; | |
| 4781 | 473 } |
| 474 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 475 gaim_blist_add_buddy(b, (struct group*)node, NULL); | |
| 4795 | 476 } |
| 4781 | 477 } else if (GAIM_BLIST_NODE_IS_GROUP(n)) { |
| 478 struct group *g = (struct group*)n; | |
| 479 if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 480 switch (position) { | |
| 481 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
| 482 case GTK_TREE_VIEW_DROP_AFTER: | |
| 483 gaim_blist_add_group(g, node); | |
| 484 break; | |
| 485 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
| 486 case GTK_TREE_VIEW_DROP_BEFORE: | |
| 487 gaim_blist_add_group(g, node->prev); | |
| 488 break; | |
| 489 } | |
| 490 | |
| 5055 | 491 } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 492 gaim_blist_add_group(g, node->parent); | |
| 4770 | 493 } |
| 4781 | 494 |
| 4777 | 495 } |
| 4781 | 496 |
| 4721 | 497 gtk_tree_path_free(path); |
| 4970 | 498 gaim_blist_save(); |
| 4704 | 499 } |
| 4702 | 500 } |
| 501 } | |
| 502 | |
| 4724 | 503 static void gaim_gtk_blist_paint_tip(GtkWidget *widget, GdkEventExpose *event, struct buddy *b) |
| 504 { | |
| 505 GtkStyle *style; | |
| 506 GdkPixbuf *pixbuf = gaim_gtk_blist_get_status_icon(b, GAIM_STATUS_ICON_LARGE); | |
| 507 PangoLayout *layout; | |
| 508 char *tooltiptext = gaim_get_tooltip_text(b); | |
| 509 | |
| 510 layout = gtk_widget_create_pango_layout (gtkblist->tipwindow, NULL); | |
| 511 pango_layout_set_markup(layout, tooltiptext, strlen(tooltiptext)); | |
| 4732 | 512 pango_layout_set_wrap(layout, PANGO_WRAP_WORD); |
| 4733 | 513 pango_layout_set_width(layout, 300000); |
| 4724 | 514 style = gtkblist->tipwindow->style; |
| 4732 | 515 |
| 4724 | 516 gtk_paint_flat_box (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, |
| 517 NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1); | |
| 4729 | 518 |
| 519 #if GTK_CHECK_VERSION(2,2,0) | |
| 4724 | 520 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, pixbuf, |
| 521 0, 0, 4, 4, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); | |
| 4729 | 522 #else |
| 4758 | 523 gdk_pixbuf_render_to_drawable(pixbuf, GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, 4, 4, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); |
| 4729 | 524 #endif |
| 4724 | 525 |
| 526 gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, TRUE, | |
| 527 NULL, gtkblist->tipwindow, "tooltip", 38, 4, layout); | |
| 528 | |
| 529 g_object_unref (pixbuf); | |
| 530 g_object_unref (layout); | |
| 531 g_free(tooltiptext); | |
| 532 return; | |
| 533 } | |
| 534 | |
| 535 static gboolean gaim_gtk_blist_tooltip_timeout(GtkWidget *tv) | |
| 536 { | |
| 537 GtkTreePath *path; | |
| 538 GtkTreeIter iter; | |
| 539 GaimBlistNode *node; | |
| 540 GValue val = {0}; | |
| 541 | |
| 542 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), gtkblist->rect.x, gtkblist->rect.y, &path, NULL, NULL, NULL)) | |
| 543 return FALSE; | |
| 544 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
| 545 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); | |
| 546 node = g_value_get_pointer(&val); | |
| 547 | |
| 548 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 549 int scr_w,scr_h, w, h, x, y; | |
| 550 PangoLayout *layout; | |
| 551 struct buddy *buddy = (struct buddy*)node; | |
| 552 char *tooltiptext = gaim_get_tooltip_text(buddy); | |
| 553 gtkblist->tipwindow = gtk_window_new(GTK_WINDOW_POPUP); | |
|
4907
68e2b07ef8d7
[gaim-migrate @ 5241]
Christian Hammond <chipx86@chipx86.com>
parents:
4883
diff
changeset
|
554 gtkblist->tipwindow->parent = tv; |
| 4724 | 555 gtk_widget_set_app_paintable(gtkblist->tipwindow, TRUE); |
| 4729 | 556 gtk_window_set_resizable(GTK_WINDOW(gtkblist->tipwindow), FALSE); |
| 4724 | 557 gtk_widget_set_name(gtkblist->tipwindow, "gtk-tooltips"); |
| 558 g_signal_connect(G_OBJECT(gtkblist->tipwindow), "expose_event", | |
| 559 G_CALLBACK(gaim_gtk_blist_paint_tip), buddy); | |
| 560 gtk_widget_ensure_style (gtkblist->tipwindow); | |
| 561 | |
| 562 layout = gtk_widget_create_pango_layout (gtkblist->tipwindow, NULL); | |
| 4733 | 563 pango_layout_set_wrap(layout, PANGO_WRAP_WORD); |
| 564 pango_layout_set_width(layout, 300000); | |
| 4724 | 565 pango_layout_set_markup(layout, tooltiptext, strlen(tooltiptext)); |
| 566 scr_w = gdk_screen_width(); | |
| 567 scr_h = gdk_screen_height(); | |
| 568 pango_layout_get_size (layout, &w, &h); | |
| 569 w = PANGO_PIXELS(w) + 8; | |
| 570 h = PANGO_PIXELS(h) + 8; | |
| 571 | |
| 572 /* 38 is the size of a large status icon plus 4 pixels padding on each side. | |
| 573 I should #define this or something */ | |
| 574 w = w + 38; | |
| 575 h = MAX(h, 38); | |
| 576 | |
| 577 gdk_window_get_pointer(NULL, &x, &y, NULL); | |
| 578 if (GTK_WIDGET_NO_WINDOW(gtkblist->window)) | |
| 579 y+=gtkblist->window->allocation.y; | |
| 580 | |
| 581 x -= ((w >> 1) + 4); | |
| 582 | |
| 583 if ((x + w) > scr_w) | |
| 584 x -= (x + w) - scr_w; | |
| 585 else if (x < 0) | |
| 586 x = 0; | |
| 587 | |
| 588 if ((y + h + 4) > scr_h) | |
| 589 y = y - h; | |
| 590 else | |
| 591 y = y + 6; | |
| 592 g_object_unref (layout); | |
| 593 g_free(tooltiptext); | |
| 594 gtk_widget_set_size_request(gtkblist->tipwindow, w, h); | |
| 4729 | 595 gtk_window_move(GTK_WINDOW(gtkblist->tipwindow), x, y); |
| 4724 | 596 gtk_widget_show(gtkblist->tipwindow); |
| 597 } | |
| 4729 | 598 |
| 4724 | 599 gtk_tree_path_free(path); |
| 600 return FALSE; | |
| 601 } | |
| 602 | |
| 4730 | 603 static gboolean gaim_gtk_blist_motion_cb (GtkWidget *tv, GdkEventMotion *event, gpointer null) |
| 4724 | 604 { |
| 605 GtkTreePath *path; | |
| 606 if (gtkblist->timeout) { | |
| 607 if ((event->y > gtkblist->rect.y) && ((event->y - gtkblist->rect.height) < gtkblist->rect.y)) | |
| 4732 | 608 return FALSE; |
| 4724 | 609 /* We've left the cell. Remove the timeout and create a new one below */ |
| 610 if (gtkblist->tipwindow) { | |
| 611 gtk_widget_destroy(gtkblist->tipwindow); | |
| 612 gtkblist->tipwindow = NULL; | |
| 613 } | |
| 614 | |
| 615 g_source_remove(gtkblist->timeout); | |
| 616 } | |
| 617 | |
| 618 gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL); | |
| 619 gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, >kblist->rect); | |
| 620 if (path) | |
| 621 gtk_tree_path_free(path); | |
| 622 gtkblist->timeout = g_timeout_add(500, (GSourceFunc)gaim_gtk_blist_tooltip_timeout, tv); | |
| 4730 | 623 return FALSE; |
| 4724 | 624 } |
| 625 | |
| 626 static void gaim_gtk_blist_leave_cb (GtkWidget *w, GdkEventCrossing *e, gpointer n) | |
| 627 { | |
| 4978 | 628 if (gtkblist->timeout) { |
| 629 g_source_remove(gtkblist->timeout); | |
| 630 gtkblist->timeout = 0; | |
| 631 } | |
| 4724 | 632 if (gtkblist->tipwindow) { |
| 633 gtk_widget_destroy(gtkblist->tipwindow); | |
| 634 gtkblist->tipwindow = NULL; | |
| 635 } | |
| 4978 | 636 } |
| 4724 | 637 |
| 4687 | 638 /*************************************************** |
| 639 * Crap * | |
| 640 ***************************************************/ | |
| 641 static GtkItemFactoryEntry blist_menu[] = | |
|
1929
d51ea669d84e
[gaim-migrate @ 1939]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1918
diff
changeset
|
642 { |
| 4687 | 643 /* Buddies menu */ |
| 644 { N_("/_Buddies"), NULL, NULL, 0, "<Branch>" }, | |
| 5024 | 645 { N_("/Buddies/New _Instant Message..."), "<CTL>I", show_im_dialog, 0, "<StockItem>", GAIM_STOCK_IM }, |
| 646 { N_("/Buddies/Join a _Chat..."), "<CTL>C", join_chat, 0, "<StockItem>", GAIM_STOCK_CHAT }, | |
| 5145 | 647 { N_("/Buddies/Get _User Info..."), "<CTL>J", show_info_dialog, 0, "<StockItem>", GAIM_STOCK_INFO }, |
| 4834 | 648 { "/Buddies/sep1", NULL, NULL, 0, "<Separator>" }, |
| 4983 | 649 { N_("/Buddies/_Show Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, "<CheckItem>"}, |
| 5000 | 650 { N_("/Buddies/Show _Empty Groups"), NULL, gaim_gtk_blist_show_empty_groups_cb, 1, "<CheckItem>"}, |
| 4983 | 651 { N_("/Buddies/_Add a Buddy..."), NULL, gaim_gtk_blist_add_buddy_cb, 0, "<StockItem>", GTK_STOCK_ADD }, |
| 652 { N_("/Buddies/Add a _Group..."), NULL, show_add_group, 0, NULL}, | |
| 5024 | 653 { "/Buddies/sep2", NULL, NULL, 0, "<Separator>" }, |
| 654 { N_("/Buddies/_Signoff"), "<CTL>D", signoff_all, 0, "<StockItem>", GAIM_STOCK_SIGN_OFF }, | |
| 655 { N_("/Buddies/_Quit"), "<CTL>Q", do_quit, 0, "<StockItem>", GTK_STOCK_QUIT }, | |
|
1929
d51ea669d84e
[gaim-migrate @ 1939]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1918
diff
changeset
|
656 |
| 4687 | 657 /* Tools */ |
| 658 { N_("/_Tools"), NULL, NULL, 0, "<Branch>" }, | |
| 659 { N_("/Tools/_Away"), NULL, NULL, 0, "<Branch>" }, | |
| 660 { N_("/Tools/Buddy _Pounce"), NULL, NULL, 0, "<Branch>" }, | |
| 5024 | 661 { N_("/Tools/P_rotocol Actions"), NULL, NULL, 0, "<Branch>" }, |
| 662 { "/Tools/sep1", NULL, NULL, 0, "<Separator>" }, | |
| 5053 | 663 { N_("/Tools/A_ccounts..."), "<CTL>A", account_editor, 0, "<StockItem>", GAIM_STOCK_ACCOUNTS }, |
| 5024 | 664 { N_("/Tools/_File Transfers..."), NULL, gaim_show_xfer_dialog, 0, "<StockItem>", GAIM_STOCK_FILE_TRANSFER }, |
| 665 { N_("/Tools/Preferences..."), "<CTL>P", show_prefs, 0, "<StockItem>", GTK_STOCK_PREFERENCES }, | |
| 666 { N_("/Tools/Pr_ivacy..."), NULL, show_privacy_options, 0, "<StockItem>", GAIM_STOCK_PRIVACY }, | |
| 4834 | 667 { "/Tools/sep2", NULL, NULL, 0, "<Separator>" }, |
| 5024 | 668 { N_("/Tools/View System _Log..."), NULL, gtk_blist_show_systemlog_cb, 0, NULL }, |
| 3251 | 669 |
| 4687 | 670 /* Help */ |
| 671 { N_("/_Help"), NULL, NULL, 0, "<Branch>" }, | |
| 5024 | 672 { N_("/Help/Online _Help"), "F1", gtk_blist_show_onlinehelp_cb, 0, "<StockItem>", GTK_STOCK_HELP }, |
| 673 { N_("/Help/_Debug Window..."), NULL, toggle_debug, 0, NULL }, | |
| 674 { N_("/Help/_About..."), NULL, show_about, 0, "<StockItem>", GAIM_STOCK_ABOUT }, | |
| 4687 | 675 }; |
|
1929
d51ea669d84e
[gaim-migrate @ 1939]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1918
diff
changeset
|
676 |
| 4687 | 677 /********************************************************* |
| 678 * Private Utility functions * | |
| 679 *********************************************************/ | |
| 680 | |
| 4724 | 681 static char *gaim_get_tooltip_text(struct buddy *b) |
| 682 { | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
683 GaimPlugin *prpl; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
684 GaimPluginProtocolInfo *prpl_info = NULL; |
| 4724 | 685 char *text = NULL; |
| 686 char *statustext = NULL; | |
| 4867 | 687 char *aliastext = NULL, *nicktext = NULL; |
| 4724 | 688 char *warning = NULL, *idletime = NULL; |
| 689 | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
690 prpl = gaim_find_prpl(b->account->protocol); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
691 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
692 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
693 if (prpl_info->tooltip_text) { |
| 4815 | 694 const char *end; |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
695 statustext = prpl_info->tooltip_text(b); |
| 4815 | 696 |
| 697 if(statustext && !g_utf8_validate(statustext, -1, &end)) { | |
| 698 char *new = g_strndup(statustext, | |
| 699 g_utf8_pointer_to_offset(statustext, end)); | |
| 700 g_free(statustext); | |
| 701 statustext = new; | |
| 702 } | |
| 4724 | 703 } |
| 4732 | 704 |
| 5131 | 705 if (!statustext && !GAIM_BUDDY_IS_ONLINE(b)) |
| 706 statustext = g_strdup(_("<b>Status:</b> Offline")); | |
| 707 | |
| 5002 | 708 if (b->idle > 0) { |
| 4724 | 709 int ihrs, imin; |
| 710 time_t t; | |
| 711 time(&t); | |
| 712 ihrs = (t - b->idle) / 3600; | |
| 713 imin = ((t - b->idle) / 60) % 60; | |
| 714 if (ihrs) | |
| 4744 | 715 idletime = g_strdup_printf(_("%dh%02dm"), ihrs, imin); |
| 4724 | 716 else |
| 4744 | 717 idletime = g_strdup_printf(_("%dm"), imin); |
| 4724 | 718 } |
| 4732 | 719 |
| 4945 | 720 if(b->alias && b->alias[0]) |
| 4867 | 721 aliastext = g_markup_escape_text(b->alias, -1); |
| 722 | |
| 723 if(b->server_alias) | |
| 724 nicktext = g_markup_escape_text(b->server_alias, -1); | |
| 725 | |
| 4724 | 726 if (b->evil > 0) |
| 4744 | 727 warning = g_strdup_printf(_("%d%%"), b->evil); |
| 4732 | 728 |
| 4724 | 729 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>" |
| 4744 | 730 "%s %s" /* Alias */ |
| 731 "%s %s" /* Nickname */ | |
| 732 "%s %s" /* Idle */ | |
| 733 "%s %s" /* Warning */ | |
| 4968 | 734 "%s%s" /* Status */ |
| 735 "%s", | |
| 4724 | 736 b->name, |
| 4867 | 737 aliastext ? _("\n<b>Alias:</b>") : "", aliastext ? aliastext : "", |
| 738 nicktext ? _("\n<b>Nickname:</b>") : "", nicktext ? nicktext : "", | |
| 5002 | 739 idletime ? _("\n<b>Idle:</b>") : "", idletime ? idletime : "", |
| 4744 | 740 b->evil ? _("\n<b>Warned:</b>") : "", b->evil ? warning : "", |
| 4968 | 741 statustext ? "\n" : "", statustext ? statustext : "", |
| 5116 | 742 !g_ascii_strcasecmp(b->name, "robflynn") ? _("\n<b>Description:</b> Spooky") : ""); |
| 4968 | 743 |
| 4737 | 744 if(warning) |
| 745 g_free(warning); | |
| 746 if(idletime) | |
| 747 g_free(idletime); | |
| 748 if(statustext) | |
| 749 g_free(statustext); | |
| 4867 | 750 if(nicktext) |
| 751 g_free(nicktext); | |
| 752 if(aliastext) | |
| 753 g_free(aliastext); | |
| 4737 | 754 |
| 4724 | 755 return text; |
| 756 | |
| 757 } | |
| 758 | |
| 5168 | 759 GdkPixbuf *gaim_gtk_blist_get_status_icon(struct buddy *b, GaimStatusIconSize size) |
| 4687 | 760 { |
| 761 GdkPixbuf *status = NULL; | |
| 762 GdkPixbuf *scale = NULL; | |
| 763 GdkPixbuf *emblem = NULL; | |
| 4737 | 764 gchar *filename = NULL; |
| 4687 | 765 const char *protoname = NULL; |
|
1929
d51ea669d84e
[gaim-migrate @ 1939]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1918
diff
changeset
|
766 |
| 4691 | 767 char *se = NULL, *sw = NULL ,*nw = NULL ,*ne = NULL; |
| 4737 | 768 |
| 4687 | 769 int scalesize = 30; |
| 770 | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
771 GaimPlugin *prpl; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
772 GaimPluginProtocolInfo *prpl_info = NULL; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
773 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
774 prpl = gaim_find_prpl(b->account->protocol); |
| 4916 | 775 |
| 776 if (!prpl) | |
| 777 return NULL; | |
| 778 | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
779 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
780 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
781 if (prpl_info->list_icon) |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
782 protoname = prpl_info->list_icon(b->account, b); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
783 if (b->present != GAIM_BUDDY_SIGNING_OFF && prpl_info->list_emblems) |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
784 prpl_info->list_emblems(b, &se, &sw, &nw, &ne); |
| 5068 | 785 |
| 4724 | 786 if (size == GAIM_STATUS_ICON_SMALL) { |
| 4687 | 787 scalesize = 15; |
| 788 sw = nw = ne = NULL; /* So that only the se icon will composite */ | |
|
1929
d51ea669d84e
[gaim-migrate @ 1939]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1918
diff
changeset
|
789 } |
|
d51ea669d84e
[gaim-migrate @ 1939]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1918
diff
changeset
|
790 |
| 4701 | 791 |
| 5068 | 792 if (b->present == GAIM_BUDDY_SIGNING_ON) { |
| 4687 | 793 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "login.png", NULL); |
| 794 status = gdk_pixbuf_new_from_file(filename,NULL); | |
| 795 g_free(filename); | |
| 5068 | 796 } else if (b->present == GAIM_BUDDY_SIGNING_OFF) { |
| 797 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "logout.png", NULL); | |
| 798 status = gdk_pixbuf_new_from_file(filename,NULL); | |
| 799 g_free(filename); | |
| 4701 | 800 |
| 4737 | 801 /* "Hey, what's all this crap?" you ask. Status icons will be themeable too, and |
| 4687 | 802 then it will look up protoname from the theme */ |
| 803 } else { | |
| 804 char *image = g_strdup_printf("%s.png", protoname); | |
| 805 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
| 806 status = gdk_pixbuf_new_from_file(filename,NULL); | |
| 807 g_free(image); | |
| 808 g_free(filename); | |
|
1929
d51ea669d84e
[gaim-migrate @ 1939]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1918
diff
changeset
|
809 |
| 4687 | 810 } |
| 4737 | 811 |
| 4687 | 812 if (!status) |
| 813 return NULL; | |
| 4737 | 814 |
| 4687 | 815 scale = gdk_pixbuf_scale_simple(status, scalesize, scalesize, GDK_INTERP_BILINEAR); |
| 4737 | 816 |
| 817 g_object_unref(G_OBJECT(status)); | |
| 818 | |
| 4687 | 819 /* Emblems */ |
| 4737 | 820 |
| 4687 | 821 /* Each protocol can specify up to four "emblems" to composite over the base icon. "away", "busy", "mobile user" |
| 822 * are all examples of states represented by emblems. I'm not even really sure I like this yet. */ | |
| 4737 | 823 |
| 4687 | 824 /* XXX Clean this crap up, yo. */ |
| 825 if (se) { | |
| 826 char *image = g_strdup_printf("%s.png", se); | |
| 827 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
| 828 g_free(image); | |
| 829 emblem = gdk_pixbuf_new_from_file(filename,NULL); | |
| 830 g_free(filename); | |
| 831 if (emblem) { | |
| 4724 | 832 if (size == GAIM_STATUS_ICON_LARGE) |
| 4687 | 833 gdk_pixbuf_composite (emblem, |
| 834 scale, 15, 15, | |
| 835 15, 15, | |
| 836 15, 15, | |
| 837 1, 1, | |
| 838 GDK_INTERP_BILINEAR, | |
| 839 255); | |
| 840 else | |
| 841 gdk_pixbuf_composite (emblem, | |
| 5017 | 842 scale, 5, 5, |
| 843 10, 10, | |
| 844 5, 5, | |
| 845 .6, .6, | |
| 4687 | 846 GDK_INTERP_BILINEAR, |
| 847 255); | |
| 4737 | 848 g_object_unref(G_OBJECT(emblem)); |
| 4687 | 849 } |
| 850 } | |
| 851 if (sw) { | |
| 852 char *image = g_strdup_printf("%s.png", sw); | |
| 853 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
| 854 g_free(image); | |
| 855 emblem = gdk_pixbuf_new_from_file(filename,NULL); | |
| 856 g_free(filename); | |
| 857 if (emblem) { | |
| 4737 | 858 gdk_pixbuf_composite (emblem, |
| 859 scale, 0, 15, | |
| 860 15, 15, | |
| 861 0, 15, | |
| 862 1, 1, | |
| 863 GDK_INTERP_BILINEAR, | |
| 864 255); | |
| 865 g_object_unref(G_OBJECT(emblem)); | |
| 4687 | 866 } |
| 867 } | |
| 868 if (nw) { | |
| 869 char *image = g_strdup_printf("%s.png", nw); | |
| 870 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
| 871 g_free(image); | |
| 872 emblem = gdk_pixbuf_new_from_file(filename,NULL); | |
| 873 g_free(filename); | |
| 874 if (emblem) { | |
| 875 gdk_pixbuf_composite (emblem, | |
| 876 scale, 0, 0, | |
| 877 15, 15, | |
| 878 0, 0, | |
| 879 1, 1, | |
| 880 GDK_INTERP_BILINEAR, | |
| 881 255); | |
| 4737 | 882 g_object_unref(G_OBJECT(emblem)); |
| 4687 | 883 } |
| 884 } | |
| 885 if (ne) { | |
| 886 char *image = g_strdup_printf("%s.png", ne); | |
| 887 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
| 888 g_free(image); | |
| 889 emblem = gdk_pixbuf_new_from_file(filename,NULL); | |
| 890 g_free(filename); | |
| 891 if (emblem) { | |
| 892 gdk_pixbuf_composite (emblem, | |
| 893 scale, 15, 0, | |
| 894 15, 15, | |
| 895 15, 0, | |
| 896 1, 1, | |
| 897 GDK_INTERP_BILINEAR, | |
| 898 255); | |
| 4954 | 899 g_object_unref(G_OBJECT(emblem)); |
| 4687 | 900 } |
| 4737 | 901 } |
| 4687 | 902 |
| 4737 | 903 |
| 4718 | 904 /* Idle grey buddies affects the whole row. This converts the status icon to greyscale. */ |
| 5068 | 905 if (b->present == GAIM_BUDDY_OFFLINE) |
| 4928 | 906 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); |
| 907 else if (b->idle && blist_options & OPT_BLIST_GREY_IDLERS) | |
| 908 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.25, FALSE); | |
| 4687 | 909 return scale; |
| 1 | 910 } |
| 911 | |
| 4737 | 912 static GdkPixbuf *gaim_gtk_blist_get_buddy_icon(struct buddy *b) |
| 1 | 913 { |
| 4687 | 914 /* This just opens a file from ~/.gaim/icons/screenname. This needs to change to be more gooder. */ |
| 4737 | 915 char *file; |
| 916 GdkPixbuf *buf, *ret; | |
| 917 | |
| 4687 | 918 if (!(blist_options & OPT_BLIST_SHOW_ICONS)) |
| 919 return NULL; | |
| 4737 | 920 |
| 4757 | 921 if ((file = gaim_buddy_get_setting(b, "buddy_icon")) == NULL) |
| 922 return NULL; | |
| 923 | |
| 4737 | 924 buf = gdk_pixbuf_new_from_file(file, NULL); |
| 925 g_free(file); | |
| 926 | |
| 927 | |
| 4687 | 928 if (buf) { |
| 5068 | 929 if (!GAIM_BUDDY_IS_ONLINE(b)) |
| 4928 | 930 gdk_pixbuf_saturate_and_pixelate(buf, buf, 0.0, FALSE); |
| 931 if (b->idle && blist_options & OPT_BLIST_GREY_IDLERS) | |
| 932 gdk_pixbuf_saturate_and_pixelate(buf, buf, 0.25, FALSE); | |
| 933 | |
| 4737 | 934 ret = gdk_pixbuf_scale_simple(buf,30,30, GDK_INTERP_BILINEAR); |
| 935 g_object_unref(G_OBJECT(buf)); | |
| 936 return ret; | |
|
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
937 } |
| 4687 | 938 return NULL; |
| 2986 | 939 } |
| 940 | |
| 4810 | 941 static gchar *gaim_gtk_blist_get_name_markup(struct buddy *b, gboolean selected) |
| 1 | 942 { |
| 4687 | 943 char *name = gaim_get_buddy_alias(b); |
| 944 char *esc = g_markup_escape_text(name, strlen(name)), *text = NULL; | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
945 GaimPlugin *prpl; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
946 GaimPluginProtocolInfo *prpl_info = NULL; |
| 4687 | 947 /* XXX Clean up this crap */ |
| 4699 | 948 |
| 4687 | 949 int ihrs, imin; |
| 4724 | 950 char *idletime = NULL, *warning = NULL, *statustext = NULL; |
| 4732 | 951 time_t t; |
|
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
952 |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
953 prpl = gaim_find_prpl(b->account->protocol); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
954 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
955 if (prpl != NULL) |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
956 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
957 |
| 4687 | 958 if (!(blist_options & OPT_BLIST_SHOW_ICONS)) { |
| 5068 | 959 if ((b->idle && blist_options & OPT_BLIST_GREY_IDLERS && !selected) || !GAIM_BUDDY_IS_ONLINE(b)) { |
| 4718 | 960 text = g_strdup_printf("<span color='dim grey'>%s</span>", |
| 4699 | 961 esc); |
| 4687 | 962 g_free(esc); |
| 963 return text; | |
| 964 } else { | |
| 965 return esc; | |
| 966 } | |
| 1 | 967 } |
| 968 | |
| 4687 | 969 time(&t); |
| 970 ihrs = (t - b->idle) / 3600; | |
| 971 imin = ((t - b->idle) / 60) % 60; | |
| 4699 | 972 |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
973 if (prpl && prpl_info->status_text) { |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
974 char *tmp = prpl_info->status_text(b); |
| 4815 | 975 const char *end; |
| 976 | |
| 977 if(tmp && !g_utf8_validate(tmp, -1, &end)) { | |
| 978 char *new = g_strndup(tmp, | |
| 979 g_utf8_pointer_to_offset(tmp, end)); | |
| 980 g_free(tmp); | |
| 981 tmp = new; | |
| 982 } | |
| 4732 | 983 |
| 984 if(tmp) { | |
| 4855 | 985 char buf[32]; |
| 986 char *c = tmp; | |
| 987 int length = 0, vis=0; | |
| 988 gboolean inside = FALSE; | |
| 4806 | 989 g_strdelimit(tmp, "\n", ' '); |
|
4852
d1c17e81055e
[gaim-migrate @ 5179]
Christian Hammond <chipx86@chipx86.com>
parents:
4847
diff
changeset
|
990 |
| 4855 | 991 while(*c && vis < 20) { |
| 992 if(*c == '&') | |
| 993 inside = TRUE; | |
| 4856 | 994 else if(*c == ';') |
| 995 inside = FALSE; | |
| 4855 | 996 if(!inside) |
| 997 vis++; | |
| 998 length++; | |
| 999 c++; /* this is fun */ | |
| 1000 } | |
|
4852
d1c17e81055e
[gaim-migrate @ 5179]
Christian Hammond <chipx86@chipx86.com>
parents:
4847
diff
changeset
|
1001 |
| 4855 | 1002 if(vis == 20) |
| 1003 g_snprintf(buf, sizeof(buf), "%%.%ds...", length); | |
| 1004 else | |
| 1005 g_snprintf(buf, sizeof(buf), "%%s "); | |
|
4852
d1c17e81055e
[gaim-migrate @ 5179]
Christian Hammond <chipx86@chipx86.com>
parents:
4847
diff
changeset
|
1006 |
| 4855 | 1007 statustext = g_strdup_printf(buf, tmp); |
|
4852
d1c17e81055e
[gaim-migrate @ 5179]
Christian Hammond <chipx86@chipx86.com>
parents:
4847
diff
changeset
|
1008 |
| 4732 | 1009 g_free(tmp); |
| 1010 } | |
| 4722 | 1011 } |
| 4732 | 1012 |
| 5002 | 1013 if (b->idle > 0) { |
| 4687 | 1014 if (ihrs) |
| 4757 | 1015 idletime = g_strdup_printf(_("Idle (%dh%02dm) "), ihrs, imin); |
| 4687 | 1016 else |
| 4757 | 1017 idletime = g_strdup_printf(_("Idle (%dm) "), imin); |
| 4687 | 1018 } |
| 4757 | 1019 |
| 4687 | 1020 if (b->evil > 0) |
| 4757 | 1021 warning = g_strdup_printf(_("Warned (%d%%) "), b->evil); |
| 1022 | |
| 5135 | 1023 if(!GAIM_BUDDY_IS_ONLINE(b) && !statustext) |
| 1024 statustext = g_strdup("Offline "); | |
| 1025 | |
| 4810 | 1026 if (b->idle && blist_options & OPT_BLIST_GREY_IDLERS && !selected) { |
| 4916 | 1027 text = g_strdup_printf("<span color='dim grey'>%s</span>\n" |
| 5135 | 1028 "<span color='dim grey' size='smaller'>%s%s%s</span>", |
| 4687 | 1029 esc, |
| 4722 | 1030 statustext != NULL ? statustext : "", |
| 5135 | 1031 idletime != NULL ? idletime : "", |
| 1032 warning != NULL ? warning : ""); | |
| 5068 | 1033 } else if (statustext == NULL && idletime == NULL && warning == NULL && GAIM_BUDDY_IS_ONLINE(b)) { |
| 4916 | 1034 text = g_strdup(esc); |
| 4797 | 1035 } else { |
| 4916 | 1036 text = g_strdup_printf("%s\n" |
| 5135 | 1037 "<span %s size='smaller'>%s%s%s</span>", esc, |
| 4916 | 1038 selected ? "" : "color='dim grey'", |
| 1039 statustext != NULL ? statustext : "", | |
| 1040 idletime != NULL ? idletime : "", | |
| 5135 | 1041 warning != NULL ? warning : ""); |
| 4797 | 1042 } |
| 4722 | 1043 if (idletime) |
| 4687 | 1044 g_free(idletime); |
| 4722 | 1045 if (warning) |
| 4687 | 1046 g_free(warning); |
| 4722 | 1047 if (statustext) |
| 1048 g_free(statustext); | |
| 4737 | 1049 if (esc) |
| 1050 g_free(esc); | |
| 4699 | 1051 |
| 4687 | 1052 return text; |
| 1053 } | |
|
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
1054 |
| 4840 | 1055 static void gaim_gtk_blist_restore_position() |
| 1056 { | |
| 1057 /* if the window exists, is hidden, we're saving positions, and the position is sane... */ | |
| 1058 if(gtkblist && gtkblist->window && | |
| 1059 !GTK_WIDGET_VISIBLE(gtkblist->window) && | |
| 1060 blist_pos.width != 0) { | |
| 1061 /* ...check position is on screen... */ | |
| 1062 if (blist_pos.x >= gdk_screen_width()) | |
| 1063 blist_pos.x = gdk_screen_width() - 100; | |
| 1064 else if (blist_pos.x < 0) | |
| 1065 blist_pos.x = 100; | |
| 1066 | |
| 1067 if (blist_pos.y >= gdk_screen_height()) | |
| 1068 blist_pos.y = gdk_screen_height() - 100; | |
| 1069 else if (blist_pos.y < 0) | |
| 1070 blist_pos.y = 100; | |
| 1071 | |
| 1072 /* ...and move it back. */ | |
| 1073 gtk_window_move(GTK_WINDOW(gtkblist->window), blist_pos.x, blist_pos.y); | |
| 1074 gtk_window_resize(GTK_WINDOW(gtkblist->window), blist_pos.width, blist_pos.height); | |
| 1075 } | |
| 1076 } | |
| 1077 | |
| 4944 | 1078 static gboolean gaim_gtk_blist_refresh_timer(struct gaim_buddy_list *list) |
| 1079 { | |
| 1080 GaimBlistNode *group = list->root; | |
| 1081 GaimBlistNode *buddy; | |
| 1082 | |
| 1083 while (group) { | |
| 1084 buddy = group->child; | |
| 1085 while (buddy) { | |
| 1086 if (((struct buddy *)buddy)->idle) | |
| 1087 gaim_gtk_blist_update(list, buddy); | |
| 1088 buddy = buddy->next; | |
| 1089 } | |
| 1090 group = group->next; | |
| 1091 } | |
| 1092 | |
| 1093 /* keep on going */ | |
| 1094 return TRUE; | |
| 1095 } | |
| 4840 | 1096 |
| 4687 | 1097 /********************************************************************************** |
| 1098 * Public API Functions * | |
| 1099 **********************************************************************************/ | |
|
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1100 static void gaim_gtk_blist_new_list(struct gaim_buddy_list *blist) |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1101 { |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1102 blist->ui_data = g_new0(struct gaim_gtk_buddy_list, 1); |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1103 } |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1104 |
| 4729 | 1105 void gaim_gtk_blist_update_columns() |
| 1106 { | |
| 5187 | 1107 if(!gtkblist) |
| 1108 return; | |
| 1109 | |
| 4729 | 1110 if (blist_options & OPT_BLIST_SHOW_ICONS) { |
| 1111 gtk_tree_view_column_set_visible(gtkblist->buddy_icon_column, TRUE); | |
| 1112 gtk_tree_view_column_set_visible(gtkblist->idle_column, FALSE); | |
| 1113 gtk_tree_view_column_set_visible(gtkblist->warning_column, FALSE); | |
| 1114 } else { | |
| 1115 gtk_tree_view_column_set_visible(gtkblist->idle_column, blist_options & OPT_BLIST_SHOW_IDLETIME); | |
| 1116 gtk_tree_view_column_set_visible(gtkblist->warning_column, blist_options & OPT_BLIST_SHOW_WARN); | |
| 1117 gtk_tree_view_column_set_visible(gtkblist->buddy_icon_column, FALSE); | |
| 1118 } | |
| 1119 } | |
| 1120 | |
| 4702 | 1121 enum {DRAG_BUDDY, DRAG_ROW}; |
| 1122 | |
| 4834 | 1123 static char * |
| 1124 item_factory_translate_func (const char *path, gpointer func_data) | |
| 1125 { | |
| 1126 return _(path); | |
| 1127 } | |
| 1128 | |
| 4687 | 1129 static void gaim_gtk_blist_show(struct gaim_buddy_list *list) |
| 1130 { | |
| 1131 GtkItemFactory *ift; | |
| 1132 GtkCellRenderer *rend; | |
| 1133 GtkTreeViewColumn *column; | |
| 1134 GtkWidget *sw; | |
| 1135 GtkWidget *button; | |
| 4694 | 1136 GtkSizeGroup *sg; |
| 5089 | 1137 GtkAccelGroup *accel_group; |
| 4810 | 1138 GtkTreeSelection *selection; |
| 4781 | 1139 GtkTargetEntry gte[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, |
| 4702 | 1140 {"application/x-im-contact", 0, DRAG_BUDDY}}; |
| 4690 | 1141 |
| 4745 | 1142 if (gtkblist && gtkblist->window) { |
| 4687 | 1143 gtk_widget_show(gtkblist->window); |
| 1144 return; | |
| 1145 } | |
| 4690 | 1146 |
|
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1147 gtkblist = GAIM_GTK_BLIST(list); |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1148 |
| 4687 | 1149 gtkblist->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| 4840 | 1150 gtk_window_set_role(GTK_WINDOW(gtkblist->window), "buddy_list"); |
| 4964 | 1151 gtk_window_set_title(GTK_WINDOW(gtkblist->window), _("Buddy List")); |
| 4690 | 1152 |
| 5168 | 1153 GTK_WINDOW(gtkblist->window)->allow_shrink = TRUE; |
| 1154 | |
| 4925 | 1155 gtkblist->vbox = gtk_vbox_new(FALSE, 0); |
| 4687 | 1156 gtk_container_add(GTK_CONTAINER(gtkblist->window), gtkblist->vbox); |
| 1 | 1157 |
| 4840 | 1158 g_signal_connect(G_OBJECT(gtkblist->window), "delete_event", G_CALLBACK(gtk_blist_delete_cb), NULL); |
| 1159 g_signal_connect(G_OBJECT(gtkblist->window), "configure_event", G_CALLBACK(gtk_blist_configure_cb), NULL); | |
| 1160 g_signal_connect(G_OBJECT(gtkblist->window), "visibility_notify_event", G_CALLBACK(gtk_blist_visibility_cb), NULL); | |
| 1161 gtk_widget_add_events(gtkblist->window, GDK_VISIBILITY_NOTIFY_MASK); | |
| 4698 | 1162 |
| 4687 | 1163 /******************************* Menu bar *************************************/ |
| 5089 | 1164 accel_group = gtk_accel_group_new(); |
| 1165 gtk_window_add_accel_group(GTK_WINDOW (gtkblist->window), accel_group); | |
| 1166 g_object_unref(accel_group); | |
| 1167 ift = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<GaimMain>", accel_group); | |
| 4834 | 1168 gtk_item_factory_set_translate_func (ift, |
| 1169 item_factory_translate_func, | |
| 1170 NULL, NULL); | |
| 4687 | 1171 gtk_item_factory_create_items(ift, sizeof(blist_menu) / sizeof(*blist_menu), |
| 1172 blist_menu, NULL); | |
| 1173 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtk_item_factory_get_widget(ift, "<GaimMain>"), FALSE, FALSE, 0); | |
| 1 | 1174 |
| 4834 | 1175 awaymenu = gtk_item_factory_get_widget(ift, N_("/Tools/Away")); |
| 4694 | 1176 do_away_menu(); |
| 1177 | |
|
5032
cb700c07ee07
[gaim-migrate @ 5375]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
1178 gtkblist->bpmenu = gtk_item_factory_get_widget(ift, N_("/Tools/Buddy Pounce")); |
|
cb700c07ee07
[gaim-migrate @ 5375]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
1179 gaim_gtkpounce_menu_build(gtkblist->bpmenu); |
| 4696 | 1180 |
| 4834 | 1181 protomenu = gtk_item_factory_get_widget(ift, N_("/Tools/Protocol Actions")); |
| 4696 | 1182 do_proto_menu(); |
| 1183 | |
| 4687 | 1184 /****************************** GtkTreeView **********************************/ |
| 1185 sw = gtk_scrolled_window_new(NULL,NULL); | |
| 1186 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
| 1187 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
| 1188 | |
| 5060 | 1189 gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN, G_TYPE_STRING, |
| 4687 | 1190 G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER); |
| 4702 | 1191 |
| 4687 | 1192 gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel)); |
| 4943 | 1193 gtk_widget_set_size_request(gtkblist->treeview, -1, 200); |
| 4704 | 1194 |
| 4810 | 1195 /* Set up selection stuff */ |
| 1196 | |
| 1197 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | |
| 1198 g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(gaim_gtk_blist_selection_changed), NULL); | |
| 1199 | |
| 1200 | |
| 4702 | 1201 /* Set up dnd */ |
| 1202 gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(gtkblist->treeview), GDK_BUTTON1_MASK, gte, | |
| 1203 2, GDK_ACTION_COPY); | |
| 4704 | 1204 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(gtkblist->treeview), gte, 2, |
| 4702 | 1205 GDK_ACTION_COPY | GDK_ACTION_MOVE); |
| 4704 | 1206 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-received", G_CALLBACK(gaim_gtk_blist_drag_data_rcv_cb), NULL); |
| 1207 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-get", G_CALLBACK(gaim_gtk_blist_drag_data_get_cb), NULL); | |
| 1208 | |
| 4724 | 1209 /* Tooltips */ |
| 1210 g_signal_connect(G_OBJECT(gtkblist->treeview), "motion-notify-event", G_CALLBACK(gaim_gtk_blist_motion_cb), NULL); | |
| 1211 g_signal_connect(G_OBJECT(gtkblist->treeview), "leave-notify-event", G_CALLBACK(gaim_gtk_blist_leave_cb), NULL); | |
| 4687 | 1212 |
| 1213 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE); | |
| 1 | 1214 |
| 5060 | 1215 column = gtk_tree_view_column_new (); |
| 1216 | |
| 4687 | 1217 rend = gtk_cell_renderer_pixbuf_new(); |
| 5060 | 1218 gtk_tree_view_column_pack_start (column, rend, FALSE); |
| 1219 gtk_tree_view_column_set_attributes (column, rend, | |
| 1220 "pixbuf", STATUS_ICON_COLUMN, | |
| 1221 "visible", STATUS_ICON_VISIBLE_COLUMN, | |
| 1222 NULL); | |
| 4933 | 1223 g_object_set(rend, "xalign", 0.0, "ypad", 0, NULL); |
| 4706 | 1224 |
| 4687 | 1225 rend = gtk_cell_renderer_text_new(); |
| 5060 | 1226 gtk_tree_view_column_pack_start (column, rend, TRUE); |
| 1227 gtk_tree_view_column_set_attributes (column, rend, | |
| 1228 "markup", NAME_COLUMN, | |
| 1229 NULL); | |
| 1230 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); | |
| 1231 | |
| 4687 | 1232 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), column); |
| 4706 | 1233 |
| 4687 | 1234 rend = gtk_cell_renderer_text_new(); |
| 4725 | 1235 gtkblist->warning_column = gtk_tree_view_column_new_with_attributes("Warning", rend, "markup", WARNING_COLUMN, NULL); |
| 1236 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->warning_column); | |
| 4796 | 1237 g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); |
| 4687 | 1238 |
| 1239 rend = gtk_cell_renderer_text_new(); | |
| 4725 | 1240 gtkblist->idle_column = gtk_tree_view_column_new_with_attributes("Idle", rend, "markup", IDLE_COLUMN, NULL); |
| 1241 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->idle_column); | |
| 4796 | 1242 g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); |
| 1 | 1243 |
| 4687 | 1244 rend = gtk_cell_renderer_pixbuf_new(); |
| 4725 | 1245 gtkblist->buddy_icon_column = gtk_tree_view_column_new_with_attributes("Buddy Icon", rend, "pixbuf", BUDDY_ICON_COLUMN, NULL); |
| 4796 | 1246 g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); |
| 4725 | 1247 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->buddy_icon_column); |
| 4718 | 1248 |
| 4687 | 1249 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-activated", G_CALLBACK(gtk_blist_row_activated_cb), NULL); |
| 5142 | 1250 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-expanded", G_CALLBACK(gtk_blist_row_expanded_cb), NULL); |
| 1251 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-collapsed", G_CALLBACK(gtk_blist_row_collapsed_cb), NULL); | |
| 4687 | 1252 g_signal_connect(G_OBJECT(gtkblist->treeview), "button-press-event", G_CALLBACK(gtk_blist_button_press_cb), NULL); |
|
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
1253 |
| 4687 | 1254 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), sw, TRUE, TRUE, 0); |
| 1255 gtk_container_add(GTK_CONTAINER(sw), gtkblist->treeview); | |
| 4725 | 1256 gaim_gtk_blist_update_columns(); |
| 4934 | 1257 |
| 4956 | 1258 /* set the Show Offline Buddies option. must be done |
| 1259 * after the treeview or faceprint gets mad. -Robot101 | |
| 1260 */ | |
| 5000 | 1261 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (ift, N_("/Buddies/Show Offline Buddies"))), |
| 4956 | 1262 blist_options & OPT_BLIST_SHOW_OFFLINE); |
| 5000 | 1263 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (ift, N_("/Buddies/Show Empty Groups"))), |
| 1264 !(blist_options & OPT_BLIST_NO_MT_GRP)); | |
| 4956 | 1265 |
| 1266 /* OK... let's show this bad boy. */ | |
| 1267 gaim_gtk_blist_refresh(list); | |
| 1268 gaim_gtk_blist_restore_position(); | |
| 1269 gtk_widget_show_all(gtkblist->window); | |
| 1270 | |
| 4687 | 1271 /**************************** Button Box **************************************/ |
| 4956 | 1272 /* add this afterwards so it doesn't force up the width of the window */ |
| 4694 | 1273 |
| 5018 | 1274 gtkblist->tooltips = gtk_tooltips_new(); |
| 4973 | 1275 |
| 4694 | 1276 sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); |
| 4687 | 1277 gtkblist->bbox = gtk_hbox_new(TRUE, 0); |
| 1278 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->bbox, FALSE, FALSE, 0); | |
| 4956 | 1279 gtk_widget_show(gtkblist->bbox); |
| 1280 | |
| 4687 | 1281 button = gaim_pixbuf_button_from_stock(_("IM"), GAIM_STOCK_IM, GAIM_BUTTON_VERTICAL); |
| 1282 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); | |
| 1283 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
| 4694 | 1284 gtk_size_group_add_widget(sg, button); |
| 4692 | 1285 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_im_cb), |
| 4697 | 1286 gtkblist->treeview); |
| 5018 | 1287 gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Send a message to the selected buddy"), NULL); |
| 4956 | 1288 gtk_widget_show(button); |
| 1289 | |
| 4687 | 1290 button = gaim_pixbuf_button_from_stock(_("Get Info"), GAIM_STOCK_INFO, GAIM_BUTTON_VERTICAL); |
| 1291 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); | |
| 1292 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
| 4694 | 1293 gtk_size_group_add_widget(sg, button); |
| 1294 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_info_cb), | |
| 4697 | 1295 gtkblist->treeview); |
| 5018 | 1296 gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Get information on the selected buddy"), NULL); |
| 4956 | 1297 gtk_widget_show(button); |
| 4729 | 1298 |
| 4687 | 1299 button = gaim_pixbuf_button_from_stock(_("Chat"), GAIM_STOCK_CHAT, GAIM_BUTTON_VERTICAL); |
| 1300 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); | |
| 1301 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
| 4694 | 1302 gtk_size_group_add_widget(sg, button); |
| 1303 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_chat_cb), NULL); | |
| 5018 | 1304 gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Join a chat room"), NULL); |
| 4956 | 1305 gtk_widget_show(button); |
| 4694 | 1306 |
| 5024 | 1307 button = gaim_pixbuf_button_from_stock(_("Away"), GAIM_STOCK_ICON_AWAY, GAIM_BUTTON_VERTICAL); |
| 4687 | 1308 gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); |
| 1309 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
| 4694 | 1310 gtk_size_group_add_widget(sg, button); |
| 1311 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_away_cb), NULL); | |
| 5018 | 1312 gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Set an away message"), NULL); |
| 4956 | 1313 gtk_widget_show(button); |
| 4687 | 1314 |
| 4956 | 1315 /* this will show the right image/label widgets for us */ |
| 4944 | 1316 gaim_gtk_blist_update_toolbar(); |
| 1317 | |
| 4956 | 1318 /* start the refresh timer */ |
| 4944 | 1319 gtkblist->refresh_timer = g_timeout_add(30000, (GSourceFunc)gaim_gtk_blist_refresh_timer, list); |
| 4687 | 1320 } |
|
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
1321 |
| 4687 | 1322 void gaim_gtk_blist_refresh(struct gaim_buddy_list *list) |
| 1323 { | |
| 1324 GaimBlistNode *group = list->root; | |
| 1325 GaimBlistNode *buddy; | |
| 4690 | 1326 |
| 4687 | 1327 while (group) { |
| 4916 | 1328 buddy = group->child; |
| 4687 | 1329 gaim_gtk_blist_update(list, group); |
| 1330 while (buddy) { | |
| 4699 | 1331 gaim_gtk_blist_update(list, buddy); |
| 4687 | 1332 buddy = buddy->next; |
| 1333 } | |
| 1334 group = group->next; | |
| 1335 } | |
| 1336 } | |
| 1 | 1337 |
| 4699 | 1338 static gboolean get_iter_from_node_helper(GaimBlistNode *node, GtkTreeIter *iter, GtkTreeIter *root) { |
| 4867 | 1339 |
| 4699 | 1340 do { |
| 1341 GaimBlistNode *n; | |
| 1342 GtkTreeIter child; | |
| 1343 | |
| 1344 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), root, NODE_COLUMN, &n, -1); | |
| 1345 if(n == node) { | |
| 1346 *iter = *root; | |
| 1347 return TRUE; | |
| 1348 } | |
| 1349 | |
| 1350 if(gtk_tree_model_iter_children(GTK_TREE_MODEL(gtkblist->treemodel), &child, root)) { | |
| 1351 if(get_iter_from_node_helper(node,iter,&child)) | |
| 1352 return TRUE; | |
| 1353 } | |
| 1354 } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(gtkblist->treemodel), root)); | |
| 1355 | |
| 1356 return FALSE; | |
| 1357 } | |
| 1358 | |
| 1359 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter) { | |
| 1360 GtkTreeIter root; | |
| 1361 | |
| 1362 if (!gtkblist) | |
| 1363 return FALSE; | |
| 1364 | |
| 1365 if(!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(gtkblist->treemodel), &root)) | |
| 1366 return FALSE; | |
| 1367 | |
| 1368 return get_iter_from_node_helper(node, iter, &root); | |
| 1369 } | |
| 1370 | |
| 4944 | 1371 /* |
| 1372 * These state assignments suck. I'm sorry. They're for historical reasons. | |
| 1373 * Roll on new prefs. -Robot101 | |
| 1374 * | |
| 1375 * NO_BUTTON_TEXT && SHOW_BUTTON_XPM - image | |
| 1376 * !NO_BUTTON_TEXT && !SHOW_BUTTON_XPM - text | |
| 1377 * !NO_BUTTON_TEXT && SHOW_BUTTON_XPM - text & images | |
| 1378 * NO_BUTTON_TEXT && !SHOW_BUTTON_XPM - none | |
| 1379 */ | |
| 1380 | |
| 1381 static void gaim_gtk_blist_update_toolbar_icons (GtkWidget *widget, gpointer data) { | |
| 1382 if (GTK_IS_IMAGE(widget)) { | |
| 1383 if (blist_options & OPT_BLIST_SHOW_BUTTON_XPM) | |
| 1384 gtk_widget_show(widget); | |
| 1385 else | |
| 1386 gtk_widget_hide(widget); | |
| 1387 } else if (GTK_IS_LABEL(widget)) { | |
| 1388 if (blist_options & OPT_BLIST_NO_BUTTON_TEXT) | |
| 1389 gtk_widget_hide(widget); | |
| 1390 else | |
| 1391 gtk_widget_show(widget); | |
| 1392 } else if (GTK_IS_CONTAINER(widget)) { | |
| 1393 gtk_container_foreach(GTK_CONTAINER(widget), gaim_gtk_blist_update_toolbar_icons, NULL); | |
| 1394 } | |
| 1395 } | |
| 1396 | |
| 4697 | 1397 void gaim_gtk_blist_update_toolbar() { |
| 1398 if (!gtkblist) | |
| 1399 return; | |
| 4699 | 1400 |
| 4944 | 1401 if (blist_options & OPT_BLIST_NO_BUTTON_TEXT && !(blist_options & OPT_BLIST_SHOW_BUTTON_XPM)) |
| 4697 | 1402 gtk_widget_hide(gtkblist->bbox); |
| 4944 | 1403 else { |
| 1404 gtk_container_foreach(GTK_CONTAINER(gtkblist->bbox), gaim_gtk_blist_update_toolbar_icons, NULL); | |
| 4956 | 1405 gtk_widget_show(gtkblist->bbox); |
| 4944 | 1406 } |
| 4697 | 1407 } |
| 1408 | |
| 4701 | 1409 static void gaim_gtk_blist_remove(struct gaim_buddy_list *list, GaimBlistNode *node) |
| 1410 { | |
| 1411 GtkTreeIter iter; | |
| 1412 | |
| 4912 | 1413 /* For some reason, we're called before we have a buddy list sometimes */ |
| 1414 if(!gtkblist) | |
| 1415 return; | |
| 1416 | |
| 4831 | 1417 if(gtkblist->selected_node == node) |
| 1418 gtkblist->selected_node = NULL; | |
| 1419 | |
| 4701 | 1420 if (get_iter_from_node(node, &iter)) { |
| 1421 gtk_tree_store_remove(gtkblist->treemodel, &iter); | |
| 5041 | 1422 if(GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 1423 gaim_gtk_blist_update(list, node->parent); | |
| 4701 | 1424 } |
| 1425 } | |
| 1426 } | |
| 1427 | |
| 4810 | 1428 static gboolean do_selection_changed(GaimBlistNode *new_selection) |
| 1429 { | |
| 1430 GaimBlistNode *old_selection = gtkblist->selected_node; | |
| 1431 | |
| 1432 if(new_selection != gtkblist->selected_node) { | |
| 1433 gtkblist->selected_node = new_selection; | |
| 1434 if(new_selection) | |
| 1435 gaim_gtk_blist_update(NULL, new_selection); | |
| 1436 if(old_selection) | |
| 1437 gaim_gtk_blist_update(NULL, old_selection); | |
| 1438 } | |
| 1439 | |
| 1440 return FALSE; | |
| 1441 } | |
| 1442 | |
| 1443 static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data) | |
| 1444 { | |
| 1445 GaimBlistNode *new_selection = NULL; | |
| 1446 GtkTreeIter iter; | |
| 1447 | |
| 1448 if(gtk_tree_selection_get_selected(selection, NULL, &iter)){ | |
| 1449 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, | |
| 1450 NODE_COLUMN, &new_selection, -1); | |
| 1451 } | |
| 1452 /* we set this up as a timeout, otherwise the blist flickers */ | |
| 1453 g_timeout_add(0, (GSourceFunc)do_selection_changed, new_selection); | |
| 1454 } | |
| 1455 | |
| 4936 | 1456 static void make_a_group(GaimBlistNode *node, GtkTreeIter *iter) { |
| 1457 GaimBlistNode *sibling; | |
| 1458 GtkTreeIter siblingiter; | |
| 4980 | 1459 struct group *group = (struct group *)node; |
| 1460 char *esc = g_markup_escape_text(group->name, -1); | |
| 1461 char *mark; | |
| 1462 | |
| 1463 if(blist_options & OPT_BLIST_SHOW_GRPNUM) | |
| 1464 mark = g_strdup_printf("<span weight='bold'>%s</span> (%d/%d)", esc, gaim_blist_get_group_online_count(group), gaim_blist_get_group_size(group, FALSE)); | |
| 1465 else | |
| 1466 mark = g_strdup_printf("<span weight='bold'>%s</span>", esc); | |
| 1467 | |
| 4936 | 1468 g_free(esc); |
| 4980 | 1469 |
| 4936 | 1470 sibling = node->prev; |
| 1471 while (sibling && !get_iter_from_node(sibling, &siblingiter)) { | |
| 1472 sibling = sibling->prev; | |
| 1473 } | |
| 1474 | |
| 1475 gtk_tree_store_insert_after(gtkblist->treemodel, iter, NULL, | |
| 1476 sibling ? &siblingiter : NULL); | |
| 1477 gtk_tree_store_set(gtkblist->treemodel, iter, | |
| 5060 | 1478 STATUS_ICON_COLUMN, NULL, |
| 1479 STATUS_ICON_VISIBLE_COLUMN, FALSE, | |
| 4936 | 1480 NAME_COLUMN, mark, |
| 1481 NODE_COLUMN, node, | |
| 1482 -1); | |
| 1483 g_free(mark); | |
| 1484 } | |
| 1485 | |
| 4701 | 1486 |
| 4687 | 1487 static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node) |
| 1488 { | |
| 4699 | 1489 GtkTreeIter iter; |
| 4936 | 1490 GtkTreePath *expand = NULL; |
| 4699 | 1491 gboolean new_entry = FALSE; |
|
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
1492 |
| 4687 | 1493 if (!gtkblist) |
| 1494 return; | |
| 4699 | 1495 |
| 1496 if (!get_iter_from_node(node, &iter)) { /* This is a newly added node */ | |
| 1497 new_entry = TRUE; | |
| 4687 | 1498 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 5068 | 1499 if (((struct buddy*)node)->present != GAIM_BUDDY_OFFLINE || ((blist_options & OPT_BLIST_SHOW_OFFLINE) && ((struct buddy*)node)->account->gc)) { |
| 4699 | 1500 GtkTreeIter groupiter; |
| 1501 GaimBlistNode *oldersibling; | |
| 1502 GtkTreeIter oldersiblingiter; | |
| 5142 | 1503 char *collapsed = gaim_group_get_setting((struct group *)node->parent, "collapsed"); |
| 4690 | 1504 |
| 4936 | 1505 if(node->parent && |
| 1506 !get_iter_from_node(node->parent, &groupiter)) { | |
| 1507 /* This buddy's group has not yet been added. | |
| 1508 * We do that here */ | |
| 1509 make_a_group(node->parent, &groupiter); | |
| 5000 | 1510 } |
| 5142 | 1511 if(!collapsed) |
| 4936 | 1512 expand = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &groupiter); |
| 5142 | 1513 else |
| 1514 g_free(collapsed); | |
| 4810 | 1515 |
| 4699 | 1516 oldersibling = node->prev; |
| 4867 | 1517 while (oldersibling && !get_iter_from_node(oldersibling, &oldersiblingiter)) { |
| 4699 | 1518 oldersibling = oldersibling->prev; |
| 4867 | 1519 } |
| 4699 | 1520 |
| 1521 gtk_tree_store_insert_after(gtkblist->treemodel, &iter, &groupiter, oldersibling ? &oldersiblingiter : NULL); | |
| 4810 | 1522 |
| 5200 | 1523 if (blist_options & OPT_BLIST_POPUP) { |
| 1524 gtk_widget_show(gtkblist->window); | |
| 1525 gtk_window_deiconify(GTK_WINDOW(gtkblist->window)); | |
| 1526 gdk_window_raise(gtkblist->window->window); | |
| 1527 } | |
| 4699 | 1528 |
| 1529 } | |
| 1530 } | |
| 5000 | 1531 else if (GAIM_BLIST_NODE_IS_GROUP(node) && |
| 1532 ((blist_options & OPT_BLIST_SHOW_OFFLINE) || | |
| 1533 !(blist_options & OPT_BLIST_NO_MT_GRP))) { | |
| 4936 | 1534 make_a_group(node, &iter); |
| 1535 expand = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter); | |
| 4916 | 1536 } |
| 1537 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 5000 | 1538 if((blist_options & OPT_BLIST_NO_MT_GRP) && !(blist_options & OPT_BLIST_SHOW_OFFLINE) && !gaim_blist_get_group_online_count((struct group *)node)) { |
| 4916 | 1539 gtk_tree_store_remove(gtkblist->treemodel, &iter); |
| 4936 | 1540 } else { |
| 4980 | 1541 struct group *group = (struct group *)node; |
| 1542 char *esc = g_markup_escape_text(group->name, -1); | |
| 1543 char *mark; | |
| 1544 | |
| 1545 if(blist_options & OPT_BLIST_SHOW_GRPNUM) | |
| 1546 mark = g_strdup_printf("<span weight='bold'>%s</span> (%d/%d)", esc, gaim_blist_get_group_online_count(group), gaim_blist_get_group_size(group, FALSE)); | |
| 1547 else | |
| 1548 mark = g_strdup_printf("<span weight='bold'>%s</span>", esc); | |
| 1549 | |
| 4916 | 1550 g_free(esc); |
| 1551 gtk_tree_store_set(gtkblist->treemodel, &iter, | |
| 4936 | 1552 NAME_COLUMN, mark, |
| 1553 -1); | |
| 4916 | 1554 g_free(mark); |
| 1555 } | |
| 4699 | 1556 } |
|
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1557 |
| 5068 | 1558 if (GAIM_BLIST_NODE_IS_BUDDY(node) && (((struct buddy*)node)->present != GAIM_BUDDY_OFFLINE || ((blist_options & OPT_BLIST_SHOW_OFFLINE) && ((struct buddy*)node)->account->gc))) { |
| 4687 | 1559 GdkPixbuf *status, *avatar; |
| 1560 char *mark; | |
| 4697 | 1561 char *warning = NULL, *idle = NULL; |
| 1562 | |
| 4810 | 1563 gboolean selected = (gtkblist->selected_node == node); |
| 1564 | |
| 1565 status = gaim_gtk_blist_get_status_icon((struct buddy*)node, | |
| 4724 | 1566 blist_options & OPT_BLIST_SHOW_ICONS ? GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL); |
| 4687 | 1567 avatar = gaim_gtk_blist_get_buddy_icon((struct buddy*)node); |
| 4810 | 1568 mark = gaim_gtk_blist_get_name_markup((struct buddy*)node, selected); |
| 4697 | 1569 |
| 4725 | 1570 if (((struct buddy*)node)->idle > 0) { |
| 4697 | 1571 time_t t; |
| 1572 int ihrs, imin; | |
| 1573 time(&t); | |
| 1574 ihrs = (t - ((struct buddy *)node)->idle) / 3600; | |
| 1575 imin = ((t - ((struct buddy*)node)->idle) / 60) % 60; | |
| 4718 | 1576 if(ihrs > 0) |
| 1577 idle = g_strdup_printf("(%d:%02d)", ihrs, imin); | |
| 1578 else | |
| 1579 idle = g_strdup_printf("(%d)", imin); | |
| 4697 | 1580 } |
| 1581 | |
| 4725 | 1582 if (((struct buddy*)node)->evil > 0) |
| 4699 | 1583 warning = g_strdup_printf("%d%%", ((struct buddy*)node)->evil); |
| 4810 | 1584 |
| 4697 | 1585 |
| 4718 | 1586 if((blist_options & OPT_BLIST_GREY_IDLERS) |
| 1587 && ((struct buddy *)node)->idle) { | |
| 4810 | 1588 if(warning && !selected) { |
| 4718 | 1589 char *w2 = g_strdup_printf("<span color='dim grey'>%s</span>", |
| 1590 warning); | |
| 1591 g_free(warning); | |
| 1592 warning = w2; | |
| 1593 } | |
| 1594 | |
| 4810 | 1595 if(idle && !selected) { |
| 4718 | 1596 char *i2 = g_strdup_printf("<span color='dim grey'>%s</span>", |
| 1597 idle); | |
| 1598 g_free(idle); | |
| 1599 idle = i2; | |
| 1600 } | |
| 1601 } | |
| 1602 | |
| 4699 | 1603 gtk_tree_store_set(gtkblist->treemodel, &iter, |
| 4687 | 1604 STATUS_ICON_COLUMN, status, |
| 5060 | 1605 STATUS_ICON_VISIBLE_COLUMN, TRUE, |
| 4687 | 1606 NAME_COLUMN, mark, |
| 4697 | 1607 WARNING_COLUMN, warning, |
| 1608 IDLE_COLUMN, idle, | |
| 4699 | 1609 BUDDY_ICON_COLUMN, avatar, |
| 4687 | 1610 NODE_COLUMN, node, |
| 1611 -1); | |
| 4699 | 1612 |
| 5189 | 1613 if (blist_options & OPT_BLIST_POPUP && |
| 5200 | 1614 ((struct buddy *)node)->present == GAIM_BUDDY_SIGNING_OFF) { |
| 1615 gtk_widget_show(gtkblist->window); | |
| 1616 gtk_window_deiconify(GTK_WINDOW(gtkblist->window)); | |
| 1617 gdk_window_raise(gtkblist->window->window); | |
| 1618 } | |
| 5189 | 1619 |
| 4687 | 1620 g_free(mark); |
| 4697 | 1621 if (idle) |
| 1622 g_free(idle); | |
| 1623 if (warning) | |
| 1624 g_free(warning); | |
|
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1625 |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1626 if (status != NULL) |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1627 g_object_unref(status); |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1628 |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1629 if (avatar != NULL) |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1630 g_object_unref(avatar); |
|
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1631 |
| 4701 | 1632 } else if (GAIM_BLIST_NODE_IS_BUDDY(node) && !new_entry) { |
| 1633 gaim_gtk_blist_remove(list, node); | |
| 4687 | 1634 } |
| 4980 | 1635 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(gtkblist->treeview)); |
| 4936 | 1636 |
| 4974 | 1637 |
| 4936 | 1638 if(expand) { |
| 1639 gtk_tree_view_expand_row(GTK_TREE_VIEW(gtkblist->treeview), expand, TRUE); | |
| 1640 gtk_tree_path_free(expand); | |
| 1641 } | |
| 4980 | 1642 |
| 1643 if(GAIM_BLIST_NODE_IS_BUDDY(node)) | |
| 1644 gaim_gtk_blist_update(list, node->parent); | |
| 4687 | 1645 } |
|
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
1646 |
| 4687 | 1647 static void gaim_gtk_blist_destroy(struct gaim_buddy_list *list) |
| 1648 { | |
| 4770 | 1649 if (!gtkblist) |
| 1650 return; | |
| 4944 | 1651 |
| 4687 | 1652 gtk_widget_destroy(gtkblist->window); |
| 5018 | 1653 gtk_object_sink(GTK_OBJECT(gtkblist->tooltips)); |
| 4745 | 1654 |
| 4944 | 1655 if (gtkblist->refresh_timer) |
| 1656 g_source_remove(gtkblist->refresh_timer); | |
| 1657 if (gtkblist->timeout) | |
| 1658 g_source_remove(gtkblist->timeout); | |
| 1659 | |
| 1660 gtkblist->refresh_timer = 0; | |
| 1661 gtkblist->timeout = 0; | |
| 4745 | 1662 gtkblist->window = gtkblist->vbox = gtkblist->treeview = NULL; |
| 1663 gtkblist->treemodel = NULL; | |
| 1664 gtkblist->idle_column = NULL; | |
| 1665 gtkblist->warning_column = gtkblist->buddy_icon_column = NULL; | |
| 1666 gtkblist->bbox = gtkblist->tipwindow = NULL; | |
| 1667 protomenu = NULL; | |
| 1668 awaymenu = NULL; | |
| 5187 | 1669 gtkblist = NULL; |
| 4687 | 1670 } |
| 1 | 1671 |
| 4687 | 1672 static void gaim_gtk_blist_set_visible(struct gaim_buddy_list *list, gboolean show) |
| 1673 { | |
| 4840 | 1674 if (!(gtkblist && gtkblist->window)) |
| 1675 return; | |
| 1676 | |
| 4698 | 1677 if (show) { |
| 4840 | 1678 gaim_gtk_blist_restore_position(); |
| 4699 | 1679 gtk_window_present(GTK_WINDOW(gtkblist->window)); |
| 4698 | 1680 } else { |
| 1681 if (!connections || docklet_count) { | |
| 1682 #ifdef _WIN32 | |
|
4711
0c1f3e651d3e
[gaim-migrate @ 5022]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4706
diff
changeset
|
1683 wgaim_systray_minimize(gtkblist->window); |
| 4698 | 1684 #endif |
| 1685 gtk_widget_hide(gtkblist->window); | |
| 1686 } else { | |
| 1687 gtk_window_iconify(GTK_WINDOW(gtkblist->window)); | |
| 1688 } | |
| 1689 } | |
| 1690 } | |
| 1691 | |
| 1692 void gaim_gtk_blist_docklet_toggle() { | |
| 1693 /* Useful for the docklet plugin and also for the win32 tray icon*/ | |
| 1694 /* This is called when one of those is clicked--it will show/hide the | |
| 1695 buddy list/login window--depending on which is active */ | |
| 4840 | 1696 if (connections) { |
| 1697 if (gtkblist && gtkblist->window) { | |
| 1698 if (GTK_WIDGET_VISIBLE(gtkblist->window)) { | |
| 1699 gaim_blist_set_visible(GAIM_WINDOW_ICONIFIED(gtkblist->window) || gaim_gtk_blist_obscured); | |
| 1700 } else { | |
| 4698 | 1701 #if _WIN32 |
| 4840 | 1702 wgaim_systray_maximize(gtkblist->window); |
| 4698 | 1703 #endif |
| 4840 | 1704 gaim_blist_set_visible(TRUE); |
| 1705 } | |
| 1706 } else { | |
| 1707 /* we're logging in or something... do nothing */ | |
| 1708 /* or should I make the blist? */ | |
| 1709 debug_printf("docklet_toggle called with connections but no blist!\n"); | |
| 4698 | 1710 } |
| 4840 | 1711 } else if (mainwindow) { |
| 1712 if (GTK_WIDGET_VISIBLE(mainwindow)) { | |
| 4698 | 1713 if (GAIM_WINDOW_ICONIFIED(mainwindow)) { |
| 1714 gtk_window_present(GTK_WINDOW(mainwindow)); | |
| 1715 } else { | |
| 1716 #if _WIN32 | |
| 1717 wgaim_systray_minimize(mainwindow); | |
| 1718 #endif | |
| 1719 gtk_widget_hide(mainwindow); | |
| 1720 } | |
| 1721 } else { | |
| 1722 #if _WIN32 | |
| 1723 wgaim_systray_maximize(mainwindow); | |
| 1724 #endif | |
| 4833 | 1725 show_login(); |
| 4698 | 1726 } |
| 4840 | 1727 } else { |
| 1728 show_login(); | |
| 4698 | 1729 } |
| 1730 } | |
| 1731 | |
| 1732 void gaim_gtk_blist_docklet_add() | |
| 1733 { | |
| 1734 docklet_count++; | |
| 1735 } | |
| 1736 | |
| 1737 void gaim_gtk_blist_docklet_remove() | |
| 1738 { | |
| 1739 docklet_count--; | |
| 1740 if (!docklet_count) { | |
| 4944 | 1741 if (connections) |
| 4698 | 1742 gaim_blist_set_visible(TRUE); |
| 4944 | 1743 else if (mainwindow) |
| 4840 | 1744 gtk_window_present(GTK_WINDOW(mainwindow)); |
| 4944 | 1745 else |
| 4840 | 1746 show_login(); |
| 4698 | 1747 } |
| 4687 | 1748 } |
| 1 | 1749 |
| 4687 | 1750 static struct gaim_blist_ui_ops blist_ui_ops = |
| 1751 { | |
|
4695
4bdd9a5fd026
[gaim-migrate @ 5006]
Christian Hammond <chipx86@chipx86.com>
parents:
4694
diff
changeset
|
1752 gaim_gtk_blist_new_list, |
| 5068 | 1753 NULL, |
| 4687 | 1754 gaim_gtk_blist_show, |
| 1755 gaim_gtk_blist_update, | |
| 1756 gaim_gtk_blist_remove, | |
| 1757 gaim_gtk_blist_destroy, | |
| 1758 gaim_gtk_blist_set_visible | |
| 1759 }; | |
| 1 | 1760 |
| 1761 | |
| 4687 | 1762 struct gaim_blist_ui_ops *gaim_get_gtk_blist_ui_ops() |
|
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2334
diff
changeset
|
1763 { |
| 4687 | 1764 return &blist_ui_ops; |
|
1037
1c663beef29d
[gaim-migrate @ 1047]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1036
diff
changeset
|
1765 } |
|
1c663beef29d
[gaim-migrate @ 1047]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1036
diff
changeset
|
1766 |
| 3131 | 1767 |
| 1768 | |
| 4687 | 1769 /********************************************************************* |
| 1770 * Public utility functions * | |
| 1771 *********************************************************************/ | |
|
1058
4927ce25d8cc
[gaim-migrate @ 1068]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1772 |
| 4687 | 1773 GdkPixbuf * |
| 1774 create_prpl_icon(struct gaim_account *account) | |
|
4553
d03fcb3f4be2
[gaim-migrate @ 4833]
Christian Hammond <chipx86@chipx86.com>
parents:
4525
diff
changeset
|
1775 { |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1776 GaimPlugin *prpl; |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1777 GaimPluginProtocolInfo *prpl_info = NULL; |
| 4687 | 1778 GdkPixbuf *status = NULL; |
| 1779 char *filename = NULL; | |
| 5151 | 1780 const char *protoname = NULL; |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1781 char buf[256]; |
| 5151 | 1782 |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1783 prpl = gaim_find_prpl(account->protocol); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1784 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1785 if (prpl != NULL) { |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1786 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1787 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1788 if (prpl_info->list_icon != NULL) |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1789 protoname = prpl_info->list_icon(account, NULL); |
| 5151 | 1790 } |
| 1791 | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1792 if (protoname == NULL) |
| 5201 | 1793 return NULL; |
| 1794 | |
|
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1795 /* |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1796 * Status icons will be themeable too, and then it will look up |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1797 * protoname from the theme |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1798 */ |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1799 g_snprintf(buf, sizeof(buf), "%s.png", protoname); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1800 |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1801 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1802 "default", buf, NULL); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1803 status = gdk_pixbuf_new_from_file(filename, NULL); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1804 g_free(filename); |
|
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5201
diff
changeset
|
1805 |
| 4687 | 1806 return status; |
| 1 | 1807 } |
| 4699 | 1808 |
