Mercurial > pidgin.yaz
annotate src/gtklog.c @ 12136:370f9d7868f9
[gaim-migrate @ 14436]
SF Patch #1356575 from Kevin Stange (SimGuy)
"This patch moves buddy pounces out of the menu and into
a new dialog, as suggested by Sean. I'm not ready to
say this is finished, but it's a solid starting point
and it does work.
I changed the namespacing a little from gaim_gtkpounce
to gaim_gtk_pounce to be consistent with the rest of Gaim.
I wanted to try to get more information into the pounce
manager, but I wasn't sure how to display it. I
thought perhaps a column containing a row of icons
representing which events are being watched (so the
user can see which of several pounces for the same
buddy are which), however, while I know how to do this,
there aren't icons in Gaim suitable for representing
all the events. Like "returned from away" and
"idle/unidle", as far as I can see. I'm not sure what
else could be shown to make the manager dialog more
"informative."
The dialog updates automatically to show pounces only
for connected accounts and updates when a pounce is
added, changed, or removed in some other way than the
dialog.
I'd like to get feedback on it if anyone has anything
they think I should change or fix, I'll do that and
update this patch. Otherwise, feel free to commit. :)"
As ridingpigs commented in the tracker, this is "far better than the current menu thing."
I made a few small changes to this. I believe most of them were related to adding hooks to disable things if there were no accounts connected. I also sorte
d the Tools menu a bit and updated the docklet to match.
I wish the plugin action code could sort the items it added.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Fri, 18 Nov 2005 16:37:51 +0000 |
parents | 3ba50c385299 |
children | 375f1f3817a8 |
rev | line source |
---|---|
7432 | 1 /** |
2 * @file gtklog.c GTK+ Log viewer | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
10 * |
7432 | 11 * This program is free software; you can redistribute it and/or modify |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
9791 | 25 #include "internal.h" |
26 #include "gtkgaim.h" | |
7432 | 27 |
28 #include "account.h" | |
29 #include "gtkblist.h" | |
30 #include "gtkimhtml.h" | |
31 #include "gtklog.h" | |
32 #include "gtkutils.h" | |
33 #include "log.h" | |
11769 | 34 #include "notify.h" |
10636 | 35 #include "util.h" |
7432 | 36 |
37 static GHashTable *log_viewers = NULL; | |
7535 | 38 static void populate_log_tree(GaimGtkLogViewer *lv); |
8573 | 39 static GaimGtkLogViewer *syslog_viewer = NULL; |
7432 | 40 |
41 struct log_viewer_hash_t { | |
10663 | 42 GaimLogType type; |
7432 | 43 char *screenname; |
44 GaimAccount *account; | |
10663 | 45 GaimContact *contact; |
7432 | 46 }; |
47 | |
7440 | 48 static guint log_viewer_hash(gconstpointer data) |
7432 | 49 { |
7440 | 50 const struct log_viewer_hash_t *viewer = data; |
51 | |
10663 | 52 if (viewer->contact != NULL) |
53 return g_direct_hash(viewer->contact); | |
54 | |
55 return g_str_hash(viewer->screenname) + | |
56 g_str_hash(gaim_account_get_username(viewer->account)); | |
7432 | 57 } |
58 | |
10663 | 59 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) |
7432 | 60 { |
7440 | 61 const struct log_viewer_hash_t *a, *b; |
7432 | 62 int ret; |
7440 | 63 char *normal; |
64 | |
65 a = y; | |
66 b = z; | |
67 | |
10663 | 68 if (a->contact != NULL) { |
69 if (b->contact != NULL) | |
70 return (a->contact == b->contact); | |
71 else | |
72 return FALSE; | |
73 } else { | |
74 if (b->contact != NULL) | |
75 return FALSE; | |
76 } | |
77 | |
7440 | 78 normal = g_strdup(gaim_normalize(a->account, a->screenname)); |
79 ret = (a->account == b->account) && | |
80 !strcmp(normal, gaim_normalize(b->account, b->screenname)); | |
7432 | 81 g_free(normal); |
10663 | 82 |
7432 | 83 return ret; |
84 } | |
85 | |
7535 | 86 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) |
87 { | |
88 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); | |
89 GList *logs; | |
90 GdkCursor *cursor = gdk_cursor_new(GDK_WATCH); | |
10175 | 91 |
10663 | 92 if (lv->search != NULL) |
7535 | 93 g_free(lv->search); |
10175 | 94 |
11585 | 95 gtk_tree_store_clear(lv->treestore); |
7535 | 96 if (strlen(search_term) == 0) {/* reset the tree */ |
97 populate_log_tree(lv); | |
98 lv->search = NULL; | |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
99 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); |
7535 | 100 return; |
101 } | |
10175 | 102 |
7535 | 103 lv->search = g_strdup(search_term); |
10175 | 104 |
7535 | 105 gdk_window_set_cursor(lv->window->window, cursor); |
106 while (gtk_events_pending()) | |
107 gtk_main_iteration(); | |
108 gdk_cursor_unref(cursor); | |
10175 | 109 |
7535 | 110 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
111 char *read = gaim_log_read((GaimLog*)logs->data, NULL); | |
112 if (gaim_strcasestr(read, search_term)) { | |
113 GtkTreeIter iter; | |
114 GaimLog *log = logs->data; | |
115 char title[64]; | |
7676 | 116 char *title_utf8; /* temporary variable for utf8 conversion */ |
10636 | 117 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time)); |
7676 | 118 title_utf8 = gaim_utf8_try_convert(title); |
119 strncpy(title, title_utf8, sizeof(title)); | |
120 g_free(title_utf8); | |
7535 | 121 gtk_tree_store_append (lv->treestore, &iter, NULL); |
122 gtk_tree_store_set(lv->treestore, &iter, | |
123 0, title, | |
10175 | 124 1, log, -1); |
7535 | 125 } |
10574 | 126 g_free(read); |
7535 | 127 } |
10175 | 128 |
129 | |
7535 | 130 cursor = gdk_cursor_new(GDK_LEFT_PTR); |
131 gdk_window_set_cursor(lv->window->window, cursor); | |
132 gdk_cursor_unref(cursor); | |
133 } | |
134 | |
7454 | 135 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
8573 | 136 GaimGtkLogViewer *lv = syslog_viewer; |
7454 | 137 |
10663 | 138 if (ht != NULL) { |
8573 | 139 lv = g_hash_table_lookup(log_viewers, ht); |
140 g_hash_table_remove(log_viewers, ht); | |
10663 | 141 |
142 if (ht->screenname != NULL) | |
143 g_free(ht->screenname); | |
144 | |
8573 | 145 g_free(ht); |
146 } else | |
147 syslog_viewer = NULL; | |
148 | |
10663 | 149 while (lv->logs != NULL) { |
7535 | 150 GList *logs2; |
10663 | 151 |
152 gaim_log_free((GaimLog *)lv->logs->data); | |
153 | |
7535 | 154 logs2 = lv->logs->next; |
155 g_list_free_1(lv->logs); | |
156 lv->logs = logs2; | |
7533 | 157 } |
10663 | 158 |
159 if (lv->search != NULL) | |
7535 | 160 g_free(lv->search); |
10663 | 161 |
8573 | 162 g_free(lv); |
7454 | 163 gtk_widget_destroy(w); |
164 | |
165 return TRUE; | |
166 } | |
167 | |
10663 | 168 static void log_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, GaimGtkLogViewer *viewer) { |
169 if (gtk_tree_view_row_expanded(tv, path)) | |
170 gtk_tree_view_collapse_row(tv, path); | |
171 else | |
172 gtk_tree_view_expand_row(tv, path, FALSE); | |
8573 | 173 } |
10663 | 174 |
7454 | 175 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { |
7432 | 176 GtkTreeIter iter; |
177 GValue val = { 0, }; | |
178 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); | |
179 GaimLog *log = NULL; | |
180 GaimLogReadFlags flags; | |
181 char *read = NULL; | |
182 char time[64]; | |
183 | |
10663 | 184 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) |
7432 | 185 return; |
186 gtk_tree_model_get_value (model, &iter, 1, &val); | |
187 log = g_value_get_pointer(&val); | |
188 g_value_unset(&val); | |
189 | |
10663 | 190 if (log == NULL) |
7432 | 191 return; |
192 | |
10663 | 193 if (log->type != GAIM_LOG_SYSTEM) { |
194 char *title; | |
195 char *title_utf8; /* temporary variable for utf8 conversion */ | |
196 | |
197 gaim_strftime(time, sizeof(time), "%c", localtime(&log->time)); | |
198 | |
199 if (log->type == GAIM_LOG_CHAT) | |
200 title = g_strdup_printf(_("Conversation in %s on %s"), log->name, time); | |
201 else | |
202 title = g_strdup_printf(_("Conversation with %s on %s"), log->name, time); | |
203 | |
204 title_utf8 = gaim_utf8_try_convert(title); | |
205 g_free(title); | |
206 | |
207 title = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", title_utf8); | |
208 g_free(title_utf8); | |
209 | |
210 gtk_label_set_markup(GTK_LABEL(viewer->label), title); | |
211 g_free(title); | |
212 } | |
213 | |
7432 | 214 read = gaim_log_read(log, &flags); |
215 viewer->flags = flags; | |
10663 | 216 |
7432 | 217 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); |
10645 | 218 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), |
219 gaim_account_get_protocol_name(log->account)); | |
10574 | 220 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, |
10175 | 221 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | |
7432 | 222 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
7535 | 223 |
10663 | 224 if (viewer->search != NULL) { |
10574 | 225 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
226 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); |
10574 | 227 } |
10175 | 228 |
7432 | 229 g_free(read); |
230 } | |
231 | |
232 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. | |
233 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," | |
234 * "August," "2002," etc. based on how many conversation took place in each subdivision. | |
235 * | |
236 * For now, I'll just make it a flat list. | |
237 */ | |
238 static void populate_log_tree(GaimGtkLogViewer *lv) | |
11585 | 239 /* Logs are made from trees in real life. |
7432 | 240 This is a tree made from logs */ |
241 { | |
9435 | 242 char month[30]; |
7440 | 243 char title[64]; |
10663 | 244 char prev_top_month[30] = ""; |
9435 | 245 char *utf8_tmp; /* temporary variable for utf8 conversion */ |
246 GtkTreeIter toplevel, child; | |
7432 | 247 GList *logs = lv->logs; |
10663 | 248 |
249 while (logs != NULL) { | |
7432 | 250 GaimLog *log = logs->data; |
10175 | 251 |
10636 | 252 gaim_strftime(month, sizeof(month), "%B %Y", localtime(&log->time)); |
253 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time)); | |
10175 | 254 |
9435 | 255 /* do utf8 conversions */ |
256 utf8_tmp = gaim_utf8_try_convert(month); | |
257 strncpy(month, utf8_tmp, sizeof(month)); | |
10574 | 258 g_free(utf8_tmp); |
9435 | 259 utf8_tmp = gaim_utf8_try_convert(title); |
260 strncpy(title, utf8_tmp, sizeof(title)); | |
261 g_free(utf8_tmp); | |
10175 | 262 |
9435 | 263 if (strncmp(month, prev_top_month, sizeof(month)) != 0) { |
264 /* top level */ | |
265 gtk_tree_store_append(lv->treestore, &toplevel, NULL); | |
266 gtk_tree_store_set(lv->treestore, &toplevel, 0, month, 1, NULL, -1); | |
10175 | 267 |
10680 | 268 strncpy(prev_top_month, month, sizeof(prev_top_month)); |
269 } | |
10175 | 270 |
10680 | 271 /* sub */ |
272 gtk_tree_store_append(lv->treestore, &child, &toplevel); | |
273 gtk_tree_store_set(lv->treestore, &child, 0, title, 1, log, -1); | |
10175 | 274 |
7432 | 275 logs = logs->next; |
276 } | |
277 } | |
278 | |
10663 | 279 static GaimGtkLogViewer *display_log_viewer(struct log_viewer_hash_t *ht, GList *logs, |
11585 | 280 const char *title, GdkPixbuf *pixbuf, int log_size) |
10663 | 281 { |
282 GaimGtkLogViewer *lv; | |
283 GtkWidget *title_box; | |
284 char *text; | |
11769 | 285 GtkWidget *pane; |
286 GtkWidget *sw; | |
287 GtkCellRenderer *rend; | |
288 GtkTreeViewColumn *col; | |
289 GtkTreeSelection *sel; | |
11780 | 290 #if GTK_CHECK_VERSION(2,2,0) |
11769 | 291 GtkTreePath *path_to_first_log; |
11780 | 292 #endif |
11769 | 293 GtkWidget *vbox; |
294 GtkWidget *frame; | |
295 GtkWidget *hbox; | |
296 GtkWidget *button; | |
297 GtkWidget *size_label; | |
7432 | 298 |
299 lv = g_new0(GaimGtkLogViewer, 1); | |
10663 | 300 lv->logs = logs; |
301 | |
11769 | 302 if (logs == NULL) |
303 { | |
304 /* No logs were found. */ | |
305 const char *log_preferences = NULL; | |
306 | |
307 if (ht == NULL) { | |
308 if (!gaim_prefs_get_bool("/core/logging/log_system")) | |
309 log_preferences = _("System events will only be logged if the \"Log all status changes to system log\" preference is enabled."); | |
310 } else { | |
311 if (ht->type == GAIM_LOG_IM) { | |
312 if (!gaim_prefs_get_bool("/core/logging/log_ims")) | |
313 log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."); | |
314 } else if (ht->type == GAIM_LOG_CHAT) { | |
315 if (!gaim_prefs_get_bool("/core/logging/log_chats")) | |
11869 | 316 log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); |
11769 | 317 } |
318 } | |
319 | |
320 gaim_notify_info(NULL, title, _("No logs were found"), log_preferences); | |
321 return NULL; | |
322 } | |
323 | |
10663 | 324 if (ht != NULL) |
325 g_hash_table_insert(log_viewers, ht, lv); | |
7432 | 326 |
327 /* Window ***********/ | |
10663 | 328 lv->window = gtk_dialog_new_with_buttons(title, NULL, 0, |
7432 | 329 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); |
11243 | 330 gtk_container_set_border_width (GTK_CONTAINER(lv->window), GAIM_HIG_BOX_SPACE); |
7432 | 331 gtk_dialog_set_has_separator(GTK_DIALOG(lv->window), FALSE); |
332 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(lv->window)->vbox), 0); | |
10175 | 333 g_signal_connect(G_OBJECT(lv->window), "response", |
7454 | 334 G_CALLBACK(destroy_cb), ht); |
11004
a3d3729a9130
[gaim-migrate @ 12859]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10884
diff
changeset
|
335 gtk_window_set_role(GTK_WINDOW(lv->window), "log_viewer"); |
7454 | 336 |
10663 | 337 /* Icon *************/ |
338 if (pixbuf != NULL) { | |
339 GdkPixbuf *scale; | |
340 GtkWidget *icon; | |
7432 | 341 |
11243 | 342 title_box = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
343 gtk_container_set_border_width(GTK_CONTAINER(title_box), GAIM_HIG_BOX_SPACE); | |
10663 | 344 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), title_box, FALSE, FALSE, 0); |
345 | |
346 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); | |
347 icon = gtk_image_new_from_pixbuf(scale); | |
348 gtk_box_pack_start(GTK_BOX(title_box), icon, FALSE, FALSE, 0); | |
349 g_object_unref(G_OBJECT(pixbuf)); | |
350 g_object_unref(G_OBJECT(scale)); | |
351 } else | |
352 title_box = GTK_DIALOG(lv->window)->vbox; | |
7432 | 353 |
354 /* Label ************/ | |
10663 | 355 lv->label = gtk_label_new(NULL); |
356 | |
357 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", title); | |
9624 | 358 |
10663 | 359 gtk_label_set_markup(GTK_LABEL(lv->label), text); |
360 gtk_misc_set_alignment(GTK_MISC(lv->label), 0, 0); | |
361 gtk_box_pack_start(GTK_BOX(title_box), lv->label, FALSE, FALSE, 0); | |
7432 | 362 g_free(text); |
363 | |
11769 | 364 /* Pane *************/ |
365 pane = gtk_hpaned_new(); | |
366 gtk_container_set_border_width(GTK_CONTAINER(pane), GAIM_HIG_BOX_SPACE); | |
367 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), pane, TRUE, TRUE, 0); | |
7432 | 368 |
11769 | 369 /* List *************/ |
370 sw = gtk_scrolled_window_new (NULL, NULL); | |
371 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); | |
372 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
373 gtk_paned_add1(GTK_PANED(pane), sw); | |
374 lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); | |
375 lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore)); | |
376 rend = gtk_cell_renderer_text_new(); | |
377 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); | |
378 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); | |
379 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); | |
380 gtk_container_add (GTK_CONTAINER (sw), lv->treeview); | |
11402 | 381 |
11769 | 382 populate_log_tree(lv); |
11402 | 383 |
11769 | 384 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); |
385 g_signal_connect (G_OBJECT (sel), "changed", | |
386 G_CALLBACK (log_select_cb), | |
387 lv); | |
388 g_signal_connect (G_OBJECT(lv->treeview), "row-activated", | |
389 G_CALLBACK(log_row_activated_cb), | |
390 lv); | |
391 gaim_set_accessible_label(lv->treeview, lv->label); | |
11585 | 392 |
11769 | 393 /* Log size ************/ |
394 if(log_size) { | |
395 char *sz_txt = gaim_str_size_to_units(log_size); | |
396 text = g_strdup_printf("<span weight='bold'>%s</span> %s", _("Total log size:"), sz_txt); | |
397 size_label = gtk_label_new(NULL); | |
398 gtk_label_set_markup(GTK_LABEL(size_label), text); | |
399 /* gtk_paned_add1(GTK_PANED(pane), size_label); */ | |
400 gtk_misc_set_alignment(GTK_MISC(size_label), 0, 0); | |
401 gtk_box_pack_end(GTK_BOX(GTK_DIALOG(lv->window)->vbox), size_label, FALSE, FALSE, 0); | |
402 g_free(sz_txt); | |
403 g_free(text); | |
404 } | |
11402 | 405 |
11769 | 406 /* A fancy little box ************/ |
407 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
408 gtk_paned_add2(GTK_PANED(pane), vbox); | |
11402 | 409 |
11769 | 410 /* Viewer ************/ |
411 frame = gaim_gtk_create_imhtml(FALSE, &lv->imhtml, NULL); | |
412 gtk_widget_set_name(lv->imhtml, "gaim_gtklog_imhtml"); | |
413 gtk_widget_set_size_request(lv->imhtml, 320, 200); | |
414 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); | |
415 gtk_widget_show(frame); | |
10181 | 416 |
11769 | 417 /* Search box **********/ |
418 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
419 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
420 lv->entry = gtk_entry_new(); | |
421 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); | |
422 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
423 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
424 g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv); | |
425 g_signal_connect(GTK_BUTTON(button), "activate", G_CALLBACK(search_cb), lv); | |
426 g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(search_cb), lv); | |
10175 | 427 |
11780 | 428 #if GTK_CHECK_VERSION(2,2,0) |
11769 | 429 /* Show most recent log **********/ |
430 path_to_first_log = gtk_tree_path_new_from_string("0:0"); | |
431 if (path_to_first_log) | |
432 { | |
433 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(lv->treeview), path_to_first_log); | |
434 gtk_tree_selection_select_path(sel, path_to_first_log); | |
435 gtk_tree_path_free(path_to_first_log); | |
10663 | 436 } |
11780 | 437 #endif |
7432 | 438 |
439 gtk_widget_show_all(lv->window); | |
10663 | 440 |
441 return lv; | |
442 } | |
443 | |
444 void gaim_gtk_log_show(GaimLogType type, const char *screenname, GaimAccount *account) { | |
445 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); | |
446 GaimGtkLogViewer *lv = NULL; | |
447 const char *name = screenname; | |
448 char *title; | |
449 | |
450 g_return_if_fail(account != NULL); | |
451 g_return_if_fail(screenname != NULL); | |
452 | |
453 ht->type = type; | |
454 ht->screenname = g_strdup(screenname); | |
455 ht->account = account; | |
456 | |
457 if (log_viewers == NULL) { | |
458 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); | |
459 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { | |
460 gtk_window_present(GTK_WINDOW(lv->window)); | |
461 g_free(ht); | |
462 return; | |
463 } | |
464 | |
465 if (type == GAIM_LOG_CHAT) { | |
466 GaimChat *chat; | |
467 | |
468 chat = gaim_blist_find_chat(account, screenname); | |
469 if (chat != NULL) | |
470 name = gaim_chat_get_name(chat); | |
471 | |
472 title = g_strdup_printf(_("Conversations in %s"), name); | |
473 } else { | |
474 GaimBuddy *buddy; | |
475 | |
476 buddy = gaim_find_buddy(account, screenname); | |
477 if (buddy != NULL) | |
478 name = gaim_buddy_get_contact_alias(buddy); | |
479 | |
480 title = g_strdup_printf(_("Conversations with %s"), name); | |
481 } | |
482 | |
483 display_log_viewer(ht, gaim_log_get_logs(type, screenname, account), | |
11585 | 484 title, gaim_gtk_create_prpl_icon(account), gaim_log_get_total_size(type, screenname, account)); |
10663 | 485 g_free(title); |
486 } | |
487 | |
488 void gaim_gtk_log_show_contact(GaimContact *contact) { | |
489 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); | |
490 GaimBlistNode *child; | |
491 GaimGtkLogViewer *lv = NULL; | |
492 GList *logs = NULL; | |
493 char *filename; | |
494 GdkPixbuf *pixbuf; | |
495 const char *name = NULL; | |
496 char *title; | |
11585 | 497 int total_log_size = 0; |
10663 | 498 |
499 g_return_if_fail(contact != NULL); | |
500 | |
501 ht->type = GAIM_LOG_IM; | |
502 ht->contact = contact; | |
503 | |
504 if (log_viewers == NULL) { | |
505 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); | |
506 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { | |
507 gtk_window_present(GTK_WINDOW(lv->window)); | |
508 g_free(ht); | |
509 return; | |
510 } | |
511 | |
512 for (child = contact->node.child ; child ; child = child->next) { | |
513 if (!GAIM_BLIST_NODE_IS_BUDDY(child)) | |
514 continue; | |
515 | |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11700
diff
changeset
|
516 logs = g_list_concat(gaim_log_get_logs(GAIM_LOG_IM, ((GaimBuddy *)child)->name, |
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11700
diff
changeset
|
517 ((GaimBuddy *)child)->account), logs); |
11585 | 518 total_log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy *)child)->name, ((GaimBuddy *)child)->account); |
10663 | 519 } |
520 logs = g_list_sort(logs, gaim_log_compare); | |
521 | |
522 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "icons", "online.png", NULL); | |
523 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
524 g_free(filename); | |
525 | |
526 if (contact->alias != NULL) | |
527 name = contact->alias; | |
528 else if (contact->priority != NULL) | |
529 name = gaim_buddy_get_contact_alias(contact->priority); | |
530 | |
531 title = g_strdup_printf(_("Conversations with %s"), name); | |
11585 | 532 display_log_viewer(ht, logs, title, pixbuf, total_log_size); |
10663 | 533 g_free(title); |
7432 | 534 } |
8573 | 535 |
536 void gaim_gtk_syslog_show() | |
537 { | |
538 GList *accounts = NULL; | |
10663 | 539 GList *logs = NULL; |
8573 | 540 |
10181 | 541 if (syslog_viewer != NULL) { |
8573 | 542 gtk_window_present(GTK_WINDOW(syslog_viewer->window)); |
543 return; | |
544 } | |
545 | |
10663 | 546 for(accounts = gaim_accounts_get_all(); accounts != NULL; accounts = accounts->next) { |
8573 | 547 |
548 GaimAccount *account = (GaimAccount *)accounts->data; | |
10663 | 549 if(gaim_find_prpl(gaim_account_get_protocol_id(account)) == NULL) |
8573 | 550 continue; |
551 | |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11700
diff
changeset
|
552 logs = g_list_concat(gaim_log_get_system_logs(account), logs); |
8573 | 553 } |
10663 | 554 logs = g_list_sort(logs, gaim_log_compare); |
10175 | 555 |
11585 | 556 syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), NULL, 0); |
8573 | 557 } |