comparison src/gtklog.c @ 8573:7dcd6f26e4a7

[gaim-migrate @ 9321] " This patch reimplements the system log. It writes system log to ~/.gaim/logs/<protocol>/<username>/.system/<timestamp>.(txt|html), where <timestamp> is the time that the account <username> with <protocol> signs on. Nathan (faceprint) and LSchiere suggested this logging scheme. No code is currently written to read the old system logs. Note that if you change the logging format, you need to re-login the accounts for the change to take effect." --Ka-Hing (javabsp) Cheung who continues: "Now this one applies, also contains a rider patch that, if you enable sound for "Someone says your name in chat", it will not play a sound if the message is a system message, like if jabber chat tells you that "*** becomes available" and *** is you, it won't play a sound." committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Sat, 03 Apr 2004 18:34:29 +0000
parents 4971193f761d
children 599d6ac9bbfe
comparison
equal deleted inserted replaced
8572:f6890288bbe0 8573:7dcd6f26e4a7
33 #include "gtkutils.h" 33 #include "gtkutils.h"
34 #include "log.h" 34 #include "log.h"
35 35
36 static GHashTable *log_viewers = NULL; 36 static GHashTable *log_viewers = NULL;
37 static void populate_log_tree(GaimGtkLogViewer *lv); 37 static void populate_log_tree(GaimGtkLogViewer *lv);
38 static GaimGtkLogViewer *syslog_viewer = NULL;
38 39
39 struct log_viewer_hash_t { 40 struct log_viewer_hash_t {
40 char *screenname; 41 char *screenname;
41 GaimAccount *account; 42 GaimAccount *account;
42 }; 43 };
111 gdk_window_set_cursor(lv->window->window, cursor); 112 gdk_window_set_cursor(lv->window->window, cursor);
112 gdk_cursor_unref(cursor); 113 gdk_cursor_unref(cursor);
113 } 114 }
114 115
115 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { 116 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) {
116 GaimGtkLogViewer *lv = g_hash_table_lookup(log_viewers, ht); 117 GaimGtkLogViewer *lv = syslog_viewer;
117 118
118 g_hash_table_remove(log_viewers, ht); 119 if(ht != NULL){
119 g_free(ht->screenname); 120 lv = g_hash_table_lookup(log_viewers, ht);
120 g_free(ht); 121 g_hash_table_remove(log_viewers, ht);
122 g_free(ht->screenname);
123 g_free(ht);
124 } else
125 syslog_viewer = NULL;
126
121 while (lv->logs) { 127 while (lv->logs) {
122 GaimLog *log = lv->logs->data; 128 GaimLog *log = lv->logs->data;
123 GList *logs2; 129 GList *logs2;
124 gaim_log_free(log); 130 gaim_log_free(log);
125 logs2 = lv->logs->next; 131 logs2 = lv->logs->next;
126 g_list_free_1(lv->logs); 132 g_list_free_1(lv->logs);
127 lv->logs = logs2; 133 lv->logs = logs2;
128 } 134 }
129 if (lv->search) 135 if (lv->search)
130 g_free(lv->search); 136 g_free(lv->search);
131 g_free(lv); 137 g_free(lv);
132 gtk_widget_destroy(w); 138 gtk_widget_destroy(w);
133 139
134 return TRUE; 140 return TRUE;
135 } 141 }
136 142 #if 0
143 static gboolean destroy_syslog_cb(GtkWidget *w, gint resp, void *cb)
144 {
145 while (syslog_viewer->logs) {
146 GaimLog *log = syslog_viewer->logs->data;
147 GList *logs2;
148 gaim_log_free(log);
149 logs2 = syslog_viewer->logs->next;
150 g_list_free_1(syslog_viewer->logs);
151 syslog_viewer->logs = logs2;
152 }
153 if (syslog_viewer->search)
154 g_free(syslog_viewer->search);
155 g_free(syslog_viewer);
156 syslog_viewer = NULL;
157 gtk_widget_destroy(w);
158
159 return TRUE;
160 }
161 #endif
137 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { 162 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) {
138 GtkTreeIter iter; 163 GtkTreeIter iter;
139 GValue val = { 0, }; 164 GValue val = { 0, };
140 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); 165 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore);
141 GaimLog *log = NULL; 166 GaimLog *log = NULL;
309 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); 334 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
310 gaim_set_accessible_label (lv->treeview, label); 335 gaim_set_accessible_label (lv->treeview, label);
311 336
312 gtk_widget_show_all(lv->window); 337 gtk_widget_show_all(lv->window);
313 } 338 }
339
340 void gaim_gtk_syslog_show()
341 {
342 GtkWidget *hbox, *vbox;
343 GtkCellRenderer *rend;
344 GtkTreeViewColumn *col;
345 GtkTreeSelection *sel;
346 GtkWidget *label, *pane, *sw, *button;
347 char *text;
348 GList *accounts = NULL;
349
350 if(syslog_viewer){
351 gtk_window_present(GTK_WINDOW(syslog_viewer->window));
352 return;
353 }
354
355 syslog_viewer = g_new0(GaimGtkLogViewer, 1);
356
357 for(accounts = gaim_accounts_get_all(); accounts != NULL;
358 accounts = accounts->next) {
359 GList *logs;
360 GaimAccount *account = (GaimAccount *)accounts->data;
361 if(!gaim_find_prpl(gaim_account_get_protocol_id(account)))
362 continue;
363
364 logs = gaim_log_get_system_logs(account);
365 syslog_viewer->logs = g_list_concat(syslog_viewer->logs, logs);
366 }
367 syslog_viewer->logs = g_list_sort(syslog_viewer->logs, gaim_log_compare);
368
369 /* Window ***********/
370 syslog_viewer->window = gtk_dialog_new_with_buttons(_("System Log"), NULL, 0,
371 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
372 gtk_container_set_border_width (GTK_CONTAINER(syslog_viewer->window), 6);
373 gtk_dialog_set_has_separator(GTK_DIALOG(syslog_viewer->window), FALSE);
374 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), 0);
375 g_signal_connect(G_OBJECT(syslog_viewer->window), "response",
376 G_CALLBACK(destroy_cb), NULL);
377
378 hbox = gtk_hbox_new(FALSE, 6);
379 gtk_container_set_border_width(GTK_CONTAINER(hbox), 6);
380 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), hbox,
381 FALSE, FALSE, 0);
382
383 /* Label ************/
384 label = gtk_label_new(NULL);
385 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>",
386 _("System Log"));
387 gtk_label_set_markup(GTK_LABEL(label), text);
388 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
389 g_free(text);
390
391 /* Pane *************/
392 pane = gtk_hpaned_new();
393 gtk_container_set_border_width(GTK_CONTAINER(pane), 6);
394 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), pane,
395 TRUE, TRUE, 0);
396
397 /* List *************/
398 sw = gtk_scrolled_window_new (NULL, NULL);
399 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
400 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
401 gtk_paned_add1(GTK_PANED(pane), sw);
402 syslog_viewer->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
403 syslog_viewer->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (syslog_viewer->treestore));
404 rend = gtk_cell_renderer_text_new();
405 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL);
406 gtk_tree_view_append_column (GTK_TREE_VIEW(syslog_viewer->treeview), col);
407 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (syslog_viewer->treeview), FALSE);
408 gtk_container_add (GTK_CONTAINER (sw), syslog_viewer->treeview);
409
410 gtk_widget_set_size_request(syslog_viewer->treeview, 170, 200);
411 populate_log_tree(syslog_viewer);
412
413 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (syslog_viewer->treeview));
414 g_signal_connect (G_OBJECT (sel), "changed",
415 G_CALLBACK (log_select_cb),
416 syslog_viewer);
417
418 /* Viewer ************/
419 vbox = gtk_vbox_new(FALSE, 6);
420 gtk_paned_add2(GTK_PANED(pane), vbox);
421 sw = gtk_scrolled_window_new(NULL, NULL);
422 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
423 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
424 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
425 syslog_viewer->imhtml = gtk_imhtml_new(NULL, NULL);
426 gtk_container_add(GTK_CONTAINER(sw), syslog_viewer->imhtml);
427 gaim_setup_imhtml(syslog_viewer->imhtml);
428 gtk_widget_set_size_request(syslog_viewer->imhtml, 400, 200);
429
430 /* Search box **********/
431 hbox = gtk_hbox_new(FALSE, 6);
432 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
433 syslog_viewer->entry = gtk_entry_new();
434 gtk_box_pack_start(GTK_BOX(hbox), syslog_viewer->entry, TRUE, TRUE, 0);
435 button = gtk_button_new_from_stock(GTK_STOCK_FIND);
436 g_signal_connect (G_OBJECT (button), "pressed",
437 G_CALLBACK (search_cb),
438 syslog_viewer);
439 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
440
441 gtk_widget_show_all(syslog_viewer->window);
442 }
443