Mon, 26 Apr 2004 16:10:16 +0000
[gaim-migrate @ 9577]
" This patch creates the subsystem like most of the core
to connect to signals and emit them. It also adds a
"gtkblist-created" signal so plugins that want to add
something to the gtkblist know when it's created.
Using the same subsytem setup as the rest of gaim helps
plugin authors avoid connecting to the buddy signon
even to know when they can connect to the
"drawing-menu" signal." --Gary Kramlich
committer: Luke Schierer <lschiere@pidgin.im>
| 5228 | 1 | /* |
| 2 | * gaim | |
| 3 | * | |
| 8046 | 4 | * Gaim is the legal property of its developers, whose names are too numerous |
| 5 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 6 | * source distribution. | |
| 5228 | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 21 | * | |
| 22 | */ | |
| 7620 | 23 | #include "gtkinternal.h" |
| 24 | ||
| 25 | #include "account.h" | |
| 26 | #include "core.h" | |
| 27 | #include "debug.h" | |
| 28 | #include "multi.h" | |
| 29 | #include "notify.h" | |
| 30 | #include "prpl.h" | |
| 31 | #include "prefs.h" | |
| 32 | #include "request.h" | |
| 33 | #include "signals.h" | |
| 34 | #include "sound.h" | |
| 35 | #include "stock.h" | |
| 36 | #include "util.h" | |
| 37 | ||
| 38 | #include "gtkaccount.h" | |
| 39 | #include "gtkblist.h" | |
| 40 | #include "gtkconv.h" | |
| 41 | #include "gtkdebug.h" | |
| 42 | #include "gtkft.h" | |
| 43 | #include "gtklog.h" | |
| 44 | #include "gtkpounce.h" | |
| 45 | #include "gtkprefs.h" | |
| 46 | #include "gtkprivacy.h" | |
| 8113 | 47 | #include "gtkroomlist.h" |
| 7620 | 48 | #include "gtkutils.h" |
| 49 | ||
| 50 | #include "ui.h" | |
| 51 | ||
| 52 | #include "gaim.h" | |
| 5228 | 53 | |
| 54 | #include <gdk/gdkkeysyms.h> | |
| 55 | #include <gtk/gtk.h> | |
| 7620 | 56 | #include <gdk/gdk.h> |
| 57 | ||
| 7662 | 58 | #if (GTK_CHECK_VERSION(2,2,0) && !(defined(__APPLE__) && defined(__MACH__))) |
| 59 | #define WANT_DROP_SHADOW | |
| 60 | #endif | |
| 61 | ||
| 7620 | 62 | typedef struct |
| 63 | { | |
| 64 | GaimAccount *account; | |
| 65 | ||
| 66 | GtkWidget *window; | |
| 67 | GtkWidget *combo; | |
| 68 | GtkWidget *entry; | |
| 69 | GtkWidget *entry_for_alias; | |
| 70 | GtkWidget *account_box; | |
| 71 | ||
| 72 | } GaimGtkAddBuddyData; | |
| 73 | ||
| 74 | typedef struct | |
| 75 | { | |
| 76 | GaimAccount *account; | |
| 77 | ||
| 78 | GtkWidget *window; | |
| 79 | GtkWidget *account_menu; | |
| 80 | GtkWidget *alias_entry; | |
| 81 | GtkWidget *group_combo; | |
| 82 | GtkWidget *entries_box; | |
| 83 | GtkSizeGroup *sg; | |
| 84 | ||
| 85 | GList *entries; | |
| 86 | ||
| 87 | } GaimGtkAddChatData; | |
| 88 | ||
|
8303
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
89 | typedef struct |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
90 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
91 | GaimAccount *account; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
92 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
93 | GtkWidget *window; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
94 | GtkWidget *account_menu; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
95 | GtkWidget *entries_box; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
96 | GtkSizeGroup *sg; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
97 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
98 | GList *entries; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
99 | } GaimGtkJoinChatData; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
100 | |
| 7620 | 101 | |
| 102 | static GtkWidget *protomenu = NULL; | |
| 5228 | 103 | |
| 5422 | 104 | GSList *gaim_gtk_blist_sort_methods = NULL; |
| 105 | static struct gaim_gtk_blist_sort_method *current_sort_method = NULL; | |
| 7620 | 106 | static GtkTreeIter sort_method_none(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur); |
| 107 | ||
| 108 | /* The functions we use for sorting aren't available in gtk 2.0.x, and | |
| 109 | * segfault in 2.2.0. 2.2.1 is known to work, so I'll require that */ | |
| 110 | #if GTK_CHECK_VERSION(2,2,1) | |
| 111 | static GtkTreeIter sort_method_alphabetical(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur); | |
| 112 | static GtkTreeIter sort_method_status(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur); | |
| 113 | static GtkTreeIter sort_method_log(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur); | |
| 114 | #endif | |
| 115 | static GaimGtkBuddyList *gtkblist = NULL; | |
| 5228 | 116 | |
| 117 | /* part of the best damn Docklet code this side of Tahiti */ | |
| 118 | static gboolean gaim_gtk_blist_obscured = FALSE; | |
| 119 | ||
| 120 | static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data); | |
| 7620 | 121 | static void gaim_gtk_blist_update(GaimBuddyList *list, GaimBlistNode *node); |
| 5234 | 122 | static char *gaim_get_tooltip_text(GaimBlistNode *node); |
| 5228 | 123 | static char *item_factory_translate_func (const char *path, gpointer func_data); |
| 5273 | 124 | static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter); |
| 7620 | 125 | static void redo_buddy_list(GaimBuddyList *list, gboolean remove); |
| 126 | static void gaim_gtk_blist_collapse_contact_cb(GtkWidget *w, GaimBlistNode *node); | |
| 127 | ||
| 128 | static void show_rename_group(GtkWidget *unused, GaimGroup *g); | |
| 5422 | 129 | |
| 5256 | 130 | struct _gaim_gtk_blist_node { |
| 131 | GtkTreeRowReference *row; | |
| 7620 | 132 | gboolean contact_expanded; |
| 5256 | 133 | }; |
| 134 | ||
| 7662 | 135 | #ifdef WANT_DROP_SHADOW |
| 7620 | 136 | /**************************** Weird drop shadow stuff *******************/ |
| 137 | /* This is based on a patch for drop shadows in GTK menus available at http://www.xfce.org/gtkmenu-shadow/ */ | |
| 138 | ||
| 139 | enum side { | |
| 140 | EAST_SIDE, | |
| 141 | SOUTH_SIDE | |
| 142 | }; | |
| 143 | ||
| 144 | const double shadow_strip_l[5] = { | |
| 145 | .937, .831, .670, .478, .180 | |
| 146 | }; | |
| 147 | ||
| 148 | const double bottom_left_corner[25] = { | |
| 149 | 1.00, .682, .423, .333, .258, | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
150 | 1.00, .898, .800, .682, .584, |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
151 | 1.00, .937, .874, .800, .737, |
| 7620 | 152 | 1.00, .968, .937, .898, .866, |
| 153 | 1.00, .988, .976, .960, .945 | |
| 154 | }; | |
| 155 | ||
| 156 | const double bottom_right_corner[25] = { | |
| 157 | .258, .584, .737, .866, .945, | |
| 158 | .584, .682, .800, .898, .960, | |
| 159 | .737, .800, .874, .937, .976, | |
| 160 | .866, .898, .937, .968, .988, | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
161 | .945, .960, .976, .988, .996 |
| 7620 | 162 | }; |
| 163 | ||
| 164 | const double top_right_corner[25] = { | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
165 | 1.00, 1.00, 1.00, 1.00, 1.00, |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
166 | .686, .898, .937, .968, .988, |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
167 | .423, .803, .874, .937, .976, |
| 7620 | 168 | .333, .686, .800, .898, .960, |
| 169 | .258, .584, .737, .866, .945 | |
| 170 | }; | |
| 171 | ||
| 172 | const double top_left_corner[25] = { | |
| 173 | .988, .968, .937, .898, .498, | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
174 | .976, .937, .874, .803, .423, |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
175 | .960, .898, .800, .686, .333, |
| 7620 | 176 | .945, .866, .737, .584, .258, |
| 177 | .941, .847, .698, .521, .215 | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
178 | }; |
| 7620 | 179 | |
| 180 | ||
| 181 | static GdkPixbuf * | |
| 182 | get_pixbuf (GtkWidget *menu, | |
| 183 | int x, | |
| 184 | int y, | |
| 185 | int width, | |
| 186 | int height) | |
| 187 | { | |
| 188 | GdkPixbuf *dest, *src; | |
| 189 | GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET(menu)); | |
| 190 | GdkWindow *root = gdk_screen_get_root_window (screen); | |
| 191 | gint screen_height = gdk_screen_get_height (screen); | |
| 192 | gint screen_width = gdk_screen_get_width (screen); | |
| 193 | gint original_width = width; | |
| 194 | gint original_height = height; | |
| 195 | ||
| 196 | #ifdef _WIN32 | |
| 197 | /* In Win32, GDK gets the workarea that isn't occupied by toolbars | |
| 198 | (including the taskbar) and uses that region as the screen size. | |
| 199 | GTK returns positions based on a screen size that ignores these | |
| 200 | toolbars. Since we want a pixmap with real X,Y coordinates, we | |
| 201 | need to find out the offset from GTK's screen to GDK's screen, | |
| 202 | and adjust the pixmaps we grab accordingly. GDK will not deal | |
| 203 | with toolbar position updates, so we're stuck restarting Gaim | |
| 204 | if that happens. */ | |
| 205 | RECT *workarea = g_malloc(sizeof(RECT)); | |
| 206 | SystemParametersInfo(SPI_GETWORKAREA, 0, (void *)workarea, 0); | |
| 207 | x += (workarea->left); | |
| 208 | y += (workarea->top); | |
| 209 | g_free(workarea); | |
| 210 | #endif | |
| 211 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
212 | if (x < 0) |
| 7620 | 213 | { |
| 214 | width += x; | |
| 215 | x = 0; | |
| 216 | } | |
| 217 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
218 | if (y < 0) |
| 7620 | 219 | { |
| 220 | height += y; | |
| 221 | y = 0; | |
| 222 | } | |
| 223 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
224 | if (x + width > screen_width) |
| 7620 | 225 | { |
| 226 | width = screen_width - x; | |
| 227 | } | |
| 228 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
229 | if (y + height > screen_height) |
| 7620 | 230 | { |
| 231 | height = screen_height - y; | |
| 232 | } | |
| 233 | ||
| 234 | if (width <= 0 || height <= 0) | |
| 235 | return NULL; | |
| 236 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
237 | dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, |
| 7620 | 238 | original_width, original_height); |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
239 | src = gdk_pixbuf_get_from_drawable (NULL, root, NULL, x, y, 0, 0, |
| 7620 | 240 | width, height); |
| 241 | gdk_pixbuf_copy_area (src, 0, 0, width, height, dest, 0, 0); | |
| 242 | ||
| 243 | g_object_unref (G_OBJECT (src)); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
244 | |
| 7620 | 245 | return dest; |
| 246 | } | |
| 247 | ||
| 248 | static void | |
| 249 | shadow_paint(GaimGtkBuddyList *blist, GdkRectangle *area, enum side shadow) | |
| 250 | { | |
| 251 | gint width, height; | |
| 252 | GdkGC *gc = gtkblist->tipwindow->style->black_gc; | |
| 253 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
254 | switch (shadow) |
| 7620 | 255 | { |
| 256 | case EAST_SIDE: | |
| 257 | if (gtkblist->east != NULL) | |
| 258 | { | |
| 259 | if (area) | |
| 260 | gdk_gc_set_clip_rectangle (gc, area); | |
| 261 | ||
| 262 | width = gdk_pixbuf_get_width (gtkblist->east); | |
| 263 | height = gdk_pixbuf_get_height (gtkblist->east); | |
| 264 | ||
| 265 | gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->east_shadow), gc, | |
| 266 | gtkblist->east, 0, 0, 0, 0, width, height, GDK_RGB_DITHER_NONE, | |
| 267 | 0, 0); | |
| 268 | ||
| 269 | if (area) | |
| 270 | gdk_gc_set_clip_rectangle (gc, NULL); | |
| 271 | } | |
| 272 | break; | |
| 273 | case SOUTH_SIDE: | |
| 274 | if (blist->south != NULL) | |
| 275 | { | |
| 276 | if (area) | |
| 277 | gdk_gc_set_clip_rectangle (gc, area); | |
| 278 | ||
| 279 | width = gdk_pixbuf_get_width (gtkblist->south); | |
| 280 | height = gdk_pixbuf_get_height (gtkblist->south); | |
| 281 | gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->south_shadow), gc, gtkblist->south, | |
| 282 | 0, 0, 0, 0, width, height, GDK_RGB_DITHER_NONE, 0, 0); | |
| 8040 | 283 | |
| 7620 | 284 | if (area) |
| 285 | gdk_gc_set_clip_rectangle (gc, NULL); | |
| 286 | } | |
| 287 | break; | |
| 288 | default: | |
| 289 | break; | |
| 290 | } | |
| 291 | } | |
| 292 | ||
| 293 | static void | |
| 294 | pixbuf_add_shadow (GdkPixbuf *pb, | |
| 295 | enum side shadow) | |
| 296 | { | |
| 297 | gint width, rowstride, height; | |
| 298 | gint i; | |
| 299 | guchar *pixels, *p; | |
| 300 | ||
| 301 | width = gdk_pixbuf_get_width (pb); | |
| 302 | height = gdk_pixbuf_get_height (pb); | |
| 303 | rowstride = gdk_pixbuf_get_rowstride (pb); | |
| 304 | pixels = gdk_pixbuf_get_pixels (pb); | |
| 305 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
306 | switch (shadow) |
| 7620 | 307 | { |
| 308 | case EAST_SIDE: | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
309 | if (height > 5) |
| 7620 | 310 | { |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
311 | for (i = 0; i < width; i++) |
| 7620 | 312 | { |
| 313 | gint j, k; | |
| 314 | ||
| 315 | p = pixels + (i * rowstride); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
316 | for (j = 0, k = 0; j < 3 * width; j += 3, k++) |
| 7620 | 317 | { |
| 318 | p[j] = (guchar) (p[j] * top_right_corner [i * width + k]); | |
| 319 | p[j + 1] = (guchar) (p[j + 1] * top_right_corner [i * width + k]); | |
| 320 | p[j + 2] = (guchar) (p[j + 2] * top_right_corner [i * width + k]); | |
| 321 | } | |
| 322 | } | |
| 323 | ||
| 324 | i = 5; | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
325 | } |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
326 | else |
| 7620 | 327 | { |
| 328 | i = 0; | |
| 329 | } | |
| 330 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
331 | for (;i < height; i++) |
| 7620 | 332 | { |
| 333 | gint j, k; | |
| 334 | ||
| 335 | p = pixels + (i * rowstride); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
336 | for (j = 0, k = 0; j < 3 * width; j += 3, k++) |
| 7620 | 337 | { |
| 338 | p[j] = (guchar) (p[j] * shadow_strip_l[width - 1 - k]); | |
| 339 | p[j + 1] = (guchar) (p[j + 1] * shadow_strip_l[width - 1 - k]); | |
| 340 | p[j + 2] = (guchar) (p[j + 2] * shadow_strip_l[width - 1 - k]); | |
| 341 | } | |
| 342 | } | |
| 343 | break; | |
| 344 | ||
| 345 | case SOUTH_SIDE: | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
346 | for (i = 0; i < height; i++) |
| 7620 | 347 | { |
| 348 | gint j, k; | |
| 349 | ||
| 350 | p = pixels + (i * rowstride); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
351 | for (j = 0, k = 0; j < 3 * height; j += 3, k++) |
| 7620 | 352 | { |
| 353 | p[j] = (guchar) (p[j] * bottom_left_corner[i * height + k]); | |
| 354 | p[j + 1] = (guchar) (p[j + 1] * bottom_left_corner[i * height + k]); | |
| 355 | p[j + 2] = (guchar) (p[j + 2] * bottom_left_corner[i * height + k]); | |
| 356 | } | |
| 357 | ||
| 358 | p = pixels + (i * rowstride) + 3 * height; | |
| 359 | for (j = 0, k = 0; j < (width * 3) - (6 * height); j += 3, k++) | |
| 360 | { | |
| 361 | p[j] = (guchar) (p[j] * bottom_right_corner [i * height]); | |
| 362 | p[j + 1] = (guchar) (p[j + 1] * bottom_right_corner [i * height]); | |
| 363 | p[j + 2] = (guchar) (p[j + 2] * bottom_right_corner [i * height]); | |
| 364 | } | |
| 365 | ||
| 366 | p = pixels + (i * rowstride) + ((width * 3) - (3 * height)); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
367 | for (j = 0, k = 0; j < 3 * height; j += 3, k++) |
| 7620 | 368 | { |
| 369 | p[j] = (guchar) (p[j] * bottom_right_corner[i * height + k]); | |
| 370 | p[j + 1] = (guchar) (p[j + 1] * bottom_right_corner[i * height + k]); | |
| 371 | p[j + 2] = (guchar) (p[j + 2] * bottom_right_corner[i * height + k]); | |
| 372 | } | |
| 373 | } | |
| 374 | break; | |
| 375 | ||
| 376 | default: | |
| 377 | break; | |
| 378 | } | |
| 379 | } | |
| 380 | ||
| 381 | static gboolean | |
| 382 | map_shadow_windows (gpointer data) | |
| 383 | { | |
| 384 | GaimGtkBuddyList *blist = (GaimGtkBuddyList*)data; | |
| 385 | GtkWidget *widget = blist->tipwindow; | |
| 386 | GdkPixbuf *pixbuf; | |
| 387 | int x, y; | |
| 388 | ||
| 389 | gtk_window_get_position(GTK_WINDOW(widget), &x, &y); | |
| 390 | pixbuf = get_pixbuf (widget, | |
| 391 | x + widget->allocation.width, y, | |
| 392 | 5, widget->allocation.height + 5); | |
| 393 | if (pixbuf != NULL) | |
| 394 | { | |
| 395 | pixbuf_add_shadow (pixbuf, EAST_SIDE); | |
| 396 | if (blist->east != NULL) | |
| 397 | { | |
| 398 | g_object_unref (G_OBJECT (blist->east)); | |
| 399 | } | |
| 400 | blist->east = pixbuf; | |
| 401 | } | |
| 402 | ||
| 403 | pixbuf = get_pixbuf (widget, | |
| 404 | x, y + widget->allocation.height, | |
| 405 | widget->allocation.width + 5, 5); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
406 | if (pixbuf != NULL) |
| 7620 | 407 | { |
| 408 | pixbuf_add_shadow (pixbuf, SOUTH_SIDE); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
409 | if (blist->south != NULL) |
| 7620 | 410 | { |
| 411 | g_object_unref (G_OBJECT (blist->south)); | |
| 412 | } | |
| 413 | blist->south = pixbuf; | |
| 414 | } | |
| 415 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
416 | gdk_window_move_resize (blist->east_shadow, |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
417 | x + widget->allocation.width, y, |
| 7620 | 418 | 5, widget->allocation.height); |
| 419 | ||
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
420 | gdk_window_move_resize (blist->south_shadow, |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
421 | x, y + widget->allocation.height, |
| 7620 | 422 | widget->allocation.width + 5, 5); |
| 423 | gdk_window_show (blist->east_shadow); | |
| 424 | gdk_window_show (blist->south_shadow); | |
| 425 | shadow_paint(blist, NULL, EAST_SIDE); | |
| 426 | shadow_paint(blist, NULL, SOUTH_SIDE); | |
| 427 | ||
| 428 | return FALSE; | |
| 429 | } | |
| 430 | ||
| 431 | /**************** END WEIRD DROP SHADOW STUFF ***********************************/ | |
| 432 | #endif | |
|
8254
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
433 | |
| 7620 | 434 | static GSList *blist_prefs_callbacks = NULL; |
| 435 | ||
| 5228 | 436 | /*************************************************** |
| 437 | * Callbacks * | |
| 438 | ***************************************************/ | |
| 439 | ||
| 440 | static gboolean gtk_blist_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data) | |
| 441 | { | |
| 442 | if (docklet_count) | |
| 443 | gaim_blist_set_visible(FALSE); | |
| 444 | else | |
| 7620 | 445 | gaim_core_quit(); |
| 5228 | 446 | |
| 447 | /* we handle everything, event should not propogate further */ | |
| 448 | return TRUE; | |
| 449 | } | |
| 450 | ||
| 451 | static gboolean gtk_blist_configure_cb(GtkWidget *w, GdkEventConfigure *event, gpointer data) | |
| 452 | { | |
| 453 | /* unfortunately GdkEventConfigure ignores the window gravity, but * | |
| 454 | * the only way we have of setting the position doesn't. we have to * | |
| 7620 | 455 | * call get_position because it does pay attention to the gravity. * |
| 456 | * this is inefficient and I agree it sucks, but it's more likely * | |
| 457 | * to work correctly. - Robot101 */ | |
| 5228 | 458 | gint x, y; |
| 459 | ||
| 460 | /* check for visibility because when we aren't visible, this will * | |
| 461 | * give us bogus (0,0) coordinates. - xOr */ | |
| 7620 | 462 | if (GTK_WIDGET_VISIBLE(w)) |
| 5228 | 463 | gtk_window_get_position(GTK_WINDOW(w), &x, &y); |
| 7620 | 464 | else |
| 465 | return FALSE; /* carry on normally */ | |
| 466 | ||
| 467 | /* don't save if nothing changed */ | |
| 468 | if (x == gaim_prefs_get_int("/gaim/gtk/blist/x") && | |
| 469 | y == gaim_prefs_get_int("/gaim/gtk/blist/y") && | |
| 470 | event->width == gaim_prefs_get_int("/gaim/gtk/blist/width") && | |
| 471 | event->height == gaim_prefs_get_int("/gaim/gtk/blist/height")) { | |
| 472 | ||
| 473 | return FALSE; /* carry on normally */ | |
| 5228 | 474 | } |
| 475 | ||
| 7620 | 476 | /* don't save off-screen positioning */ |
| 477 | if (x + event->width < 0 || | |
| 478 | y + event->height < 0 || | |
| 479 | x > gdk_screen_width() || | |
| 480 | y > gdk_screen_height()) { | |
| 481 | ||
| 482 | return FALSE; /* carry on normally */ | |
| 483 | } | |
| 484 | ||
| 485 | /* store the position */ | |
| 486 | gaim_prefs_set_int("/gaim/gtk/blist/x", x); | |
| 487 | gaim_prefs_set_int("/gaim/gtk/blist/y", y); | |
| 488 | gaim_prefs_set_int("/gaim/gtk/blist/width", event->width); | |
| 489 | gaim_prefs_set_int("/gaim/gtk/blist/height", event->height); | |
| 490 | ||
| 5228 | 491 | /* continue to handle event normally */ |
| 492 | return FALSE; | |
| 493 | } | |
| 494 | ||
| 495 | static gboolean gtk_blist_visibility_cb(GtkWidget *w, GdkEventVisibility *event, gpointer data) | |
| 496 | { | |
| 497 | if (event->state == GDK_VISIBILITY_FULLY_OBSCURED) | |
| 498 | gaim_gtk_blist_obscured = TRUE; | |
| 499 | else | |
| 500 | gaim_gtk_blist_obscured = FALSE; | |
| 501 | ||
| 502 | /* continue to handle event normally */ | |
| 503 | return FALSE; | |
| 504 | } | |
| 505 | ||
| 7620 | 506 | static void gtk_blist_menu_info_cb(GtkWidget *w, GaimBuddy *b) |
| 5228 | 507 | { |
| 508 | serv_get_info(b->account->gc, b->name); | |
| 509 | } | |
| 510 | ||
| 7620 | 511 | static void gtk_blist_menu_im_cb(GtkWidget *w, GaimBuddy *b) |
| 5228 | 512 | { |
| 7620 | 513 | GaimConversation *conv = gaim_conversation_new(GAIM_CONV_IM, b->account, |
| 514 | b->name); | |
| 515 | ||
| 516 | if(conv) { | |
| 517 | GaimConvWindow *win = gaim_conversation_get_window(conv); | |
| 518 | ||
| 519 | gaim_conv_window_raise(win); | |
| 520 | gaim_conv_window_switch_conversation( | |
| 521 | gaim_conversation_get_window(conv), | |
| 522 | gaim_conversation_get_index(conv)); | |
| 523 | ||
| 524 | if (GAIM_IS_GTK_WINDOW(win)) | |
| 525 | gtk_window_present(GTK_WINDOW(GAIM_GTK_WINDOW(win)->window)); | |
| 526 | } | |
| 5228 | 527 | } |
| 528 | ||
| 7620 | 529 | static void gtk_blist_menu_autojoin_cb(GtkWidget *w, GaimChat *chat) |
| 530 | { | |
| 7693 | 531 | gaim_blist_node_set_bool((GaimBlistNode*)chat, "gtk-autojoin", |
| 532 | gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w))); | |
| 7620 | 533 | |
| 534 | gaim_blist_save(); | |
| 535 | } | |
| 536 | ||
| 537 | static void gtk_blist_menu_join_cb(GtkWidget *w, GaimChat *chat) | |
| 5228 | 538 | { |
| 5234 | 539 | serv_join_chat(chat->account->gc, chat->components); |
| 540 | } | |
| 541 | ||
| 542 | static void gtk_blist_menu_alias_cb(GtkWidget *w, GaimBlistNode *node) | |
| 543 | { | |
| 544 | if(GAIM_BLIST_NODE_IS_BUDDY(node)) | |
| 7620 | 545 | alias_dialog_bud((GaimBuddy*)node); |
| 546 | else if(GAIM_BLIST_NODE_IS_CONTACT(node)) | |
| 547 | alias_dialog_contact((GaimContact*)node); | |
| 5234 | 548 | else if(GAIM_BLIST_NODE_IS_CHAT(node)) |
| 7620 | 549 | alias_dialog_blist_chat((GaimChat*)node); |
| 5228 | 550 | } |
| 551 | ||
| 7620 | 552 | static void gtk_blist_menu_bp_cb(GtkWidget *w, GaimBuddy *b) |
| 5228 | 553 | { |
| 7620 | 554 | gaim_gtkpounce_dialog_show(b->account, b->name, NULL); |
| 5228 | 555 | } |
| 556 | ||
| 7620 | 557 | static void gtk_blist_menu_showlog_cb(GtkWidget *w, GaimBuddy *b) |
| 5228 | 558 | { |
| 7620 | 559 | gaim_gtk_log_show(b->name, b->account); |
| 560 | } | |
| 561 | ||
| 5228 | 562 | static void gtk_blist_show_systemlog_cb() |
| 563 | { | |
| 8573 | 564 | gaim_gtk_syslog_show(); |
| 5228 | 565 | } |
| 566 | ||
| 567 | static void gtk_blist_show_onlinehelp_cb() | |
| 568 | { | |
| 7620 | 569 | gaim_notify_uri(NULL, GAIM_WEBSITE "documentation.php"); |
| 5228 | 570 | } |
| 571 | ||
| 572 | static void gtk_blist_button_im_cb(GtkWidget *w, GtkTreeView *tv) | |
| 573 | { | |
| 574 | GtkTreeIter iter; | |
| 575 | GtkTreeModel *model = gtk_tree_view_get_model(tv); | |
| 576 | GtkTreeSelection *sel = gtk_tree_view_get_selection(tv); | |
| 577 | ||
| 578 | if(gtk_tree_selection_get_selected(sel, &model, &iter)){ | |
| 579 | GaimBlistNode *node; | |
| 580 | ||
| 581 | gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
| 582 | if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 7620 | 583 | gaim_conversation_new(GAIM_CONV_IM, ((GaimBuddy*)node)->account, ((GaimBuddy*)node)->name); |
| 584 | return; | |
| 585 | } else if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 586 | GaimBuddy *buddy = | |
| 587 | gaim_contact_get_priority_buddy((GaimContact*)node); | |
| 588 | gaim_conversation_new(GAIM_CONV_IM, buddy->account, buddy->name); | |
| 5228 | 589 | return; |
| 590 | } | |
| 591 | } | |
| 592 | show_im_dialog(); | |
| 593 | } | |
| 594 | ||
| 595 | static void gtk_blist_button_info_cb(GtkWidget *w, GtkTreeView *tv) | |
| 596 | { | |
| 597 | GtkTreeIter iter; | |
| 598 | GtkTreeModel *model = gtk_tree_view_get_model(tv); | |
| 599 | GtkTreeSelection *sel = gtk_tree_view_get_selection(tv); | |
| 600 | ||
| 601 | if(gtk_tree_selection_get_selected(sel, &model, &iter)){ | |
| 602 | GaimBlistNode *node; | |
| 603 | ||
| 604 | gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
| 605 | if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 7620 | 606 | serv_get_info(((GaimBuddy*)node)->account->gc, ((GaimBuddy*)node)->name); |
| 607 | return; | |
| 608 | } else if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 609 | GaimBuddy *buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
| 610 | serv_get_info(buddy->account->gc, buddy->name); | |
| 5228 | 611 | return; |
| 612 | } | |
| 613 | } | |
| 614 | show_info_dialog(); | |
| 615 | } | |
| 616 | ||
|
8303
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
617 | static void |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
618 | do_join_chat(GaimGtkJoinChatData *data) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
619 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
620 | if (data) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
621 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
622 | GHashTable *components = |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
623 | g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
624 | GList *tmp; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
625 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
626 | for (tmp = data->entries; tmp != NULL; tmp = tmp->next) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
627 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
628 | if (g_object_get_data(tmp->data, "is_spin")) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
629 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
630 | g_hash_table_replace(components, |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
631 | g_strdup(g_object_get_data(tmp->data, "identifier")), |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
632 | g_strdup_printf("%d", |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
633 | gtk_spin_button_get_value_as_int(tmp->data))); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
634 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
635 | else |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
636 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
637 | g_hash_table_replace(components, |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
638 | g_strdup(g_object_get_data(tmp->data, "identifier")), |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
639 | g_strdup(gtk_entry_get_text(tmp->data))); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
640 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
641 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
642 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
643 | serv_join_chat(gaim_account_get_connection(data->account), components); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
644 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
645 | g_hash_table_destroy(components); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
646 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
647 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
648 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
649 | static void |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
650 | rebuild_joinchat_entries(GaimGtkJoinChatData *data) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
651 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
652 | GaimConnection *gc; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
653 | GList *list, *tmp; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
654 | struct proto_chat_entry *pce; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
655 | gboolean focus = TRUE; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
656 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
657 | gc = gaim_account_get_connection(data->account); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
658 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
659 | while (GTK_BOX(data->entries_box)->children) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
660 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
661 | gtk_container_remove(GTK_CONTAINER(data->entries_box), |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
662 | ((GtkBoxChild *)GTK_BOX(data->entries_box)->children->data)->widget); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
663 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
664 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
665 | if (data->entries != NULL) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
666 | g_list_free(data->entries); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
667 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
668 | data->entries = NULL; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
669 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
670 | list = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
671 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
672 | for (tmp = list; tmp; tmp = tmp->next) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
673 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
674 | GtkWidget *label; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
675 | GtkWidget *rowbox; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
676 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
677 | pce = tmp->data; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
678 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
679 | rowbox = gtk_hbox_new(FALSE, 12); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
680 | gtk_box_pack_start(GTK_BOX(data->entries_box), rowbox, FALSE, FALSE, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
681 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
682 | label = gtk_label_new_with_mnemonic(pce->label); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
683 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
684 | gtk_size_group_add_widget(data->sg, label); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
685 | gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
686 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
687 | if (pce->is_int) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
688 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
689 | GtkObject *adjust; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
690 | GtkWidget *spin; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
691 | adjust = gtk_adjustment_new(pce->min, pce->min, pce->max, |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
692 | 1, 10, 10); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
693 | spin = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
694 | g_object_set_data(G_OBJECT(spin), "is_spin", |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
695 | GINT_TO_POINTER(TRUE)); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
696 | g_object_set_data(G_OBJECT(spin), "identifier", pce->identifier); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
697 | data->entries = g_list_append(data->entries, spin); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
698 | gtk_widget_set_size_request(spin, 50, -1); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
699 | gtk_box_pack_end(GTK_BOX(rowbox), spin, FALSE, FALSE, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
700 | gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(spin)); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
701 | gaim_set_accessible_label (spin, label); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
702 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
703 | else |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
704 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
705 | GtkWidget *entry = gtk_entry_new(); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
706 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
707 | gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
708 | g_object_set_data(G_OBJECT(entry), "identifier", pce->identifier); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
709 | data->entries = g_list_append(data->entries, entry); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
710 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
711 | if (pce->def) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
712 | gtk_entry_set_text(GTK_ENTRY(entry), pce->def); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
713 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
714 | if (focus) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
715 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
716 | gtk_widget_grab_focus(entry); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
717 | focus = FALSE; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
718 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
719 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
720 | if (pce->secret) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
721 | gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
722 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
723 | gtk_box_pack_end(GTK_BOX(rowbox), entry, TRUE, TRUE, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
724 | gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(entry)); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
725 | gaim_set_accessible_label (entry, label); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
726 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
727 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
728 | g_free(pce); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
729 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
730 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
731 | g_list_free(list); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
732 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
733 | gtk_widget_show_all(data->entries_box); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
734 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
735 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
736 | static void |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
737 | join_chat_select_account_cb(GObject *w, GaimAccount *account, |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
738 | GaimGtkJoinChatData *data) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
739 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
740 | if (gaim_account_get_protocol(data->account) == |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
741 | gaim_account_get_protocol(account)) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
742 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
743 | data->account = account; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
744 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
745 | else |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
746 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
747 | data->account = account; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
748 | rebuild_joinchat_entries(data); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
749 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
750 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
751 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
752 | static gboolean |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
753 | join_chat_check_account_func(GaimAccount *account) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
754 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
755 | GaimConnection *gc = gaim_account_get_connection(account); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
756 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
757 | return (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
758 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
759 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
760 | static void |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
761 | do_joinchat(GtkWidget *dialog, int id, GaimGtkJoinChatData *info) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
762 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
763 | switch(id) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
764 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
765 | case GTK_RESPONSE_OK: |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
766 | do_join_chat(info); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
767 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
768 | break; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
769 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
770 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
771 | gtk_widget_destroy(GTK_WIDGET(dialog)); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
772 | g_list_free(info->entries); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
773 | g_free(info); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
774 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
775 | |
|
8305
5a6d1168a8b3
[gaim-migrate @ 9029]
Christian Hammond <chipx86@chipx86.com>
parents:
8303
diff
changeset
|
776 | void |
|
5a6d1168a8b3
[gaim-migrate @ 9029]
Christian Hammond <chipx86@chipx86.com>
parents:
8303
diff
changeset
|
777 | gaim_gtk_blist_show_join_chat(void) |
|
8303
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
778 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
779 | GtkWidget *hbox, *vbox; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
780 | GtkWidget *rowbox; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
781 | GtkWidget *label; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
782 | GList *c; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
783 | GaimGtkBuddyList *gtkblist; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
784 | GtkWidget *img = NULL; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
785 | GaimConnection *gc = NULL; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
786 | GaimGtkJoinChatData *data = NULL; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
787 | int numaccounts = 0; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
788 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
789 | /* Count how many protocols support chat */ |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
790 | for (c = gaim_connections_get_all(); c != NULL; c = c->next) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
791 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
792 | gc = c->data; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
793 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
794 | if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
795 | numaccounts++; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
796 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
797 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
798 | if (numaccounts <= 0) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
799 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
800 | gaim_notify_error(NULL, NULL, |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
801 | _("You are not currently signed on with any " |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
802 | "protocols that have the ability to chat."), |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
803 | NULL); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
804 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
805 | return; |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
806 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
807 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
808 | gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
809 | img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
810 | GTK_ICON_SIZE_DIALOG); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
811 | data = g_new0(GaimGtkJoinChatData, 1); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
812 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
813 | data->window = gtk_dialog_new_with_buttons( |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
814 | _("Join a Chat"), |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
815 | gtkblist->window ? GTK_WINDOW(gtkblist->window) : NULL, 0, |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
816 | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
|
8308
88f1dc8588a8
[gaim-migrate @ 9032]
Mark Doliner <markdoliner@pidgin.im>
parents:
8305
diff
changeset
|
817 | GAIM_STOCK_CHAT, GTK_RESPONSE_OK, NULL); |
|
8303
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
818 | gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
819 | gtk_container_set_border_width(GTK_CONTAINER(data->window), 6); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
820 | gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
821 | gtk_dialog_set_has_separator(GTK_DIALOG(data->window), FALSE); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
822 | gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), 12); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
823 | gtk_container_set_border_width( |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
824 | GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), 6); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
825 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
826 | hbox = gtk_hbox_new(FALSE, 12); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
827 | gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
828 | gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
829 | gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
830 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
831 | vbox = gtk_vbox_new(FALSE, 5); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
832 | gtk_container_set_border_width(GTK_CONTAINER(vbox), 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
833 | gtk_container_add(GTK_CONTAINER(hbox), vbox); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
834 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
835 | label = gtk_label_new(_("Please enter the appropriate information " |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
836 | "about the chat you would like to join.\n")); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
837 | gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
838 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
839 | gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
840 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
841 | rowbox = gtk_hbox_new(FALSE, 12); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
842 | gtk_box_pack_start(GTK_BOX(vbox), rowbox, TRUE, TRUE, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
843 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
844 | data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
845 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
846 | if (numaccounts > 1) |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
847 | { |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
848 | label = gtk_label_new_with_mnemonic(_("_Account:")); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
849 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
850 | gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
851 | gtk_size_group_add_widget(data->sg, label); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
852 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
853 | data->account_menu = gaim_gtk_account_option_menu_new(NULL, FALSE, |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
854 | G_CALLBACK(join_chat_select_account_cb), |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
855 | join_chat_check_account_func, data); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
856 | gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
857 | gtk_label_set_mnemonic_widget(GTK_LABEL(label), |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
858 | GTK_WIDGET(data->account_menu)); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
859 | gaim_set_accessible_label (data->account_menu, label); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
860 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
861 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
862 | data->entries_box = gtk_vbox_new(FALSE, 5); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
863 | gtk_container_add(GTK_CONTAINER(vbox), data->entries_box); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
864 | gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
865 | |
|
8444
53fb5f226f2d
[gaim-migrate @ 9174]
Mark Doliner <markdoliner@pidgin.im>
parents:
8308
diff
changeset
|
866 | for (c = gaim_connections_get_all(); c != NULL; c = c->next) |
|
53fb5f226f2d
[gaim-migrate @ 9174]
Mark Doliner <markdoliner@pidgin.im>
parents:
8308
diff
changeset
|
867 | { |
|
53fb5f226f2d
[gaim-migrate @ 9174]
Mark Doliner <markdoliner@pidgin.im>
parents:
8308
diff
changeset
|
868 | gc = c->data; |
|
53fb5f226f2d
[gaim-migrate @ 9174]
Mark Doliner <markdoliner@pidgin.im>
parents:
8308
diff
changeset
|
869 | |
|
53fb5f226f2d
[gaim-migrate @ 9174]
Mark Doliner <markdoliner@pidgin.im>
parents:
8308
diff
changeset
|
870 | if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat) |
|
53fb5f226f2d
[gaim-migrate @ 9174]
Mark Doliner <markdoliner@pidgin.im>
parents:
8308
diff
changeset
|
871 | break; |
|
53fb5f226f2d
[gaim-migrate @ 9174]
Mark Doliner <markdoliner@pidgin.im>
parents:
8308
diff
changeset
|
872 | } |
|
53fb5f226f2d
[gaim-migrate @ 9174]
Mark Doliner <markdoliner@pidgin.im>
parents:
8308
diff
changeset
|
873 | data->account = gaim_connection_get_account(gc); |
|
8303
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
874 | rebuild_joinchat_entries(data); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
875 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
876 | g_signal_connect(G_OBJECT(data->window), "response", |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
877 | G_CALLBACK(do_joinchat), data); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
878 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
879 | g_object_unref(data->sg); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
880 | |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
881 | gtk_widget_show_all(data->window); |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
882 | } |
|
bbe7d3420549
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
883 | |
| 5234 | 884 | static void gtk_blist_button_chat_cb(GtkWidget *w, GtkTreeView *tv) |
| 5228 | 885 | { |
| 5234 | 886 | GtkTreeIter iter; |
| 887 | GtkTreeModel *model = gtk_tree_view_get_model(tv); | |
| 888 | GtkTreeSelection *sel = gtk_tree_view_get_selection(tv); | |
| 889 | ||
| 890 | if(gtk_tree_selection_get_selected(sel, &model, &iter)){ | |
| 891 | GaimBlistNode *node; | |
| 892 | ||
| 893 | gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
| 894 | if (GAIM_BLIST_NODE_IS_CHAT(node)) { | |
| 7620 | 895 | serv_join_chat(((GaimChat *)node)->account->gc, ((GaimChat *)node)->components); |
| 5234 | 896 | return; |
| 897 | } | |
| 898 | } | |
|
8305
5a6d1168a8b3
[gaim-migrate @ 9029]
Christian Hammond <chipx86@chipx86.com>
parents:
8303
diff
changeset
|
899 | gaim_gtk_blist_show_join_chat(); |
| 5228 | 900 | } |
| 901 | ||
| 902 | static void gtk_blist_button_away_cb(GtkWidget *w, gpointer data) | |
| 903 | { | |
| 904 | gtk_menu_popup(GTK_MENU(awaymenu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME); | |
| 905 | } | |
| 906 | ||
| 907 | static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { | |
| 908 | GaimBlistNode *node; | |
| 909 | GValue val = {0,}; | |
| 910 | ||
| 911 | gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); | |
| 912 | ||
| 913 | node = g_value_get_pointer(&val); | |
| 914 | ||
| 915 | if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 7693 | 916 | gaim_blist_node_set_bool(node, "collapsed", FALSE); |
| 5228 | 917 | gaim_blist_save(); |
| 918 | } | |
| 919 | } | |
| 920 | ||
| 921 | static void gtk_blist_row_collapsed_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { | |
| 922 | GaimBlistNode *node; | |
| 923 | GValue val = {0,}; | |
| 924 | ||
| 925 | gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); | |
| 926 | ||
| 927 | node = g_value_get_pointer(&val); | |
| 928 | ||
| 929 | if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 7693 | 930 | gaim_blist_node_set_bool(node, "collapsed", TRUE); |
| 5228 | 931 | gaim_blist_save(); |
| 7620 | 932 | } else if(GAIM_BLIST_NODE_IS_CONTACT(node)) { |
| 933 | gaim_gtk_blist_collapse_contact_cb(NULL, node); | |
| 5228 | 934 | } |
| 935 | } | |
| 936 | ||
| 937 | static void gtk_blist_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { | |
| 938 | GaimBlistNode *node; | |
| 939 | GtkTreeIter iter; | |
| 940 | GValue val = { 0, }; | |
| 941 | ||
| 942 | gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
| 943 | ||
| 944 | gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); | |
| 945 | node = g_value_get_pointer(&val); | |
| 946 | ||
| 7620 | 947 | if(GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 948 | GaimBuddy *buddy; | |
| 949 | GaimConversation *conv; | |
| 950 | ||
| 951 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) | |
| 952 | buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
| 953 | else | |
| 954 | buddy = (GaimBuddy*)node; | |
| 955 | ||
| 956 | conv = gaim_conversation_new(GAIM_CONV_IM, buddy->account, buddy->name); | |
|
5489
389a0cf53c48
[gaim-migrate @ 5885]
Christian Hammond <chipx86@chipx86.com>
parents:
5451
diff
changeset
|
957 | |
| 5228 | 958 | if(conv) { |
| 7620 | 959 | GaimConvWindow *win = gaim_conversation_get_window(conv); |
| 960 | ||
| 961 | gaim_conv_window_raise(win); | |
| 962 | gaim_conv_window_switch_conversation( | |
| 5228 | 963 | gaim_conversation_get_window(conv), |
| 964 | gaim_conversation_get_index(conv)); | |
|
5489
389a0cf53c48
[gaim-migrate @ 5885]
Christian Hammond <chipx86@chipx86.com>
parents:
5451
diff
changeset
|
965 | |
|
389a0cf53c48
[gaim-migrate @ 5885]
Christian Hammond <chipx86@chipx86.com>
parents:
5451
diff
changeset
|
966 | if (GAIM_IS_GTK_WINDOW(win)) |
|
389a0cf53c48
[gaim-migrate @ 5885]
Christian Hammond <chipx86@chipx86.com>
parents:
5451
diff
changeset
|
967 | gtk_window_present(GTK_WINDOW(GAIM_GTK_WINDOW(win)->window)); |
| 5228 | 968 | } |
| 5234 | 969 | } else if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
| 7620 | 970 | serv_join_chat(((GaimChat *)node)->account->gc, ((GaimChat *)node)->components); |
| 5228 | 971 | } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
| 972 | if (gtk_tree_view_row_expanded(tv, path)) | |
| 973 | gtk_tree_view_collapse_row(tv, path); | |
| 974 | else | |
| 975 | gtk_tree_view_expand_row(tv,path,FALSE); | |
| 976 | } | |
| 977 | } | |
| 978 | ||
| 5234 | 979 | static void gaim_gtk_blist_add_chat_cb() |
| 980 | { | |
| 981 | GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | |
| 982 | GtkTreeIter iter; | |
| 983 | GaimBlistNode *node; | |
| 984 | ||
| 985 | if(gtk_tree_selection_get_selected(sel, NULL, &iter)){ | |
| 986 | gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
| 7620 | 987 | if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
|
7859
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7856
diff
changeset
|
988 | gaim_blist_request_add_chat(NULL, (GaimGroup*)node->parent->parent, NULL); |
| 7620 | 989 | if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_CHAT(node)) |
|
7859
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7856
diff
changeset
|
990 | gaim_blist_request_add_chat(NULL, (GaimGroup*)node->parent, NULL); |
| 5234 | 991 | else if (GAIM_BLIST_NODE_IS_GROUP(node)) |
|
7859
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7856
diff
changeset
|
992 | gaim_blist_request_add_chat(NULL, (GaimGroup*)node, NULL); |
| 5234 | 993 | } |
| 994 | else { | |
|
7859
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7856
diff
changeset
|
995 | gaim_blist_request_add_chat(NULL, NULL, NULL); |
| 5234 | 996 | } |
| 997 | } | |
| 998 | ||
| 5228 | 999 | static void gaim_gtk_blist_add_buddy_cb() |
| 1000 | { | |
| 1001 | GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | |
| 1002 | GtkTreeIter iter; | |
| 1003 | GaimBlistNode *node; | |
| 1004 | ||
| 1005 | if(gtk_tree_selection_get_selected(sel, NULL, &iter)){ | |
| 1006 | gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
| 7620 | 1007 | if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 1008 | gaim_blist_request_add_buddy(NULL, NULL, ((GaimGroup*)node->parent->parent)->name, | |
| 1009 | NULL); | |
| 1010 | } else if (GAIM_BLIST_NODE_IS_CONTACT(node) | |
| 1011 | || GAIM_BLIST_NODE_IS_CHAT(node)) { | |
| 1012 | gaim_blist_request_add_buddy(NULL, NULL, ((GaimGroup*)node->parent)->name, NULL); | |
| 1013 | } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 1014 | gaim_blist_request_add_buddy(NULL, NULL, ((GaimGroup*)node)->name, NULL); | |
| 1015 | } | |
| 5228 | 1016 | } |
| 1017 | else { | |
| 7620 | 1018 | gaim_blist_request_add_buddy(NULL, NULL, NULL, NULL); |
| 1019 | } | |
| 1020 | } | |
| 1021 | ||
| 1022 | static void | |
| 1023 | gaim_gtk_blist_remove_cb (GtkWidget *w, GaimBlistNode *node) | |
| 1024 | { | |
| 1025 | if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 1026 | show_confirm_del((GaimBuddy*)node); | |
| 1027 | } else if (GAIM_BLIST_NODE_IS_CHAT(node)) { | |
| 1028 | show_confirm_del_blist_chat((GaimChat*)node); | |
| 1029 | } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 1030 | show_confirm_del_group((GaimGroup*)node); | |
| 1031 | } else if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 1032 | show_confirm_del_contact((GaimContact*)node); | |
| 5228 | 1033 | } |
| 1034 | } | |
| 1035 | ||
| 1036 | static void | |
| 7620 | 1037 | gaim_gtk_blist_expand_contact_cb(GtkWidget *w, GaimBlistNode *node) |
| 5228 | 1038 | { |
| 7620 | 1039 | struct _gaim_gtk_blist_node *gtknode; |
| 1040 | GaimBlistNode *bnode; | |
| 1041 | ||
| 1042 | if(!GAIM_BLIST_NODE_IS_CONTACT(node)) | |
| 1043 | return; | |
| 1044 | ||
| 1045 | gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
| 1046 | ||
| 1047 | gtknode->contact_expanded = TRUE; | |
| 1048 | ||
| 1049 | for(bnode = node->child; bnode; bnode = bnode->next) { | |
| 1050 | gaim_gtk_blist_update(NULL, bnode); | |
| 1051 | } | |
| 1052 | gaim_gtk_blist_update(NULL, node); | |
| 1053 | } | |
| 1054 | ||
| 1055 | static void | |
| 1056 | gaim_gtk_blist_collapse_contact_cb(GtkWidget *w, GaimBlistNode *node) | |
| 1057 | { | |
| 1058 | GaimBlistNode *bnode; | |
| 1059 | struct _gaim_gtk_blist_node *gtknode; | |
| 1060 | ||
| 1061 | if(!GAIM_BLIST_NODE_IS_CONTACT(node)) | |
| 1062 | return; | |
| 1063 | ||
| 1064 | gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
| 1065 | ||
| 1066 | gtknode->contact_expanded = FALSE; | |
| 1067 | ||
| 1068 | for(bnode = node->child; bnode; bnode = bnode->next) { | |
| 1069 | gaim_gtk_blist_update(NULL, bnode); | |
| 5228 | 1070 | } |
| 1071 | } | |
| 1072 | ||
| 7620 | 1073 | static void gaim_proto_menu_cb(GtkMenuItem *item, GaimBuddy *b) |
| 5228 | 1074 | { |
| 1075 | struct proto_buddy_menu *pbm = g_object_get_data(G_OBJECT(item), "gaimcallback"); | |
| 1076 | if (pbm->callback) | |
| 1077 | pbm->callback(pbm->gc, b->name); | |
| 1078 | } | |
| 1079 | ||
| 7620 | 1080 | static void make_buddy_menu(GtkWidget *menu, GaimPluginProtocolInfo *prpl_info, GaimBuddy *b) |
| 1081 | { | |
|
8710
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1082 | GList *list = NULL, *l = NULL; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1083 | gboolean dup_separator = FALSE; |
| 7620 | 1084 | GtkWidget *menuitem; |
| 1085 | ||
| 1086 | if (prpl_info && prpl_info->get_info) { | |
| 8137 | 1087 | gaim_new_item_from_stock(menu, _("Get _Info"), GAIM_STOCK_INFO, |
| 7620 | 1088 | G_CALLBACK(gtk_blist_menu_info_cb), b, 0, 0, NULL); |
| 1089 | } | |
| 8137 | 1090 | gaim_new_item_from_stock(menu, _("I_M"), GAIM_STOCK_IM, |
| 7620 | 1091 | G_CALLBACK(gtk_blist_menu_im_cb), b, 0, 0, NULL); |
| 1092 | gaim_new_item_from_stock(menu, _("Add Buddy _Pounce"), NULL, | |
| 1093 | G_CALLBACK(gtk_blist_menu_bp_cb), b, 0, 0, NULL); | |
| 1094 | gaim_new_item_from_stock(menu, _("View _Log"), NULL, | |
| 1095 | G_CALLBACK(gtk_blist_menu_showlog_cb), b, 0, 0, NULL); | |
| 1096 | ||
| 1097 | if (prpl_info && prpl_info->buddy_menu) { | |
| 1098 | list = prpl_info->buddy_menu(b->account->gc, b->name); | |
|
8710
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1099 | |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1100 | for(l = list; l; l = l->next) { |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1101 | struct proto_buddy_menu *pbm = l->data; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1102 | |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1103 | /* draw "-" titled menu items as a separator. Since the |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1104 | pbm is not being used in a callback, it needs to be |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1105 | freed. Also, do some simple checking to prevent |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1106 | doubled-up separators */ |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1107 | if('-' == *pbm->label) { |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1108 | if(! dup_separator) { |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1109 | gaim_separator(menu); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1110 | dup_separator = TRUE; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1111 | } |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1112 | g_free(pbm); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1113 | continue; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1114 | } else { |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1115 | dup_separator = FALSE; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1116 | } |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1117 | |
| 7620 | 1118 | menuitem = gtk_menu_item_new_with_mnemonic(pbm->label); |
| 1119 | g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pbm); | |
| 1120 | g_signal_connect(G_OBJECT(menuitem), "activate", | |
|
8710
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1121 | G_CALLBACK(gaim_proto_menu_cb), b); |
| 7620 | 1122 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| 1123 | } | |
|
8710
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1124 | g_list_free(list); |
| 7620 | 1125 | } |
| 1126 | ||
|
8710
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1127 | /* check for additional menu items which may be added by other |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1128 | plugins. */ |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1129 | list = gaim_buddy_get_extended_menu(b); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1130 | for(l = list; l; l = l->next) { |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1131 | struct proto_buddy_menu *pbm = l->data; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1132 | |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1133 | /* draw "-" titled menu items as a separator. see previous, |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1134 | identical-looking code. */ |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1135 | if('-' == *pbm->label) { |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1136 | if(! dup_separator) { |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1137 | gaim_separator(menu); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1138 | dup_separator = TRUE; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1139 | } |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1140 | g_free(pbm); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1141 | continue; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1142 | } else { |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1143 | dup_separator = FALSE; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1144 | } |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1145 | |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1146 | menuitem = gtk_menu_item_new_with_mnemonic(pbm->label); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1147 | g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pbm); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1148 | g_signal_connect(G_OBJECT(menuitem), "activate", |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1149 | G_CALLBACK(gaim_proto_menu_cb), b); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1150 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1151 | } |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1152 | g_list_free(list); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1153 | |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8697
diff
changeset
|
1154 | /* moving on to the old ui-specific plugin menus */ |
| 7620 | 1155 | gaim_signal_emit(GAIM_GTK_BLIST(gaim_get_blist()), |
| 1156 | "drawing-menu", menu, b); | |
| 1157 | ||
| 1158 | gaim_separator(menu); | |
|
8302
e23e9c8f05f7
[gaim-migrate @ 9026]
Christian Hammond <chipx86@chipx86.com>
parents:
8259
diff
changeset
|
1159 | gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, |
| 7620 | 1160 | G_CALLBACK(gtk_blist_menu_alias_cb), b, 0, 0, NULL); |
| 1161 | gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, | |
| 1162 | G_CALLBACK(gaim_gtk_blist_remove_cb), b, | |
| 1163 | 0, 0, NULL); | |
| 1164 | } | |
| 1165 | ||
| 1166 | static gboolean gtk_blist_key_press_cb(GtkWidget *tv, GdkEventKey *event, | |
| 1167 | gpointer null) | |
| 1168 | { | |
| 1169 | GaimBlistNode *node; | |
| 1170 | GValue val = { 0, }; | |
| 1171 | GtkTreeIter iter; | |
| 1172 | GtkTreeSelection *sel; | |
| 1173 | ||
| 1174 | sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); | |
| 1175 | if(!gtk_tree_selection_get_selected(sel, NULL, &iter)) | |
| 1176 | return FALSE; | |
| 1177 | ||
| 1178 | gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter, | |
| 1179 | NODE_COLUMN, &val); | |
| 1180 | node = g_value_get_pointer(&val); | |
| 1181 | ||
| 1182 | if(event->state & GDK_CONTROL_MASK && | |
| 1183 | (event->keyval == 'o' || event->keyval == 'O')) { | |
| 1184 | GaimBuddy *buddy; | |
| 1185 | ||
| 1186 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 1187 | buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
| 1188 | } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 1189 | buddy = (GaimBuddy*)node; | |
| 1190 | } else { | |
| 1191 | return FALSE; | |
| 1192 | } | |
| 1193 | if(buddy) | |
| 1194 | serv_get_info(buddy->account->gc, buddy->name); | |
| 1195 | } | |
| 1196 | ||
| 1197 | return FALSE; | |
| 1198 | } | |
| 1199 | ||
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1200 | static GtkWidget * |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1201 | create_group_menu (GaimBlistNode *node) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1202 | { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1203 | GtkWidget *menu; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1204 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1205 | menu = gtk_menu_new(); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1206 | gaim_new_item_from_stock(menu, _("Add a _Buddy"), GTK_STOCK_ADD, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1207 | G_CALLBACK(gaim_gtk_blist_add_buddy_cb), node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1208 | gaim_new_item_from_stock(menu, _("Add a C_hat"), GTK_STOCK_ADD, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1209 | G_CALLBACK(gaim_gtk_blist_add_chat_cb), node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1210 | gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1211 | G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1212 | gaim_new_item_from_stock(menu, _("_Rename"), NULL, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1213 | G_CALLBACK(show_rename_group), node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1214 | return menu; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1215 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1216 | |
|
8586
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1217 | static void gaim_proto_chat_menu_cb(GtkMenuItem *item, GaimChat *c) |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1218 | { |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1219 | struct proto_chat_menu *pcm = g_object_get_data(G_OBJECT(item), "gaimcallback"); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1220 | if (pcm->callback) |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1221 | pcm->callback(pcm->gc, c->components); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1222 | } |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1223 | |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1224 | static GtkWidget * |
|
8586
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1225 | create_chat_menu (GaimBlistNode *node, |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1226 | GaimChat *c, |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1227 | GaimPlugin *prpl, |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1228 | GaimPluginProtocolInfo *prpl_info) |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1229 | { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1230 | GtkWidget *menu; |
|
8586
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1231 | GList *list; |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1232 | GtkWidget *menuitem; |
| 8197 | 1233 | gboolean autojoin = (gaim_blist_node_get_bool(node, |
| 8198 | 1234 | "gtk-autojoin") || (gaim_blist_node_get_string(node, |
| 1235 | "gtk-autojoin") != NULL)); | |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1236 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1237 | menu = gtk_menu_new(); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1238 | gaim_new_item_from_stock(menu, _("_Join"), GAIM_STOCK_CHAT, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1239 | G_CALLBACK(gtk_blist_menu_join_cb), node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1240 | gaim_new_check_item(menu, _("Auto-Join"), |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1241 | G_CALLBACK(gtk_blist_menu_autojoin_cb), node, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1242 | autojoin); |
|
8586
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1243 | |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1244 | if (prpl_info && prpl_info->chat_menu) { |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1245 | list = prpl_info->chat_menu(c->account->gc, c->components); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1246 | while (list) { |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1247 | struct proto_chat_menu *pcm = list->data; |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1248 | menuitem = gtk_menu_item_new_with_mnemonic(pcm->label); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1249 | g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pcm); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1250 | g_signal_connect(G_OBJECT(menuitem), "activate", |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1251 | G_CALLBACK(gaim_proto_chat_menu_cb), c); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1252 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1253 | list = list->next; |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1254 | } |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1255 | } |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1256 | gaim_signal_emit(GAIM_GTK_BLIST(gaim_get_blist()), |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1257 | "drawing-menu", menu, c); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1258 | |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1259 | gaim_separator(menu); |
|
8302
e23e9c8f05f7
[gaim-migrate @ 9026]
Christian Hammond <chipx86@chipx86.com>
parents:
8259
diff
changeset
|
1260 | gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1261 | G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1262 | gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1263 | G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); |
|
8586
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1264 | |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1265 | return menu; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1266 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1267 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1268 | static GtkWidget * |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1269 | create_contact_menu (GaimBlistNode *node) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1270 | { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1271 | GtkWidget *menu; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1272 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1273 | menu = gtk_menu_new(); |
|
8302
e23e9c8f05f7
[gaim-migrate @ 9026]
Christian Hammond <chipx86@chipx86.com>
parents:
8259
diff
changeset
|
1274 | gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1275 | G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1276 | gaim_new_item_from_stock(menu, _("_Collapse"), GTK_STOCK_ZOOM_OUT, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1277 | G_CALLBACK(gaim_gtk_blist_collapse_contact_cb), |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1278 | node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1279 | gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1280 | G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1281 | return menu; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1282 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1283 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1284 | static GtkWidget * |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1285 | create_buddy_menu (GaimBlistNode *node, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1286 | GaimBuddy *b, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1287 | GaimPlugin *prpl, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1288 | GaimPluginProtocolInfo *prpl_info) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1289 | { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1290 | struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1291 | GtkWidget *menu; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1292 | GtkWidget *menuitem; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1293 | gboolean show_offline = gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies"); |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
1294 | |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1295 | menu = gtk_menu_new(); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1296 | make_buddy_menu(menu, prpl_info, b); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1297 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1298 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1299 | gaim_separator(menu); |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
1300 | |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1301 | if(gtknode->contact_expanded) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1302 | gaim_new_item_from_stock(menu, _("_Collapse"), |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1303 | GTK_STOCK_ZOOM_OUT, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1304 | G_CALLBACK(gaim_gtk_blist_collapse_contact_cb), |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1305 | node, 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1306 | } else { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1307 | gaim_new_item_from_stock(menu, _("_Expand"), |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1308 | GTK_STOCK_ZOOM_IN, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1309 | G_CALLBACK(gaim_gtk_blist_expand_contact_cb), node, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1310 | 0, 0, NULL); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1311 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1312 | if(node->child->next) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1313 | GaimBlistNode *bnode; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1314 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1315 | for(bnode = node->child; bnode; bnode = bnode->next) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1316 | GaimBuddy *buddy = (GaimBuddy*)bnode; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1317 | GtkWidget *submenu; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1318 | GtkWidget *image; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1319 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1320 | if(buddy == b) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1321 | continue; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1322 | if(!buddy->account->gc) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1323 | continue; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1324 | if(!show_offline && !GAIM_BUDDY_IS_ONLINE(buddy)) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1325 | continue; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1326 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1327 | menuitem = gtk_image_menu_item_new_with_label(buddy->name); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1328 | image = gtk_image_new_from_pixbuf( |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1329 | gaim_gtk_blist_get_status_icon(bnode, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1330 | GAIM_STATUS_ICON_SMALL)); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1331 | gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1332 | image); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1333 | gtk_widget_show(image); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1334 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1335 | gtk_widget_show(menuitem); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1336 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1337 | submenu = gtk_menu_new(); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1338 | gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1339 | gtk_widget_show(submenu); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1340 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1341 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(buddy->account)); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1342 | prpl_info = prpl ? GAIM_PLUGIN_PROTOCOL_INFO(prpl) : NULL; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1343 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1344 | make_buddy_menu(submenu, prpl_info, buddy); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1345 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1346 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1347 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1348 | return menu; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1349 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1350 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1351 | static gboolean |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1352 | gaim_gtk_blist_show_context_menu(GaimBlistNode *node, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1353 | GtkMenuPositionFunc func, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1354 | GtkWidget *tv, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1355 | guint button, |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1356 | guint32 time) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1357 | { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1358 | struct _gaim_gtk_blist_node *gtknode; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1359 | GtkWidget *menu = NULL; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1360 | gboolean handled = FALSE; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1361 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1362 | gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1363 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1364 | /* Create a menu based on the thing we right-clicked on */ |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1365 | if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1366 | menu = create_group_menu(node); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1367 | } else if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
|
8586
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1368 | GaimChat *c = (GaimChat *)node; |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1369 | GaimPlugin *prpl = NULL; |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1370 | GaimPluginProtocolInfo *prpl_info = NULL; |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1371 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(c->account)); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1372 | if (prpl != NULL) |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1373 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
|
c8c7a19da549
[gaim-migrate @ 9336]
Pekka Riikonen <priikone@silcnet.org>
parents:
8573
diff
changeset
|
1374 | menu = create_chat_menu(node, c, prpl, prpl_info); |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1375 | } else if ((GAIM_BLIST_NODE_IS_CONTACT(node)) && (gtknode->contact_expanded)) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1376 | menu = create_contact_menu(node); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1377 | } else if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_BUDDY(node)) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1378 | GaimBuddy *b; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1379 | GaimPlugin *prpl = NULL; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1380 | GaimPluginProtocolInfo *prpl_info = NULL; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1381 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1382 | if (GAIM_BLIST_NODE_IS_CONTACT(node)) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1383 | b = gaim_contact_get_priority_buddy((GaimContact*)node); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1384 | else |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1385 | b = (GaimBuddy *)node; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1386 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1387 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1388 | if (prpl != NULL) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1389 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1390 | menu = create_buddy_menu(node, b, prpl, prpl_info); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1391 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1392 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1393 | /* Now display the menu */ |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1394 | if (menu != NULL) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1395 | gtk_widget_show_all(menu); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1396 | gtk_menu_popup(GTK_MENU(menu), NULL, NULL, func, tv, button, time); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1397 | handled = TRUE; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1398 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1399 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1400 | return handled; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1401 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1402 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1403 | static gboolean gtk_blist_button_press_cb(GtkWidget *tv, GdkEventButton *event, gpointer user_data) |
| 5228 | 1404 | { |
| 1405 | GtkTreePath *path; | |
| 1406 | GaimBlistNode *node; | |
| 1407 | GValue val = { 0, }; | |
| 1408 | GtkTreeIter iter; | |
| 1409 | GtkTreeSelection *sel; | |
| 1410 | GaimPlugin *prpl = NULL; | |
| 1411 | GaimPluginProtocolInfo *prpl_info = NULL; | |
| 7620 | 1412 | struct _gaim_gtk_blist_node *gtknode; |
| 1413 | gboolean handled = FALSE; | |
| 5228 | 1414 | |
| 1415 | /* Here we figure out which node was clicked */ | |
| 1416 | if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL)) | |
| 1417 | return FALSE; | |
| 1418 | gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1419 | gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
| 5228 | 1420 | node = g_value_get_pointer(&val); |
| 7620 | 1421 | gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; |
| 1422 | ||
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1423 | /* Right click draws a context menu */ |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1424 | if ((event->button == 3) && (event->type == GDK_BUTTON_PRESS)) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1425 | handled = gaim_gtk_blist_show_context_menu(node, NULL, tv, 3, event->time); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1426 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1427 | /* CTRL+middle click expands or collapse a contact */ |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1428 | } else if ((event->button == 2) && (event->type == GDK_BUTTON_PRESS) && |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1429 | (event->state & GDK_CONTROL_MASK) && (GAIM_BLIST_NODE_IS_CONTACT(node))) { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1430 | if (gtknode->contact_expanded) |
| 7620 | 1431 | gaim_gtk_blist_collapse_contact_cb(NULL, node); |
| 1432 | else | |
| 1433 | gaim_gtk_blist_expand_contact_cb(NULL, node); | |
| 1434 | handled = TRUE; | |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1435 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1436 | /* Double middle click gets info */ |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1437 | } else if ((event->button == 2) && (event->type == GDK_2BUTTON_PRESS) && |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1438 | ((GAIM_BLIST_NODE_IS_CONTACT(node)) || (GAIM_BLIST_NODE_IS_BUDDY(node)))) { |
| 7620 | 1439 | GaimBuddy *b; |
| 1440 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) | |
| 1441 | b = gaim_contact_get_priority_buddy((GaimContact*)node); | |
| 1442 | else | |
| 1443 | b = (GaimBuddy *)node; | |
| 1444 | ||
| 7956 | 1445 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); |
| 5228 | 1446 | if (prpl != NULL) |
| 1447 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
| 1448 | ||
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1449 | if (prpl && prpl_info->get_info) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1450 | serv_get_info(b->account->gc, b->name); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1451 | handled = TRUE; |
| 5228 | 1452 | } |
| 1453 | ||
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1454 | #if (1) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1455 | /* |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1456 | * This code only exists because GTK doesn't work. If we return |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1457 | * FALSE here, as would be normal the event propoagates down and |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1458 | * somehow gets interpreted as the start of a drag event. |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1459 | * |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1460 | * Um, isn't it _normal_ to return TRUE here? Since the event |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1461 | * was handled? --Mark |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1462 | */ |
| 7620 | 1463 | if(handled) { |
| 1464 | sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); | |
| 1465 | gtk_tree_selection_select_path(sel, path); | |
| 1466 | gtk_tree_path_free(path); | |
| 1467 | return TRUE; | |
| 1468 | } | |
| 5228 | 1469 | #endif |
| 7753 | 1470 | gtk_tree_path_free(path); |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1471 | |
| 7620 | 1472 | return FALSE; |
| 5228 | 1473 | } |
| 1474 | ||
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1475 | static gboolean |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1476 | gaim_gtk_blist_popup_menu_cb(GtkWidget *tv, void *user_data) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1477 | { |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1478 | GaimBlistNode *node; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1479 | GValue val = { 0, }; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1480 | GtkTreeIter iter; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1481 | GtkTreeSelection *sel; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1482 | gboolean handled = FALSE; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1483 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1484 | sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1485 | if (!gtk_tree_selection_get_selected(sel, NULL, &iter)) |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1486 | return FALSE; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1487 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1488 | gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1489 | &iter, NODE_COLUMN, &val); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1490 | node = g_value_get_pointer(&val); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1491 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1492 | /* Shift+F10 draws a context menu */ |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1493 | handled = gaim_gtk_blist_show_context_menu(node, gaim_gtk_treeview_popup_menu_position_func, tv, 0, GDK_CURRENT_TIME); |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1494 | |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1495 | return handled; |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1496 | } |
|
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
1497 | |
| 5228 | 1498 | static void gaim_gtk_blist_show_empty_groups_cb(gpointer data, guint action, GtkWidget *item) |
| 1499 | { | |
| 7620 | 1500 | gaim_prefs_set_bool("/gaim/gtk/blist/show_empty_groups", |
| 1501 | gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))); | |
| 5228 | 1502 | } |
| 1503 | ||
| 1504 | static void gaim_gtk_blist_edit_mode_cb(gpointer callback_data, guint callback_action, | |
| 1505 | GtkWidget *checkitem) { | |
| 1506 | if(gtkblist->window->window) { | |
| 1507 | GdkCursor *cursor = gdk_cursor_new(GDK_WATCH); | |
| 1508 | gdk_window_set_cursor(gtkblist->window->window, cursor); | |
| 1509 | while (gtk_events_pending()) | |
| 1510 | gtk_main_iteration(); | |
| 1511 | gdk_cursor_unref(cursor); | |
| 1512 | } | |
| 1513 | ||
| 7620 | 1514 | gaim_prefs_set_bool("/gaim/gtk/blist/show_offline_buddies", |
| 1515 | gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(checkitem))); | |
| 5228 | 1516 | |
| 1517 | if(gtkblist->window->window) { | |
| 1518 | GdkCursor *cursor = gdk_cursor_new(GDK_LEFT_PTR); | |
| 1519 | gdk_window_set_cursor(gtkblist->window->window, cursor); | |
| 1520 | gdk_cursor_unref(cursor); | |
| 1521 | } | |
| 1522 | } | |
| 1523 | ||
| 8089 | 1524 | static void |
| 1525 | add_buddies_from_vcard(const char *prpl_id, GaimGroup *group, GList *list, | |
| 1526 | const char *alias) | |
| 1527 | { | |
| 1528 | GList *l; | |
| 1529 | GaimAccount *account = NULL; | |
| 1530 | GaimConnection *gc; | |
| 1531 | ||
| 1532 | if (list == NULL) | |
| 1533 | return; | |
| 1534 | ||
| 1535 | for (l = gaim_connections_get_all(); l != NULL; l = l->next) | |
| 1536 | { | |
| 1537 | gc = (GaimConnection *)l->data; | |
| 1538 | account = gaim_connection_get_account(gc); | |
| 1539 | ||
| 1540 | if (!strcmp(gaim_account_get_protocol_id(account), prpl_id)) | |
| 1541 | break; | |
| 1542 | ||
| 1543 | account = NULL; | |
| 1544 | } | |
| 1545 | ||
| 1546 | if (account != NULL) | |
| 1547 | { | |
| 1548 | for (l = list; l != NULL; l = l->next) | |
| 1549 | { | |
| 1550 | gaim_blist_request_add_buddy(account, l->data, | |
| 1551 | (group ? group->name : NULL), | |
| 1552 | alias); | |
| 1553 | } | |
| 1554 | } | |
| 1555 | ||
| 1556 | g_list_foreach(list, (GFunc)g_free, NULL); | |
| 1557 | g_list_free(list); | |
| 1558 | } | |
| 1559 | ||
| 1560 | static gboolean | |
| 1561 | parse_vcard(const char *vcard, GaimGroup *group) | |
| 1562 | { | |
| 1563 | char *temp_vcard; | |
| 1564 | char *s, *c; | |
| 1565 | char *alias = NULL; | |
| 1566 | GList *aims = NULL; | |
| 1567 | GList *icqs = NULL; | |
| 1568 | GList *yahoos = NULL; | |
| 1569 | GList *msns = NULL; | |
| 1570 | GList *jabbers = NULL; | |
| 1571 | ||
| 1572 | s = temp_vcard = g_strdup(vcard); | |
| 1573 | ||
| 1574 | while (*s != '\0' && strncmp(s, "END:vCard", strlen("END:vCard"))) | |
| 1575 | { | |
| 1576 | char *field, *value; | |
| 1577 | ||
| 1578 | field = s; | |
| 1579 | ||
| 1580 | /* Grab the field */ | |
| 1581 | while (*s != '\r' && *s != '\n' && *s != '\0' && *s != ':') | |
| 1582 | s++; | |
| 1583 | ||
| 1584 | if (*s == '\r') s++; | |
| 1585 | if (*s == '\n') | |
| 1586 | { | |
| 1587 | s++; | |
| 1588 | continue; | |
| 1589 | } | |
| 1590 | ||
| 1591 | if (*s != '\0') *s++ = '\0'; | |
| 1592 | ||
| 1593 | if ((c = strchr(field, ';')) != NULL) | |
| 1594 | *c = '\0'; | |
| 1595 | ||
| 1596 | /* Proceed to the end of the line */ | |
| 1597 | value = s; | |
| 1598 | ||
| 1599 | while (*s != '\r' && *s != '\n' && *s != '\0') | |
| 1600 | s++; | |
| 1601 | ||
| 1602 | if (*s == '\r') *s++ = '\0'; | |
| 1603 | if (*s == '\n') *s++ = '\0'; | |
| 1604 | ||
| 1605 | /* We only want to worry about a few fields here. */ | |
| 1606 | if (!strcmp(field, "FN")) | |
| 1607 | alias = g_strdup(value); | |
| 1608 | else if (!strcmp(field, "X-AIM") || !strcmp(field, "X-ICQ") || | |
| 1609 | !strcmp(field, "X-YAHOO") || !strcmp(field, "X-MSN") || | |
| 1610 | !strcmp(field, "X-JABBER")) | |
| 1611 | { | |
| 1612 | char **values = g_strsplit(value, ":", 0); | |
| 1613 | char **im; | |
| 1614 | ||
| 1615 | for (im = values; *im != NULL; im++) | |
| 1616 | { | |
| 1617 | if (!strcmp(field, "X-AIM")) | |
| 1618 | aims = g_list_append(aims, g_strdup(*im)); | |
| 1619 | else if (!strcmp(field, "X-ICQ")) | |
| 1620 | icqs = g_list_append(icqs, g_strdup(*im)); | |
| 1621 | else if (!strcmp(field, "X-YAHOO")) | |
| 1622 | yahoos = g_list_append(yahoos, g_strdup(*im)); | |
| 1623 | else if (!strcmp(field, "X-MSN")) | |
| 1624 | msns = g_list_append(msns, g_strdup(*im)); | |
| 1625 | else if (!strcmp(field, "X-JABBER")) | |
| 1626 | jabbers = g_list_append(jabbers, g_strdup(*im)); | |
| 1627 | } | |
| 1628 | ||
| 1629 | g_strfreev(values); | |
| 1630 | } | |
| 1631 | } | |
| 1632 | ||
| 1633 | g_free(temp_vcard); | |
| 1634 | ||
| 1635 | if (aims == NULL && icqs == NULL && yahoos == NULL && | |
| 1636 | msns == NULL && jabbers == NULL) | |
| 1637 | { | |
| 1638 | if (alias != NULL) | |
| 1639 | g_free(alias); | |
| 1640 | ||
| 1641 | return FALSE; | |
| 1642 | } | |
| 1643 | ||
| 1644 | add_buddies_from_vcard("prpl-oscar", group, aims, alias); | |
| 1645 | add_buddies_from_vcard("prpl-oscar", group, icqs, alias); | |
| 1646 | add_buddies_from_vcard("prpl-yahoo", group, yahoos, alias); | |
| 1647 | add_buddies_from_vcard("prpl-msn", group, msns, alias); | |
| 1648 | add_buddies_from_vcard("prpl-jabber", group, jabbers, alias); | |
| 1649 | ||
| 1650 | if (alias != NULL) | |
| 1651 | g_free(alias); | |
| 1652 | ||
| 1653 | return TRUE; | |
| 1654 | } | |
| 1655 | ||
| 5228 | 1656 | static void gaim_gtk_blist_drag_data_get_cb (GtkWidget *widget, |
| 1657 | GdkDragContext *dc, | |
| 1658 | GtkSelectionData *data, | |
| 1659 | guint info, | |
| 1660 | guint time, | |
| 1661 | gpointer *null) | |
| 1662 | { | |
| 8089 | 1663 | if (data->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) |
| 1664 | { | |
| 5228 | 1665 | GtkTreeRowReference *ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); |
| 1666 | GtkTreePath *sourcerow = gtk_tree_row_reference_get_path(ref); | |
| 1667 | GtkTreeIter iter; | |
| 1668 | GaimBlistNode *node = NULL; | |
| 1669 | GValue val = {0}; | |
| 5273 | 1670 | if(!sourcerow) |
| 1671 | return; | |
| 5228 | 1672 | gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, sourcerow); |
| 1673 | gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); | |
| 1674 | node = g_value_get_pointer(&val); | |
| 1675 | gtk_selection_data_set (data, | |
| 1676 | gdk_atom_intern ("GAIM_BLIST_NODE", FALSE), | |
| 1677 | 8, /* bits */ | |
| 1678 | (void*)&node, | |
| 1679 | sizeof (node)); | |
| 5273 | 1680 | |
| 5228 | 1681 | gtk_tree_path_free(sourcerow); |
| 1682 | } | |
| 8089 | 1683 | else if (data->target == gdk_atom_intern("application/x-im-contact", FALSE)) |
| 1684 | { | |
| 7706 | 1685 | GtkTreeRowReference *ref; |
| 1686 | GtkTreePath *sourcerow; | |
| 1687 | GtkTreeIter iter; | |
| 1688 | GaimBlistNode *node = NULL; | |
| 1689 | GaimBuddy *buddy; | |
| 1690 | GaimConnection *gc; | |
| 1691 | GValue val = {0}; | |
| 1692 | GString *str; | |
| 1693 | const char *protocol; | |
| 1694 | char *mime_str; | |
| 1695 | ||
| 1696 | ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); | |
| 1697 | sourcerow = gtk_tree_row_reference_get_path(ref); | |
| 1698 | ||
| 1699 | if (!sourcerow) | |
| 1700 | return; | |
| 1701 | ||
| 1702 | gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, | |
| 1703 | sourcerow); | |
| 1704 | gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter, | |
| 1705 | NODE_COLUMN, &val); | |
| 1706 | ||
| 1707 | node = g_value_get_pointer(&val); | |
| 1708 | ||
| 1709 | if (GAIM_BLIST_NODE_IS_CONTACT(node)) | |
| 1710 | { | |
| 1711 | buddy = gaim_contact_get_priority_buddy((GaimContact *)node); | |
| 1712 | } | |
| 1713 | else if (!GAIM_BLIST_NODE_IS_BUDDY(node)) | |
| 1714 | { | |
| 1715 | gtk_tree_path_free(sourcerow); | |
| 1716 | return; | |
| 1717 | } | |
| 1718 | else | |
| 1719 | { | |
| 1720 | buddy = (GaimBuddy *)node; | |
| 1721 | } | |
| 1722 | ||
| 1723 | gc = gaim_account_get_connection(buddy->account); | |
| 1724 | ||
| 1725 | if (gc == NULL) | |
| 1726 | { | |
| 1727 | gtk_tree_path_free(sourcerow); | |
| 1728 | return; | |
| 1729 | } | |
| 1730 | ||
| 1731 | protocol = | |
| 1732 | GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->list_icon(buddy->account, | |
| 1733 | buddy); | |
| 1734 | ||
| 1735 | str = g_string_new(NULL); | |
| 1736 | g_string_printf(str, | |
| 1737 | "MIME-Version: 1.0\r\n" | |
| 1738 | "Content-Type: application/x-im-contact\r\n" | |
| 1739 | "X-IM-Protocol: %s\r\n" | |
| 1740 | "X-IM-Username: %s\r\n", | |
| 1741 | protocol, | |
| 1742 | buddy->name); | |
| 1743 | ||
| 1744 | if (buddy->alias != NULL) | |
| 1745 | { | |
| 1746 | g_string_append_printf(str, | |
| 1747 | "X-IM-Alias: %s\r\n", | |
| 1748 | buddy->alias); | |
| 1749 | } | |
| 1750 | ||
| 1751 | str = g_string_append(str, "\r\n"); | |
| 1752 | ||
| 1753 | mime_str = g_string_free(str, FALSE); | |
| 1754 | ||
| 1755 | gtk_selection_data_set(data, | |
| 1756 | gdk_atom_intern("application/x-im-contact", FALSE), | |
| 1757 | 8, /* bits */ | |
| 1758 | mime_str, | |
| 1759 | strlen(mime_str) + 1); | |
| 1760 | ||
| 1761 | g_free(mime_str); | |
| 1762 | gtk_tree_path_free(sourcerow); | |
| 1763 | } | |
| 5228 | 1764 | } |
| 1765 | ||
| 1766 | static void gaim_gtk_blist_drag_data_rcv_cb(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, | |
| 1767 | GtkSelectionData *sd, guint info, guint t) | |
| 7620 | 1768 | { |
| 5228 | 1769 | if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE) && sd->data) { |
| 1770 | GaimBlistNode *n = NULL; | |
| 1771 | GtkTreePath *path = NULL; | |
| 1772 | GtkTreeViewDropPosition position; | |
| 1773 | memcpy(&n, sd->data, sizeof(n)); | |
| 1774 | if(gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), x, y, &path, &position)) { | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
1775 | /* if we're here, I think it means the drop is ok */ |
| 7642 | 1776 | GtkTreeIter iter; |
| 5228 | 1777 | GaimBlistNode *node; |
| 1778 | GValue val = {0}; | |
| 7620 | 1779 | struct _gaim_gtk_blist_node *gtknode; |
| 1780 | ||
| 1781 | gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), | |
| 1782 | &iter, path); | |
| 1783 | gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), | |
| 1784 | &iter, NODE_COLUMN, &val); | |
| 5228 | 1785 | node = g_value_get_pointer(&val); |
| 7620 | 1786 | gtknode = node->ui_data; |
| 1787 | ||
| 1788 | if (GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
| 1789 | GaimContact *c = (GaimContact*)n; | |
| 1790 | if (GAIM_BLIST_NODE_IS_CONTACT(node) && gtknode->contact_expanded) { | |
| 1791 | gaim_blist_merge_contact(c, node); | |
| 1792 | } else if (GAIM_BLIST_NODE_IS_CONTACT(node) || | |
| 5234 | 1793 | GAIM_BLIST_NODE_IS_CHAT(node)) { |
| 5228 | 1794 | switch(position) { |
| 1795 | case GTK_TREE_VIEW_DROP_AFTER: | |
| 1796 | case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
| 7620 | 1797 | gaim_blist_add_contact(c, (GaimGroup*)node->parent, |
| 1798 | node); | |
| 1799 | break; | |
| 1800 | case GTK_TREE_VIEW_DROP_BEFORE: | |
| 1801 | case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
| 1802 | gaim_blist_add_contact(c, (GaimGroup*)node->parent, | |
| 1803 | node->prev); | |
| 1804 | break; | |
| 1805 | } | |
| 1806 | } else if(GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 1807 | gaim_blist_add_contact(c, (GaimGroup*)node, NULL); | |
| 1808 | } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 1809 | gaim_blist_merge_contact(c, node); | |
| 1810 | } | |
| 1811 | } else if (GAIM_BLIST_NODE_IS_BUDDY(n)) { | |
| 1812 | GaimBuddy *b = (GaimBuddy*)n; | |
| 1813 | if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 1814 | switch(position) { | |
| 1815 | case GTK_TREE_VIEW_DROP_AFTER: | |
| 1816 | case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
| 1817 | gaim_blist_add_buddy(b, (GaimContact*)node->parent, | |
| 1818 | (GaimGroup*)node->parent->parent, node); | |
| 5228 | 1819 | break; |
| 1820 | case GTK_TREE_VIEW_DROP_BEFORE: | |
| 1821 | case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
| 7620 | 1822 | gaim_blist_add_buddy(b, (GaimContact*)node->parent, |
| 1823 | (GaimGroup*)node->parent->parent, | |
| 1824 | node->prev); | |
| 5228 | 1825 | break; |
| 1826 | } | |
| 7620 | 1827 | } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { |
| 1828 | gaim_blist_add_buddy(b, NULL, (GaimGroup*)node->parent, | |
| 1829 | NULL); | |
| 5228 | 1830 | } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
| 7620 | 1831 | gaim_blist_add_buddy(b, NULL, (GaimGroup*)node, NULL); |
| 1832 | } else if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 1833 | if(gtknode->contact_expanded) { | |
| 1834 | switch(position) { | |
| 1835 | case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
| 1836 | case GTK_TREE_VIEW_DROP_AFTER: | |
| 1837 | case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
| 1838 | gaim_blist_add_buddy(b, (GaimContact*)node, | |
| 1839 | (GaimGroup*)node->parent, NULL); | |
| 1840 | break; | |
| 1841 | case GTK_TREE_VIEW_DROP_BEFORE: | |
| 1842 | gaim_blist_add_buddy(b, NULL, | |
| 1843 | (GaimGroup*)node->parent, node->prev); | |
| 1844 | break; | |
| 1845 | } | |
| 1846 | } else { | |
| 1847 | switch(position) { | |
| 1848 | case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
| 1849 | case GTK_TREE_VIEW_DROP_AFTER: | |
| 1850 | gaim_blist_add_buddy(b, NULL, | |
| 1851 | (GaimGroup*)node->parent, NULL); | |
| 1852 | break; | |
| 1853 | case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
| 1854 | case GTK_TREE_VIEW_DROP_BEFORE: | |
| 1855 | gaim_blist_add_buddy(b, NULL, | |
| 1856 | (GaimGroup*)node->parent, node->prev); | |
| 1857 | break; | |
| 1858 | } | |
| 1859 | } | |
| 5228 | 1860 | } |
| 5234 | 1861 | } else if (GAIM_BLIST_NODE_IS_CHAT(n)) { |
| 7620 | 1862 | GaimChat *chat = (GaimChat *)n; |
| 1863 | if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 1864 | switch(position) { | |
| 1865 | case GTK_TREE_VIEW_DROP_AFTER: | |
| 1866 | case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
| 1867 | gaim_blist_add_chat(chat, | |
| 1868 | (GaimGroup*)node->parent->parent, node); | |
| 1869 | break; | |
| 1870 | case GTK_TREE_VIEW_DROP_BEFORE: | |
| 1871 | case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
| 1872 | gaim_blist_add_chat(chat, | |
| 1873 | (GaimGroup*)node->parent->parent, | |
| 1874 | node->prev); | |
| 1875 | break; | |
| 1876 | } | |
| 1877 | } else if(GAIM_BLIST_NODE_IS_CONTACT(node) || | |
| 5234 | 1878 | GAIM_BLIST_NODE_IS_CHAT(node)) { |
| 1879 | switch(position) { | |
| 1880 | case GTK_TREE_VIEW_DROP_AFTER: | |
| 1881 | case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
| 7620 | 1882 | gaim_blist_add_chat(chat, (GaimGroup*)node->parent, node); |
| 5234 | 1883 | break; |
| 1884 | case GTK_TREE_VIEW_DROP_BEFORE: | |
| 1885 | case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
| 7620 | 1886 | gaim_blist_add_chat(chat, (GaimGroup*)node->parent, node->prev); |
| 5234 | 1887 | break; |
| 1888 | } | |
| 1889 | } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
| 7620 | 1890 | gaim_blist_add_chat(chat, (GaimGroup*)node, NULL); |
| 5234 | 1891 | } |
| 5228 | 1892 | } else if (GAIM_BLIST_NODE_IS_GROUP(n)) { |
| 7620 | 1893 | GaimGroup *g = (GaimGroup*)n; |
| 5228 | 1894 | if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
| 1895 | switch (position) { | |
| 1896 | case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
| 1897 | case GTK_TREE_VIEW_DROP_AFTER: | |
| 1898 | gaim_blist_add_group(g, node); | |
| 1899 | break; | |
| 1900 | case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
| 1901 | case GTK_TREE_VIEW_DROP_BEFORE: | |
| 1902 | gaim_blist_add_group(g, node->prev); | |
| 1903 | break; | |
| 1904 | } | |
| 7620 | 1905 | } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 1906 | gaim_blist_add_group(g, node->parent->parent); | |
| 1907 | } else if(GAIM_BLIST_NODE_IS_CONTACT(node) || | |
| 5234 | 1908 | GAIM_BLIST_NODE_IS_CHAT(node)) { |
| 5228 | 1909 | gaim_blist_add_group(g, node->parent); |
| 1910 | } | |
| 1911 | } | |
| 1912 | ||
| 1913 | gtk_tree_path_free(path); | |
| 7620 | 1914 | gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
| 1915 | ||
| 5228 | 1916 | gaim_blist_save(); |
| 1917 | } | |
| 1918 | } | |
| 7706 | 1919 | else if (sd->target == gdk_atom_intern("application/x-im-contact", |
| 1920 | FALSE) && sd->data) | |
| 1921 | { | |
| 1922 | GaimGroup *group = NULL; | |
| 1923 | GtkTreePath *path = NULL; | |
| 1924 | GtkTreeViewDropPosition position; | |
|
7712
74af9358b808
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7706
diff
changeset
|
1925 | GaimAccount *account; |
| 7706 | 1926 | char *protocol = NULL; |
| 1927 | char *username = NULL; | |
| 1928 | char *alias = NULL; | |
| 1929 | ||
| 1930 | if (gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), | |
| 1931 | x, y, &path, &position)) | |
| 1932 | { | |
| 1933 | GtkTreeIter iter; | |
| 1934 | GaimBlistNode *node; | |
| 1935 | GValue val = {0}; | |
| 1936 | ||
| 1937 | gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), | |
| 1938 | &iter, path); | |
| 1939 | gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), | |
| 1940 | &iter, NODE_COLUMN, &val); | |
| 1941 | node = g_value_get_pointer(&val); | |
| 1942 | ||
| 1943 | if (GAIM_BLIST_NODE_IS_BUDDY(node)) | |
| 1944 | { | |
| 1945 | group = (GaimGroup *)node->parent->parent; | |
| 1946 | } | |
| 1947 | else if (GAIM_BLIST_NODE_IS_CHAT(node) || | |
| 1948 | GAIM_BLIST_NODE_IS_CONTACT(node)) | |
| 1949 | { | |
| 1950 | group = (GaimGroup *)node->parent; | |
| 1951 | } | |
| 1952 | else if (GAIM_BLIST_NODE_IS_GROUP(node)) | |
| 1953 | { | |
| 1954 | group = (GaimGroup *)node; | |
| 1955 | } | |
| 1956 | } | |
| 1957 | ||
|
7712
74af9358b808
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7706
diff
changeset
|
1958 | if (gaim_gtk_parse_x_im_contact(sd->data, FALSE, &account, |
|
74af9358b808
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7706
diff
changeset
|
1959 | &protocol, &username, &alias)) |
| 7706 | 1960 | { |
| 1961 | if (account == NULL) | |
| 1962 | { | |
| 1963 | gaim_notify_error(NULL, NULL, | |
| 1964 | _("You are not currently signed on with an account that " | |
| 1965 | "can add that buddy."), NULL); | |
| 1966 | } | |
| 1967 | else | |
| 1968 | { | |
| 1969 | gaim_blist_request_add_buddy(account, username, | |
| 1970 | (group ? group->name : NULL), | |
| 1971 | alias); | |
| 1972 | } | |
| 1973 | } | |
| 1974 | ||
| 1975 | if (username != NULL) g_free(username); | |
| 1976 | if (protocol != NULL) g_free(protocol); | |
| 1977 | if (alias != NULL) g_free(alias); | |
| 1978 | ||
| 1979 | if (path != NULL) | |
| 1980 | gtk_tree_path_free(path); | |
| 1981 | ||
| 1982 | gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); | |
| 1983 | } | |
| 8089 | 1984 | else if (sd->target == gdk_atom_intern("text/x-vcard", FALSE) && sd->data) |
| 1985 | { | |
| 1986 | gboolean result; | |
| 1987 | GaimGroup *group = NULL; | |
| 1988 | GtkTreePath *path = NULL; | |
| 1989 | GtkTreeViewDropPosition position; | |
| 1990 | ||
| 1991 | if (gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), | |
| 1992 | x, y, &path, &position)) | |
| 1993 | { | |
| 1994 | GtkTreeIter iter; | |
| 1995 | GaimBlistNode *node; | |
| 1996 | GValue val = {0}; | |
| 1997 | ||
| 1998 | gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), | |
| 1999 | &iter, path); | |
| 2000 | gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), | |
| 2001 | &iter, NODE_COLUMN, &val); | |
| 2002 | node = g_value_get_pointer(&val); | |
| 2003 | ||
| 2004 | if (GAIM_BLIST_NODE_IS_BUDDY(node)) | |
| 2005 | { | |
| 2006 | group = (GaimGroup *)node->parent->parent; | |
| 2007 | } | |
| 2008 | else if (GAIM_BLIST_NODE_IS_CHAT(node) || | |
| 2009 | GAIM_BLIST_NODE_IS_CONTACT(node)) | |
| 2010 | { | |
| 2011 | group = (GaimGroup *)node->parent; | |
| 2012 | } | |
| 2013 | else if (GAIM_BLIST_NODE_IS_GROUP(node)) | |
| 2014 | { | |
| 2015 | group = (GaimGroup *)node; | |
| 2016 | } | |
| 2017 | } | |
| 2018 | ||
| 2019 | result = parse_vcard(sd->data, group); | |
| 2020 | ||
| 2021 | gtk_drag_finish(dc, result, (dc->action == GDK_ACTION_MOVE), t); | |
| 2022 | } | |
| 5228 | 2023 | } |
| 2024 | ||
| 5234 | 2025 | static void gaim_gtk_blist_paint_tip(GtkWidget *widget, GdkEventExpose *event, GaimBlistNode *node) |
| 5228 | 2026 | { |
| 2027 | GtkStyle *style; | |
| 5234 | 2028 | GdkPixbuf *pixbuf = gaim_gtk_blist_get_status_icon(node, GAIM_STATUS_ICON_LARGE); |
| 5228 | 2029 | PangoLayout *layout; |
| 5234 | 2030 | char *tooltiptext = gaim_get_tooltip_text(node); |
| 5228 | 2031 | |
| 7620 | 2032 | if(!tooltiptext) |
| 2033 | return; | |
| 2034 | ||
| 5228 | 2035 | layout = gtk_widget_create_pango_layout (gtkblist->tipwindow, NULL); |
| 2036 | pango_layout_set_markup(layout, tooltiptext, strlen(tooltiptext)); | |
| 2037 | pango_layout_set_wrap(layout, PANGO_WRAP_WORD); | |
| 2038 | pango_layout_set_width(layout, 300000); | |
| 2039 | style = gtkblist->tipwindow->style; | |
| 2040 | ||
| 2041 | gtk_paint_flat_box (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, | |
| 2042 | NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1); | |
| 2043 | ||
| 2044 | #if GTK_CHECK_VERSION(2,2,0) | |
| 2045 | gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, pixbuf, | |
| 2046 | 0, 0, 4, 4, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); | |
| 2047 | #else | |
| 2048 | gdk_pixbuf_render_to_drawable(pixbuf, GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, 4, 4, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); | |
| 2049 | #endif | |
| 2050 | ||
| 2051 | gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, TRUE, | |
| 2052 | NULL, gtkblist->tipwindow, "tooltip", 38, 4, layout); | |
| 2053 | ||
| 2054 | g_object_unref (pixbuf); | |
| 2055 | g_object_unref (layout); | |
| 2056 | g_free(tooltiptext); | |
| 7620 | 2057 | |
| 7662 | 2058 | #ifdef WANT_DROP_SHADOW |
| 8040 | 2059 | shadow_paint(gtkblist, NULL, EAST_SIDE); |
| 2060 | shadow_paint(gtkblist, NULL, SOUTH_SIDE); | |
| 7620 | 2061 | #endif |
| 2062 | ||
| 5228 | 2063 | return; |
| 2064 | } | |
| 2065 | ||
|
8254
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2066 | static void gaim_gtk_blist_tooltip_destroy() |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2067 | { |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2068 | if (gtkblist->tipwindow == NULL) |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2069 | return; |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2070 | |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2071 | gtk_widget_destroy(gtkblist->tipwindow); |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2072 | gtkblist->tipwindow = NULL; |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2073 | #ifdef WANT_DROP_SHADOW |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2074 | gdk_window_set_user_data (gtkblist->east_shadow, NULL); |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2075 | gdk_window_destroy (gtkblist->east_shadow); |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2076 | gtkblist->east_shadow = NULL; |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2077 | |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2078 | gdk_window_set_user_data (gtkblist->south_shadow, NULL); |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2079 | gdk_window_destroy (gtkblist->south_shadow); |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2080 | gtkblist->south_shadow = NULL; |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2081 | #endif |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2082 | } |
|
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2083 | |
| 5228 | 2084 | static gboolean gaim_gtk_blist_tooltip_timeout(GtkWidget *tv) |
| 2085 | { | |
| 2086 | GtkTreePath *path; | |
| 2087 | GtkTreeIter iter; | |
| 2088 | GaimBlistNode *node; | |
| 2089 | GValue val = {0}; | |
| 5234 | 2090 | int scr_w,scr_h, w, h, x, y; |
| 2091 | PangoLayout *layout; | |
| 7636 | 2092 | gboolean tooltip_top = FALSE; |
| 5234 | 2093 | char *tooltiptext = NULL; |
| 7636 | 2094 | struct _gaim_gtk_blist_node *gtknode; |
| 7662 | 2095 | #ifdef WANT_DROP_SHADOW |
| 7620 | 2096 | GdkWindowAttr attr; |
| 2097 | #endif | |
| 5228 | 2098 | |
| 7636 | 2099 | if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), gtkblist->tip_rect.x, gtkblist->tip_rect.y, &path, NULL, NULL, NULL)) |
| 5228 | 2100 | return FALSE; |
| 2101 | gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
| 2102 | gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); | |
| 2103 | node = g_value_get_pointer(&val); | |
| 7620 | 2104 | |
| 2105 | if(!GAIM_BLIST_NODE_IS_CONTACT(node) && !GAIM_BLIST_NODE_IS_BUDDY(node) | |
| 2106 | && !GAIM_BLIST_NODE_IS_CHAT(node)) | |
| 5234 | 2107 | return FALSE; |
| 5228 | 2108 | |
| 7636 | 2109 | gtknode = node->ui_data; |
| 2110 | ||
| 7731 | 2111 | if (node->child && GAIM_BLIST_NODE_IS_CONTACT(node) && |
| 2112 | ((GaimContact*)node)->online > 1 && !gtknode->contact_expanded && | |
| 2113 | gaim_prefs_get_bool("/gaim/gtk/blist/auto_expand_contacts")) { | |
| 7719 | 2114 | GtkTreeIter i; |
| 7636 | 2115 | gaim_gtk_blist_expand_contact_cb(NULL, node); |
| 8083 | 2116 | tooltip_top = TRUE; /* When the person expands, the new screennames will be below. |
| 2117 | We'll draw the tip above the cursor so that the user can see | |
| 2118 | the included buddies */ | |
| 2119 | ||
| 7636 | 2120 | while (gtk_events_pending()) |
| 2121 | gtk_main_iteration(); | |
| 2122 | ||
| 8083 | 2123 | /* we check to see if we're still supposed to be moving, now that gtk events have |
| 2124 | * happened, and the mouse might not still be in the buddy list */ | |
| 2125 | if(!gtkblist->timeout) { | |
| 2126 | gaim_gtk_blist_collapse_contact_cb(NULL, node); | |
| 2127 | return FALSE; | |
| 2128 | } | |
| 2129 | ||
| 7636 | 2130 | gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, >kblist->contact_rect); |
| 7720 | 2131 | gdk_drawable_get_size(GDK_DRAWABLE(tv->window), &(gtkblist->contact_rect.width), NULL); |
| 7636 | 2132 | gtkblist->mouseover_contact = node; |
| 2133 | gtk_tree_path_down (path); | |
| 7719 | 2134 | while (gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &i, path)) { |
| 7636 | 2135 | GdkRectangle rect; |
| 2136 | gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, &rect); | |
| 2137 | gtkblist->contact_rect.height += rect.height; | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2138 | gtk_tree_path_next(path); |
| 7636 | 2139 | } |
| 2140 | } | |
| 2141 | ||
| 2142 | gtk_tree_path_free(path); | |
| 2143 | ||
| 5234 | 2144 | tooltiptext = gaim_get_tooltip_text(node); |
| 7620 | 2145 | |
| 2146 | if(!tooltiptext) | |
| 2147 | return FALSE; | |
| 2148 | ||
| 7837 | 2149 | if(gtkblist->tipwindow) |
| 2150 | gtk_widget_destroy(gtkblist->tipwindow); | |
| 5234 | 2151 | gtkblist->tipwindow = gtk_window_new(GTK_WINDOW_POPUP); |
| 2152 | gtk_widget_set_app_paintable(gtkblist->tipwindow, TRUE); | |
| 2153 | gtk_window_set_resizable(GTK_WINDOW(gtkblist->tipwindow), FALSE); | |
| 2154 | gtk_widget_set_name(gtkblist->tipwindow, "gtk-tooltips"); | |
| 2155 | g_signal_connect(G_OBJECT(gtkblist->tipwindow), "expose_event", | |
| 2156 | G_CALLBACK(gaim_gtk_blist_paint_tip), node); | |
| 2157 | gtk_widget_ensure_style (gtkblist->tipwindow); | |
| 7837 | 2158 | |
| 7662 | 2159 | #ifdef WANT_DROP_SHADOW |
| 7620 | 2160 | attr.window_type = GDK_WINDOW_TEMP; |
| 2161 | attr.override_redirect = TRUE; | |
| 2162 | attr.x = gtkblist->tipwindow->allocation.x; | |
| 2163 | attr.y = gtkblist->tipwindow->allocation.y; | |
| 2164 | attr.width = gtkblist->tipwindow->allocation.width; | |
| 2165 | attr.height = gtkblist->tipwindow->allocation.height; | |
| 2166 | attr.wclass = GDK_INPUT_OUTPUT; | |
| 2167 | attr.visual = gtk_widget_get_visual (gtkblist->window); | |
| 2168 | attr.colormap = gtk_widget_get_colormap (gtkblist->window); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2169 | |
| 7620 | 2170 | attr.event_mask = gtk_widget_get_events (gtkblist->tipwindow); |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2171 | |
| 7620 | 2172 | attr.event_mask |= (GDK_EXPOSURE_MASK | GDK_KEY_PRESS_MASK | |
| 2173 | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK ); | |
| 7897 | 2174 | if(gtkblist->east_shadow) { |
| 2175 | gdk_window_set_user_data (gtkblist->east_shadow, NULL); | |
| 2176 | gdk_window_destroy (gtkblist->east_shadow); | |
| 2177 | } | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2178 | gtkblist->east_shadow = gdk_window_new(gtk_widget_get_root_window(gtkblist->tipwindow), &attr, |
| 7620 | 2179 | GDK_WA_NOREDIR | GDK_WA_VISUAL | GDK_WA_COLORMAP); |
| 2180 | gdk_window_set_user_data (gtkblist->east_shadow, gtkblist->tipwindow); | |
| 2181 | gdk_window_set_back_pixmap (gtkblist->east_shadow, NULL, FALSE); | |
| 2182 | ||
| 7897 | 2183 | if(gtkblist->south_shadow) { |
| 2184 | gdk_window_set_user_data (gtkblist->south_shadow, NULL); | |
| 2185 | gdk_window_destroy (gtkblist->south_shadow); | |
| 2186 | } | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2187 | gtkblist->south_shadow = gdk_window_new(gtk_widget_get_root_window(gtkblist->tipwindow), &attr, |
| 7620 | 2188 | GDK_WA_NOREDIR | GDK_WA_VISUAL | GDK_WA_COLORMAP); |
| 2189 | gdk_window_set_user_data (gtkblist->south_shadow, gtkblist->tipwindow); | |
| 2190 | gdk_window_set_back_pixmap (gtkblist->south_shadow, NULL, FALSE); | |
| 2191 | #endif | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2192 | |
| 5234 | 2193 | layout = gtk_widget_create_pango_layout (gtkblist->tipwindow, NULL); |
| 2194 | pango_layout_set_wrap(layout, PANGO_WRAP_WORD); | |
| 2195 | pango_layout_set_width(layout, 300000); | |
| 2196 | pango_layout_set_markup(layout, tooltiptext, strlen(tooltiptext)); | |
| 2197 | scr_w = gdk_screen_width(); | |
| 2198 | scr_h = gdk_screen_height(); | |
| 2199 | pango_layout_get_size (layout, &w, &h); | |
| 2200 | w = PANGO_PIXELS(w) + 8; | |
| 2201 | h = PANGO_PIXELS(h) + 8; | |
| 5228 | 2202 | |
| 5234 | 2203 | /* 38 is the size of a large status icon plus 4 pixels padding on each side. |
| 2204 | * I should #define this or something */ | |
| 2205 | w = w + 38; | |
| 2206 | h = MAX(h, 38); | |
| 2207 | ||
| 2208 | gdk_window_get_pointer(NULL, &x, &y, NULL); | |
| 2209 | if (GTK_WIDGET_NO_WINDOW(gtkblist->window)) | |
| 2210 | y+=gtkblist->window->allocation.y; | |
| 2211 | ||
| 2212 | x -= ((w >> 1) + 4); | |
| 5228 | 2213 | |
| 7636 | 2214 | if ((y + h + 4) > scr_h || tooltip_top) |
| 7620 | 2215 | y = y - h - 5; |
| 5234 | 2216 | else |
| 2217 | y = y + 6; | |
| 7620 | 2218 | |
| 7719 | 2219 | if (y < 0) |
| 2220 | y = 0; | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2221 | |
| 7719 | 2222 | if (y != 0) { |
| 2223 | if ((x + w) > scr_w) | |
| 2224 | x -= (x + w + 5) - scr_w; | |
| 2225 | else if (x < 0) | |
| 2226 | x = 0; | |
| 2227 | } else { | |
| 2228 | x -= (w / 2 + 10); | |
| 2229 | if (x < 0) | |
| 2230 | x += w + 15; | |
| 2231 | } | |
| 2232 | ||
| 5234 | 2233 | g_object_unref (layout); |
| 2234 | g_free(tooltiptext); | |
| 2235 | gtk_widget_set_size_request(gtkblist->tipwindow, w, h); | |
| 2236 | gtk_window_move(GTK_WINDOW(gtkblist->tipwindow), x, y); | |
| 2237 | gtk_widget_show(gtkblist->tipwindow); | |
| 5228 | 2238 | |
| 7662 | 2239 | #ifdef WANT_DROP_SHADOW |
| 7620 | 2240 | map_shadow_windows(gtkblist); |
| 2241 | #endif | |
| 2242 | ||
| 5228 | 2243 | return FALSE; |
| 2244 | } | |
| 2245 | ||
| 2246 | static gboolean gaim_gtk_blist_motion_cb (GtkWidget *tv, GdkEventMotion *event, gpointer null) | |
| 2247 | { | |
| 2248 | GtkTreePath *path; | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2249 | int delay; |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2250 | |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2251 | delay = gaim_prefs_get_int("/gaim/gtk/blist/tooltip_delay"); |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2252 | |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2253 | if (delay == 0) |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2254 | return FALSE; |
| 8083 | 2255 | |
| 5228 | 2256 | if (gtkblist->timeout) { |
| 7636 | 2257 | if ((event->y > gtkblist->tip_rect.y) && ((event->y - gtkblist->tip_rect.height) < gtkblist->tip_rect.y)) |
| 5228 | 2258 | return FALSE; |
| 2259 | /* We've left the cell. Remove the timeout and create a new one below */ | |
|
8254
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2260 | gaim_gtk_blist_tooltip_destroy(); |
| 5228 | 2261 | g_source_remove(gtkblist->timeout); |
| 2262 | } | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2263 | |
| 5228 | 2264 | gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL); |
| 7636 | 2265 | gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, >kblist->tip_rect); |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2266 | |
| 5228 | 2267 | if (path) |
| 2268 | gtk_tree_path_free(path); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2269 | gtkblist->timeout = g_timeout_add(delay, (GSourceFunc)gaim_gtk_blist_tooltip_timeout, tv); |
| 7636 | 2270 | |
| 2271 | if (gtkblist->mouseover_contact) { | |
| 2272 | if ((event->y < gtkblist->contact_rect.y) || ((event->y - gtkblist->contact_rect.height) > gtkblist->contact_rect.y)) { | |
| 2273 | gaim_gtk_blist_collapse_contact_cb(NULL, gtkblist->mouseover_contact); | |
| 2274 | gtkblist->mouseover_contact = NULL; | |
| 2275 | } | |
| 2276 | } | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2277 | |
| 5228 | 2278 | return FALSE; |
| 2279 | } | |
| 2280 | ||
| 2281 | static void gaim_gtk_blist_leave_cb (GtkWidget *w, GdkEventCrossing *e, gpointer n) | |
| 2282 | { | |
| 8083 | 2283 | |
| 5228 | 2284 | if (gtkblist->timeout) { |
| 2285 | g_source_remove(gtkblist->timeout); | |
| 2286 | gtkblist->timeout = 0; | |
| 2287 | } | |
|
8254
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
2288 | gaim_gtk_blist_tooltip_destroy(); |
| 7720 | 2289 | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2290 | if (gtkblist->mouseover_contact && |
| 7720 | 2291 | !((e->x > gtkblist->contact_rect.x) && (e->x < (gtkblist->contact_rect.x + gtkblist->contact_rect.width)) && |
| 2292 | (e->y > gtkblist->contact_rect.y) && (e->y < (gtkblist->contact_rect.y + gtkblist->contact_rect.height)))) { | |
| 2293 | gaim_gtk_blist_collapse_contact_cb(NULL, gtkblist->mouseover_contact); | |
| 7636 | 2294 | gtkblist->mouseover_contact = NULL; |
| 2295 | } | |
| 5228 | 2296 | } |
| 2297 | ||
| 2298 | static void | |
| 2299 | toggle_debug(void) | |
| 2300 | { | |
| 7620 | 2301 | gaim_prefs_set_bool("/gaim/gtk/debug/enabled", |
| 2302 | !gaim_prefs_get_bool("/gaim/gtk/debug/enabled")); | |
| 5228 | 2303 | } |
| 2304 | ||
| 2305 | ||
| 2306 | /*************************************************** | |
| 2307 | * Crap * | |
| 2308 | ***************************************************/ | |
| 2309 | static GtkItemFactoryEntry blist_menu[] = | |
| 2310 | { | |
| 2311 | /* Buddies menu */ | |
| 2312 | { N_("/_Buddies"), NULL, NULL, 0, "<Branch>" }, | |
|
7887
4b2925a88897
[gaim-migrate @ 8545]
Mark Doliner <markdoliner@pidgin.im>
parents:
7879
diff
changeset
|
2313 | { N_("/Buddies/New Instant _Message..."), "<CTL>M", show_im_dialog, 0, "<StockItem>", GAIM_STOCK_IM }, |
|
8305
5a6d1168a8b3
[gaim-migrate @ 9029]
Christian Hammond <chipx86@chipx86.com>
parents:
8303
diff
changeset
|
2314 | { N_("/Buddies/Join a _Chat..."), "<CTL>C", gaim_gtk_blist_show_join_chat, 0, "<StockItem>", GAIM_STOCK_CHAT }, |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
2315 | { N_("/Buddies/Get User _Info..."), "<CTL>I", show_info_dialog, 0, "<StockItem>", GAIM_STOCK_INFO }, |
| 5228 | 2316 | { "/Buddies/sep1", NULL, NULL, 0, "<Separator>" }, |
| 5398 | 2317 | { N_("/Buddies/Show _Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, "<CheckItem>"}, |
| 5228 | 2318 | { N_("/Buddies/Show _Empty Groups"), NULL, gaim_gtk_blist_show_empty_groups_cb, 1, "<CheckItem>"}, |
|
7853
cd8b631ff166
[gaim-migrate @ 8507]
Mark Doliner <markdoliner@pidgin.im>
parents:
7843
diff
changeset
|
2319 | { N_("/Buddies/_Add Buddy..."), "<CTL>B", gaim_gtk_blist_add_buddy_cb, 0, "<StockItem>", GTK_STOCK_ADD }, |
|
cd8b631ff166
[gaim-migrate @ 8507]
Mark Doliner <markdoliner@pidgin.im>
parents:
7843
diff
changeset
|
2320 | { N_("/Buddies/Add C_hat..."), NULL, gaim_gtk_blist_add_chat_cb, 0, "<StockItem>", GTK_STOCK_ADD }, |
|
cd8b631ff166
[gaim-migrate @ 8507]
Mark Doliner <markdoliner@pidgin.im>
parents:
7843
diff
changeset
|
2321 | { N_("/Buddies/Add _Group..."), NULL, gaim_blist_request_add_group, 0, "<StockItem>", GTK_STOCK_ADD }, |
| 5228 | 2322 | { "/Buddies/sep2", NULL, NULL, 0, "<Separator>" }, |
| 7620 | 2323 | { N_("/Buddies/_Signoff"), "<CTL>D", gaim_connections_disconnect_all, 0, "<StockItem>", GAIM_STOCK_SIGN_OFF }, |
| 2324 | { N_("/Buddies/_Quit"), "<CTL>Q", gaim_core_quit, 0, "<StockItem>", GTK_STOCK_QUIT }, | |
| 5228 | 2325 | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2326 | /* Tools */ |
| 5228 | 2327 | { N_("/_Tools"), NULL, NULL, 0, "<Branch>" }, |
| 2328 | { N_("/Tools/_Away"), NULL, NULL, 0, "<Branch>" }, | |
| 2329 | { N_("/Tools/Buddy _Pounce"), NULL, NULL, 0, "<Branch>" }, | |
| 2330 | { N_("/Tools/P_rotocol Actions"), NULL, NULL, 0, "<Branch>" }, | |
| 2331 | { "/Tools/sep1", NULL, NULL, 0, "<Separator>" }, | |
| 7620 | 2332 | { N_("/Tools/A_ccounts"), "<CTL>A", gaim_gtk_accounts_window_show, 0, "<StockItem>", GAIM_STOCK_ACCOUNTS }, |
| 7737 | 2333 | { N_("/Tools/_File Transfers"), NULL, gaim_show_xfer_dialog, 0, "<StockItem>", GAIM_STOCK_FILE_TRANSFER }, |
| 8113 | 2334 | { N_("/Tools/R_oom List"), NULL, gaim_gtk_roomlist_dialog_show, 0, NULL }, |
|
7870
a91330fa7cbd
[gaim-migrate @ 8524]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
7859
diff
changeset
|
2335 | { N_("/Tools/Pr_eferences"), "<CTL>P", gaim_gtk_prefs_show, 0, "<StockItem>", GTK_STOCK_PREFERENCES }, |
|
7856
df68efa91eb1
[gaim-migrate @ 8510]
Mark Doliner <markdoliner@pidgin.im>
parents:
7853
diff
changeset
|
2336 | { N_("/Tools/Pr_ivacy"), NULL, gaim_gtk_privacy_dialog_show, 0, NULL }, |
| 5228 | 2337 | { "/Tools/sep2", NULL, NULL, 0, "<Separator>" }, |
| 7620 | 2338 | { N_("/Tools/View System _Log"), NULL, gtk_blist_show_systemlog_cb, 0, NULL }, |
| 5228 | 2339 | |
| 2340 | /* Help */ | |
| 2341 | { N_("/_Help"), NULL, NULL, 0, "<Branch>" }, | |
| 2342 | { N_("/Help/Online _Help"), "F1", gtk_blist_show_onlinehelp_cb, 0, "<StockItem>", GTK_STOCK_HELP }, | |
| 7620 | 2343 | { N_("/Help/_Debug Window"), NULL, toggle_debug, 0, NULL }, |
| 2344 | { N_("/Help/_About"), NULL, show_about, 0, "<StockItem>", GAIM_STOCK_ABOUT }, | |
| 5228 | 2345 | }; |
| 2346 | ||
| 2347 | /********************************************************* | |
| 2348 | * Private Utility functions * | |
| 2349 | *********************************************************/ | |
| 7620 | 2350 | static void |
| 2351 | rename_group_cb(GaimGroup *g, const char *new_name) | |
| 2352 | { | |
| 2353 | gaim_blist_rename_group(g, new_name); | |
| 2354 | gaim_blist_save(); | |
| 2355 | } | |
| 2356 | ||
| 2357 | static void | |
| 2358 | show_rename_group(GtkWidget *unused, GaimGroup *g) | |
| 2359 | { | |
| 2360 | gaim_request_input(NULL, _("Rename Group"), _("New group name"), | |
| 2361 | _("Please enter a new name for the selected group."), | |
| 8697 | 2362 | g->name, FALSE, FALSE, NULL, |
| 7620 | 2363 | _("OK"), G_CALLBACK(rename_group_cb), |
| 2364 | _("Cancel"), NULL, g); | |
| 2365 | } | |
| 5228 | 2366 | |
| 5234 | 2367 | static char *gaim_get_tooltip_text(GaimBlistNode *node) |
| 5228 | 2368 | { |
| 5237 | 2369 | GaimPlugin *prpl; |
| 2370 | GaimPluginProtocolInfo *prpl_info = NULL; | |
| 5228 | 2371 | char *text = NULL; |
| 7956 | 2372 | |
| 5234 | 2373 | if(GAIM_BLIST_NODE_IS_CHAT(node)) { |
| 7620 | 2374 | GaimChat *chat = (GaimChat *)node; |
| 5237 | 2375 | char *name = NULL; |
| 5274 | 2376 | struct proto_chat_entry *pce; |
| 2377 | GList *parts, *tmp; | |
| 2378 | GString *parts_text = g_string_new(""); | |
| 2379 | ||
| 7956 | 2380 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(chat->account)); |
| 5274 | 2381 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
| 2382 | ||
| 2383 | parts = prpl_info->chat_info(chat->account->gc); | |
| 5237 | 2384 | |
| 7620 | 2385 | name = g_markup_escape_text(gaim_chat_get_name(chat), -1); |
| 2386 | ||
| 2387 | if(g_list_length(gaim_connections_get_all()) > 1) { | |
| 5274 | 2388 | char *account = g_markup_escape_text(chat->account->username, -1); |
| 2389 | g_string_append_printf(parts_text, _("\n<b>Account:</b> %s"), | |
| 2390 | account); | |
| 2391 | g_free(account); | |
| 5237 | 2392 | } |
| 5274 | 2393 | for(tmp = parts; tmp; tmp = tmp->next) { |
| 7889 | 2394 | char *label, *tmp2, *value; |
| 5274 | 2395 | pce = tmp->data; |
| 5237 | 2396 | |
| 8020 | 2397 | if(!pce->secret) { |
| 2398 | ||
| 2399 | tmp2 = g_markup_escape_text(pce->label, -1); | |
| 2400 | label = gaim_text_strip_mnemonic(tmp2); | |
| 2401 | g_free(tmp2); | |
| 2402 | ||
| 2403 | value = g_markup_escape_text(g_hash_table_lookup(chat->components, | |
| 2404 | pce->identifier), -1); | |
| 2405 | ||
| 2406 | g_string_append_printf(parts_text, "\n<b>%s</b> %s", label, value); | |
| 2407 | g_free(label); | |
| 2408 | g_free(value); | |
| 2409 | } | |
| 5274 | 2410 | g_free(pce); |
| 2411 | } | |
| 2412 | g_list_free(parts); | |
| 2413 | ||
| 2414 | text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>%s", | |
| 2415 | name, parts_text->str); | |
| 2416 | g_string_free(parts_text, TRUE); | |
| 5237 | 2417 | g_free(name); |
| 7620 | 2418 | } else if(GAIM_BLIST_NODE_IS_CONTACT(node) || |
| 2419 | GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 2420 | GaimBuddy *b; | |
| 5234 | 2421 | char *statustext = NULL; |
| 7620 | 2422 | char *contactaliastext = NULL; |
| 5234 | 2423 | char *aliastext = NULL, *nicktext = NULL; |
| 7950 | 2424 | char *loggedin = NULL, *idletime = NULL; |
| 2425 | char *warning = NULL; | |
| 5274 | 2426 | char *accounttext = NULL; |
| 5228 | 2427 | |
| 7620 | 2428 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) { |
| 2429 | GaimContact *contact = (GaimContact*)node; | |
| 2430 | b = gaim_contact_get_priority_buddy(contact); | |
| 2431 | if(contact->alias) | |
| 2432 | contactaliastext = g_markup_escape_text(contact->alias, -1); | |
| 2433 | } else { | |
| 2434 | b = (GaimBuddy *)node; | |
| 2435 | } | |
| 2436 | ||
| 7956 | 2437 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); |
| 5234 | 2438 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
| 2439 | ||
| 7620 | 2440 | if (prpl_info && prpl_info->tooltip_text) { |
| 5234 | 2441 | const char *end; |
| 2442 | statustext = prpl_info->tooltip_text(b); | |
| 5228 | 2443 | |
| 5234 | 2444 | if(statustext && !g_utf8_validate(statustext, -1, &end)) { |
| 2445 | char *new = g_strndup(statustext, | |
| 2446 | g_utf8_pointer_to_offset(statustext, end)); | |
| 2447 | g_free(statustext); | |
| 2448 | statustext = new; | |
| 2449 | } | |
| 2450 | } | |
| 2451 | ||
| 2452 | if (!statustext && !GAIM_BUDDY_IS_ONLINE(b)) | |
| 2453 | statustext = g_strdup(_("<b>Status:</b> Offline")); | |
| 5228 | 2454 | |
| 7950 | 2455 | if (b->signon > 0) |
| 2456 | loggedin = gaim_str_seconds_to_string(time(NULL) - b->signon); | |
| 2457 | ||
|
5341
91cc5a959efa
[gaim-migrate @ 5717]
Mark Doliner <markdoliner@pidgin.im>
parents:
5340
diff
changeset
|
2458 | if (b->idle > 0) |
| 7620 | 2459 | idletime = gaim_str_seconds_to_string(time(NULL) - b->idle); |
| 5228 | 2460 | |
| 5234 | 2461 | if(b->alias && b->alias[0]) |
| 2462 | aliastext = g_markup_escape_text(b->alias, -1); | |
| 5228 | 2463 | |
| 5234 | 2464 | if(b->server_alias) |
| 2465 | nicktext = g_markup_escape_text(b->server_alias, -1); | |
| 5228 | 2466 | |
| 5234 | 2467 | if (b->evil > 0) |
| 2468 | warning = g_strdup_printf(_("%d%%"), b->evil); | |
| 5228 | 2469 | |
| 7620 | 2470 | if(g_list_length(gaim_connections_get_all()) > 1) |
| 5274 | 2471 | accounttext = g_markup_escape_text(b->account->username, -1); |
| 2472 | ||
| 5234 | 2473 | text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>" |
|
8592
95551e6e91ba
[gaim-migrate @ 9343]
Mark Doliner <markdoliner@pidgin.im>
parents:
8591
diff
changeset
|
2474 | "%s %s" /* Account */ |
| 7620 | 2475 | "%s %s" /* Contact Alias */ |
| 5438 | 2476 | "%s %s" /* Alias */ |
| 2477 | "%s %s" /* Nickname */ | |
|
8592
95551e6e91ba
[gaim-migrate @ 9343]
Mark Doliner <markdoliner@pidgin.im>
parents:
8591
diff
changeset
|
2478 | "%s %s" /* Logged In */ |
|
95551e6e91ba
[gaim-migrate @ 9343]
Mark Doliner <markdoliner@pidgin.im>
parents:
8591
diff
changeset
|
2479 | "%s %s" /* Idle */ |
|
95551e6e91ba
[gaim-migrate @ 9343]
Mark Doliner <markdoliner@pidgin.im>
parents:
8591
diff
changeset
|
2480 | "%s %s" /* Warning */ |
|
95551e6e91ba
[gaim-migrate @ 9343]
Mark Doliner <markdoliner@pidgin.im>
parents:
8591
diff
changeset
|
2481 | "%s" /* Status */ |
| 5438 | 2482 | "%s", |
| 2483 | b->name, | |
| 2484 | accounttext ? _("\n<b>Account:</b>") : "", accounttext ? accounttext : "", | |
| 7620 | 2485 | contactaliastext ? _("\n<b>Contact Alias:</b>") : "", contactaliastext ? contactaliastext : "", |
| 5438 | 2486 | aliastext ? _("\n<b>Alias:</b>") : "", aliastext ? aliastext : "", |
| 2487 | nicktext ? _("\n<b>Nickname:</b>") : "", nicktext ? nicktext : "", | |
| 7950 | 2488 | loggedin ? _("\n<b>Logged In:</b>") : "", loggedin ? loggedin : "", |
| 5438 | 2489 | idletime ? _("\n<b>Idle:</b>") : "", idletime ? idletime : "", |
| 2490 | b->evil ? _("\n<b>Warned:</b>") : "", b->evil ? warning : "", | |
|
8592
95551e6e91ba
[gaim-migrate @ 9343]
Mark Doliner <markdoliner@pidgin.im>
parents:
8591
diff
changeset
|
2491 | statustext ? statustext : "", |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2492 | !g_ascii_strcasecmp(b->name, "robflynn") ? _("\n<b>Description:</b> Spooky") : |
| 7620 | 2493 | !g_ascii_strcasecmp(b->name, "seanegn") ? _("\n<b>Status</b>: Awesome") : |
| 2494 | !g_ascii_strcasecmp(b->name, "chipx86") ? _("\n<b>Status</b>: Rockin'") : ""); | |
| 5234 | 2495 | |
| 2496 | if(warning) | |
| 2497 | g_free(warning); | |
| 7950 | 2498 | if(loggedin) |
| 2499 | g_free(loggedin); | |
| 5234 | 2500 | if(idletime) |
| 2501 | g_free(idletime); | |
| 2502 | if(statustext) | |
| 2503 | g_free(statustext); | |
| 2504 | if(nicktext) | |
| 2505 | g_free(nicktext); | |
| 2506 | if(aliastext) | |
| 2507 | g_free(aliastext); | |
| 5274 | 2508 | if(accounttext) |
| 2509 | g_free(accounttext); | |
| 5234 | 2510 | } |
| 5228 | 2511 | |
| 2512 | return text; | |
| 2513 | } | |
| 2514 | ||
| 7620 | 2515 | struct _emblem_data { |
| 2516 | char *filename; | |
| 2517 | int x; | |
| 2518 | int y; | |
| 2519 | }; | |
| 2520 | ||
| 5234 | 2521 | GdkPixbuf *gaim_gtk_blist_get_status_icon(GaimBlistNode *node, GaimStatusIconSize size) |
| 5228 | 2522 | { |
| 7620 | 2523 | GdkPixbuf *scale, *status = NULL; |
| 2524 | int i, scalesize = 30; | |
| 2525 | char *filename; | |
| 5228 | 2526 | const char *protoname = NULL; |
| 7620 | 2527 | struct _gaim_gtk_blist_node *gtknode = node->ui_data; |
| 2528 | struct _emblem_data emblems[4] = {{NULL, 15, 15}, {NULL, 0, 15}, | |
| 2529 | {NULL, 0, 0}, {NULL, 15, 0}}; | |
| 2530 | ||
| 2531 | GaimBuddy *buddy = NULL; | |
| 2532 | GaimChat *chat = NULL; | |
| 2533 | ||
| 2534 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 2535 | if(!gtknode->contact_expanded) | |
| 2536 | buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
| 2537 | } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 2538 | buddy = (GaimBuddy*)node; | |
| 2539 | } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
| 2540 | chat = (GaimChat*)node; | |
| 2541 | } else { | |
| 5228 | 2542 | return NULL; |
| 5234 | 2543 | } |
| 2544 | ||
| 7620 | 2545 | if(buddy || chat) { |
| 2546 | GaimAccount *account; | |
| 2547 | GaimPlugin *prpl; | |
| 2548 | GaimPluginProtocolInfo *prpl_info; | |
| 2549 | ||
| 2550 | if(buddy) | |
| 2551 | account = buddy->account; | |
| 2552 | else | |
| 2553 | account = chat->account; | |
| 2554 | ||
| 7956 | 2555 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
| 7620 | 2556 | if(!prpl) |
| 2557 | return NULL; | |
| 2558 | ||
| 2559 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
| 2560 | ||
| 2561 | if(prpl_info && prpl_info->list_icon) { | |
| 2562 | protoname = prpl_info->list_icon(account, buddy); | |
| 2563 | } | |
| 2564 | if(prpl_info && prpl_info->list_emblems && buddy) { | |
| 2565 | if(buddy->present != GAIM_BUDDY_SIGNING_OFF) | |
| 2566 | prpl_info->list_emblems(buddy, &emblems[0].filename, | |
| 2567 | &emblems[1].filename, &emblems[2].filename, | |
| 2568 | &emblems[3].filename); | |
| 2569 | } | |
| 5234 | 2570 | } |
| 5228 | 2571 | |
| 7620 | 2572 | if(size == GAIM_STATUS_ICON_SMALL) { |
| 5228 | 2573 | scalesize = 15; |
| 7620 | 2574 | /* So that only the se icon will composite */ |
| 2575 | emblems[1].filename = emblems[2].filename = emblems[3].filename = NULL; | |
| 5228 | 2576 | } |
| 2577 | ||
| 7620 | 2578 | if(buddy && buddy->present == GAIM_BUDDY_SIGNING_ON) { |
| 2579 | filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "login.png", NULL); | |
| 2580 | } else if(buddy && buddy->present == GAIM_BUDDY_SIGNING_OFF) { | |
| 2581 | filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "logout.png", NULL); | |
| 2582 | } else if(buddy || chat) { | |
| 5228 | 2583 | char *image = g_strdup_printf("%s.png", protoname); |
| 2584 | filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
| 2585 | g_free(image); | |
| 7620 | 2586 | } else { |
| 2587 | /* gaim dude */ | |
| 2588 | filename = g_build_filename(DATADIR, "pixmaps", "gaim.png", NULL); | |
| 5228 | 2589 | } |
| 7620 | 2590 | |
| 2591 | status = gdk_pixbuf_new_from_file(filename, NULL); | |
| 2592 | g_free(filename); | |
| 2593 | ||
| 2594 | if(!status) | |
| 2595 | return NULL; | |
| 2596 | ||
| 2597 | scale = gdk_pixbuf_scale_simple(status, scalesize, scalesize, | |
| 2598 | GDK_INTERP_BILINEAR); | |
| 2599 | g_object_unref(status); | |
| 2600 | ||
| 2601 | for(i=0; i<4; i++) { | |
| 2602 | if(emblems[i].filename) { | |
| 2603 | GdkPixbuf *emblem; | |
| 2604 | char *image = g_strdup_printf("%s.png", emblems[i].filename); | |
| 2605 | filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
| 2606 | g_free(image); | |
| 2607 | emblem = gdk_pixbuf_new_from_file(filename, NULL); | |
| 2608 | g_free(filename); | |
| 2609 | if(emblem) { | |
| 2610 | if(i == 0 && size == GAIM_STATUS_ICON_SMALL) { | |
| 2611 | gdk_pixbuf_composite(emblem, | |
| 2612 | scale, 5, 5, | |
| 2613 | 10, 10, | |
| 2614 | 5, 5, | |
| 2615 | .6, .6, | |
| 2616 | GDK_INTERP_BILINEAR, | |
| 2617 | 255); | |
| 2618 | } else { | |
| 2619 | gdk_pixbuf_composite(emblem, | |
| 2620 | scale, emblems[i].x, emblems[i].y, | |
| 2621 | 15, 15, | |
| 2622 | emblems[i].x, emblems[i].y, | |
| 2623 | 1, 1, | |
| 2624 | GDK_INTERP_BILINEAR, | |
| 2625 | 255); | |
| 2626 | } | |
| 2627 | g_object_unref(emblem); | |
| 2628 | } | |
| 5228 | 2629 | } |
| 2630 | } | |
| 7620 | 2631 | |
| 2632 | if(buddy) { | |
| 2633 | if(buddy->present == GAIM_BUDDY_OFFLINE) | |
| 2634 | gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); | |
| 2635 | else if(buddy->idle && | |
| 2636 | gaim_prefs_get_bool("/gaim/gtk/blist/grey_idle_buddies")) | |
| 2637 | gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.25, FALSE); | |
| 5228 | 2638 | } |
| 7620 | 2639 | |
| 5228 | 2640 | return scale; |
| 2641 | } | |
| 2642 | ||
| 7620 | 2643 | static GdkPixbuf *gaim_gtk_blist_get_buddy_icon(GaimBuddy *b) |
| 5228 | 2644 | { |
| 7620 | 2645 | const char *file; |
| 5228 | 2646 | GdkPixbuf *buf, *ret; |
| 2647 | ||
| 7620 | 2648 | if (!gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) |
| 5228 | 2649 | return NULL; |
| 2650 | ||
| 7693 | 2651 | if ((file = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon")) == NULL) |
| 5228 | 2652 | return NULL; |
| 2653 | ||
| 2654 | buf = gdk_pixbuf_new_from_file(file, NULL); | |
| 2655 | ||
| 2656 | ||
| 2657 | if (buf) { | |
| 2658 | if (!GAIM_BUDDY_IS_ONLINE(b)) | |
| 2659 | gdk_pixbuf_saturate_and_pixelate(buf, buf, 0.0, FALSE); | |
| 7620 | 2660 | if (b->idle && gaim_prefs_get_bool("/gaim/gtk/blist/grey_idle_buddies")) |
| 5228 | 2661 | gdk_pixbuf_saturate_and_pixelate(buf, buf, 0.25, FALSE); |
| 2662 | ||
| 2663 | ret = gdk_pixbuf_scale_simple(buf,30,30, GDK_INTERP_BILINEAR); | |
| 2664 | g_object_unref(G_OBJECT(buf)); | |
| 2665 | return ret; | |
| 2666 | } | |
| 2667 | return NULL; | |
| 2668 | } | |
| 2669 | ||
| 7620 | 2670 | static gchar *gaim_gtk_blist_get_name_markup(GaimBuddy *b, gboolean selected) |
| 5228 | 2671 | { |
| 7620 | 2672 | const char *name; |
| 2673 | char *esc, *text = NULL; | |
| 5228 | 2674 | GaimPlugin *prpl; |
| 2675 | GaimPluginProtocolInfo *prpl_info = NULL; | |
| 7620 | 2676 | GaimContact *contact; |
| 2677 | struct _gaim_gtk_blist_node *gtkcontactnode = NULL; | |
| 5228 | 2678 | int ihrs, imin; |
| 2679 | char *idletime = NULL, *warning = NULL, *statustext = NULL; | |
| 2680 | time_t t; | |
| 7620 | 2681 | /* XXX Clean up this crap */ |
| 2682 | ||
| 2683 | contact = (GaimContact*)((GaimBlistNode*)b)->parent; | |
| 2684 | if(contact) | |
| 2685 | gtkcontactnode = ((GaimBlistNode*)contact)->ui_data; | |
| 2686 | ||
| 2687 | if(gtkcontactnode && !gtkcontactnode->contact_expanded && contact->alias) | |
| 2688 | name = contact->alias; | |
| 2689 | else | |
| 2690 | name = gaim_get_buddy_alias(b); | |
| 2691 | esc = g_markup_escape_text(name, strlen(name)); | |
| 2692 | ||
| 7956 | 2693 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); |
| 5228 | 2694 | |
| 2695 | if (prpl != NULL) | |
| 2696 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
| 2697 | ||
| 7620 | 2698 | if (!gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) { |
| 2699 | if ((b->idle && !selected && | |
| 2700 | gaim_prefs_get_bool("/gaim/gtk/blist/grey_idle_buddies")) || | |
| 2701 | !GAIM_BUDDY_IS_ONLINE(b)) { | |
| 2702 | if (selected) | |
| 2703 | text = g_strdup(esc); | |
| 2704 | else | |
| 2705 | text = g_strdup_printf("<span color='dim grey'>%s</span>", | |
| 2706 | esc); | |
| 5228 | 2707 | g_free(esc); |
| 2708 | return text; | |
| 7620 | 2709 | } |
| 2710 | else { | |
| 5228 | 2711 | return esc; |
| 2712 | } | |
| 2713 | } | |
| 2714 | ||
| 2715 | time(&t); | |
| 2716 | ihrs = (t - b->idle) / 3600; | |
| 2717 | imin = ((t - b->idle) / 60) % 60; | |
| 2718 | ||
|
8122
64dc12809940
[gaim-migrate @ 8826]
Christian Hammond <chipx86@chipx86.com>
parents:
8113
diff
changeset
|
2719 | if (prpl_info && prpl_info->status_text && b->account->gc) { |
| 5228 | 2720 | char *tmp = prpl_info->status_text(b); |
| 2721 | const char *end; | |
| 2722 | ||
| 2723 | if(tmp && !g_utf8_validate(tmp, -1, &end)) { | |
| 2724 | char *new = g_strndup(tmp, | |
| 2725 | g_utf8_pointer_to_offset(tmp, end)); | |
| 2726 | g_free(tmp); | |
| 2727 | tmp = new; | |
| 2728 | } | |
| 2729 | ||
| 2730 | if(tmp) { | |
| 2731 | char buf[32]; | |
| 2732 | char *c = tmp; | |
| 2733 | int length = 0, vis=0; | |
| 2734 | gboolean inside = FALSE; | |
| 2735 | g_strdelimit(tmp, "\n", ' '); | |
| 7620 | 2736 | gaim_str_strip_cr(tmp); |
| 5228 | 2737 | |
| 2738 | while(*c && vis < 20) { | |
| 2739 | if(*c == '&') | |
| 2740 | inside = TRUE; | |
| 2741 | else if(*c == ';') | |
| 2742 | inside = FALSE; | |
| 2743 | if(!inside) | |
| 2744 | vis++; | |
| 7620 | 2745 | c = g_utf8_next_char(c); /* this is fun */ |
| 5228 | 2746 | } |
| 2747 | ||
| 7620 | 2748 | length = c - tmp; |
| 2749 | ||
| 5228 | 2750 | if(vis == 20) |
| 2751 | g_snprintf(buf, sizeof(buf), "%%.%ds...", length); | |
| 2752 | else | |
| 2753 | g_snprintf(buf, sizeof(buf), "%%s "); | |
| 2754 | ||
| 2755 | statustext = g_strdup_printf(buf, tmp); | |
| 2756 | ||
| 2757 | g_free(tmp); | |
| 2758 | } | |
| 2759 | } | |
| 2760 | ||
| 7620 | 2761 | if (b->idle > 0 && |
| 2762 | gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time")) { | |
| 5228 | 2763 | if (ihrs) |
| 2764 | idletime = g_strdup_printf(_("Idle (%dh%02dm) "), ihrs, imin); | |
| 2765 | else | |
| 2766 | idletime = g_strdup_printf(_("Idle (%dm) "), imin); | |
| 2767 | } | |
| 2768 | ||
| 7620 | 2769 | if (b->evil > 0 && |
| 2770 | gaim_prefs_get_bool("/gaim/gtk/blist/show_warning_level")) | |
| 5228 | 2771 | warning = g_strdup_printf(_("Warned (%d%%) "), b->evil); |
| 2772 | ||
| 2773 | if(!GAIM_BUDDY_IS_ONLINE(b) && !statustext) | |
| 7620 | 2774 | statustext = g_strdup(_("Offline ")); |
| 2775 | ||
| 2776 | if (b->idle && !selected && | |
| 2777 | gaim_prefs_get_bool("/gaim/gtk/blist/grey_idle_buddies")) { | |
| 2778 | ||
| 5228 | 2779 | text = g_strdup_printf("<span color='dim grey'>%s</span>\n" |
| 2780 | "<span color='dim grey' size='smaller'>%s%s%s</span>", | |
| 2781 | esc, | |
| 2782 | statustext != NULL ? statustext : "", | |
| 2783 | idletime != NULL ? idletime : "", | |
| 2784 | warning != NULL ? warning : ""); | |
| 7620 | 2785 | } else if (statustext == NULL && idletime == NULL && warning == NULL && |
| 2786 | GAIM_BUDDY_IS_ONLINE(b)) { | |
| 5228 | 2787 | text = g_strdup(esc); |
| 2788 | } else { | |
| 2789 | text = g_strdup_printf("%s\n" | |
| 2790 | "<span %s size='smaller'>%s%s%s</span>", esc, | |
| 2791 | selected ? "" : "color='dim grey'", | |
| 2792 | statustext != NULL ? statustext : "", | |
| 7620 | 2793 | idletime != NULL ? idletime : "", |
| 5228 | 2794 | warning != NULL ? warning : ""); |
| 2795 | } | |
| 2796 | if (idletime) | |
| 2797 | g_free(idletime); | |
| 2798 | if (warning) | |
| 2799 | g_free(warning); | |
| 2800 | if (statustext) | |
| 2801 | g_free(statustext); | |
| 2802 | if (esc) | |
| 2803 | g_free(esc); | |
| 2804 | ||
| 2805 | return text; | |
| 2806 | } | |
| 2807 | ||
| 2808 | static void gaim_gtk_blist_restore_position() | |
| 2809 | { | |
| 7620 | 2810 | int blist_x, blist_y, blist_width, blist_height; |
| 2811 | ||
| 2812 | blist_width = gaim_prefs_get_int("/gaim/gtk/blist/width"); | |
| 2813 | ||
| 2814 | /* if the window exists, is hidden, we're saving positions, and the | |
| 2815 | * position is sane... */ | |
| 2816 | if (gtkblist && gtkblist->window && | |
| 2817 | !GTK_WIDGET_VISIBLE(gtkblist->window) && blist_width != 0) { | |
| 2818 | ||
| 2819 | blist_x = gaim_prefs_get_int("/gaim/gtk/blist/x"); | |
| 2820 | blist_y = gaim_prefs_get_int("/gaim/gtk/blist/y"); | |
| 2821 | blist_height = gaim_prefs_get_int("/gaim/gtk/blist/height"); | |
| 2822 | ||
| 5228 | 2823 | /* ...check position is on screen... */ |
| 7620 | 2824 | if (blist_x >= gdk_screen_width()) |
| 2825 | blist_x = gdk_screen_width() - 100; | |
| 2826 | else if (blist_x + blist_width < 0) | |
| 2827 | blist_x = 100; | |
| 2828 | ||
| 2829 | if (blist_y >= gdk_screen_height()) | |
| 2830 | blist_y = gdk_screen_height() - 100; | |
| 2831 | else if (blist_y + blist_height < 0) | |
| 2832 | blist_y = 100; | |
| 2833 | ||
| 5228 | 2834 | /* ...and move it back. */ |
| 7620 | 2835 | gtk_window_move(GTK_WINDOW(gtkblist->window), blist_x, blist_y); |
| 2836 | gtk_window_resize(GTK_WINDOW(gtkblist->window), blist_width, blist_height); | |
| 5228 | 2837 | } |
| 2838 | } | |
| 2839 | ||
| 7620 | 2840 | static gboolean gaim_gtk_blist_refresh_timer(GaimBuddyList *list) |
| 5228 | 2841 | { |
| 7620 | 2842 | GaimBlistNode *gnode, *cnode; |
| 2843 | ||
| 2844 | for(gnode = list->root; gnode; gnode = gnode->next) { | |
| 2845 | if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 5234 | 2846 | continue; |
| 7620 | 2847 | for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 2848 | if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 2849 | GaimBuddy *buddy = gaim_contact_get_priority_buddy((GaimContact*)cnode); | |
| 2850 | if(buddy && buddy->idle) | |
| 2851 | gaim_gtk_blist_update(list, cnode); | |
| 2852 | } | |
| 5228 | 2853 | } |
| 2854 | } | |
| 2855 | ||
| 2856 | /* keep on going */ | |
| 2857 | return TRUE; | |
| 2858 | } | |
| 2859 | ||
| 7620 | 2860 | static void gaim_gtk_blist_hide_node(GaimBuddyList *list, GaimBlistNode *node) |
| 5260 | 2861 | { |
| 2862 | struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
| 2863 | GtkTreeIter iter; | |
| 2864 | ||
| 2865 | if (!gtknode || !gtknode->row || !gtkblist) | |
| 2866 | return; | |
| 2867 | ||
| 2868 | if(gtkblist->selected_node == node) | |
| 2869 | gtkblist->selected_node = NULL; | |
| 2870 | ||
| 2871 | if (get_iter_from_node(node, &iter)) { | |
| 2872 | gtk_tree_store_remove(gtkblist->treemodel, &iter); | |
| 7620 | 2873 | if(GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_BUDDY(node) |
| 2874 | || GAIM_BLIST_NODE_IS_CHAT(node)) { | |
| 5260 | 2875 | gaim_gtk_blist_update(list, node->parent); |
| 2876 | } | |
| 2877 | } | |
| 2878 | gtk_tree_row_reference_free(gtknode->row); | |
| 2879 | gtknode->row = NULL; | |
| 2880 | } | |
| 2881 | ||
| 7620 | 2882 | static void |
| 2883 | signed_on_off_cb(GaimConnection *gc, GaimBuddyList *blist) | |
| 2884 | { | |
|
8259
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
2885 | GaimGtkBuddyList *gtkblist = GAIM_GTK_BLIST(blist); |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
2886 | |
| 7620 | 2887 | gaim_gtk_blist_update_protocol_actions(); |
| 8235 | 2888 | gaim_gtkpounce_menu_build(gtkblist->bpmenu); |
| 7620 | 2889 | } |
| 2890 | ||
| 2891 | /* this is called on all sorts of signals, and we have no reason to pass | |
| 2892 | * it anything, so it remains without arguments. If you need anything | |
| 2893 | * more specific, do as below, and create another callback that calls | |
| 2894 | * this */ | |
| 2895 | static void | |
| 2896 | raise_on_events_cb() | |
| 2897 | { | |
| 2898 | if(gtkblist && gtkblist->window && | |
| 2899 | gaim_prefs_get_bool("/gaim/gtk/blist/raise_on_events")) { | |
| 2900 | gtk_widget_show(gtkblist->window); | |
| 2901 | gtk_window_deiconify(GTK_WINDOW(gtkblist->window)); | |
| 2902 | gdk_window_raise(gtkblist->window->window); | |
| 2903 | } | |
| 2904 | } | |
| 2905 | ||
| 5228 | 2906 | /********************************************************************************** |
| 2907 | * Public API Functions * | |
| 2908 | **********************************************************************************/ | |
| 7620 | 2909 | static void gaim_gtk_blist_new_list(GaimBuddyList *blist) |
| 5228 | 2910 | { |
| 7620 | 2911 | GaimGtkBuddyList *gtkblist; |
| 2912 | ||
| 2913 | gtkblist = g_new0(GaimGtkBuddyList, 1); | |
| 2914 | blist->ui_data = gtkblist; | |
| 2915 | ||
| 2916 | /* All of these signal handlers are for the "Raise on Events" option */ | |
| 2917 | gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-on", | |
| 2918 | gtkblist, GAIM_CALLBACK(raise_on_events_cb), NULL); | |
| 2919 | gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-off", | |
| 2920 | gtkblist, GAIM_CALLBACK(raise_on_events_cb), NULL); | |
| 5228 | 2921 | } |
| 2922 | ||
| 5256 | 2923 | static void gaim_gtk_blist_new_node(GaimBlistNode *node) |
| 2924 | { | |
| 2925 | node->ui_data = g_new0(struct _gaim_gtk_blist_node, 1); | |
| 2926 | } | |
| 2927 | ||
| 5228 | 2928 | void gaim_gtk_blist_update_columns() |
| 2929 | { | |
| 2930 | if(!gtkblist) | |
| 2931 | return; | |
| 2932 | ||
| 7620 | 2933 | if (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) { |
| 5228 | 2934 | gtk_tree_view_column_set_visible(gtkblist->buddy_icon_column, TRUE); |
| 2935 | gtk_tree_view_column_set_visible(gtkblist->idle_column, FALSE); | |
| 2936 | gtk_tree_view_column_set_visible(gtkblist->warning_column, FALSE); | |
| 2937 | } else { | |
| 7620 | 2938 | gtk_tree_view_column_set_visible(gtkblist->idle_column, |
| 2939 | gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time")); | |
| 2940 | gtk_tree_view_column_set_visible(gtkblist->warning_column, | |
| 2941 | gaim_prefs_get_bool("/gaim/gtk/blist/show_warning_level")); | |
| 5228 | 2942 | gtk_tree_view_column_set_visible(gtkblist->buddy_icon_column, FALSE); |
| 2943 | } | |
| 2944 | } | |
| 2945 | ||
| 8089 | 2946 | enum {DRAG_BUDDY, DRAG_ROW, DRAG_VCARD}; |
| 5228 | 2947 | |
| 2948 | static char * | |
| 2949 | item_factory_translate_func (const char *path, gpointer func_data) | |
| 2950 | { | |
| 7620 | 2951 | return _((char *)path); |
| 5228 | 2952 | } |
| 2953 | ||
| 5422 | 2954 | void gaim_gtk_blist_setup_sort_methods() |
| 2955 | { | |
| 7620 | 2956 | gaim_gtk_blist_sort_method_reg("none", _("None"), sort_method_none); |
| 2957 | #if GTK_CHECK_VERSION(2,2,1) | |
| 2958 | gaim_gtk_blist_sort_method_reg("alphabetical", _("Alphabetical"), sort_method_alphabetical); | |
| 2959 | gaim_gtk_blist_sort_method_reg("status", _("By status"), sort_method_status); | |
| 2960 | gaim_gtk_blist_sort_method_reg("log_size", _("By log size"), sort_method_log); | |
| 2961 | #endif | |
| 2962 | gaim_gtk_blist_sort_method_set(gaim_prefs_get_string("/gaim/gtk/blist/sort_type")); | |
| 2963 | } | |
| 2964 | ||
| 2965 | static void _prefs_change_redo_list() { | |
| 2966 | redo_buddy_list(gaim_get_blist(), TRUE); | |
| 2967 | } | |
| 2968 | ||
| 2969 | static void _prefs_change_sort_method(const char *pref_name, GaimPrefType type, | |
| 2970 | gpointer val, gpointer data) { | |
| 2971 | if(!strcmp(pref_name, "/gaim/gtk/blist/sort_type")) | |
| 2972 | gaim_gtk_blist_sort_method_set(val); | |
| 2973 | } | |
| 2974 | ||
| 2975 | static void gaim_gtk_blist_show(GaimBuddyList *list) | |
| 5228 | 2976 | { |
| 2977 | GtkCellRenderer *rend; | |
| 2978 | GtkTreeViewColumn *column; | |
| 2979 | GtkWidget *sw; | |
| 2980 | GtkWidget *button; | |
| 2981 | GtkSizeGroup *sg; | |
| 2982 | GtkAccelGroup *accel_group; | |
| 2983 | GtkTreeSelection *selection; | |
| 2984 | GtkTargetEntry gte[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, | |
| 8089 | 2985 | {"application/x-im-contact", 0, DRAG_BUDDY}, |
| 2986 | {"text/x-vcard", 0, DRAG_VCARD }}; | |
| 5228 | 2987 | |
| 2988 | if (gtkblist && gtkblist->window) { | |
| 2989 | gtk_widget_show(gtkblist->window); | |
| 2990 | return; | |
| 2991 | } | |
| 2992 | ||
| 2993 | gtkblist = GAIM_GTK_BLIST(list); | |
| 2994 | ||
| 2995 | gtkblist->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
| 2996 | gtk_window_set_role(GTK_WINDOW(gtkblist->window), "buddy_list"); | |
| 2997 | gtk_window_set_title(GTK_WINDOW(gtkblist->window), _("Buddy List")); | |
| 2998 | ||
| 2999 | GTK_WINDOW(gtkblist->window)->allow_shrink = TRUE; | |
| 3000 | ||
| 3001 | gtkblist->vbox = gtk_vbox_new(FALSE, 0); | |
| 3002 | gtk_container_add(GTK_CONTAINER(gtkblist->window), gtkblist->vbox); | |
| 3003 | ||
| 3004 | g_signal_connect(G_OBJECT(gtkblist->window), "delete_event", G_CALLBACK(gtk_blist_delete_cb), NULL); | |
| 3005 | g_signal_connect(G_OBJECT(gtkblist->window), "configure_event", G_CALLBACK(gtk_blist_configure_cb), NULL); | |
| 3006 | g_signal_connect(G_OBJECT(gtkblist->window), "visibility_notify_event", G_CALLBACK(gtk_blist_visibility_cb), NULL); | |
| 3007 | gtk_widget_add_events(gtkblist->window, GDK_VISIBILITY_NOTIFY_MASK); | |
| 3008 | ||
| 3009 | /******************************* Menu bar *************************************/ | |
| 3010 | accel_group = gtk_accel_group_new(); | |
| 3011 | gtk_window_add_accel_group(GTK_WINDOW (gtkblist->window), accel_group); | |
| 3012 | g_object_unref(accel_group); | |
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3013 | gtkblist->ift = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<GaimMain>", accel_group); |
|
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3014 | gtk_item_factory_set_translate_func (gtkblist->ift, |
| 5228 | 3015 | item_factory_translate_func, |
| 3016 | NULL, NULL); | |
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3017 | gtk_item_factory_create_items(gtkblist->ift, sizeof(blist_menu) / sizeof(*blist_menu), |
| 5228 | 3018 | blist_menu, NULL); |
| 7620 | 3019 | gaim_gtk_load_accels(); |
| 3020 | g_signal_connect(G_OBJECT(accel_group), "accel-changed", | |
| 3021 | G_CALLBACK(gaim_gtk_save_accels_cb), NULL); | |
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3022 | gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtk_item_factory_get_widget(gtkblist->ift, "<GaimMain>"), FALSE, FALSE, 0); |
| 5228 | 3023 | |
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3024 | awaymenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Away")); |
| 5228 | 3025 | do_away_menu(); |
| 3026 | ||
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3027 | gtkblist->bpmenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Buddy Pounce")); |
| 5228 | 3028 | gaim_gtkpounce_menu_build(gtkblist->bpmenu); |
| 3029 | ||
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3030 | protomenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Protocol Actions")); |
| 7620 | 3031 | gaim_gtk_blist_update_protocol_actions(); |
| 5228 | 3032 | /****************************** GtkTreeView **********************************/ |
| 3033 | sw = gtk_scrolled_window_new(NULL,NULL); | |
| 3034 | gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
| 3035 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
| 3036 | ||
| 7620 | 3037 | gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS, |
| 3038 | GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN, G_TYPE_STRING, | |
| 3039 | G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER); | |
| 5228 | 3040 | |
| 3041 | gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel)); | |
| 3042 | gtk_widget_set_size_request(gtkblist->treeview, -1, 200); | |
| 3043 | ||
| 3044 | /* Set up selection stuff */ | |
| 3045 | ||
| 3046 | selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | |
| 3047 | g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(gaim_gtk_blist_selection_changed), NULL); | |
| 3048 | ||
| 3049 | ||
| 3050 | /* Set up dnd */ | |
|
7650
bd193cc04594
[gaim-migrate @ 8293]
Mark Doliner <markdoliner@pidgin.im>
parents:
7642
diff
changeset
|
3051 | gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(gtkblist->treeview), |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
3052 | GDK_BUTTON1_MASK, gte, 3, |
|
7650
bd193cc04594
[gaim-migrate @ 8293]
Mark Doliner <markdoliner@pidgin.im>
parents:
7642
diff
changeset
|
3053 | GDK_ACTION_COPY); |
|
bd193cc04594
[gaim-migrate @ 8293]
Mark Doliner <markdoliner@pidgin.im>
parents:
7642
diff
changeset
|
3054 | gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(gtkblist->treeview), |
| 8089 | 3055 | gte, 3, |
|
7650
bd193cc04594
[gaim-migrate @ 8293]
Mark Doliner <markdoliner@pidgin.im>
parents:
7642
diff
changeset
|
3056 | GDK_ACTION_COPY | GDK_ACTION_MOVE); |
| 7636 | 3057 | |
| 3058 | g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-received", G_CALLBACK(gaim_gtk_blist_drag_data_rcv_cb), NULL); | |
| 5228 | 3059 | g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-get", G_CALLBACK(gaim_gtk_blist_drag_data_get_cb), NULL); |
| 3060 | ||
| 3061 | /* Tooltips */ | |
| 3062 | g_signal_connect(G_OBJECT(gtkblist->treeview), "motion-notify-event", G_CALLBACK(gaim_gtk_blist_motion_cb), NULL); | |
| 3063 | g_signal_connect(G_OBJECT(gtkblist->treeview), "leave-notify-event", G_CALLBACK(gaim_gtk_blist_leave_cb), NULL); | |
| 3064 | ||
| 3065 | gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE); | |
| 3066 | ||
| 3067 | column = gtk_tree_view_column_new (); | |
| 3068 | ||
| 3069 | rend = gtk_cell_renderer_pixbuf_new(); | |
| 3070 | gtk_tree_view_column_pack_start (column, rend, FALSE); | |
| 7620 | 3071 | gtk_tree_view_column_set_attributes (column, rend, |
| 5228 | 3072 | "pixbuf", STATUS_ICON_COLUMN, |
| 3073 | "visible", STATUS_ICON_VISIBLE_COLUMN, | |
| 3074 | NULL); | |
| 3075 | g_object_set(rend, "xalign", 0.0, "ypad", 0, NULL); | |
| 3076 | ||
| 3077 | rend = gtk_cell_renderer_text_new(); | |
| 3078 | gtk_tree_view_column_pack_start (column, rend, TRUE); | |
| 7620 | 3079 | gtk_tree_view_column_set_attributes (column, rend, |
| 5228 | 3080 | "markup", NAME_COLUMN, |
| 3081 | NULL); | |
| 3082 | g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); | |
| 3083 | ||
| 3084 | gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), column); | |
| 3085 | ||
| 3086 | rend = gtk_cell_renderer_text_new(); | |
| 3087 | gtkblist->warning_column = gtk_tree_view_column_new_with_attributes("Warning", rend, "markup", WARNING_COLUMN, NULL); | |
| 3088 | gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->warning_column); | |
| 3089 | g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); | |
| 3090 | ||
| 3091 | rend = gtk_cell_renderer_text_new(); | |
| 3092 | gtkblist->idle_column = gtk_tree_view_column_new_with_attributes("Idle", rend, "markup", IDLE_COLUMN, NULL); | |
| 3093 | gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->idle_column); | |
| 3094 | g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); | |
| 3095 | ||
| 3096 | rend = gtk_cell_renderer_pixbuf_new(); | |
| 3097 | gtkblist->buddy_icon_column = gtk_tree_view_column_new_with_attributes("Buddy Icon", rend, "pixbuf", BUDDY_ICON_COLUMN, NULL); | |
| 3098 | g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); | |
| 3099 | gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->buddy_icon_column); | |
| 3100 | ||
| 3101 | g_signal_connect(G_OBJECT(gtkblist->treeview), "row-activated", G_CALLBACK(gtk_blist_row_activated_cb), NULL); | |
| 3102 | g_signal_connect(G_OBJECT(gtkblist->treeview), "row-expanded", G_CALLBACK(gtk_blist_row_expanded_cb), NULL); | |
| 3103 | g_signal_connect(G_OBJECT(gtkblist->treeview), "row-collapsed", G_CALLBACK(gtk_blist_row_collapsed_cb), NULL); | |
| 3104 | g_signal_connect(G_OBJECT(gtkblist->treeview), "button-press-event", G_CALLBACK(gtk_blist_button_press_cb), NULL); | |
| 7620 | 3105 | g_signal_connect(G_OBJECT(gtkblist->treeview), "key-press-event", G_CALLBACK(gtk_blist_key_press_cb), NULL); |
|
8143
ce4b6383777b
[gaim-migrate @ 8851]
Nathan Fredrickson <nathan@silverorange.com>
parents:
8137
diff
changeset
|
3106 | g_signal_connect(G_OBJECT(gtkblist->treeview), "popup-menu", G_CALLBACK(gaim_gtk_blist_popup_menu_cb), NULL); |
| 5228 | 3107 | |
|
5419
062efd736788
[gaim-migrate @ 5798]
Mark Doliner <markdoliner@pidgin.im>
parents:
5398
diff
changeset
|
3108 | /* Enable CTRL+F searching */ |
|
062efd736788
[gaim-migrate @ 5798]
Mark Doliner <markdoliner@pidgin.im>
parents:
5398
diff
changeset
|
3109 | gtk_tree_view_set_search_column(GTK_TREE_VIEW(gtkblist->treeview), NAME_COLUMN); |
|
062efd736788
[gaim-migrate @ 5798]
Mark Doliner <markdoliner@pidgin.im>
parents:
5398
diff
changeset
|
3110 | |
| 5228 | 3111 | gtk_box_pack_start(GTK_BOX(gtkblist->vbox), sw, TRUE, TRUE, 0); |
| 3112 | gtk_container_add(GTK_CONTAINER(sw), gtkblist->treeview); | |
| 3113 | gaim_gtk_blist_update_columns(); | |
| 3114 | ||
| 3115 | /* set the Show Offline Buddies option. must be done | |
| 3116 | * after the treeview or faceprint gets mad. -Robot101 | |
| 3117 | */ | |
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3118 | gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Offline Buddies"))), |
| 7620 | 3119 | gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")); |
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3120 | gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Empty Groups"))), |
| 7620 | 3121 | gaim_prefs_get_bool("/gaim/gtk/blist/show_empty_groups")); |
| 5228 | 3122 | |
| 3123 | /* OK... let's show this bad boy. */ | |
| 3124 | gaim_gtk_blist_refresh(list); | |
| 3125 | gaim_gtk_blist_restore_position(); | |
| 3126 | gtk_widget_show_all(gtkblist->window); | |
| 3127 | ||
| 3128 | /**************************** Button Box **************************************/ | |
| 3129 | /* add this afterwards so it doesn't force up the width of the window */ | |
| 3130 | ||
| 3131 | gtkblist->tooltips = gtk_tooltips_new(); | |
| 3132 | ||
| 3133 | sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); | |
| 3134 | gtkblist->bbox = gtk_hbox_new(TRUE, 0); | |
| 3135 | gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->bbox, FALSE, FALSE, 0); | |
| 3136 | gtk_widget_show(gtkblist->bbox); | |
| 3137 | ||
| 8137 | 3138 | button = gaim_pixbuf_button_from_stock(_("I_M"), GAIM_STOCK_IM, GAIM_BUTTON_VERTICAL); |
| 5228 | 3139 | gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); |
| 3140 | gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
| 3141 | gtk_size_group_add_widget(sg, button); | |
| 3142 | g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_im_cb), | |
| 3143 | gtkblist->treeview); | |
| 3144 | gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Send a message to the selected buddy"), NULL); | |
| 3145 | gtk_widget_show(button); | |
| 3146 | ||
| 8137 | 3147 | button = gaim_pixbuf_button_from_stock(_("Get _Info"), GAIM_STOCK_INFO, GAIM_BUTTON_VERTICAL); |
| 5228 | 3148 | gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); |
| 3149 | gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
| 3150 | gtk_size_group_add_widget(sg, button); | |
| 3151 | g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_info_cb), | |
| 3152 | gtkblist->treeview); | |
| 3153 | gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Get information on the selected buddy"), NULL); | |
| 3154 | gtk_widget_show(button); | |
| 3155 | ||
| 8137 | 3156 | button = gaim_pixbuf_button_from_stock(_("_Chat"), GAIM_STOCK_CHAT, GAIM_BUTTON_VERTICAL); |
| 5228 | 3157 | gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); |
| 3158 | gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
| 3159 | gtk_size_group_add_widget(sg, button); | |
| 5234 | 3160 | g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_chat_cb), gtkblist->treeview); |
| 5228 | 3161 | gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Join a chat room"), NULL); |
| 3162 | gtk_widget_show(button); | |
| 3163 | ||
| 8137 | 3164 | button = gaim_pixbuf_button_from_stock(_("_Away"), GAIM_STOCK_ICON_AWAY, GAIM_BUTTON_VERTICAL); |
| 5228 | 3165 | gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); |
| 3166 | gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
| 3167 | gtk_size_group_add_widget(sg, button); | |
| 3168 | g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_away_cb), NULL); | |
| 3169 | gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Set an away message"), NULL); | |
| 3170 | gtk_widget_show(button); | |
| 3171 | ||
| 3172 | /* this will show the right image/label widgets for us */ | |
| 3173 | gaim_gtk_blist_update_toolbar(); | |
| 3174 | ||
| 3175 | /* start the refresh timer */ | |
| 7620 | 3176 | if (gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time") || |
| 3177 | gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) { | |
| 3178 | ||
| 3179 | gtkblist->refresh_timer = g_timeout_add(30000, | |
| 3180 | (GSourceFunc)gaim_gtk_blist_refresh_timer, list); | |
| 3181 | } | |
| 3182 | ||
| 3183 | /* attach prefs callbacks */ | |
| 3184 | /* for the toolbar buttons */ | |
| 3185 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3186 | GINT_TO_POINTER( | |
| 3187 | gaim_prefs_connect_callback("/gaim/gtk/blist/button_style", | |
| 3188 | gaim_gtk_blist_update_toolbar, NULL))); | |
| 3189 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3190 | GINT_TO_POINTER( | |
| 3191 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_buttons", | |
| 3192 | gaim_gtk_blist_update_toolbar, NULL))); | |
| 3193 | ||
| 3194 | /* things that affect how buddies are displayed */ | |
| 3195 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3196 | GINT_TO_POINTER( | |
| 3197 | gaim_prefs_connect_callback("/gaim/gtk/blist/grey_idle_buddies", | |
| 3198 | _prefs_change_redo_list, NULL))); | |
| 3199 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3200 | GINT_TO_POINTER( | |
| 3201 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_buddy_icons", | |
| 3202 | _prefs_change_redo_list, NULL))); | |
| 3203 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3204 | GINT_TO_POINTER( | |
| 3205 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_warning_level", | |
| 3206 | _prefs_change_redo_list, NULL))); | |
| 3207 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3208 | GINT_TO_POINTER( | |
| 3209 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_idle_time", | |
| 3210 | _prefs_change_redo_list, NULL))); | |
| 3211 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3212 | GINT_TO_POINTER( | |
| 3213 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_empty_groups", | |
| 3214 | _prefs_change_redo_list, NULL))); | |
| 3215 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3216 | GINT_TO_POINTER( | |
| 3217 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_group_count", | |
| 3218 | _prefs_change_redo_list, NULL))); | |
| 3219 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3220 | GINT_TO_POINTER( | |
| 3221 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_offline_buddies", | |
| 3222 | _prefs_change_redo_list, NULL))); | |
| 3223 | ||
| 3224 | /* sorting */ | |
| 3225 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3226 | GINT_TO_POINTER( | |
| 3227 | gaim_prefs_connect_callback("/gaim/gtk/blist/sort_type", | |
| 3228 | _prefs_change_sort_method, NULL))); | |
| 3229 | ||
| 3230 | /* things that affect what columns are displayed */ | |
| 3231 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3232 | GINT_TO_POINTER( | |
| 3233 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_buddy_icons", | |
| 3234 | gaim_gtk_blist_update_columns, NULL))); | |
| 3235 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3236 | GINT_TO_POINTER( | |
| 3237 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_idle_time", | |
| 3238 | gaim_gtk_blist_update_columns, NULL))); | |
| 3239 | blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, | |
| 3240 | GINT_TO_POINTER( | |
| 3241 | gaim_prefs_connect_callback("/gaim/gtk/blist/show_warning_level", | |
| 3242 | gaim_gtk_blist_update_columns, NULL))); | |
|
8259
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3243 | |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3244 | /* Setup some gaim signal handlers. */ |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3245 | gaim_signal_connect(gaim_connections_get_handle(), "signing-on", |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3246 | gtkblist, GAIM_CALLBACK(signed_on_off_cb), list); |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3247 | gaim_signal_connect(gaim_connections_get_handle(), "signing-off", |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3248 | gtkblist, GAIM_CALLBACK(signed_on_off_cb), list); |
| 8815 | 3249 | |
| 3250 | /* emit our created signal */ | |
| 3251 | gaim_signal_emit(gaim_gtk_blist_get_handle(), "gtkblist-created", list); | |
| 5228 | 3252 | } |
| 3253 | ||
| 7620 | 3254 | /* XXX: does this need fixing? */ |
| 3255 | static void redo_buddy_list(GaimBuddyList *list, gboolean remove) | |
| 5228 | 3256 | { |
| 7620 | 3257 | GaimBlistNode *gnode, *cnode, *bnode; |
| 3258 | ||
| 3259 | for(gnode = list->root; gnode; gnode = gnode->next) { | |
| 3260 | if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 5234 | 3261 | continue; |
| 7620 | 3262 | for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 3263 | if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 3264 | if(remove) | |
| 3265 | gaim_gtk_blist_hide_node(list, cnode); | |
| 3266 | ||
| 3267 | for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 3268 | if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
| 3269 | continue; | |
| 3270 | if(remove) | |
| 3271 | gaim_gtk_blist_hide_node(list, bnode); | |
| 3272 | gaim_gtk_blist_update(list, bnode); | |
| 3273 | } | |
| 3274 | ||
| 3275 | gaim_gtk_blist_update(list, cnode); | |
| 3276 | } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
| 3277 | if(remove) | |
| 3278 | gaim_gtk_blist_hide_node(list, cnode); | |
| 3279 | ||
| 3280 | gaim_gtk_blist_update(list, cnode); | |
| 3281 | } | |
| 5228 | 3282 | } |
| 7620 | 3283 | gaim_gtk_blist_update(list, gnode); |
| 5228 | 3284 | } |
| 3285 | } | |
| 3286 | ||
| 7620 | 3287 | void gaim_gtk_blist_refresh(GaimBuddyList *list) |
| 5422 | 3288 | { |
| 3289 | redo_buddy_list(list, FALSE); | |
| 3290 | } | |
| 3291 | ||
| 5297 | 3292 | void |
| 3293 | gaim_gtk_blist_update_refresh_timeout() | |
| 3294 | { | |
| 7620 | 3295 | GaimBuddyList *blist; |
| 3296 | GaimGtkBuddyList *gtkblist; | |
| 5297 | 3297 | |
| 3298 | blist = gaim_get_blist(); | |
| 3299 | gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
| 3300 | ||
| 7620 | 3301 | if (gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time") || |
| 3302 | gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) { | |
| 3303 | ||
| 3304 | gtkblist->refresh_timer = g_timeout_add(30000, | |
| 3305 | (GSourceFunc)gaim_gtk_blist_refresh_timer, blist); | |
| 5297 | 3306 | } else { |
| 3307 | g_source_remove(gtkblist->refresh_timer); | |
| 3308 | gtkblist->refresh_timer = 0; | |
| 3309 | } | |
| 3310 | } | |
| 3311 | ||
| 5256 | 3312 | static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter) { |
| 3313 | struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
| 3314 | GtkTreePath *path; | |
| 5228 | 3315 | |
| 7620 | 3316 | /* XXX: why do we assume we have a buddy here? */ |
| 5263 | 3317 | if (!gtknode) { |
| 7620 | 3318 | #if 0 |
| 3319 | gaim_debug(GAIM_DEBUG_ERROR, "gtkblist", "buddy %s has no ui_data\n", ((GaimBuddy *)node)->name); | |
| 3320 | #endif | |
| 5263 | 3321 | return FALSE; |
| 3322 | } | |
| 3323 | ||
| 3324 | if (!gtkblist) { | |
| 3325 | gaim_debug(GAIM_DEBUG_ERROR, "gtkblist", "get_iter_from_node was called, but we don't seem to have a blist\n"); | |
| 3326 | return FALSE; | |
| 3327 | } | |
| 3328 | ||
| 3329 | if (!gtknode->row) | |
| 5228 | 3330 | return FALSE; |
| 3331 | ||
| 5256 | 3332 | if ((path = gtk_tree_row_reference_get_path(gtknode->row)) == NULL) |
| 5228 | 3333 | return FALSE; |
| 5256 | 3334 | if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), iter, path)) { |
| 3335 | gtk_tree_path_free(path); | |
| 3336 | return FALSE; | |
| 3337 | } | |
| 3338 | gtk_tree_path_free(path); | |
| 3339 | return TRUE; | |
| 5228 | 3340 | } |
| 3341 | ||
| 7620 | 3342 | static void |
| 3343 | gaim_gtk_blist_update_toolbar_icons (GtkWidget *widget, gpointer data) | |
| 3344 | { | |
| 3345 | GaimButtonStyle style = gaim_prefs_get_int("/gaim/gtk/blist/button_style"); | |
| 3346 | ||
| 5228 | 3347 | if (GTK_IS_IMAGE(widget)) { |
| 7620 | 3348 | if (style == GAIM_BUTTON_IMAGE || style == GAIM_BUTTON_TEXT_IMAGE) |
| 5228 | 3349 | gtk_widget_show(widget); |
| 3350 | else | |
| 3351 | gtk_widget_hide(widget); | |
| 7620 | 3352 | } |
| 3353 | else if (GTK_IS_LABEL(widget)) { | |
| 3354 | if (style == GAIM_BUTTON_IMAGE) | |
| 5228 | 3355 | gtk_widget_hide(widget); |
| 3356 | else | |
| 3357 | gtk_widget_show(widget); | |
| 7620 | 3358 | } |
| 3359 | else if (GTK_IS_CONTAINER(widget)) { | |
| 3360 | gtk_container_foreach(GTK_CONTAINER(widget), | |
| 3361 | gaim_gtk_blist_update_toolbar_icons, NULL); | |
| 5228 | 3362 | } |
| 3363 | } | |
| 3364 | ||
| 3365 | void gaim_gtk_blist_update_toolbar() { | |
| 3366 | if (!gtkblist) | |
| 3367 | return; | |
| 3368 | ||
| 7620 | 3369 | if (gaim_prefs_get_int("/gaim/gtk/blist/button_style") == GAIM_BUTTON_NONE) |
| 5228 | 3370 | gtk_widget_hide(gtkblist->bbox); |
| 3371 | else { | |
| 7620 | 3372 | gtk_container_foreach(GTK_CONTAINER(gtkblist->bbox), |
| 3373 | gaim_gtk_blist_update_toolbar_icons, NULL); | |
| 5228 | 3374 | gtk_widget_show(gtkblist->bbox); |
| 3375 | } | |
| 3376 | } | |
| 3377 | ||
| 7620 | 3378 | static void gaim_gtk_blist_remove(GaimBuddyList *list, GaimBlistNode *node) |
| 5228 | 3379 | { |
| 5260 | 3380 | gaim_gtk_blist_hide_node(list, node); |
| 5228 | 3381 | |
| 7620 | 3382 | if(node->parent) |
| 3383 | gaim_gtk_blist_update(list, node->parent); | |
| 3384 | ||
| 5263 | 3385 | /* There's something I don't understand here */ |
| 3386 | /* g_free(node->ui_data); | |
| 3387 | node->ui_data = NULL; */ | |
| 5228 | 3388 | } |
| 3389 | ||
| 3390 | static gboolean do_selection_changed(GaimBlistNode *new_selection) | |
| 3391 | { | |
|
5254
6717daf94719
[gaim-migrate @ 5626]
Robert McQueen <robot101@debian.org>
parents:
5241
diff
changeset
|
3392 | GaimBlistNode *old_selection = NULL; |
| 5228 | 3393 | |
|
5254
6717daf94719
[gaim-migrate @ 5626]
Robert McQueen <robot101@debian.org>
parents:
5241
diff
changeset
|
3394 | /* test for gtkblist because crazy timeout means we can be called after the blist is gone */ |
|
6717daf94719
[gaim-migrate @ 5626]
Robert McQueen <robot101@debian.org>
parents:
5241
diff
changeset
|
3395 | if (gtkblist && new_selection != gtkblist->selected_node) { |
|
6717daf94719
[gaim-migrate @ 5626]
Robert McQueen <robot101@debian.org>
parents:
5241
diff
changeset
|
3396 | old_selection = gtkblist->selected_node; |
| 5228 | 3397 | gtkblist->selected_node = new_selection; |
| 3398 | if(new_selection) | |
| 3399 | gaim_gtk_blist_update(NULL, new_selection); | |
| 3400 | if(old_selection) | |
| 3401 | gaim_gtk_blist_update(NULL, old_selection); | |
| 3402 | } | |
| 3403 | ||
| 3404 | return FALSE; | |
| 3405 | } | |
| 3406 | ||
| 3407 | static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data) | |
| 3408 | { | |
| 3409 | GaimBlistNode *new_selection = NULL; | |
| 3410 | GtkTreeIter iter; | |
| 3411 | ||
| 3412 | if(gtk_tree_selection_get_selected(selection, NULL, &iter)){ | |
| 3413 | gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, | |
| 3414 | NODE_COLUMN, &new_selection, -1); | |
| 3415 | } | |
|
5254
6717daf94719
[gaim-migrate @ 5626]
Robert McQueen <robot101@debian.org>
parents:
5241
diff
changeset
|
3416 | |
| 5228 | 3417 | /* we set this up as a timeout, otherwise the blist flickers */ |
| 3418 | g_timeout_add(0, (GSourceFunc)do_selection_changed, new_selection); | |
| 3419 | } | |
| 3420 | ||
| 8252 | 3421 | static gboolean insert_node(GaimBuddyList *list, GaimBlistNode *node, GtkTreeIter *iter) |
| 7620 | 3422 | { |
| 3423 | GtkTreeIter parent_iter, cur, *curptr = NULL; | |
| 3424 | struct _gaim_gtk_blist_node *gtknode = node->ui_data; | |
| 5256 | 3425 | GtkTreePath *newpath; |
| 7620 | 3426 | |
| 3427 | if(!gtknode || !iter) | |
| 8252 | 3428 | return FALSE; |
| 7620 | 3429 | |
| 3430 | if(node->parent && !get_iter_from_node(node->parent, &parent_iter)) | |
| 8252 | 3431 | return FALSE; |
| 7620 | 3432 | |
| 3433 | if(get_iter_from_node(node, &cur)) | |
| 3434 | curptr = &cur; | |
| 3435 | ||
| 3436 | if(GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_CHAT(node)) { | |
| 3437 | *iter = current_sort_method->func(node, list, parent_iter, curptr); | |
| 3438 | } else { | |
| 3439 | *iter = sort_method_none(node, list, parent_iter, curptr); | |
| 5228 | 3440 | } |
| 3441 | ||
| 7620 | 3442 | gtk_tree_row_reference_free(gtknode->row); |
| 3443 | newpath = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), | |
| 3444 | iter); | |
| 3445 | gtknode->row = | |
| 3446 | gtk_tree_row_reference_new(GTK_TREE_MODEL(gtkblist->treemodel), | |
| 3447 | newpath); | |
| 5256 | 3448 | gtk_tree_path_free(newpath); |
| 3449 | ||
| 5228 | 3450 | gtk_tree_store_set(gtkblist->treemodel, iter, |
| 3451 | NODE_COLUMN, node, | |
| 3452 | -1); | |
| 7620 | 3453 | |
| 3454 | if(node->parent) { | |
| 3455 | GtkTreePath *expand = NULL; | |
| 3456 | struct _gaim_gtk_blist_node *gtkparentnode = node->parent->ui_data; | |
| 3457 | ||
| 3458 | if(GAIM_BLIST_NODE_IS_GROUP(node->parent)) { | |
| 7693 | 3459 | if(!gaim_blist_node_get_bool(node->parent, "collapsed")) |
| 7620 | 3460 | expand = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &parent_iter); |
| 3461 | } else if(GAIM_BLIST_NODE_IS_CONTACT(node->parent) && | |
| 3462 | gtkparentnode->contact_expanded) { | |
| 3463 | expand = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &parent_iter); | |
| 3464 | } | |
| 3465 | if(expand) { | |
| 7693 | 3466 | gtk_tree_view_expand_row(GTK_TREE_VIEW(gtkblist->treeview), expand, FALSE); |
| 7620 | 3467 | gtk_tree_path_free(expand); |
| 3468 | } | |
| 3469 | } | |
| 3470 | ||
| 8252 | 3471 | return TRUE; |
| 5228 | 3472 | } |
| 3473 | ||
| 7620 | 3474 | static void gaim_gtk_blist_update_group(GaimBuddyList *list, GaimBlistNode *node) |
| 3475 | { | |
| 3476 | GaimGroup *group; | |
|
8203
23f66d41ff8c
[gaim-migrate @ 8926]
Alex Smith <madalex@users.sourceforge.net>
parents:
8198
diff
changeset
|
3477 | int count; |
| 7620 | 3478 | |
| 3479 | g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP(node)); | |
| 3480 | ||
| 3481 | group = (GaimGroup*)node; | |
| 3482 | ||
|
8203
23f66d41ff8c
[gaim-migrate @ 8926]
Alex Smith <madalex@users.sourceforge.net>
parents:
8198
diff
changeset
|
3483 | if(gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")) |
|
23f66d41ff8c
[gaim-migrate @ 8926]
Alex Smith <madalex@users.sourceforge.net>
parents:
8198
diff
changeset
|
3484 | count = gaim_blist_get_group_size(group, FALSE); |
|
23f66d41ff8c
[gaim-migrate @ 8926]
Alex Smith <madalex@users.sourceforge.net>
parents:
8198
diff
changeset
|
3485 | else |
|
23f66d41ff8c
[gaim-migrate @ 8926]
Alex Smith <madalex@users.sourceforge.net>
parents:
8198
diff
changeset
|
3486 | count = gaim_blist_get_group_online_count(group); |
|
23f66d41ff8c
[gaim-migrate @ 8926]
Alex Smith <madalex@users.sourceforge.net>
parents:
8198
diff
changeset
|
3487 | if(gaim_prefs_get_bool("/gaim/gtk/blist/show_empty_groups") || count > 0) { |
| 7620 | 3488 | char *mark, *esc; |
| 3489 | GtkTreeIter iter; | |
| 3490 | ||
| 8252 | 3491 | if(!insert_node(list, node, &iter)) |
| 3492 | return; | |
| 7620 | 3493 | |
| 3494 | esc = g_markup_escape_text(group->name, -1); | |
| 3495 | if(gaim_prefs_get_bool("/gaim/gtk/blist/show_group_count")) { | |
| 3496 | mark = g_strdup_printf("<span weight='bold'>%s</span> (%d/%d)", | |
| 3497 | esc, gaim_blist_get_group_online_count(group), | |
| 3498 | gaim_blist_get_group_size(group, FALSE)); | |
| 3499 | } else { | |
| 3500 | mark = g_strdup_printf("<span weight='bold'>%s</span>", esc); | |
| 3501 | } | |
| 3502 | g_free(esc); | |
| 3503 | ||
| 3504 | gtk_tree_store_set(gtkblist->treemodel, &iter, | |
| 3505 | STATUS_ICON_COLUMN, NULL, | |
| 3506 | STATUS_ICON_VISIBLE_COLUMN, FALSE, | |
| 3507 | NAME_COLUMN, mark, | |
| 3508 | NODE_COLUMN, node, | |
| 3509 | -1); | |
| 3510 | g_free(mark); | |
| 3511 | } else { | |
| 3512 | gaim_gtk_blist_hide_node(list, node); | |
| 3513 | } | |
| 3514 | } | |
| 3515 | ||
| 3516 | static void buddy_node(GaimBuddy *buddy, GtkTreeIter *iter, GaimBlistNode *node) | |
| 5228 | 3517 | { |
| 7620 | 3518 | GdkPixbuf *status, *avatar; |
| 3519 | char *mark; | |
| 3520 | char *warning = NULL, *idle = NULL; | |
| 3521 | ||
| 3522 | gboolean selected = (gtkblist->selected_node == node); | |
| 3523 | ||
| 3524 | status = gaim_gtk_blist_get_status_icon((GaimBlistNode*)buddy, | |
| 3525 | (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") | |
| 3526 | ? GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); | |
| 3527 | ||
| 3528 | avatar = gaim_gtk_blist_get_buddy_icon(buddy); | |
| 3529 | mark = gaim_gtk_blist_get_name_markup(buddy, selected); | |
| 3530 | ||
| 3531 | if (buddy->idle > 0) { | |
| 3532 | time_t t; | |
| 3533 | int ihrs, imin; | |
| 3534 | time(&t); | |
| 3535 | ihrs = (t - buddy->idle) / 3600; | |
| 3536 | imin = ((t - buddy->idle) / 60) % 60; | |
| 3537 | if(ihrs > 0) | |
| 3538 | idle = g_strdup_printf("(%d:%02d)", ihrs, imin); | |
| 3539 | else | |
| 3540 | idle = g_strdup_printf("(%d)", imin); | |
| 3541 | } | |
| 3542 | ||
| 3543 | if (buddy->evil > 0) | |
| 3544 | warning = g_strdup_printf("%d%%", buddy->evil); | |
| 3545 | ||
| 3546 | if (gaim_prefs_get_bool("/gaim/gtk/blist/grey_idle_buddies") && | |
| 3547 | buddy->idle) { | |
| 3548 | ||
| 3549 | if(warning && !selected) { | |
| 3550 | char *w2 = g_strdup_printf("<span color='dim grey'>%s</span>", | |
| 3551 | warning); | |
| 3552 | g_free(warning); | |
| 3553 | warning = w2; | |
| 3554 | } | |
| 3555 | ||
| 3556 | if(idle && !selected) { | |
| 3557 | char *i2 = g_strdup_printf("<span color='dim grey'>%s</span>", | |
| 3558 | idle); | |
| 3559 | g_free(idle); | |
| 3560 | idle = i2; | |
| 5228 | 3561 | } |
| 7620 | 3562 | } |
| 3563 | ||
| 3564 | gtk_tree_store_set(gtkblist->treemodel, iter, | |
| 3565 | STATUS_ICON_COLUMN, status, | |
| 3566 | STATUS_ICON_VISIBLE_COLUMN, TRUE, | |
| 3567 | NAME_COLUMN, mark, | |
| 3568 | WARNING_COLUMN, warning, | |
| 3569 | IDLE_COLUMN, idle, | |
| 3570 | BUDDY_ICON_COLUMN, avatar, | |
| 3571 | -1); | |
| 3572 | ||
| 3573 | g_free(mark); | |
| 3574 | if(idle) | |
| 3575 | g_free(idle); | |
| 3576 | if(warning) | |
| 3577 | g_free(warning); | |
| 3578 | if(status) | |
| 3579 | g_object_unref(status); | |
| 3580 | if(avatar) | |
| 3581 | g_object_unref(avatar); | |
| 3582 | } | |
| 3583 | ||
| 3584 | static void gaim_gtk_blist_update_contact(GaimBuddyList *list, GaimBlistNode *node) | |
| 3585 | { | |
| 3586 | GaimContact *contact; | |
| 3587 | GaimBuddy *buddy; | |
| 3588 | struct _gaim_gtk_blist_node *gtknode; | |
| 3589 | ||
| 3590 | g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT(node)); | |
| 3591 | ||
| 3592 | /* First things first, update the group */ | |
| 3593 | gaim_gtk_blist_update_group(list, node->parent); | |
| 3594 | ||
| 3595 | gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
| 3596 | contact = (GaimContact*)node; | |
| 3597 | buddy = gaim_contact_get_priority_buddy(contact); | |
| 3598 | ||
| 3599 | if(buddy && (buddy->present != GAIM_BUDDY_OFFLINE || | |
| 3600 | (gaim_account_is_connected(buddy->account) && | |
| 3601 | gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")))) { | |
| 3602 | GtkTreeIter iter; | |
| 3603 | ||
| 8252 | 3604 | if(!insert_node(list, node, &iter)) |
| 3605 | return; | |
| 7620 | 3606 | |
| 3607 | if(gtknode->contact_expanded) { | |
| 3608 | GdkPixbuf *status; | |
| 5228 | 3609 | char *mark; |
| 3610 | ||
| 7620 | 3611 | status = gaim_gtk_blist_get_status_icon(node, |
| 3612 | (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") ? | |
| 3613 | GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); | |
| 3614 | ||
| 3615 | mark = g_markup_escape_text(gaim_contact_get_alias(contact), -1); | |
| 3616 | ||
| 5228 | 3617 | gtk_tree_store_set(gtkblist->treemodel, &iter, |
| 7620 | 3618 | STATUS_ICON_COLUMN, status, |
| 3619 | STATUS_ICON_VISIBLE_COLUMN, TRUE, | |
| 5228 | 3620 | NAME_COLUMN, mark, |
| 7620 | 3621 | WARNING_COLUMN, NULL, |
| 3622 | IDLE_COLUMN, NULL, | |
| 3623 | BUDDY_ICON_COLUMN, NULL, | |
| 5228 | 3624 | -1); |
| 3625 | g_free(mark); | |
| 7620 | 3626 | if(status) |
| 3627 | g_object_unref(status); | |
| 3628 | } else { | |
| 3629 | buddy_node(buddy, &iter, node); | |
| 5228 | 3630 | } |
| 7620 | 3631 | } else { |
| 3632 | gaim_gtk_blist_hide_node(list, node); | |
| 5228 | 3633 | } |
| 7620 | 3634 | } |
| 3635 | ||
| 3636 | static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node) | |
| 3637 | { | |
| 3638 | GaimContact *contact; | |
| 3639 | GaimBuddy *buddy; | |
| 3640 | struct _gaim_gtk_blist_node *gtkparentnode; | |
| 3641 | ||
| 3642 | g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
| 3643 | ||
| 3644 | buddy = (GaimBuddy*)node; | |
| 3645 | contact = (GaimContact*)node->parent; | |
| 3646 | gtkparentnode = (struct _gaim_gtk_blist_node *)node->parent->ui_data; | |
| 3647 | ||
| 3648 | /* First things first, update the contact */ | |
| 3649 | gaim_gtk_blist_update_contact(list, node->parent); | |
| 3650 | ||
| 3651 | if(gtkparentnode->contact_expanded && | |
| 3652 | (buddy->present != GAIM_BUDDY_OFFLINE || | |
| 3653 | (gaim_account_is_connected(buddy->account) && | |
| 3654 | gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")))) { | |
| 3655 | GtkTreeIter iter; | |
| 3656 | ||
| 8252 | 3657 | if(!insert_node(list, node, &iter)) |
| 3658 | return; | |
| 3659 | ||
| 7620 | 3660 | buddy_node(buddy, &iter, node); |
| 3661 | ||
| 3662 | } else { | |
| 3663 | gaim_gtk_blist_hide_node(list, node); | |
| 3664 | } | |
| 3665 | ||
| 3666 | } | |
| 3667 | ||
| 3668 | static void gaim_gtk_blist_update_chat(GaimBuddyList *list, GaimBlistNode *node) | |
| 3669 | { | |
| 3670 | GaimChat *chat; | |
| 3671 | ||
| 3672 | g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT(node)); | |
| 3673 | ||
| 3674 | /* First things first, update the group */ | |
| 3675 | gaim_gtk_blist_update_group(list, node->parent); | |
| 3676 | ||
| 3677 | chat = (GaimChat*)node; | |
| 3678 | ||
| 3679 | if(gaim_account_is_connected(chat->account)) { | |
| 3680 | GtkTreeIter iter; | |
| 5234 | 3681 | GdkPixbuf *status; |
| 7620 | 3682 | char *mark; |
| 3683 | ||
| 8252 | 3684 | if(!insert_node(list, node, &iter)) |
| 3685 | return; | |
| 5234 | 3686 | |
| 3687 | status = gaim_gtk_blist_get_status_icon(node, | |
| 7620 | 3688 | (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") ? |
| 3689 | GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); | |
| 3690 | ||
| 3691 | mark = g_markup_escape_text(gaim_chat_get_name(chat), -1); | |
| 5234 | 3692 | |
| 3693 | gtk_tree_store_set(gtkblist->treemodel, &iter, | |
| 7620 | 3694 | STATUS_ICON_COLUMN, status, |
| 3695 | STATUS_ICON_VISIBLE_COLUMN, TRUE, | |
| 3696 | NAME_COLUMN, mark, | |
| 3697 | -1); | |
| 5228 | 3698 | |
| 3699 | g_free(mark); | |
| 7620 | 3700 | if(status) |
| 5228 | 3701 | g_object_unref(status); |
| 7620 | 3702 | } else { |
| 5260 | 3703 | gaim_gtk_blist_hide_node(list, node); |
| 5228 | 3704 | } |
| 7620 | 3705 | } |
| 3706 | ||
| 3707 | static void gaim_gtk_blist_update(GaimBuddyList *list, GaimBlistNode *node) | |
| 3708 | { | |
| 3709 | if(!gtkblist) | |
| 3710 | return; | |
| 3711 | ||
| 3712 | switch(node->type) { | |
| 3713 | case GAIM_BLIST_GROUP_NODE: | |
| 3714 | gaim_gtk_blist_update_group(list, node); | |
| 3715 | break; | |
| 3716 | case GAIM_BLIST_CONTACT_NODE: | |
| 3717 | gaim_gtk_blist_update_contact(list, node); | |
| 3718 | break; | |
| 3719 | case GAIM_BLIST_BUDDY_NODE: | |
| 3720 | gaim_gtk_blist_update_buddy(list, node); | |
| 3721 | break; | |
| 3722 | case GAIM_BLIST_CHAT_NODE: | |
| 3723 | gaim_gtk_blist_update_chat(list, node); | |
| 3724 | break; | |
| 3725 | case GAIM_BLIST_OTHER_NODE: | |
| 3726 | return; | |
| 3727 | } | |
| 5234 | 3728 | |
| 5228 | 3729 | gtk_tree_view_columns_autosize(GTK_TREE_VIEW(gtkblist->treeview)); |
| 3730 | } | |
| 3731 | ||
| 7620 | 3732 | |
| 3733 | static void gaim_gtk_blist_destroy(GaimBuddyList *list) | |
| 5228 | 3734 | { |
| 3735 | if (!gtkblist) | |
| 3736 | return; | |
| 3737 | ||
|
8259
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3738 | gaim_signal_disconnect(gaim_connections_get_handle(), "signing-on", |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3739 | gtkblist, GAIM_CALLBACK(signed_on_off_cb)); |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3740 | gaim_signal_disconnect(gaim_connections_get_handle(), "signing-off", |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3741 | gtkblist, GAIM_CALLBACK(signed_on_off_cb)); |
|
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3742 | |
| 5228 | 3743 | gtk_widget_destroy(gtkblist->window); |
| 7620 | 3744 | |
|
8254
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
3745 | gaim_gtk_blist_tooltip_destroy(); |
| 7620 | 3746 | |
| 5228 | 3747 | gtk_object_sink(GTK_OBJECT(gtkblist->tooltips)); |
| 3748 | ||
| 3749 | if (gtkblist->refresh_timer) | |
| 3750 | g_source_remove(gtkblist->refresh_timer); | |
| 3751 | if (gtkblist->timeout) | |
| 3752 | g_source_remove(gtkblist->timeout); | |
| 3753 | ||
| 3754 | gtkblist->refresh_timer = 0; | |
| 3755 | gtkblist->timeout = 0; | |
| 3756 | gtkblist->window = gtkblist->vbox = gtkblist->treeview = NULL; | |
| 3757 | gtkblist->treemodel = NULL; | |
| 3758 | gtkblist->idle_column = NULL; | |
| 3759 | gtkblist->warning_column = gtkblist->buddy_icon_column = NULL; | |
|
8254
3b3d86ef983b
[gaim-migrate @ 8977]
Mark Doliner <markdoliner@pidgin.im>
parents:
8252
diff
changeset
|
3760 | gtkblist->bbox = NULL; |
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5422
diff
changeset
|
3761 | g_object_unref(G_OBJECT(gtkblist->ift)); |
| 5228 | 3762 | protomenu = NULL; |
| 3763 | awaymenu = NULL; | |
| 3764 | gtkblist = NULL; | |
| 7620 | 3765 | |
| 3766 | while(blist_prefs_callbacks) { | |
| 3767 | gaim_prefs_disconnect_callback(GPOINTER_TO_INT(blist_prefs_callbacks->data)); | |
| 3768 | blist_prefs_callbacks = g_slist_remove(blist_prefs_callbacks, blist_prefs_callbacks->data); | |
| 3769 | } | |
| 5228 | 3770 | } |
| 3771 | ||
| 7620 | 3772 | static void gaim_gtk_blist_set_visible(GaimBuddyList *list, gboolean show) |
| 5228 | 3773 | { |
| 3774 | if (!(gtkblist && gtkblist->window)) | |
| 3775 | return; | |
| 3776 | ||
| 3777 | if (show) { | |
| 3778 | gaim_gtk_blist_restore_position(); | |
| 3779 | gtk_window_present(GTK_WINDOW(gtkblist->window)); | |
| 3780 | } else { | |
| 7620 | 3781 | if (!gaim_connections_get_all() || docklet_count) { |
| 5228 | 3782 | #ifdef _WIN32 |
| 3783 | wgaim_systray_minimize(gtkblist->window); | |
| 3784 | #endif | |
| 3785 | gtk_widget_hide(gtkblist->window); | |
| 3786 | } else { | |
| 3787 | gtk_window_iconify(GTK_WINDOW(gtkblist->window)); | |
| 3788 | } | |
| 3789 | } | |
| 3790 | } | |
| 3791 | ||
| 7620 | 3792 | static GList * |
| 3793 | groups_tree(void) | |
| 3794 | { | |
| 3795 | GList *tmp = NULL; | |
| 3796 | char *tmp2; | |
| 3797 | GaimGroup *g; | |
| 3798 | GaimBlistNode *gnode; | |
| 3799 | ||
| 3800 | if (gaim_get_blist()->root == NULL) | |
| 3801 | { | |
| 3802 | tmp2 = g_strdup(_("Buddies")); | |
| 3803 | tmp = g_list_append(tmp, tmp2); | |
| 3804 | } | |
| 3805 | else | |
| 3806 | { | |
| 3807 | for (gnode = gaim_get_blist()->root; | |
| 3808 | gnode != NULL; | |
| 3809 | gnode = gnode->next) | |
| 3810 | { | |
| 3811 | if (GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 3812 | { | |
| 3813 | g = (GaimGroup *)gnode; | |
| 3814 | tmp2 = g->name; | |
| 3815 | tmp = g_list_append(tmp, tmp2); | |
| 3816 | } | |
| 3817 | } | |
| 3818 | } | |
| 3819 | ||
| 3820 | return tmp; | |
| 3821 | } | |
| 3822 | ||
| 3823 | static void | |
| 3824 | add_buddy_select_account_cb(GObject *w, GaimAccount *account, | |
| 3825 | GaimGtkAddBuddyData *data) | |
| 3826 | { | |
| 3827 | /* Save our account */ | |
| 3828 | data->account = account; | |
| 3829 | } | |
| 3830 | ||
| 3831 | static void | |
| 3832 | destroy_add_buddy_dialog_cb(GtkWidget *win, GaimGtkAddBuddyData *data) | |
| 3833 | { | |
| 3834 | g_free(data); | |
| 3835 | } | |
| 3836 | ||
| 3837 | static void | |
| 3838 | add_buddy_cb(GtkWidget *w, int resp, GaimGtkAddBuddyData *data) | |
| 3839 | { | |
| 3840 | const char *grp, *who, *whoalias; | |
| 3841 | GaimConversation *c; | |
| 3842 | GaimBuddy *b; | |
| 3843 | GaimGroup *g; | |
| 3844 | ||
| 3845 | if (resp == GTK_RESPONSE_OK) | |
| 3846 | { | |
| 3847 | who = gtk_entry_get_text(GTK_ENTRY(data->entry)); | |
| 3848 | grp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(data->combo)->entry)); | |
| 3849 | whoalias = gtk_entry_get_text(GTK_ENTRY(data->entry_for_alias)); | |
| 3850 | ||
| 3851 | c = gaim_find_conversation_with_account(who, data->account); | |
| 3852 | ||
| 3853 | if ((g = gaim_find_group(grp)) == NULL) | |
| 3854 | { | |
| 3855 | g = gaim_group_new(grp); | |
| 3856 | gaim_blist_add_group(g, NULL); | |
| 3857 | } | |
| 3858 | ||
| 3859 | b = gaim_buddy_new(data->account, who, whoalias); | |
| 3860 | gaim_blist_add_buddy(b, NULL, g, NULL); | |
| 3861 | serv_add_buddy(gaim_account_get_connection(data->account), who, g); | |
| 3862 | ||
|
7887
4b2925a88897
[gaim-migrate @ 8545]
Mark Doliner <markdoliner@pidgin.im>
parents:
7879
diff
changeset
|
3863 | /* |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
3864 | * It really seems like it would be better if the call to serv_add_buddy() |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
3865 | * and gaim_conversation_update() were done in blist.c, possibly in the |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
3866 | * gaim_blist_add_buddy() function. Maybe serv_add_buddy() should be |
|
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
3867 | * renamed to gaim_blist_add_new_buddy() or something, and have it call |
|
7887
4b2925a88897
[gaim-migrate @ 8545]
Mark Doliner <markdoliner@pidgin.im>
parents:
7879
diff
changeset
|
3868 | * gaim_blist_add_buddy() after it creates it. --Mark |
|
4b2925a88897
[gaim-migrate @ 8545]
Mark Doliner <markdoliner@pidgin.im>
parents:
7879
diff
changeset
|
3869 | */ |
|
4b2925a88897
[gaim-migrate @ 8545]
Mark Doliner <markdoliner@pidgin.im>
parents:
7879
diff
changeset
|
3870 | |
| 7620 | 3871 | if (c != NULL) { |
| 3872 | gaim_buddy_icon_update(gaim_conv_im_get_icon(GAIM_CONV_IM(c))); | |
| 3873 | gaim_conversation_update(c, GAIM_CONV_UPDATE_ADD); | |
| 3874 | } | |
| 3875 | ||
| 3876 | gaim_blist_save(); | |
| 3877 | } | |
| 3878 | ||
| 3879 | gtk_widget_destroy(data->window); | |
| 3880 | } | |
| 3881 | ||
| 3882 | static void | |
| 3883 | gaim_gtk_blist_request_add_buddy(GaimAccount *account, const char *username, | |
| 3884 | const char *group, const char *alias) | |
| 3885 | { | |
| 3886 | GtkWidget *table; | |
| 3887 | GtkWidget *label; | |
| 3888 | GtkWidget *hbox; | |
| 3889 | GtkWidget *vbox; | |
| 3890 | GtkWidget *img; | |
| 3891 | GaimGtkBuddyList *gtkblist; | |
| 3892 | GaimGtkAddBuddyData *data = g_new0(GaimGtkAddBuddyData, 1); | |
| 3893 | ||
| 3894 | data->account = | |
| 3895 | (account != NULL | |
| 3896 | ? account | |
| 3897 | : gaim_connection_get_account(gaim_connections_get_all()->data)); | |
| 3898 | ||
| 3899 | img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, | |
| 3900 | GTK_ICON_SIZE_DIALOG); | |
| 3901 | ||
| 3902 | gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
| 3903 | ||
| 3904 | data->window = gtk_dialog_new_with_buttons(_("Add Buddy"), | |
| 8222 | 3905 | NULL, 0, |
| 7620 | 3906 | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
| 3907 | GTK_STOCK_ADD, GTK_RESPONSE_OK, | |
| 3908 | NULL); | |
| 3909 | ||
| 3910 | gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); | |
| 3911 | gtk_container_set_border_width(GTK_CONTAINER(data->window), 6); | |
| 3912 | gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); | |
| 3913 | gtk_dialog_set_has_separator(GTK_DIALOG(data->window), FALSE); | |
| 3914 | gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), 12); | |
| 3915 | gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), 6); | |
| 3916 | gtk_window_set_role(GTK_WINDOW(data->window), "add_buddy"); | |
| 3917 | ||
| 3918 | hbox = gtk_hbox_new(FALSE, 12); | |
| 3919 | gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); | |
| 3920 | gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
| 3921 | gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
| 3922 | ||
| 3923 | vbox = gtk_vbox_new(FALSE, 0); | |
| 3924 | gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
| 3925 | ||
| 3926 | label = gtk_label_new( | |
| 3927 | _("Please enter the screen name of the person you would like " | |
| 3928 | "to add to your buddy list. You may optionally enter an alias, " | |
| 3929 | "or nickname, for the buddy. The alias will be displayed in " | |
| 3930 | "place of the screen name whenever possible.\n")); | |
| 3931 | ||
| 3932 | gtk_widget_set_size_request(GTK_WIDGET(label), 400, -1); | |
| 3933 | gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
| 3934 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
| 3935 | gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
| 3936 | ||
| 3937 | hbox = gtk_hbox_new(FALSE, 6); | |
| 3938 | gtk_container_add(GTK_CONTAINER(vbox), hbox); | |
| 3939 | ||
| 3940 | g_signal_connect(G_OBJECT(data->window), "destroy", | |
| 3941 | G_CALLBACK(destroy_add_buddy_dialog_cb), data); | |
| 3942 | ||
| 3943 | table = gtk_table_new(4, 2, FALSE); | |
| 3944 | gtk_table_set_row_spacings(GTK_TABLE(table), 5); | |
| 3945 | gtk_table_set_col_spacings(GTK_TABLE(table), 5); | |
| 3946 | gtk_container_set_border_width(GTK_CONTAINER(table), 0); | |
| 3947 | gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); | |
| 3948 | ||
| 3949 | label = gtk_label_new(_("Screen Name:")); | |
| 3950 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
| 3951 | gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); | |
| 3952 | ||
| 3953 | data->entry = gtk_entry_new(); | |
| 3954 | gtk_table_attach_defaults(GTK_TABLE(table), data->entry, 1, 2, 0, 1); | |
| 3955 | gtk_widget_grab_focus(data->entry); | |
| 3956 | ||
| 3957 | if (username != NULL) | |
| 3958 | gtk_entry_set_text(GTK_ENTRY(data->entry), username); | |
| 3959 | ||
| 3960 | gtk_entry_set_activates_default (GTK_ENTRY(data->entry), TRUE); | |
| 8137 | 3961 | gaim_set_accessible_label (data->entry, label); |
| 7620 | 3962 | |
| 3963 | label = gtk_label_new(_("Alias:")); | |
| 3964 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
| 3965 | gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); | |
| 3966 | ||
| 3967 | data->entry_for_alias = gtk_entry_new(); | |
| 3968 | gtk_table_attach_defaults(GTK_TABLE(table), | |
| 3969 | data->entry_for_alias, 1, 2, 1, 2); | |
| 3970 | ||
| 3971 | if (alias != NULL) | |
| 3972 | gtk_entry_set_text(GTK_ENTRY(data->entry_for_alias), alias); | |
| 3973 | ||
| 3974 | gtk_entry_set_activates_default (GTK_ENTRY(data->entry_for_alias), TRUE); | |
| 8137 | 3975 | gaim_set_accessible_label (data->entry_for_alias, label); |
| 7620 | 3976 | |
| 3977 | label = gtk_label_new(_("Group:")); | |
| 3978 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
| 3979 | gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); | |
| 3980 | ||
| 3981 | data->combo = gtk_combo_new(); | |
| 3982 | gtk_combo_set_popdown_strings(GTK_COMBO(data->combo), groups_tree()); | |
| 3983 | gtk_table_attach_defaults(GTK_TABLE(table), data->combo, 1, 2, 2, 3); | |
| 8137 | 3984 | gaim_set_accessible_label (data->combo, label); |
| 7620 | 3985 | |
| 3986 | /* Set up stuff for the account box */ | |
| 3987 | label = gtk_label_new(_("Account:")); | |
| 3988 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
| 3989 | gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); | |
| 3990 | ||
| 3991 | data->account_box = gaim_gtk_account_option_menu_new(account, FALSE, | |
| 3992 | G_CALLBACK(add_buddy_select_account_cb), NULL, data); | |
| 3993 | ||
| 3994 | gtk_table_attach_defaults(GTK_TABLE(table), data->account_box, 1, 2, 3, 4); | |
| 8137 | 3995 | gaim_set_accessible_label (data->account_box, label); |
| 7620 | 3996 | |
| 3997 | /* End of account box */ | |
| 3998 | ||
| 3999 | g_signal_connect(G_OBJECT(data->window), "response", | |
| 4000 | G_CALLBACK(add_buddy_cb), data); | |
| 4001 | ||
| 4002 | gtk_widget_show_all(data->window); | |
| 4003 | ||
| 4004 | if (group != NULL) | |
| 4005 | gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(data->combo)->entry), group); | |
| 4006 | } | |
| 4007 | ||
| 4008 | static void | |
| 4009 | add_chat_cb(GtkWidget *w, GaimGtkAddChatData *data) | |
| 4010 | { | |
| 4011 | GHashTable *components; | |
| 4012 | GList *tmp; | |
| 4013 | GaimChat *chat; | |
| 4014 | GaimGroup *group; | |
| 4015 | const char *group_name; | |
| 4016 | ||
| 4017 | components = g_hash_table_new_full(g_str_hash, g_str_equal, | |
| 4018 | g_free, g_free); | |
| 4019 | ||
| 4020 | for (tmp = data->entries; tmp; tmp = tmp->next) | |
| 4021 | { | |
| 4022 | if (g_object_get_data(tmp->data, "is_spin")) | |
| 4023 | { | |
| 4024 | g_hash_table_replace(components, | |
| 4025 | g_strdup(g_object_get_data(tmp->data, "identifier")), | |
| 4026 | g_strdup_printf("%d", | |
| 4027 | gtk_spin_button_get_value_as_int(tmp->data))); | |
| 4028 | } | |
| 4029 | else | |
| 4030 | { | |
| 4031 | g_hash_table_replace(components, | |
| 4032 | g_strdup(g_object_get_data(tmp->data, "identifier")), | |
| 4033 | g_strdup(gtk_entry_get_text(tmp->data))); | |
| 4034 | } | |
| 4035 | } | |
| 4036 | ||
| 4037 | chat = gaim_chat_new(data->account, | |
| 4038 | gtk_entry_get_text(GTK_ENTRY(data->alias_entry)), | |
| 4039 | components); | |
| 4040 | ||
| 4041 | group_name = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(data->group_combo)->entry)); | |
| 4042 | ||
| 4043 | if ((group = gaim_find_group(group_name)) == NULL) | |
| 4044 | { | |
| 4045 | group = gaim_group_new(group_name); | |
| 4046 | gaim_blist_add_group(group, NULL); | |
| 4047 | } | |
| 4048 | ||
| 4049 | if (chat != NULL) | |
| 4050 | { | |
| 4051 | gaim_blist_add_chat(chat, group, NULL); | |
| 4052 | gaim_blist_save(); | |
| 4053 | } | |
| 4054 | ||
| 4055 | gtk_widget_destroy(data->window); | |
| 4056 | g_list_free(data->entries); | |
| 4057 | ||
| 4058 | g_free(data); | |
| 4059 | } | |
| 4060 | ||
| 4061 | static void | |
| 4062 | add_chat_resp_cb(GtkWidget *w, int resp, GaimGtkAddChatData *data) | |
| 4063 | { | |
| 4064 | if (resp == GTK_RESPONSE_OK) | |
| 4065 | { | |
| 4066 | add_chat_cb(NULL, data); | |
| 4067 | } | |
| 4068 | else | |
| 4069 | { | |
| 4070 | gtk_widget_destroy(data->window); | |
| 4071 | g_list_free(data->entries); | |
| 4072 | g_free(data); | |
| 4073 | } | |
| 4074 | } | |
| 4075 | ||
| 4076 | static void | |
| 4077 | rebuild_addchat_entries(GaimGtkAddChatData *data) | |
| 4078 | { | |
| 4079 | GaimConnection *gc; | |
| 4080 | GList *list, *tmp; | |
| 4081 | struct proto_chat_entry *pce; | |
| 4082 | gboolean focus = TRUE; | |
| 4083 | ||
| 4084 | gc = gaim_account_get_connection(data->account); | |
| 4085 | ||
| 4086 | while (GTK_BOX(data->entries_box)->children) | |
| 4087 | { | |
| 4088 | gtk_container_remove(GTK_CONTAINER(data->entries_box), | |
| 4089 | ((GtkBoxChild *)GTK_BOX(data->entries_box)->children->data)->widget); | |
| 4090 | } | |
| 4091 | ||
| 4092 | if (data->entries != NULL) | |
| 4093 | g_list_free(data->entries); | |
| 4094 | ||
| 4095 | data->entries = NULL; | |
| 4096 | ||
| 4097 | list = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc); | |
| 4098 | ||
| 4099 | for (tmp = list; tmp; tmp = tmp->next) | |
| 4100 | { | |
| 4101 | GtkWidget *label; | |
| 4102 | GtkWidget *rowbox; | |
| 4103 | ||
| 4104 | pce = tmp->data; | |
| 4105 | ||
| 4106 | rowbox = gtk_hbox_new(FALSE, 5); | |
| 4107 | gtk_box_pack_start(GTK_BOX(data->entries_box), rowbox, FALSE, FALSE, 0); | |
| 4108 | ||
| 7889 | 4109 | label = gtk_label_new_with_mnemonic(pce->label); |
| 7620 | 4110 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
| 4111 | gtk_size_group_add_widget(data->sg, label); | |
| 4112 | gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
| 4113 | ||
| 4114 | if (pce->is_int) | |
| 4115 | { | |
| 4116 | GtkObject *adjust; | |
| 4117 | GtkWidget *spin; | |
| 4118 | adjust = gtk_adjustment_new(pce->min, pce->min, pce->max, | |
| 4119 | 1, 10, 10); | |
| 4120 | spin = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); | |
| 4121 | g_object_set_data(G_OBJECT(spin), "is_spin", GINT_TO_POINTER(TRUE)); | |
| 4122 | g_object_set_data(G_OBJECT(spin), "identifier", pce->identifier); | |
| 4123 | data->entries = g_list_append(data->entries, spin); | |
| 4124 | gtk_widget_set_size_request(spin, 50, -1); | |
| 4125 | gtk_box_pack_end(GTK_BOX(rowbox), spin, FALSE, FALSE, 0); | |
| 7891 | 4126 | gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin); |
| 8137 | 4127 | gaim_set_accessible_label (spin, label); |
| 7620 | 4128 | } |
| 4129 | else | |
| 4130 | { | |
| 4131 | GtkWidget *entry = gtk_entry_new(); | |
| 4132 | ||
| 4133 | g_object_set_data(G_OBJECT(entry), "identifier", pce->identifier); | |
| 4134 | data->entries = g_list_append(data->entries, entry); | |
| 4135 | ||
| 4136 | if (pce->def) | |
| 4137 | gtk_entry_set_text(GTK_ENTRY(entry), pce->def); | |
| 4138 | ||
| 4139 | if (focus) | |
| 4140 | { | |
| 4141 | gtk_widget_grab_focus(entry); | |
| 4142 | focus = FALSE; | |
| 4143 | } | |
| 4144 | ||
| 4145 | if (pce->secret) | |
| 4146 | gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); | |
| 4147 | ||
| 4148 | gtk_box_pack_end(GTK_BOX(rowbox), entry, TRUE, TRUE, 0); | |
| 4149 | ||
| 4150 | g_signal_connect(G_OBJECT(entry), "activate", | |
| 4151 | G_CALLBACK(add_chat_cb), data); | |
| 7891 | 4152 | gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); |
| 8137 | 4153 | gaim_set_accessible_label (entry, label); |
| 7620 | 4154 | } |
| 4155 | ||
| 4156 | g_free(pce); | |
| 4157 | } | |
| 4158 | ||
| 4159 | g_list_free(list); | |
| 4160 | ||
| 4161 | gtk_widget_show_all(data->entries_box); | |
| 4162 | } | |
| 4163 | ||
| 4164 | static void | |
| 4165 | add_chat_select_account_cb(GObject *w, GaimAccount *account, | |
| 4166 | GaimGtkAddChatData *data) | |
| 4167 | { | |
| 4168 | if (gaim_account_get_protocol(data->account) == | |
| 4169 | gaim_account_get_protocol(account)) | |
| 4170 | { | |
| 4171 | data->account = account; | |
| 4172 | } | |
| 4173 | else | |
| 4174 | { | |
| 4175 | data->account = account; | |
| 4176 | rebuild_addchat_entries(data); | |
| 4177 | } | |
| 4178 | } | |
| 4179 | ||
| 4180 | static gboolean | |
| 4181 | add_chat_check_account_func(GaimAccount *account) | |
| 4182 | { | |
| 4183 | GaimConnection *gc = gaim_account_get_connection(account); | |
| 4184 | ||
| 4185 | return (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL); | |
| 4186 | } | |
| 4187 | ||
| 4188 | void | |
|
7859
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7856
diff
changeset
|
4189 | gaim_gtk_blist_request_add_chat(GaimAccount *account, GaimGroup *group, |
|
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7856
diff
changeset
|
4190 | const char *alias) |
| 7620 | 4191 | { |
| 4192 | GaimGtkAddChatData *data; | |
| 4193 | GaimGtkBuddyList *gtkblist; | |
| 4194 | GList *l; | |
| 4195 | GaimConnection *gc; | |
| 4196 | GtkWidget *label; | |
| 4197 | GtkWidget *rowbox; | |
| 4198 | GtkWidget *hbox; | |
| 4199 | GtkWidget *vbox; | |
| 4200 | GtkWidget *img; | |
| 4201 | ||
| 4202 | data = g_new0(GaimGtkAddChatData, 1); | |
| 4203 | ||
| 4204 | img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, | |
| 4205 | GTK_ICON_SIZE_DIALOG); | |
| 4206 | ||
| 4207 | gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
| 4208 | ||
| 4209 | if (account != NULL) | |
| 4210 | { | |
| 4211 | data->account = account; | |
| 4212 | } | |
| 4213 | else | |
| 4214 | { | |
| 4215 | /* Select an account with chat capabilities */ | |
| 4216 | for (l = gaim_connections_get_all(); l != NULL; l = l->next) | |
| 4217 | { | |
| 4218 | gc = (GaimConnection *)l->data; | |
| 4219 | ||
| 4220 | if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat != NULL) | |
| 4221 | { | |
| 4222 | data->account = gaim_connection_get_account(gc); | |
| 4223 | break; | |
| 4224 | } | |
| 4225 | } | |
| 4226 | } | |
| 4227 | ||
| 4228 | if (data->account == NULL) | |
| 4229 | { | |
| 4230 | gaim_notify_error(NULL, NULL, | |
| 4231 | _("You are not currently signed on with any " | |
| 4232 | "protocols that have the ability to chat."), NULL); | |
| 4233 | return; | |
| 4234 | } | |
| 4235 | ||
| 4236 | data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
| 4237 | ||
| 4238 | data->window = gtk_dialog_new_with_buttons(_("Add Chat"), | |
| 8222 | 4239 | NULL, 0, |
| 7620 | 4240 | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
| 4241 | GTK_STOCK_ADD, GTK_RESPONSE_OK, | |
| 4242 | NULL); | |
| 4243 | ||
| 4244 | gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); | |
| 4245 | gtk_container_set_border_width(GTK_CONTAINER(data->window), 6); | |
| 4246 | gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); | |
| 4247 | gtk_dialog_set_has_separator(GTK_DIALOG(data->window), FALSE); | |
| 4248 | gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), 12); | |
| 4249 | gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), 6); | |
| 4250 | gtk_window_set_role(GTK_WINDOW(data->window), "add_chat"); | |
| 4251 | ||
| 4252 | hbox = gtk_hbox_new(FALSE, 12); | |
| 4253 | gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); | |
| 4254 | gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
| 4255 | gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
| 4256 | ||
| 4257 | vbox = gtk_vbox_new(FALSE, 5); | |
| 4258 | gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
| 4259 | ||
| 4260 | label = gtk_label_new( | |
| 4261 | _("Please enter an alias, and the appropriate information " | |
| 4262 | "about the chat you would like to add to your buddy list.\n")); | |
| 4263 | gtk_widget_set_size_request(label, 400, -1); | |
| 4264 | gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
| 4265 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
| 4266 | gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
| 4267 | ||
| 4268 | rowbox = gtk_hbox_new(FALSE, 5); | |
| 4269 | gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); | |
| 4270 | ||
| 4271 | label = gtk_label_new(_("Account:")); | |
| 4272 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
| 4273 | gtk_size_group_add_widget(data->sg, label); | |
| 4274 | gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
| 4275 | ||
| 4276 | data->account_menu = gaim_gtk_account_option_menu_new(account, FALSE, | |
| 4277 | G_CALLBACK(add_chat_select_account_cb), | |
| 4278 | add_chat_check_account_func, data); | |
| 4279 | gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); | |
| 8137 | 4280 | gaim_set_accessible_label (data->account_menu, label); |
| 7620 | 4281 | |
| 4282 | data->entries_box = gtk_vbox_new(FALSE, 5); | |
| 4283 | gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); | |
| 4284 | gtk_box_pack_start(GTK_BOX(vbox), data->entries_box, TRUE, TRUE, 0); | |
| 4285 | ||
| 4286 | rebuild_addchat_entries(data); | |
| 4287 | ||
| 4288 | rowbox = gtk_hbox_new(FALSE, 5); | |
| 4289 | gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); | |
| 4290 | ||
| 4291 | label = gtk_label_new(_("Alias:")); | |
| 4292 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
| 4293 | gtk_size_group_add_widget(data->sg, label); | |
| 4294 | gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
| 4295 | ||
| 4296 | data->alias_entry = gtk_entry_new(); | |
|
7859
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7856
diff
changeset
|
4297 | if (alias != NULL) |
|
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7856
diff
changeset
|
4298 | gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias); |
| 7620 | 4299 | gtk_box_pack_end(GTK_BOX(rowbox), data->alias_entry, TRUE, TRUE, 0); |
| 8137 | 4300 | gaim_set_accessible_label (data->alias_entry, label); |
| 7620 | 4301 | |
| 4302 | rowbox = gtk_hbox_new(FALSE, 5); | |
| 4303 | gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); | |
| 4304 | ||
| 4305 | label = gtk_label_new(_("Group:")); | |
| 4306 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
| 4307 | gtk_size_group_add_widget(data->sg, label); | |
| 4308 | gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
| 4309 | ||
| 4310 | data->group_combo = gtk_combo_new(); | |
| 4311 | gtk_combo_set_popdown_strings(GTK_COMBO(data->group_combo), groups_tree()); | |
| 4312 | gtk_box_pack_end(GTK_BOX(rowbox), data->group_combo, TRUE, TRUE, 0); | |
| 4313 | ||
| 4314 | if (group) | |
| 4315 | { | |
| 4316 | gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(data->group_combo)->entry), | |
| 4317 | group->name); | |
| 4318 | } | |
| 8137 | 4319 | gaim_set_accessible_label (data->group_combo, label); |
| 7620 | 4320 | |
| 4321 | g_signal_connect(G_OBJECT(data->window), "response", | |
| 4322 | G_CALLBACK(add_chat_resp_cb), data); | |
| 4323 | ||
| 4324 | gtk_widget_show_all(data->window); | |
| 4325 | } | |
| 4326 | ||
| 4327 | static void | |
| 4328 | add_group_cb(GaimConnection *gc, const char *group_name) | |
| 4329 | { | |
| 4330 | GaimGroup *g; | |
| 4331 | ||
| 4332 | g = gaim_group_new(group_name); | |
| 4333 | gaim_blist_add_group(g, NULL); | |
| 4334 | gaim_blist_save(); | |
| 4335 | } | |
| 4336 | ||
| 4337 | void | |
| 4338 | gaim_gtk_blist_request_add_group(void) | |
| 4339 | { | |
|
7853
cd8b631ff166
[gaim-migrate @ 8507]
Mark Doliner <markdoliner@pidgin.im>
parents:
7843
diff
changeset
|
4340 | gaim_request_input(NULL, _("Add Group"), NULL, |
| 7620 | 4341 | _("Please enter the name of the group to be added."), |
| 8697 | 4342 | NULL, FALSE, FALSE, NULL, |
| 7620 | 4343 | _("Add"), G_CALLBACK(add_group_cb), |
| 4344 | _("Cancel"), NULL, NULL); | |
| 4345 | } | |
| 4346 | ||
| 5228 | 4347 | void gaim_gtk_blist_docklet_toggle() { |
| 4348 | /* Useful for the docklet plugin and also for the win32 tray icon*/ | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
4349 | /* This is called when one of those is clicked--it will show/hide the |
| 5228 | 4350 | buddy list/login window--depending on which is active */ |
| 7620 | 4351 | if (gaim_connections_get_all()) { |
| 5228 | 4352 | if (gtkblist && gtkblist->window) { |
| 4353 | if (GTK_WIDGET_VISIBLE(gtkblist->window)) { | |
| 4354 | gaim_blist_set_visible(GAIM_WINDOW_ICONIFIED(gtkblist->window) || gaim_gtk_blist_obscured); | |
| 4355 | } else { | |
| 4356 | #if _WIN32 | |
| 4357 | wgaim_systray_maximize(gtkblist->window); | |
| 4358 | #endif | |
| 4359 | gaim_blist_set_visible(TRUE); | |
| 4360 | } | |
| 4361 | } else { | |
| 4362 | /* we're logging in or something... do nothing */ | |
| 4363 | /* or should I make the blist? */ | |
| 4364 | gaim_debug(GAIM_DEBUG_WARNING, "blist", | |
| 7620 | 4365 | "docklet_toggle called with gaim_connections_get_all() " |
| 5228 | 4366 | "but no blist!\n"); |
| 4367 | } | |
| 4368 | } else if (mainwindow) { | |
| 4369 | if (GTK_WIDGET_VISIBLE(mainwindow)) { | |
| 4370 | if (GAIM_WINDOW_ICONIFIED(mainwindow)) { | |
| 4371 | gtk_window_present(GTK_WINDOW(mainwindow)); | |
| 4372 | } else { | |
| 4373 | #if _WIN32 | |
| 4374 | wgaim_systray_minimize(mainwindow); | |
| 4375 | #endif | |
| 4376 | gtk_widget_hide(mainwindow); | |
| 4377 | } | |
| 4378 | } else { | |
| 4379 | #if _WIN32 | |
| 4380 | wgaim_systray_maximize(mainwindow); | |
| 4381 | #endif | |
| 4382 | show_login(); | |
| 4383 | } | |
| 4384 | } else { | |
| 4385 | show_login(); | |
| 4386 | } | |
| 4387 | } | |
| 4388 | ||
| 4389 | void gaim_gtk_blist_docklet_add() | |
| 4390 | { | |
| 4391 | docklet_count++; | |
| 4392 | } | |
| 4393 | ||
| 4394 | void gaim_gtk_blist_docklet_remove() | |
| 4395 | { | |
| 4396 | docklet_count--; | |
| 4397 | if (!docklet_count) { | |
| 7620 | 4398 | if (gaim_connections_get_all()) |
| 5228 | 4399 | gaim_blist_set_visible(TRUE); |
| 4400 | else if (mainwindow) | |
| 4401 | gtk_window_present(GTK_WINDOW(mainwindow)); | |
| 4402 | else | |
| 4403 | show_login(); | |
| 4404 | } | |
| 4405 | } | |
| 4406 | ||
| 7620 | 4407 | static GaimBlistUiOps blist_ui_ops = |
| 5228 | 4408 | { |
| 4409 | gaim_gtk_blist_new_list, | |
| 5256 | 4410 | gaim_gtk_blist_new_node, |
| 5228 | 4411 | gaim_gtk_blist_show, |
| 4412 | gaim_gtk_blist_update, | |
| 4413 | gaim_gtk_blist_remove, | |
| 4414 | gaim_gtk_blist_destroy, | |
| 7620 | 4415 | gaim_gtk_blist_set_visible, |
| 4416 | gaim_gtk_blist_request_add_buddy, | |
| 4417 | gaim_gtk_blist_request_add_chat, | |
| 4418 | gaim_gtk_blist_request_add_group | |
| 5228 | 4419 | }; |
| 4420 | ||
| 4421 | ||
| 7620 | 4422 | GaimBlistUiOps * |
| 4423 | gaim_gtk_blist_get_ui_ops(void) | |
| 5228 | 4424 | { |
| 4425 | return &blist_ui_ops; | |
| 4426 | } | |
| 4427 | ||
| 7620 | 4428 | static void account_signon_cb(GaimConnection *gc, gpointer z) |
| 4429 | { | |
| 4430 | GaimAccount *account = gaim_connection_get_account(gc); | |
| 4431 | GaimBlistNode *gnode, *cnode; | |
| 4432 | for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) | |
| 4433 | { | |
| 4434 | if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 4435 | continue; | |
| 4436 | for(cnode = gnode->child; cnode; cnode = cnode->next) | |
| 4437 | { | |
| 4438 | GaimChat *chat; | |
| 4439 | ||
| 4440 | if(!GAIM_BLIST_NODE_IS_CHAT(cnode)) | |
| 4441 | continue; | |
| 4442 | ||
| 4443 | chat = (GaimChat *)cnode; | |
| 4444 | ||
| 4445 | if(chat->account != account) | |
| 4446 | continue; | |
| 4447 | ||
| 8197 | 4448 | if(gaim_blist_node_get_bool((GaimBlistNode*)chat, "gtk-autojoin") || |
| 8198 | 4449 | (gaim_blist_node_get_string((GaimBlistNode*)chat, |
| 4450 | "gtk-autojoin") != NULL)) | |
| 7620 | 4451 | serv_join_chat(gc, chat->components); |
| 4452 | } | |
| 4453 | } | |
| 4454 | } | |
| 4455 | ||
| 8815 | 4456 | void * |
| 4457 | gaim_gtk_blist_get_handle() { | |
| 4458 | static int handle; | |
| 4459 | ||
| 4460 | return &handle; | |
| 4461 | } | |
| 4462 | ||
| 7620 | 4463 | void gaim_gtk_blist_init(void) |
| 4464 | { | |
| 8815 | 4465 | void *gtk_blist_handle = gaim_gtk_blist_get_handle(); |
| 7620 | 4466 | |
| 4467 | gaim_signal_connect(gaim_connections_get_handle(), "signed-on", | |
| 8815 | 4468 | gtk_blist_handle, GAIM_CALLBACK(account_signon_cb), |
| 7620 | 4469 | NULL); |
| 7731 | 4470 | |
| 4471 | /* Initialize prefs */ | |
| 4472 | gaim_prefs_add_none("/gaim/gtk/blist"); | |
| 4473 | gaim_prefs_add_bool("/gaim/gtk/blist/auto_expand_contacts", TRUE); | |
| 4474 | gaim_prefs_add_int("/gaim/gtk/blist/button_style", GAIM_BUTTON_TEXT_IMAGE); | |
| 4475 | gaim_prefs_add_bool("/gaim/gtk/blist/grey_idle_buddies", TRUE); | |
| 4476 | gaim_prefs_add_bool("/gaim/gtk/blist/raise_on_events", FALSE); | |
| 4477 | gaim_prefs_add_bool("/gaim/gtk/blist/show_buddy_icons", TRUE); | |
| 4478 | gaim_prefs_add_bool("/gaim/gtk/blist/show_empty_groups", FALSE); | |
| 4479 | gaim_prefs_add_bool("/gaim/gtk/blist/show_group_count", TRUE); | |
| 4480 | gaim_prefs_add_bool("/gaim/gtk/blist/show_idle_time", TRUE); | |
| 4481 | gaim_prefs_add_bool("/gaim/gtk/blist/show_offline_buddies", FALSE); | |
| 4482 | gaim_prefs_add_bool("/gaim/gtk/blist/show_warning_level", TRUE); | |
| 4483 | gaim_prefs_add_string("/gaim/gtk/blist/sort_type", ""); | |
| 4484 | gaim_prefs_add_int("/gaim/gtk/blist/x", 0); | |
| 4485 | gaim_prefs_add_int("/gaim/gtk/blist/y", 0); | |
| 4486 | gaim_prefs_add_int("/gaim/gtk/blist/width", 0); | |
| 4487 | gaim_prefs_add_int("/gaim/gtk/blist/height", 0); | |
|
8470
100fc1feea95
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
4488 | gaim_prefs_add_int("/gaim/gtk/blist/tooltip_delay", 500); |
| 7731 | 4489 | |
| 8815 | 4490 | /* Register our signals */ |
| 4491 | gaim_signal_register(gtk_blist_handle, "drawing-menu", | |
| 4492 | gaim_marshal_VOID__POINTER_POINTER, NULL, 2, | |
| 4493 | gaim_value_new(GAIM_TYPE_BOXED, "GtkMenu"), | |
| 4494 | gaim_value_new(GAIM_TYPE_SUBTYPE, | |
| 4495 | GAIM_SUBTYPE_BLIST_BUDDY)); | |
| 4496 | ||
| 4497 | gaim_signal_register(gtk_blist_handle, "gtkblist-created", | |
| 4498 | gaim_marshal_VOID__POINTER, NULL, 1, | |
| 4499 | gaim_value_new(GAIM_TYPE_SUBTYPE, | |
| 4500 | GAIM_SUBTYPE_BLIST)); | |
| 7620 | 4501 | } |
| 4502 | ||
| 8815 | 4503 | void |
| 4504 | gaim_gtk_blist_uninit(void) { | |
| 4505 | gaim_signals_unregister_by_instance(gaim_gtk_blist_get_handle()); | |
| 4506 | } | |
| 5228 | 4507 | |
| 4508 | /********************************************************************* | |
| 4509 | * Public utility functions * | |
| 4510 | *********************************************************************/ | |
| 4511 | ||
| 4512 | GdkPixbuf * | |
| 7620 | 4513 | create_prpl_icon(GaimAccount *account) |
| 5228 | 4514 | { |
| 4515 | GaimPlugin *prpl; | |
| 4516 | GaimPluginProtocolInfo *prpl_info = NULL; | |
| 4517 | GdkPixbuf *status = NULL; | |
| 4518 | char *filename = NULL; | |
| 4519 | const char *protoname = NULL; | |
| 4520 | char buf[256]; | |
| 4521 | ||
| 7956 | 4522 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
| 5228 | 4523 | |
| 4524 | if (prpl != NULL) { | |
| 4525 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
| 4526 | ||
| 4527 | if (prpl_info->list_icon != NULL) | |
| 4528 | protoname = prpl_info->list_icon(account, NULL); | |
| 4529 | } | |
| 4530 | ||
| 4531 | if (protoname == NULL) | |
| 4532 | return NULL; | |
| 4533 | ||
| 4534 | /* | |
| 4535 | * Status icons will be themeable too, and then it will look up | |
| 4536 | * protoname from the theme | |
| 4537 | */ | |
| 4538 | g_snprintf(buf, sizeof(buf), "%s.png", protoname); | |
| 4539 | ||
| 4540 | filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", | |
| 4541 | "default", buf, NULL); | |
| 4542 | status = gdk_pixbuf_new_from_file(filename, NULL); | |
| 4543 | g_free(filename); | |
| 4544 | ||
| 4545 | return status; | |
| 4546 | } | |
| 4547 | ||
| 5422 | 4548 | |
| 4549 | /********************************************************************* | |
| 4550 | * Buddy List sorting functions * | |
| 4551 | *********************************************************************/ | |
| 4552 | ||
| 7620 | 4553 | void gaim_gtk_blist_sort_method_reg(const char *id, const char *name, gaim_gtk_blist_sort_function func) |
| 5422 | 4554 | { |
| 4555 | struct gaim_gtk_blist_sort_method *method = g_new0(struct gaim_gtk_blist_sort_method, 1); | |
| 7620 | 4556 | method->id = g_strdup(id); |
| 5422 | 4557 | method->name = g_strdup(name); |
| 7620 | 4558 | method->func = func;; |
| 5422 | 4559 | gaim_gtk_blist_sort_methods = g_slist_append(gaim_gtk_blist_sort_methods, method); |
| 4560 | } | |
| 4561 | ||
| 7620 | 4562 | void gaim_gtk_blist_sort_method_unreg(const char *id){ |
| 4563 | GSList *l = gaim_gtk_blist_sort_methods; | |
| 4564 | ||
| 4565 | while(l) { | |
| 4566 | struct gaim_gtk_blist_sort_method *method = l->data; | |
| 4567 | if(!strcmp(method->id, id)) { | |
| 4568 | gaim_gtk_blist_sort_methods = g_slist_remove(gaim_gtk_blist_sort_methods, method); | |
| 4569 | g_free(method->id); | |
| 4570 | g_free(method->name); | |
| 4571 | g_free(method); | |
| 4572 | break; | |
| 4573 | } | |
| 4574 | } | |
| 5422 | 4575 | } |
| 4576 | ||
| 7620 | 4577 | void gaim_gtk_blist_sort_method_set(const char *id){ |
| 5422 | 4578 | GSList *l = gaim_gtk_blist_sort_methods; |
| 7620 | 4579 | |
| 4580 | if(!id) | |
| 4581 | id = "none"; | |
| 4582 | ||
| 4583 | while (l && strcmp(((struct gaim_gtk_blist_sort_method*)l->data)->id, id)) | |
| 5422 | 4584 | l = l->next; |
| 7620 | 4585 | |
| 5422 | 4586 | if (l) { |
| 4587 | current_sort_method = l->data; | |
| 4588 | } else if (!current_sort_method) { | |
| 7620 | 4589 | gaim_gtk_blist_sort_method_set("none"); |
| 5422 | 4590 | return; |
| 4591 | } | |
| 4592 | redo_buddy_list(gaim_get_blist(), TRUE); | |
| 4593 | ||
| 4594 | } | |
| 4595 | ||
| 4596 | /****************************************** | |
| 4597 | ** Sort Methods | |
| 4598 | ******************************************/ | |
| 4599 | ||
| 7620 | 4600 | static GtkTreeIter sort_method_none(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter parent_iter, GtkTreeIter *cur) |
| 5422 | 4601 | { |
| 7620 | 4602 | GtkTreeIter iter; |
| 4603 | GaimBlistNode *sibling = node->prev; | |
| 4604 | GtkTreeIter sibling_iter; | |
| 4605 | ||
| 4606 | if(cur) | |
| 5422 | 4607 | return *cur; |
| 7620 | 4608 | |
| 4609 | while (sibling && !get_iter_from_node(sibling, &sibling_iter)) { | |
| 4610 | sibling = sibling->prev; | |
| 5422 | 4611 | } |
| 7620 | 4612 | |
| 4613 | gtk_tree_store_insert_after(gtkblist->treemodel, &iter, | |
| 4614 | node->parent ? &parent_iter : NULL, | |
| 4615 | sibling ? &sibling_iter : NULL); | |
| 4616 | ||
| 5422 | 4617 | return iter; |
| 4618 | } | |
| 4619 | ||
| 7620 | 4620 | #if GTK_CHECK_VERSION(2,2,1) |
| 4621 | ||
| 4622 | static GtkTreeIter sort_method_alphabetical(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur) | |
| 5422 | 4623 | { |
| 4624 | GtkTreeIter more_z, iter; | |
| 4625 | GaimBlistNode *n; | |
| 4626 | GValue val = {0,}; | |
| 7620 | 4627 | |
| 4628 | const char *my_name; | |
| 4629 | ||
| 4630 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 4631 | my_name = gaim_contact_get_alias((GaimContact*)node); | |
| 4632 | } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
| 4633 | my_name = gaim_chat_get_name((GaimChat*)node); | |
| 4634 | } else { | |
| 4635 | return sort_method_none(node, blist, groupiter, cur); | |
| 4636 | } | |
| 4637 | ||
| 5422 | 4638 | |
| 4639 | if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, &groupiter)) { | |
| 4640 | gtk_tree_store_insert(gtkblist->treemodel, &iter, &groupiter, 0); | |
| 7620 | 4641 | return iter; |
| 4642 | } | |
| 4643 | ||
| 4644 | do { | |
| 4645 | const char *this_name; | |
| 4646 | int cmp; | |
| 4647 | ||
| 4648 | gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val); | |
| 4649 | n = g_value_get_pointer(&val); | |
| 4650 | ||
| 4651 | if(GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
| 4652 | this_name = gaim_contact_get_alias((GaimContact*)n); | |
| 4653 | } else if(GAIM_BLIST_NODE_IS_CHAT(n)) { | |
| 4654 | this_name = gaim_chat_get_name((GaimChat*)n); | |
| 4655 | } else { | |
| 4656 | this_name = NULL; | |
| 4657 | } | |
| 4658 | ||
| 4659 | cmp = gaim_utf8_strcasecmp(my_name, this_name); | |
| 4660 | ||
| 4661 | if(this_name && (cmp < 0 || (cmp == 0 && node < n))) { | |
| 4662 | if(cur) { | |
| 4663 | gtk_tree_store_move_before(gtkblist->treemodel, cur, &more_z); | |
| 4664 | return *cur; | |
| 4665 | } else { | |
| 4666 | gtk_tree_store_insert_before(gtkblist->treemodel, &iter, | |
| 4667 | &groupiter, &more_z); | |
| 4668 | return iter; | |
| 4669 | } | |
| 4670 | } | |
| 4671 | g_value_unset(&val); | |
| 4672 | } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(gtkblist->treemodel), &more_z)); | |
| 4673 | ||
| 4674 | if(cur) { | |
| 4675 | gtk_tree_store_move_before(gtkblist->treemodel, cur, NULL); | |
| 4676 | return *cur; | |
| 4677 | } else { | |
| 4678 | gtk_tree_store_append(gtkblist->treemodel, &iter, &groupiter); | |
| 4679 | return iter; | |
| 4680 | } | |
| 4681 | } | |
| 4682 | ||
| 4683 | static GtkTreeIter sort_method_status(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur) | |
| 4684 | { | |
| 4685 | GtkTreeIter more_z, iter; | |
| 4686 | GaimBlistNode *n; | |
| 4687 | GValue val = {0,}; | |
| 4688 | ||
| 4689 | GaimBuddy *my_buddy, *this_buddy; | |
| 4690 | ||
| 4691 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 4692 | my_buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
| 4693 | } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
| 4694 | if(cur) | |
| 4695 | return *cur; | |
| 4696 | ||
| 4697 | gtk_tree_store_append(gtkblist->treemodel, &iter, &groupiter); | |
| 4698 | return iter; | |
| 4699 | } else { | |
| 4700 | return sort_method_none(node, blist, groupiter, cur); | |
| 4701 | } | |
| 4702 | ||
| 4703 | ||
| 4704 | if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, &groupiter)) { | |
| 4705 | gtk_tree_store_insert(gtkblist->treemodel, &iter, &groupiter, 0); | |
| 5422 | 4706 | return iter; |
| 4707 | } | |
| 4708 | ||
| 4709 | do { | |
| 7620 | 4710 | int cmp; |
| 4711 | ||
| 5422 | 4712 | gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val); |
| 4713 | n = g_value_get_pointer(&val); | |
| 7620 | 4714 | |
| 4715 | if(GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
| 4716 | this_buddy = gaim_contact_get_priority_buddy((GaimContact*)n); | |
| 4717 | } else { | |
| 4718 | this_buddy = NULL; | |
| 4719 | } | |
| 4720 | ||
| 4721 | cmp = gaim_utf8_strcasecmp(my_buddy ? | |
| 4722 | gaim_contact_get_alias(gaim_buddy_get_contact(my_buddy)) | |
| 4723 | : NULL, this_buddy ? | |
| 4724 | gaim_contact_get_alias(gaim_buddy_get_contact(this_buddy)) | |
| 4725 | : NULL); | |
| 4726 | ||
| 4727 | /* Hideous */ | |
| 4728 | if(!this_buddy || | |
| 4729 | ((my_buddy->present > this_buddy->present) || | |
| 4730 | (my_buddy->present == this_buddy->present && | |
| 4731 | (((my_buddy->uc & UC_UNAVAILABLE) < (this_buddy->uc & UC_UNAVAILABLE)) || | |
| 4732 | (((my_buddy->uc & UC_UNAVAILABLE) == (this_buddy->uc & UC_UNAVAILABLE)) && | |
| 4733 | (((my_buddy->idle == 0) && (this_buddy->idle != 0)) || | |
| 4734 | (this_buddy->idle && (my_buddy->idle > this_buddy->idle)) || | |
| 4735 | ((my_buddy->idle == this_buddy->idle) && | |
| 4736 | (cmp < 0 || (cmp == 0 && node < n))))))))) { | |
| 4737 | if(cur) { | |
| 4738 | gtk_tree_store_move_before(gtkblist->treemodel, cur, &more_z); | |
| 4739 | return *cur; | |
| 4740 | } else { | |
| 4741 | gtk_tree_store_insert_before(gtkblist->treemodel, &iter, | |
| 4742 | &groupiter, &more_z); | |
| 4743 | return iter; | |
| 4744 | } | |
| 5422 | 4745 | } |
| 4746 | g_value_unset(&val); | |
| 4747 | } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(gtkblist->treemodel), &more_z)); | |
| 7620 | 4748 | |
| 4749 | if(cur) { | |
| 4750 | gtk_tree_store_move_before(gtkblist->treemodel, cur, NULL); | |
| 4751 | return *cur; | |
| 4752 | } else { | |
| 4753 | gtk_tree_store_append(gtkblist->treemodel, &iter, &groupiter); | |
| 4754 | return iter; | |
| 4755 | } | |
| 5422 | 4756 | } |
| 4757 | ||
| 7620 | 4758 | static GtkTreeIter sort_method_log(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur) |
| 5422 | 4759 | { |
| 4760 | GtkTreeIter more_z, iter; | |
| 7620 | 4761 | GaimBlistNode *n = NULL, *n2; |
| 5422 | 4762 | GValue val = {0,}; |
| 7620 | 4763 | |
| 4764 | int log_size = 0, this_log_size = 0; | |
| 4765 | const char *buddy_name, *this_buddy_name; | |
| 4766 | ||
| 4767 | if(cur && (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(gtkblist->treemodel), &groupiter) == 1)) | |
| 4768 | return *cur; | |
| 4769 | ||
| 4770 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 4771 | for (n = node->child; n; n = n->next) | |
| 4772 | log_size += gaim_log_get_total_size(((GaimBuddy*)(n))->name, ((GaimBuddy*)(n))->account); | |
| 4773 | buddy_name = gaim_contact_get_alias((GaimContact*)node); | |
| 4774 | } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
| 4775 | /* we don't have a reliable way of getting the log filename | |
| 4776 | * from the chat info in the blist, yet */ | |
| 4777 | if(cur) | |
| 4778 | return *cur; | |
| 4779 | ||
| 4780 | gtk_tree_store_append(gtkblist->treemodel, &iter, &groupiter); | |
| 4781 | return iter; | |
| 4782 | } else { | |
| 4783 | return sort_method_none(node, blist, groupiter, cur); | |
| 4784 | } | |
| 4785 | ||
| 4786 | ||
| 5422 | 4787 | if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, &groupiter)) { |
| 4788 | gtk_tree_store_insert(gtkblist->treemodel, &iter, &groupiter, 0); | |
| 4789 | return iter; | |
| 4790 | } | |
| 4791 | ||
| 4792 | do { | |
| 7620 | 4793 | int cmp; |
| 4794 | ||
| 5422 | 4795 | gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val); |
| 4796 | n = g_value_get_pointer(&val); | |
| 7620 | 4797 | this_log_size = 0; |
| 4798 | ||
| 4799 | if(GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
| 4800 | for (n2 = n->child; n2; n2 = n2->next) | |
| 4801 | this_log_size += gaim_log_get_total_size(((GaimBuddy*)(n2))->name, ((GaimBuddy*)(n2))->account); | |
| 4802 | this_buddy_name = gaim_contact_get_alias((GaimContact*)n); | |
| 4803 | } else { | |
| 4804 | this_buddy_name = NULL; | |
| 5422 | 4805 | } |
| 7620 | 4806 | |
| 4807 | cmp = gaim_utf8_strcasecmp(buddy_name, this_buddy_name); | |
| 4808 | ||
| 4809 | if (!GAIM_BLIST_NODE_IS_CONTACT(n) || log_size > this_log_size || | |
| 4810 | ((log_size == this_log_size) && | |
| 4811 | (cmp < 0 || (cmp == 0 && node < n)))) { | |
| 4812 | if(cur) { | |
| 4813 | gtk_tree_store_move_before(gtkblist->treemodel, cur, &more_z); | |
| 4814 | return *cur; | |
| 4815 | } else { | |
| 4816 | gtk_tree_store_insert_before(gtkblist->treemodel, &iter, | |
| 4817 | &groupiter, &more_z); | |
| 4818 | return iter; | |
| 4819 | } | |
| 5422 | 4820 | } |
| 4821 | g_value_unset(&val); | |
| 4822 | } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(gtkblist->treemodel), &more_z)); | |
| 7620 | 4823 | |
| 4824 | if(cur) { | |
| 4825 | gtk_tree_store_move_before(gtkblist->treemodel, cur, NULL); | |
| 4826 | return *cur; | |
| 4827 | } else { | |
| 4828 | gtk_tree_store_append(gtkblist->treemodel, &iter, &groupiter); | |
| 4829 | return iter; | |
| 4830 | } | |
| 4831 | } | |
| 4832 | ||
| 4833 | #endif | |
| 4834 | ||
| 4835 | static void | |
| 4836 | proto_act(GtkObject *obj, struct proto_actions_menu *pam) | |
| 4837 | { | |
| 4838 | if (pam->callback && pam->gc) | |
| 4839 | pam->callback(pam->gc); | |
| 5422 | 4840 | } |
| 7620 | 4841 | |
| 4842 | void | |
| 4843 | gaim_gtk_blist_update_protocol_actions(void) | |
| 4844 | { | |
| 4845 | GtkWidget *menuitem; | |
| 4846 | GtkWidget *submenu; | |
| 4847 | GaimPluginProtocolInfo *prpl_info = NULL; | |
| 4848 | GList *l; | |
| 4849 | GList *c; | |
| 4850 | struct proto_actions_menu *pam; | |
| 4851 | GaimConnection *gc = NULL; | |
| 4852 | int count = 0; | |
| 4853 | char buf[256]; | |
| 4854 | ||
| 4855 | if (!protomenu) | |
| 4856 | return; | |
| 4857 | ||
| 4858 | for (l = gtk_container_get_children(GTK_CONTAINER(protomenu)); | |
| 4859 | l != NULL; | |
| 4860 | l = l->next) { | |
| 4861 | ||
| 4862 | menuitem = l->data; | |
| 4863 | pam = g_object_get_data(G_OBJECT(menuitem), "proto_actions_menu"); | |
| 4864 | ||
| 4865 | if (pam) | |
| 4866 | g_free(pam); | |
| 4867 | ||
| 4868 | gtk_container_remove(GTK_CONTAINER(protomenu), GTK_WIDGET(menuitem)); | |
| 4869 | } | |
| 4870 | ||
| 4871 | for (c = gaim_connections_get_all(); c != NULL; c = c->next) { | |
| 4872 | gc = c->data; | |
| 4873 | ||
| 4874 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
| 4875 | ||
| 4876 | if (prpl_info->actions && gc->login_time) | |
| 4877 | count++; | |
| 4878 | } | |
| 4879 | ||
| 4880 | if (!count) { | |
| 4881 | g_snprintf(buf, sizeof(buf), _("No actions available")); | |
| 4882 | menuitem = gtk_menu_item_new_with_label(buf); | |
| 4883 | gtk_menu_shell_append(GTK_MENU_SHELL(protomenu), menuitem); | |
| 4884 | gtk_widget_show(menuitem); | |
| 4885 | return; | |
| 4886 | } | |
| 4887 | ||
| 4888 | if (count == 1) { | |
| 4889 | GList *act; | |
| 4890 | ||
| 4891 | for (c = gaim_connections_get_all(); c != NULL; c = c->next) { | |
| 4892 | gc = c->data; | |
| 4893 | ||
| 4894 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
| 4895 | ||
| 4896 | if (prpl_info->actions && gc->login_time) | |
| 4897 | break; | |
| 4898 | } | |
| 4899 | ||
| 4900 | for (act = prpl_info->actions(gc); act != NULL; act = act->next) { | |
| 4901 | if (act->data) { | |
| 4902 | struct proto_actions_menu *pam = act->data; | |
| 4903 | menuitem = gtk_menu_item_new_with_label(pam->label); | |
| 4904 | gtk_menu_shell_append(GTK_MENU_SHELL(protomenu), menuitem); | |
| 4905 | g_signal_connect(G_OBJECT(menuitem), "activate", | |
| 4906 | G_CALLBACK(proto_act), pam); | |
| 4907 | g_object_set_data(G_OBJECT(menuitem), "proto_actions_menu", pam); | |
| 4908 | gtk_widget_show(menuitem); | |
| 4909 | } | |
| 4910 | else | |
| 4911 | gaim_separator(protomenu); | |
| 4912 | } | |
| 4913 | } | |
| 4914 | else { | |
| 4915 | for (c = gaim_connections_get_all(); c != NULL; c = c->next) { | |
| 4916 | GaimAccount *account; | |
| 4917 | GList *act; | |
| 4918 | GdkPixbuf *pixbuf, *scale; | |
| 4919 | GtkWidget *image; | |
| 4920 | ||
| 4921 | gc = c->data; | |
| 4922 | ||
| 4923 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
| 4924 | ||
| 4925 | if (!prpl_info->actions || !gc->login_time) | |
| 4926 | continue; | |
| 4927 | ||
| 4928 | account = gaim_connection_get_account(gc); | |
| 4929 | ||
| 4930 | g_snprintf(buf, sizeof(buf), "%s (%s)", | |
| 4931 | gaim_account_get_username(account), | |
| 4932 | gc->prpl->info->name); | |
| 4933 | ||
| 4934 | menuitem = gtk_image_menu_item_new_with_label(buf); | |
| 4935 | ||
| 4936 | pixbuf = create_prpl_icon(gc->account); | |
| 4937 | if(pixbuf) { | |
| 4938 | scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, | |
| 4939 | GDK_INTERP_BILINEAR); | |
| 4940 | image = gtk_image_new_from_pixbuf(scale); | |
| 4941 | g_object_unref(G_OBJECT(pixbuf)); | |
| 4942 | g_object_unref(G_OBJECT(scale)); | |
| 4943 | gtk_widget_show(image); | |
| 4944 | gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), | |
| 4945 | image); | |
| 4946 | } | |
| 4947 | ||
| 4948 | gtk_menu_shell_append(GTK_MENU_SHELL(protomenu), menuitem); | |
| 4949 | gtk_widget_show(menuitem); | |
| 4950 | ||
| 4951 | submenu = gtk_menu_new(); | |
| 4952 | gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | |
| 4953 | gtk_widget_show(submenu); | |
| 4954 | ||
| 4955 | for (act = prpl_info->actions(gc); act != NULL; act = act->next) { | |
| 4956 | if (act->data) { | |
| 4957 | struct proto_actions_menu *pam = act->data; | |
| 4958 | menuitem = gtk_menu_item_new_with_label(pam->label); | |
| 4959 | gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); | |
| 4960 | g_signal_connect(G_OBJECT(menuitem), "activate", | |
| 4961 | G_CALLBACK(proto_act), pam); | |
| 4962 | g_object_set_data(G_OBJECT(menuitem), "proto_actions_menu", | |
| 4963 | pam); | |
| 4964 | gtk_widget_show(menuitem); | |
| 4965 | } | |
| 4966 | else | |
| 4967 | gaim_separator(submenu); | |
| 4968 | } | |
| 4969 | } | |
| 4970 | } | |
| 4971 | } |