📄 statusview.c
字号:
static gbooleanupdate_conntrack_ttl (gchar *key, Connection_entry *entry, GHashTable *entries){ GtkListStore *store = get_connectionstore (); entry->ttl--; if (entry->ttl == 0) { /* Remove dead connections */ gtk_list_store_remove (store, entry->ref); return TRUE; } else { if (entry->ttl < CONNTRACK_TTL-1) { /* Mark connections not seen for a while */ gtk_list_store_set (store, entry->ref, CONNECTIONCOL_COLOR, COLOR_RETIRED_CONNECTION, -1); } } return FALSE;}static voidfree_connection_entry (gpointer data){ Connection_entry *entry = (Connection_entry *)data; gtk_tree_iter_free (entry->ref); g_free (data);}/* [ update_status_screen ] * Timeout callback for refreshing the status view page periodically */static gbooleanupdate_status_screen (gpointer data){ static GHashTable *interfaces_info = NULL; static GHashTable *interfaces_widgets = NULL; static GHashTable *conntrack_entries = NULL; if (interfaces_info == NULL) interfaces_info = g_hash_table_new (g_str_hash, g_str_equal); if (interfaces_widgets == NULL) interfaces_widgets = g_hash_table_new (g_str_hash, g_str_equal); if (conntrack_entries == NULL) conntrack_entries = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, free_connection_entry); refresh_network_data (interfaces_info); g_hash_table_foreach (interfaces_info, (GHFunc)refresh_interface, interfaces_widgets); g_hash_table_foreach_remove (conntrack_entries, (GHRFunc)update_conntrack_ttl, conntrack_entries); if (active_connections_visible) connectionview_refresh (conntrack_entries); return TRUE;}static voidview_set_color_col (GtkTreeView *view, gint col_num){ GList* renderers; GList *columns; GtkCellRenderer *renderer; GList *e; columns = gtk_tree_view_get_columns (view); for (e = columns; e != NULL; e = g_list_next(e)) { GtkTreeViewColumn* column = e->data; renderers = gtk_tree_view_column_get_cell_renderers (column); renderer = g_list_nth_data (renderers, 0); gtk_tree_view_column_add_attribute (column, renderer, "foreground", CONNECTIONCOL_COLOR); g_list_free (renderers); } g_list_free (columns);}voidstatus_lookup_selected_connection (void){ GtkTreeSelection *selection; GtkTreeIter iter; GtkListStore *store = get_connectionstore (); gchar *source, *destination, *hostname; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (connectionview)); if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) return; gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, CONNECTIONCOL_SOURCE, &source, CONNECTIONCOL_DESTINATION, &destination, -1); hostname = lookup_ip (source); if (hostname != NULL) gtk_list_store_set (store, &iter, CONNECTIONCOL_SOURCE, hostname, -1); hostname = lookup_ip (destination); if (hostname != NULL) gtk_list_store_set (store, &iter, CONNECTIONCOL_DESTINATION, hostname, -1); gtk_tree_view_columns_autosize (GTK_TREE_VIEW (connectionview)); g_free (source); g_free (destination);}static gbooleanconnectionview_has_selection (GtkTreeView *view){ GtkTreeSelection *selection; GtkTreeIter iter; gboolean has_selection; selection = gtk_tree_view_get_selection (view); has_selection = gtk_tree_selection_get_selected (selection, NULL, &iter); return has_selection;}static gbooleanconnectionview_button_press_cb (GtkWidget* view, GdkEventButton* event){ gboolean retval = FALSE; GtkWidget *menu; if (!connectionview_has_selection (GTK_TREE_VIEW (view))) return FALSE; menu = menus_get_connections_context_menu (); switch (event->button) { case 1: break; case 3: gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, event->button, event->time); retval = TRUE; break; } return retval;}static voidexpander_cb (GObject *object, GParamSpec *param_spec, gpointer user_data){ GtkExpander *expander; GtkWidget *contents; expander = GTK_EXPANDER (object); contents = GTK_WIDGET (user_data); if (gtk_expander_get_expanded (expander)) { gtk_widget_show (contents); active_connections_visible = TRUE; } else { /* Reclaim vertical space on expander collapse */ gint width; gtk_window_get_size (GTK_WINDOW (Firestarter.window), &width, NULL); gtk_widget_hide (contents); gtk_window_resize (GTK_WINDOW (Firestarter.window), width, 1); active_connections_visible = FALSE; }}/* [ create_hitview_page ] * Create the hitview */GtkWidget *create_statusview_page (void){ GtkWidget *statuspagebox; GtkWidget *scrolledwin; GtkWidget *frame; GtkWidget *label; GtkWidget *table; GtkWidget *table2; GdkPixbuf *pixbuf; GtkWidget *separator; GtkWidget *expander; View_def connectionview_def = {6, { {_("Source"), G_TYPE_STRING, TRUE}, {_("Destination"), G_TYPE_STRING, TRUE}, {_("Port"), G_TYPE_STRING, TRUE}, {_("Service"), G_TYPE_STRING, TRUE}, {_("Program"), G_TYPE_STRING, TRUE}, {_("Color"), G_TYPE_STRING, FALSE}, } }; statuspagebox = gtk_vbox_new (FALSE, 0);/* Firewall */ frame = gtk_frame_new (NULL); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<b>", _("Firewall"), "</b>", NULL)); gtk_frame_set_label_widget (GTK_FRAME (frame), label); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); gtk_box_pack_start (GTK_BOX (statuspagebox), frame, FALSE, FALSE, GNOME_PAD_SMALL); table = gtk_table_new (3, 3, FALSE); gtk_table_set_row_spacings (GTK_TABLE(table), GNOME_PAD_SMALL); gtk_table_set_col_spacings (GTK_TABLE(table), GNOME_PAD_SMALL); gtk_container_add (GTK_CONTAINER (frame), table); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\" weight=\"bold\">", _("Status"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, GNOME_PAD, 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\" weight=\"bold\">", _("Events"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL, GNOME_PAD, 5); table2 = gtk_table_new (3, 3, FALSE); gtk_table_set_row_spacings (GTK_TABLE(table), GNOME_PAD_SMALL); gtk_table_set_col_spacings (GTK_TABLE(table), GNOME_PAD_SMALL); gtk_table_attach (GTK_TABLE (table), table2, 1, 2, 1, 3, GTK_FILL, GTK_FILL, GNOME_PAD, 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\" underline=\"single\">", _("Total"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (table2), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL, GNOME_PAD, 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\" underline=\"single\">", _("Serious"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (table2), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL, GNOME_PAD, 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\">", _("Inbound"), "</span>", NULL)); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0); gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, GNOME_PAD, 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\">", _("Outbound"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, GNOME_PAD, 5); events_in = gtk_label_new ("0"); gtk_table_attach (GTK_TABLE (table2), events_in, 1, 2, 1, 2, GTK_FILL, GTK_FILL, GNOME_PAD, 5); events_out = gtk_label_new ("0"); gtk_table_attach (GTK_TABLE (table2), events_out, 1, 2, 2, 3, GTK_FILL, GTK_FILL, GNOME_PAD, 5); events_serious_in = gtk_label_new ("0"); gtk_table_attach (GTK_TABLE (table2), events_serious_in, 2, 3, 1, 2, GTK_FILL, GTK_FILL, GNOME_PAD, 5); events_serious_out = gtk_label_new ("0"); gtk_table_attach (GTK_TABLE (table2), events_serious_out, 2, 3, 2, 3, GTK_FILL, GTK_FILL, GNOME_PAD, 5); pixbuf = gdk_pixbuf_new_from_inline (-1, icon_start_large, FALSE, NULL); fw_state_icon = gtk_image_new_from_pixbuf (pixbuf); g_object_unref (G_OBJECT(pixbuf)); gtk_table_attach (GTK_TABLE (table), fw_state_icon, 0, 1, 1, 2, GTK_FILL, GTK_FILL, GNOME_PAD, 0); fw_state_label = gtk_label_new (NULL); /* Force a size so that the different label lengths don't shift the other content */ gtk_widget_set_size_request (fw_state_label, 70, -1); gtk_label_set_markup (GTK_LABEL (fw_state_label), g_strconcat ( "<small>", _("Active"), "</small>", NULL)); gtk_table_attach (GTK_TABLE (table), fw_state_label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, GNOME_PAD, 0); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (statuspagebox), separator, FALSE, FALSE, 10);/* Network */ frame = gtk_frame_new (NULL); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<b>", _("Network"), "</b>", NULL)); gtk_frame_set_label_widget (GTK_FRAME (frame), label); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); gtk_box_pack_start (GTK_BOX (statuspagebox), frame, FALSE, FALSE, 0); device_table = gtk_table_new (5, 10, FALSE); gtk_table_set_row_spacings (GTK_TABLE(device_table), GNOME_PAD_SMALL); gtk_table_set_col_spacings (GTK_TABLE(device_table), GNOME_PAD_SMALL); gtk_container_add (GTK_CONTAINER (frame), device_table); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\" underline=\"single\">", _("Device"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (device_table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, GNOME_PAD, 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\" underline=\"single\">", _("Type"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (device_table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL, GNOME_PAD, 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\" underline=\"single\">", _("Received"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (device_table), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL, GNOME_PAD, 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\" underline=\"single\">", _("Sent"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (device_table), label, 3, 4, 0, 1, GTK_FILL, GTK_FILL, GNOME_PAD, 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span size=\"smaller\" underline=\"single\">", _("Activity"), "</span>", NULL)); gtk_table_attach (GTK_TABLE (device_table), label, 4, 5, 0, 1, GTK_FILL, GTK_FILL, GNOME_PAD, 5); expander = gtk_expander_new (NULL); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<b>", _("Active connections"), "</b>", NULL)); gtk_expander_set_label_widget (GTK_EXPANDER (expander), label); gtk_expander_set_spacing (GTK_EXPANDER (expander), 5); gtk_box_pack_start (GTK_BOX (statuspagebox), expander, FALSE, FALSE, 10);/* Active Connections */ connectionview = gui_create_list_view (&connectionview_def, -1, 150); g_signal_connect (G_OBJECT (connectionview), "button_press_event", G_CALLBACK (connectionview_button_press_cb), NULL); view_set_color_col (GTK_TREE_VIEW (connectionview), CONNECTIONCOL_COLOR); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (connectionview), TRUE); scrolledwin = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwin), GTK_SHADOW_IN); g_signal_connect (G_OBJECT (expander), "notify::expanded", G_CALLBACK (expander_cb), scrolledwin); gtk_expander_set_expanded (GTK_EXPANDER (expander), FALSE); gtk_box_pack_start (GTK_BOX (statuspagebox), scrolledwin, TRUE, TRUE, 1); gtk_widget_show (connectionview); gtk_widget_set_no_show_all (scrolledwin, TRUE); /* Pack the treeview into the scrolled window */ gtk_container_add (GTK_CONTAINER (scrolledwin), connectionview); gtk_timeout_add (REFRESH_RATE*1000, update_status_screen, NULL); gtk_widget_show_all (statuspagebox); return statuspagebox;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -