Mercurial > pidgin.yaz
annotate src/gtklog.c @ 12116:e75ef7aa913e
[gaim-migrate @ 14416]
" This patch implements a replacement for the queuing
system from 1.x. It also obsoletes a previous patch
[#1338873] I submitted to prioritize the unseen states
in gtk conversations.
The attached envelope.png is ripped from the
msgunread.png already included in gaim. It should be
dropped in the pixmaps directory (Makefile.am is
updated accordingly in this patch).
The two separate queuing preferences from 1.x, queuing
messages while away and queuing all new messages (from
docklet), are replaced with a single 3-way preference
for conversations. The new preference is "Hide new IM
conversations". This preference can be set to never,
away and always.
When a gtk conversation is created, it may be placed in
a hidden conversation window instead of being placed
normally. This decision is based upon the preference
and possibly the away state of the account the
conversation is being created for. This *will* effect
conversations the user explicitly requests to be
created, so in these cases the caller must be sure to
present the conversation to the user, using
gaim_gtkconv_present_conversation(). This is done
already in gtkdialogs.c which handles creating
conversations requested by the user from gaim proper
(menus, double-clicking on budy in blist, etc.).
The main advantage to not queuing messages is that the
conversations exist, the message is written to the
conversation (and logged if appropriate) and the unseen
state is set on the conversation. This means no
additional features are needed to track whether there
are queued messages or not, just use the unseen state
on conversations.
Since conversations may not be visible (messages
"queued"), gaim proper needs some notification that
there are messages waiting. I opted for a menutray icon
that shows up when an im conversation has an unseen
message. Clicking this icon will focus (and show if
hidden) the first conversation with an unseen message.
This is essentially the same behavior of the docklet in
cvs right now, except that the icon is only visible
when there is a conversation with an unread message.
The api that is added is flexible enough to allow
either the docklet or the new blist menutray icon to be
visible for conversations of any/all types and for
unseen messages >= any state. Currently they are set to
only IM conversations and only unseen states >= TEXT
(system messages and no log messages will not trigger
blinking the docklet or showing the blist tray icon),
but these could be made preferences relatively easily
in the future. Other plugins could probably benefit as
well: gaim_gtk_conversations_get_first_unseen().
There is probably some limit to comment size, so I'll
stop rambling now. If anyone has more
questions/comments, catch me in #gaim, here or on
gaim-devel."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Wed, 16 Nov 2005 18:17:01 +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 } |