+ gtk_text_freeze(GTK_TEXT(log_window));
+
+ if(log_inited)
+ gtk_text_insert(GTK_TEXT(log_window), NULL, NULL, NULL, "\n", 1);
+
+ gtk_text_insert(GTK_TEXT(log_window), NULL, &timecolor, NULL, buffer2, strlen(buffer2));
+ gtk_text_insert(GTK_TEXT(log_window), NULL, NULL, NULL, buffer1, len);
+ gtk_text_thaw(GTK_TEXT(log_window));
+
+ log_inited = 1;
+ if(follow_log)
+/* gtk_text_set_point(GTK_TEXT(w), -1); */
+ gtk_editable_set_position(GTK_EDITABLE(log_window), gtk_text_get_length(GTK_TEXT(log_window)));
+}
+
+void if_hostinfoclosebutton_clicked(GtkWidget *w, gpointer data)
+{
+ gtk_widget_destroy(GTK_WIDGET(data));
+}
+
+void update_hostinfo_dialog(GladeXML *x, node_t *n)
+{
+ GtkWidget *w;
+ char s[100];
+ avl_node_t *avlnode;
+ char *l[1];
+
+ w = glade_xml_get_widget(x, "HostInfoNameEntry");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoNameEntry"); return; }
+ gtk_entry_set_text(GTK_ENTRY(w), n->name);
+
+ w = glade_xml_get_widget(x, "HostInfoHostnameEntry");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoHostnameEntry"); return; }
+ gtk_entry_set_text(GTK_ENTRY(w), n->hostname);
+
+ w = glade_xml_get_widget(x, "HostInfoPortEntry");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoPortEntry"); return; }
+/* snprintf(s, sizeof(s)-1, "%hd", "0"); */
+ gtk_entry_set_text(GTK_ENTRY(w), "port");
+
+ w = glade_xml_get_widget(x, "HostInfoVersionEntry");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoVersionEntry"); return; }
+ gtk_entry_set_text(GTK_ENTRY(w), n->name);
+
+ w = glade_xml_get_widget(x, "HostInfoStatusEntry");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoStatusEntry"); return; }
+/* snprintf(s, sizeof(s)-1, "%x", n->status); */
+ gtk_entry_set_text(GTK_ENTRY(w), "0");
+
+ w = glade_xml_get_widget(x, "HostInfoActiveCheckbutton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoActiveCheckbutton"); return; }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), n->status.active);
+
+ w = glade_xml_get_widget(x, "HostInfoValidkeyCheckbutton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoValidkeyCheckbutton"); return; }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), n->status.validkey);
+
+ w = glade_xml_get_widget(x, "HostInfoWaitingforkeyCheckbutton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoWaitingforkeyCheckbutton"); return; }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), n->status.waitingforkey);
+
+ w = glade_xml_get_widget(x, "HostInfoVisitedCheckbutton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoVisitedCheckbutton"); return; }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), n->status.visited);
+
+ w = glade_xml_get_widget(x, "HostInfoReachableCheckbutton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoReachableCheckbutton"); return; }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), n->status.reachable);
+
+ w = glade_xml_get_widget(x, "HostInfoIndirectCheckbutton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoIndirectCheckbutton"); return; }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), n->status.indirect);
+
+ w = glade_xml_get_widget(x, "HostInfoVisibleCheckbutton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoVisibleCheckbutton"); return; }
+/* gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), n->status.visible); */
+
+ w = glade_xml_get_widget(x, "HostInfoTCPOnlyCheckbutton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoTCPOnlyCheckbutton"); return; }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), (n->options & OPTION_TCPONLY) != 0);
+
+ w = glade_xml_get_widget(x, "HostInfoIndirectdataCheckbutton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoIndirectdataCheckbutton"); return; }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), (n->options & OPTION_INDIRECT) != 0);
+
+/* w = glade_xml_get_widget(x, "HostInfoWindow"); */
+/* if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostInfoWindow"); return; } */
+/* glade_xml_signal_connect_data(x, "on_HostInfoCloseButton_clicked", if_hostinfoclosebutton_clicked, (gpointer)w); */
+ w = glade_xml_get_widget(x, "HostConnectionsCList");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "HostConnectionsCList"); return; }
+ for(avlnode = n->edge_tree->head; avlnode; avlnode = avlnode->next)
+ {
+ if(((edge_t*)(avlnode->data))->to.node == n)
+ l[0] = ((edge_t*)(avlnode->data))->from.node->name;
+ else
+ l[0] = ((edge_t*)(avlnode->data))->to.node->name;
+ gtk_clist_append(GTK_CLIST(w), l);
+ }
+}
+
+void on_preferences1_activate(GtkMenuItem *mi, gpointer data)
+{
+ GtkWidget *w;
+ GladeXML *x;
+
+ x = glade_xml_new(INTERFACE_FILE, "PropertyBox");
+ if(x == NULL)
+ {
+ log(0, TLOG_ERROR,
+ _("Could not find widget `%s'"),
+ "PropertyBox");
+ return;
+ }
+
+ w = glade_xml_get_widget(x, "PropertyBox");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "PropertyBox"); return; }
+ glade_xml_signal_autoconnect(x);
+}
+
+void on_logcontext_clear_activate(GtkMenuItem *mi, gpointer data)
+{
+ gtk_editable_delete_text(GTK_EDITABLE(log_window), 0, -1); /* Delete from 0 to end of buffer */
+ log_inited = 0;
+}
+
+void on_logcontext_follow_activate(GtkMenuItem *mi, gpointer data)
+{
+ follow_log = !follow_log;
+}
+
+void on_logcontext_close1_activate(GtkMenuItem *mi, gpointer data)
+{
+
+}
+
+void on_messages_button_press_event(GtkWidget *w, GdkEventButton *event, gpointer data)
+{
+ GladeXML *x;
+ GtkWidget *menu;
+
+ if (event->button == 3)
+ {
+ x = glade_xml_new(INTERFACE_FILE, "LogContextMenu");
+ if(x == NULL)
+ {
+ log(0, TLOG_ERROR,
+ _("Could not find widget `%s'"),
+ "LogContextMenu");
+ return;
+ }
+
+ menu = glade_xml_get_widget(x, "LogContextMenu");
+ if(!menu) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "LogContextMenu"); return; }
+
+ glade_xml_signal_connect_data(x, "on_logcontext_clear_activate", on_logcontext_clear_activate, (gpointer)x);
+ glade_xml_signal_connect_data(x, "on_logcontext_follow_activate", on_logcontext_follow_activate, (gpointer)x);
+ w = glade_xml_get_widget(x, "LogContextFollow");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "LogContextFollow"); return; }
+ GTK_CHECK_MENU_ITEM(w)->active = follow_log;
+ gnome_popup_menu_do_popup_modal(menu, NULL, NULL, event, NULL);
+ gtk_widget_destroy(menu);
+ }
+}
+
+void shuffle_nodes(void)
+{
+ avl_node_t *avlnode;
+ double newx, newy;
+
+ for(avlnode = node_tree->head; avlnode; avlnode = avlnode->next)
+ {
+ newx = ((double)random()) / ((double)RAND_MAX) * 500.0;
+ newy = ((double)random()) / ((double)RAND_MAX) * 300.0;
+ ((struct if_node_data*)((node_t *)(avlnode->data))->data)->x = newx;
+ ((struct if_node_data*)((node_t *)(avlnode->data))->data)->y = newy;
+
+ if(!((struct if_node_data*)((node_t*)(avlnode->data)))->visible)
+ continue;
+
+ x[((struct if_node_data*)((node_t*)(avlnode->data))->data)->id] = newx;
+ y[((struct if_node_data*)((node_t*)(avlnode->data))->data)->id] = newy;
+ }
+ inited = 0;
+ build_graph = 1;
+}
+
+void on_canvascontext_shuffle_activate(GtkMenuItem *mi, gpointer data)
+{
+ shuffle_nodes();
+}
+
+void on_canvascontext_keep_drawing_activate(GtkMenuItem *mi, gpointer data)
+{
+ GtkWidget *w;
+
+ keep_drawing = !keep_drawing;
+
+ /* No need to fuss with the checkbox in the menu, because that is
+ transient. Do need to update the checkbox at the bottom of the
+ window though. */
+ w = glade_xml_get_widget(canvas_xml, "KeepDrawingButton");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "KeepDrawingButton"); return; }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), keep_drawing);
+}
+
+void on_canvascontext_minus50_activate(GtkMenuItem *mi, gpointer data)
+{
+ canvas_zoom *= 0.50;
+ gnome_canvas_set_pixels_per_unit(GNOME_CANVAS(canvas), canvas_zoom);
+}
+
+void on_canvascontext_minus25_activate(GtkMenuItem *mi, gpointer data)
+{
+ canvas_zoom *= 0.75;
+ gnome_canvas_set_pixels_per_unit(GNOME_CANVAS(canvas), canvas_zoom);
+}
+
+void on_canvascontext_minus10_activate(GtkMenuItem *mi, gpointer data)
+{
+ canvas_zoom *= 0.90;
+ gnome_canvas_set_pixels_per_unit(GNOME_CANVAS(canvas), canvas_zoom);
+}
+
+void on_canvascontext_default_activate(GtkMenuItem *mi, gpointer data)
+{
+ canvas_zoom = 1.00;
+ gnome_canvas_set_pixels_per_unit(GNOME_CANVAS(canvas), 1.00);
+}
+
+void on_canvascontext_plus10_activate(GtkMenuItem *mi, gpointer data)
+{
+ canvas_zoom *= 1.10;
+ gnome_canvas_set_pixels_per_unit(GNOME_CANVAS(canvas), canvas_zoom);
+}
+
+void on_canvascontext_plus25_activate(GtkMenuItem *mi, gpointer data)
+{
+ canvas_zoom *= 1.25;
+ gnome_canvas_set_pixels_per_unit(GNOME_CANVAS(canvas), canvas_zoom);
+}
+
+void on_canvascontext_plus50_activate(GtkMenuItem *mi, gpointer data)
+{
+ canvas_zoom *= 1.50;
+ gnome_canvas_set_pixels_per_unit(GNOME_CANVAS(canvas), canvas_zoom);
+}
+
+void on_canvas_button_press_event(GtkWidget *w, GdkEventButton *event, gpointer data)
+{
+ GladeXML *x;
+ GtkWidget *menu;
+
+ if (event->button == 3)
+ {
+ x = glade_xml_new(INTERFACE_FILE, "CanvasContextMenu");
+ if(x == NULL)
+ {
+ log(0, TLOG_ERROR,
+ _("Could not find widget `%s'"),
+ "CanvasContextMenu");
+ return;
+ }
+
+ menu = glade_xml_get_widget(x, "CanvasContextMenu");
+ if(!menu) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "CanvasContextMenu"); return; }
+
+ glade_xml_signal_autoconnect(x);
+ glade_xml_signal_connect_data(x, "on_canvascontext_shuffle_activate", on_canvascontext_shuffle_activate, (gpointer)x);
+ glade_xml_signal_connect_data(x, "on_canvascontext_keep_drawing_activate", on_canvascontext_keep_drawing_activate, (gpointer)x);
+ w = glade_xml_get_widget(x, "CanvasContextKeepDrawing");
+ if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "CanvasContextKeepDrawing"); return; }
+ GTK_CHECK_MENU_ITEM(w)->active = keep_drawing;
+ gnome_popup_menu_do_popup_modal(menu, NULL, NULL, event, NULL);
+ gtk_widget_destroy(menu);
+ }
+}
+
+void on_nodetree_button_press_event(GtkWidget *w, GdkEventButton *event, gpointer data)
+{
+ GtkCTreeNode *node;
+ int row, col;
+ gpointer lt;
+ GladeXML *x;
+
+ gtk_clist_get_selection_info(GTK_CLIST(w), event->x, event->y,
+ &row, &col);