1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#include "mainwin.h"
#include "support.h"
#include "log.h"
static GtkListStore *log_list_store = NULL;
enum { COLUMN_TIME, COLUMN_TYPE, COLUMN_SOURCE, COLUMN_DESTINATION, COLUMN_DECISION, N_COLUMNS };
void log_widget_init() {
GtkTreeView *tv = GTK_TREE_VIEW(lookup_widget(get_main_window(), "log_view"));
log_list_store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
gtk_tree_view_set_model(tv, GTK_TREE_MODEL(log_list_store));
gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Time", gtk_cell_renderer_text_new(), "text", COLUMN_TIME, NULL));
gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Type", gtk_cell_renderer_text_new(), "text", COLUMN_TYPE, NULL));
gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Source", gtk_cell_renderer_text_new(), "text", COLUMN_SOURCE, NULL));
gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Destination", gtk_cell_renderer_text_new(), "text", COLUMN_DESTINATION, NULL));
gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Decision", gtk_cell_renderer_text_new(), "text", COLUMN_DECISION, NULL));
}
void log_widget_append(conn_info_t *ci) {
gtk_list_store_append(log_list_store, &ci->iter);
gtk_list_store_set(log_list_store, &ci->iter,
COLUMN_TIME, ci->timestamp_string,
COLUMN_TYPE, ci->type_string,
COLUMN_SOURCE, ci->from_string,
COLUMN_DESTINATION, ci->to_string,
COLUMN_DECISION, "outstanding...",
-1);
log_widget_cut();
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(get_main_window(), "autoscroll_button")))) {
GtkTreeView *tv = GTK_TREE_VIEW(lookup_widget(get_main_window(), "log_view"));
GtkTreePath *path;
path = gtk_tree_model_get_path(gtk_tree_view_get_model(tv), &ci->iter);
gtk_tree_view_set_cursor(tv, path, NULL, FALSE);
gtk_tree_view_scroll_to_cell(tv, path, NULL, TRUE, .5, 0);
gtk_tree_path_free(path);
}
}
void log_widget_verdict(conn_info_t *ci, verdict_t v) {
gtk_list_store_set(log_list_store, &ci->iter,
COLUMN_DECISION, v == VERDICT_REJECT ? "REJECTED" : (v == VERDICT_DROP ? "DROPPPED" : "ACCEPTED"),
-1);
}
void log_widget_clear() {
gtk_list_store_clear(log_list_store);
}
void log_widget_cut() {
gfloat m = gtk_spin_button_get_value(GTK_SPIN_BUTTON(lookup_widget(get_main_window(), "log_spinbutton")));
if (m < 10)
m = 10;
while (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(log_list_store), NULL) > m) {
GtkTreeIter iter;
if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(log_list_store), &iter))
return;
gtk_list_store_remove(log_list_store, &iter);
}
}
|