361e676229e623715f1a885e719a1a0424da202b
[olsrd.git] / gui / linux-gtk / src / interface.c
1
2 /*
3  * OLSR ad-hoc routing table management protocol GUI front-end
4  * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no)
5  *
6  * This file is part of olsr.org.
7  *
8  * uolsrGUI is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * uolsrGUI is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with olsr.org; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  *
22  */
23
24 #include "common.h"
25 #include "interface.h"
26 #include "pixmaps.h"
27
28 /* Global widgets */
29
30 /* GtkWidget *text1; */
31
32 GdkBitmap *mask;
33
34 int packet_list_size = 0;
35 int route_list_size = 0;
36 int node_list_size = 0;
37
38 GtkWidget *main_window;
39
40 GtkWidget *
41 create_main_window(void)
42 {
43   GtkWidget *notebook1;
44   GtkWidget *frame3;
45   GtkWidget *frame4;
46   GtkWidget *hbox1;
47   GtkWidget *vbox1;
48   GtkWidget *scrolledwindow1;
49   GtkWidget *node_label1;
50   GtkWidget *node_label2;
51   GtkWidget *node_label3;
52   GtkWidget *node_label4;
53   GtkWidget *node_label7;
54   GtkWidget *node_label8;
55   GtkWidget *node_label9;
56   GtkWidget *mid_frame;
57   GtkWidget *mpr_frame;
58   GtkWidget *hna_frame;
59   GtkWidget *mid_scrolledwindow;
60   GtkWidget *mpr_scrolledwindow;
61   GtkWidget *hna_scrolledwindow;
62   GtkWidget *Main;
63   GtkWidget *label_routes;
64   GtkWidget *hbox2;
65   GtkWidget *frame2;
66   GtkWidget *scrolledwindow4;
67   GtkWidget *label17;
68   GtkWidget *label18;
69   GtkWidget *label19;
70   GtkWidget *scrolledwindow3;
71   GtkWidget *label13;
72   GtkWidget *label14;
73   GtkWidget *label15;
74   GtkWidget *label16;
75   GtkWidget *label_packets;
76   //GtkWidget *empty_notebook_page2;
77   GtkWidget *label3;
78   GtkWidget *net_vbox;
79   GtkWidget *pack_vbox;
80   GtkWidget *pack_disp_vbox;
81   GtkWidget *disp_frame;
82   GtkWidget *route_frame;
83   GtkWidget *route_stats_frame;
84   GtkWidget *route_scrolledwindow;
85   GtkWidget *route_label1;
86   GtkWidget *route_label2;
87   GtkWidget *route_label3;
88   GtkWidget *route_label4;
89   GtkWidget *route_hbox1;
90
91   GtkWidget *traffic_label;
92
93   GtkWidget *settings_label;
94   GtkWidget *settings_hbox1;
95
96   GtkWidget *about_hbox1;
97   GtkWidget *about_label;
98
99   GtkWidget *empty1;
100
101   GdkPixmap *unik_logo_gdk;
102   GtkWidget *unik_logo;
103
104   /*
105    *The main window
106    */
107
108   main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
109   gtk_object_set_data(GTK_OBJECT(main_window), "main_window", main_window);
110   gtk_window_set_title(GTK_WINDOW(main_window), (olsrd_version));
111   gtk_window_set_default_size(GTK_WINDOW(main_window), 600, 550);
112   gtk_signal_connect(GTK_OBJECT(main_window), "destroy", GTK_SIGNAL_FUNC(gui_shutdown),
113                      //GTK_SIGNAL_FUNC(gtk_main_quit),
114                      NULL);
115   gtk_window_set_position(GTK_WINDOW(main_window), GTK_WIN_POS_CENTER); /* Position window in center */
116   gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, TRUE, TRUE);    /* No user-resizing */
117
118   /*
119    *Initialize the pixmaps
120    */
121   unik_logo_gdk =
122     gdk_pixmap_colormap_create_from_xpm_d(NULL, gtk_widget_get_colormap(main_window), &mask, NULL, (gchar **) logo_xpm);
123
124   unik_logo = gtk_pixmap_new(unik_logo_gdk, mask);
125
126   /*
127    *The notebook
128    */
129
130   notebook1 = gtk_notebook_new();
131   gtk_widget_ref(notebook1);
132   gtk_object_set_data_full(GTK_OBJECT(main_window), "notebook1", notebook1, (GtkDestroyNotify) gtk_widget_unref);
133   gtk_widget_show(notebook1);
134   gtk_container_add(GTK_CONTAINER(main_window), notebook1);
135
136   /*
137    *The first vbox
138    */
139   vbox1 = gtk_vbox_new(FALSE, 0);
140   gtk_widget_ref(vbox1);
141   gtk_object_set_data_full(GTK_OBJECT(main_window), "vbox1", vbox1, (GtkDestroyNotify) gtk_widget_unref);
142   gtk_widget_show(vbox1);
143   //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
144   gtk_container_add(GTK_CONTAINER(notebook1), vbox1);
145
146   /*
147    *The nodes frame
148    */
149   frame3 = gtk_frame_new("Registered nodes:");
150   gtk_widget_ref(frame3);
151   gtk_object_set_data_full(GTK_OBJECT(main_window), "frame3", frame3, (GtkDestroyNotify) gtk_widget_unref);
152   gtk_widget_show(frame3);
153   gtk_box_pack_start(GTK_BOX(vbox1), frame3, TRUE, TRUE, 0);
154   gtk_widget_set_size_request(frame3, -1, 300);
155   gtk_container_set_border_width(GTK_CONTAINER(frame3), 1);
156
157   /*
158    *The scrolled window to contain the node list
159    */
160
161   scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
162   gtk_widget_ref(scrolledwindow1);
163   gtk_object_set_data_full(GTK_OBJECT(main_window), "scrolledwindow1", scrolledwindow1, (GtkDestroyNotify) gtk_widget_unref);
164   gtk_widget_show(scrolledwindow1);
165   gtk_container_add(GTK_CONTAINER(frame3), scrolledwindow1);
166   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
167
168   //gtk_box_pack_start (GTK_BOX (frame3), scrolledwindow1, TRUE, TRUE, 0);
169   //gtk_widget_set_usize (scrolledwindow1, -2, 332);
170
171   /*
172    *The node list
173    */
174
175   node_list = gtk_clist_new(7);
176   gtk_widget_ref(node_list);
177   gtk_object_set_data_full(GTK_OBJECT(main_window), "node_list", node_list, (GtkDestroyNotify) gtk_widget_unref);
178   gtk_widget_show(node_list);
179   gtk_container_add(GTK_CONTAINER(scrolledwindow1), node_list);
180   gtk_clist_set_column_width(GTK_CLIST(node_list), 0, 150);     /* IP */
181   //gtk_clist_set_column_justification(GTK_CLIST(node_list), 0, GTK_JUSTIFY_CENTER);
182   gtk_clist_set_column_width(GTK_CLIST(node_list), 1, 150);     /* gateway */
183   //gtk_clist_set_column_justification(GTK_CLIST(node_list), 1, GTK_JUSTIFY_CENTER);
184   gtk_clist_set_column_width(GTK_CLIST(node_list), 2, 50);      /* hopcount */
185   gtk_clist_set_column_justification(GTK_CLIST(node_list), 2, GTK_JUSTIFY_CENTER);
186   gtk_clist_set_column_width(GTK_CLIST(node_list), 3, 80);      /* dev */
187   gtk_clist_set_column_justification(GTK_CLIST(node_list), 3, GTK_JUSTIFY_CENTER);
188
189   gtk_clist_set_column_width(GTK_CLIST(node_list), 4, 70);      /* timer */
190   gtk_clist_set_column_justification(GTK_CLIST(node_list), 4, GTK_JUSTIFY_CENTER);
191   //gtk_clist_set_column_width (GTK_CLIST (node_list), 7, 100); /* last about */
192   //gtk_clist_set_column_justification(GTK_CLIST(node_list), 7, GTK_JUSTIFY_CENTER);
193
194   gtk_clist_set_column_width(GTK_CLIST(node_list), 5, 40);      /* MID */
195   gtk_clist_set_column_justification(GTK_CLIST(node_list), 5, GTK_JUSTIFY_CENTER);
196   gtk_clist_set_column_width(GTK_CLIST(node_list), 6, 40);      /* HNA */
197   gtk_clist_set_column_justification(GTK_CLIST(node_list), 6, GTK_JUSTIFY_CENTER);
198
199   gtk_clist_column_titles_show(GTK_CLIST(node_list));
200
201   /*
202    *Row selection callback
203    */
204   gtk_signal_connect(GTK_OBJECT(node_list), "select_row", GTK_SIGNAL_FUNC(selection_made), NULL);
205
206   /*
207    *Column selection callback
208    */
209   gtk_signal_connect(GTK_OBJECT(node_list), "click_column", GTK_SIGNAL_FUNC(column_clicked_callback), NULL);
210
211   node_label1 = gtk_label_new("Dest");
212   gtk_widget_ref(node_label1);
213   gtk_object_set_data_full(GTK_OBJECT(main_window), "IP", node_label1, (GtkDestroyNotify) gtk_widget_unref);
214   gtk_widget_show(node_label1);
215   gtk_clist_set_column_widget(GTK_CLIST(node_list), 0, node_label1);
216
217   node_label2 = gtk_label_new("Gateway");
218   gtk_widget_ref(node_label2);
219   gtk_object_set_data_full(GTK_OBJECT(main_window), "hops", node_label2, (GtkDestroyNotify) gtk_widget_unref);
220   gtk_widget_show(node_label2);
221   gtk_clist_set_column_widget(GTK_CLIST(node_list), 1, node_label2);
222
223   node_label3 = gtk_label_new("Metric");
224   gtk_widget_ref(node_label3);
225   gtk_object_set_data_full(GTK_OBJECT(main_window), "info", node_label3, (GtkDestroyNotify) gtk_widget_unref);
226   gtk_widget_show(node_label3);
227   gtk_clist_set_column_widget(GTK_CLIST(node_list), 2, node_label3);
228
229   node_label4 = gtk_label_new("Device");
230   gtk_widget_ref(node_label4);
231   gtk_object_set_data_full(GTK_OBJECT(main_window), "Device", node_label4, (GtkDestroyNotify) gtk_widget_unref);
232   gtk_widget_show(node_label4);
233   gtk_clist_set_column_widget(GTK_CLIST(node_list), 3, node_label4);
234
235   node_label7 = gtk_label_new("Timer");
236   gtk_widget_ref(node_label7);
237   gtk_object_set_data_full(GTK_OBJECT(main_window), "LMF", node_label7, (GtkDestroyNotify) gtk_widget_unref);
238   gtk_widget_show(node_label7);
239   gtk_clist_set_column_widget(GTK_CLIST(node_list), 4, node_label7);
240
241   /*
242      node_label8 = gtk_label_new ("LMA");
243      gtk_widget_ref (node_label8);
244      gtk_object_set_data_full (GTK_OBJECT (main_window), "LMA", node_label8,
245      (GtkDestroyNotify) gtk_widget_unref);
246      gtk_widget_show (node_label8);
247      gtk_clist_set_column_widget (GTK_CLIST (node_list), 7, node_label8);
248    */
249
250   node_label8 = gtk_label_new("MID");
251   gtk_widget_ref(node_label8);
252   gtk_object_set_data_full(GTK_OBJECT(main_window), "MID", node_label8, (GtkDestroyNotify) gtk_widget_unref);
253   gtk_widget_show(node_label8);
254   gtk_clist_set_column_widget(GTK_CLIST(node_list), 5, node_label8);
255
256   node_label9 = gtk_label_new("HNA");
257   gtk_widget_ref(node_label9);
258   gtk_object_set_data_full(GTK_OBJECT(main_window), "HNA", node_label9, (GtkDestroyNotify) gtk_widget_unref);
259   gtk_widget_show(node_label9);
260   gtk_clist_set_column_widget(GTK_CLIST(node_list), 6, node_label9);
261
262   gtk_clist_column_titles_active(GTK_CLIST(node_list));
263
264   gtk_widget_show_now(node_list);
265
266   /*
267    *Row selection callback
268    */
269   gtk_signal_connect(GTK_OBJECT(node_list), "select_row", GTK_SIGNAL_FUNC(node_selection), NULL);
270
271   /*
272    *The first hbox
273    */
274   hbox1 = gtk_hbox_new(FALSE, 0);
275   gtk_widget_ref(hbox1);
276   gtk_object_set_data_full(GTK_OBJECT(main_window), "hbox1", hbox1, (GtkDestroyNotify) gtk_widget_unref);
277   gtk_widget_show(hbox1);
278   gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 0);
279   //gtk_container_add (GTK_CONTAINER (notebook1), hbox1);
280   gtk_container_set_border_width(GTK_CONTAINER(hbox1), 4);
281   gtk_widget_set_size_request(hbox1, -1, 200);
282
283   /*
284    *The net-info frame
285    */
286   frame4 = gtk_frame_new("Info:");
287   gtk_widget_ref(frame4);
288   gtk_object_set_data_full(GTK_OBJECT(main_window), "frame4", frame4, (GtkDestroyNotify) gtk_widget_unref);
289   gtk_widget_show(frame4);
290   gtk_box_pack_start(GTK_BOX(hbox1), frame4, TRUE, TRUE, 0);
291   //gtk_widget_set_size_request(frame4, 200, -1);
292   gtk_container_set_border_width(GTK_CONTAINER(frame4), 1);
293
294   /*
295    *The net-info hbox
296    */
297   net_vbox = gtk_vbox_new(FALSE, 0);
298   gtk_widget_ref(net_vbox);
299   gtk_object_set_data_full(GTK_OBJECT(main_window), "net_vbox", net_vbox, (GtkDestroyNotify) gtk_widget_unref);
300   gtk_widget_show(net_vbox);
301   gtk_container_add(GTK_CONTAINER(frame4), net_vbox);
302
303   /*
304    *The net-info label field
305    */
306   net_label = gtk_label_new(NULL);
307   gtk_widget_ref(net_label);
308   gtk_misc_set_alignment((GtkMisc *) net_label, 0, 0);
309   //gtk_label_set_justify((GtkLabel *)net_label,GTK_JUSTIFY_LEFT);
310   gtk_object_set_data_full(GTK_OBJECT(main_window), "net_label", net_label, (GtkDestroyNotify) gtk_widget_unref);
311
312   //set_net_info("Not connected...");
313   gtk_widget_show(net_label);
314   gtk_box_pack_start(GTK_BOX(net_vbox), net_label, TRUE, TRUE, 0);
315
316   //gtk_container_add (GTK_CONTAINER (frame4), net_label);
317
318   /*
319    *The connect button
320    */
321
322   connect_button = gtk_button_new_with_label("Connect to host");
323   gtk_widget_ref(connect_button);
324   gtk_object_set_data_full(GTK_OBJECT(main_window), "connect_button", connect_button, (GtkDestroyNotify) gtk_widget_unref);
325   /* Connect the "clicked" signal of the button to our callback */
326   gtk_signal_connect(GTK_OBJECT(connect_button), "clicked", GTK_SIGNAL_FUNC(connect_callback), NULL);
327   gtk_widget_show(connect_button);
328   gtk_box_pack_start(GTK_BOX(net_vbox), connect_button, FALSE, FALSE, 1);
329   gtk_container_set_border_width(GTK_CONTAINER(connect_button), 5);
330
331   /*
332    *The node MPR info frame
333    */
334   mpr_frame = gtk_frame_new("MPR:");
335   gtk_widget_ref(mpr_frame);
336   gtk_object_set_data_full(GTK_OBJECT(main_window), "mpr_frame", mpr_frame, (GtkDestroyNotify) gtk_widget_unref);
337   gtk_widget_show(mpr_frame);
338   gtk_box_pack_start(GTK_BOX(hbox1), mpr_frame, FALSE, FALSE, 0);
339   //gtk_widget_set_size_request(mid_frame, 125, -1);
340   gtk_container_set_border_width(GTK_CONTAINER(mpr_frame), 1);
341
342   /*
343    *The scrolledwindow to contain the MPR node info
344    */
345   mpr_scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
346   gtk_widget_ref(mpr_scrolledwindow);
347   gtk_object_set_data_full(GTK_OBJECT(main_window), "mpr_scrolledwindow", mpr_scrolledwindow, (GtkDestroyNotify) gtk_widget_unref);
348
349   gtk_widget_show(mpr_scrolledwindow);
350   gtk_container_add(GTK_CONTAINER(mpr_frame), mpr_scrolledwindow);
351   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(mpr_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
352   gtk_container_set_border_width(GTK_CONTAINER(mpr_scrolledwindow), 3);
353
354   /*
355    *The node MID info frame
356    */
357   mid_frame = gtk_frame_new("MID:");
358   gtk_widget_ref(mid_frame);
359   gtk_object_set_data_full(GTK_OBJECT(main_window), "mid_frame", mid_frame, (GtkDestroyNotify) gtk_widget_unref);
360   gtk_widget_show(mid_frame);
361   gtk_box_pack_start(GTK_BOX(hbox1), mid_frame, FALSE, FALSE, 0);
362   //gtk_widget_set_size_request(mid_frame, 125, -1);
363   gtk_container_set_border_width(GTK_CONTAINER(mid_frame), 1);
364
365   /*
366    *The scrolledwindow to contain the MID node info
367    */
368   mid_scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
369   gtk_widget_ref(mid_scrolledwindow);
370   gtk_object_set_data_full(GTK_OBJECT(main_window), "mid_scrolledwindow", mid_scrolledwindow, (GtkDestroyNotify) gtk_widget_unref);
371
372   gtk_widget_show(mid_scrolledwindow);
373   gtk_container_add(GTK_CONTAINER(mid_frame), mid_scrolledwindow);
374   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(mid_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
375   gtk_container_set_border_width(GTK_CONTAINER(mid_scrolledwindow), 3);
376
377   /*
378    *The MPR list
379    */
380   mpr_list = gtk_clist_new(1);
381   gtk_widget_ref(mpr_list);
382   gtk_object_set_data_full(GTK_OBJECT(main_window), "mpr_list", mpr_list, (GtkDestroyNotify) gtk_widget_unref);
383   gtk_widget_show(mpr_list);
384   gtk_container_add(GTK_CONTAINER(mpr_scrolledwindow), mpr_list);
385   gtk_clist_set_column_width(GTK_CLIST(mpr_list), 0, 120);      /* IP */
386   gtk_clist_column_titles_hide(GTK_CLIST(mpr_list));
387
388   /*
389    *The MID list
390    */
391   mid_list = gtk_clist_new(1);
392   gtk_widget_ref(mid_list);
393   gtk_object_set_data_full(GTK_OBJECT(main_window), "mid_list", mid_list, (GtkDestroyNotify) gtk_widget_unref);
394   gtk_widget_show(mid_list);
395   gtk_container_add(GTK_CONTAINER(mid_scrolledwindow), mid_list);
396   gtk_clist_set_column_width(GTK_CLIST(mid_list), 0, 120);      /* IP */
397   gtk_clist_column_titles_hide(GTK_CLIST(mid_list));
398
399   /*
400    *The node HNA info frame
401    */
402   hna_frame = gtk_frame_new("HNA:");
403   gtk_widget_ref(hna_frame);
404   gtk_object_set_data_full(GTK_OBJECT(main_window), "hna_frame", hna_frame, (GtkDestroyNotify) gtk_widget_unref);
405   gtk_widget_show(hna_frame);
406   gtk_box_pack_start(GTK_BOX(hbox1), hna_frame, FALSE, FALSE, 0);
407   //gtk_widget_set_size_request(mid_frame, 125, -1);
408   gtk_container_set_border_width(GTK_CONTAINER(hna_frame), 1);
409
410   /*
411    *The HNA scrolled window
412    */
413   hna_scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
414   gtk_widget_ref(hna_scrolledwindow);
415   gtk_object_set_data_full(GTK_OBJECT(main_window), "hna_scrolledwindow", hna_scrolledwindow, (GtkDestroyNotify) gtk_widget_unref);
416
417   gtk_widget_show(hna_scrolledwindow);
418   gtk_container_add(GTK_CONTAINER(hna_frame), hna_scrolledwindow);
419   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(hna_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
420   gtk_container_set_border_width(GTK_CONTAINER(hna_scrolledwindow), 3);
421
422   /*
423    *The HNA list
424    */
425   hna_list = gtk_clist_new(1);
426   gtk_widget_ref(hna_list);
427   gtk_object_set_data_full(GTK_OBJECT(main_window), "hna_list", hna_list, (GtkDestroyNotify) gtk_widget_unref);
428   gtk_widget_show(hna_list);
429   gtk_container_add(GTK_CONTAINER(hna_scrolledwindow), hna_list);
430   gtk_clist_set_column_width(GTK_CLIST(hna_list), 0, 120);      /* IP */
431   gtk_clist_column_titles_hide(GTK_CLIST(hna_list));
432
433   /*
434    *The "main" notebook page
435    */
436   Main = gtk_label_new("Main");
437   gtk_widget_ref(Main);
438   gtk_object_set_data_full(GTK_OBJECT(main_window), "Main", Main, (GtkDestroyNotify) gtk_widget_unref);
439   gtk_widget_show(Main);
440   gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 0), Main);
441
442   /*
443    *The main hbox of the Packet page
444    */
445
446   hbox2 = gtk_hbox_new(FALSE, 0);
447   gtk_widget_ref(hbox2);
448   gtk_object_set_data_full(GTK_OBJECT(main_window), "hbox2", hbox2, (GtkDestroyNotify) gtk_widget_unref);
449   gtk_widget_show(hbox2);
450   gtk_container_add(GTK_CONTAINER(notebook1), hbox2);
451
452   /*
453    *The packet hbox
454    */
455   pack_vbox = gtk_vbox_new(FALSE, 0);
456   gtk_widget_ref(pack_vbox);
457   gtk_object_set_data_full(GTK_OBJECT(main_window), "pack_vbox", pack_vbox, (GtkDestroyNotify) gtk_widget_unref);
458   gtk_widget_show(pack_vbox);
459   gtk_box_pack_start(GTK_BOX(hbox2), pack_vbox, TRUE, TRUE, 0);
460
461   /*
462    *The packet frame
463    */
464
465   frame2 = gtk_frame_new("Packet");
466   gtk_widget_ref(frame2);
467   gtk_object_set_data_full(GTK_OBJECT(main_window), "frame2", frame2, (GtkDestroyNotify) gtk_widget_unref);
468   gtk_widget_show(frame2);
469   gtk_box_pack_start(GTK_BOX(pack_vbox), frame2, TRUE, TRUE, 0);        /* Do not expand */
470
471   /*
472    *Packet list scrolled window
473    */
474   scrolledwindow4 = gtk_scrolled_window_new(NULL, NULL);
475   gtk_widget_ref(scrolledwindow4);
476   gtk_object_set_data_full(GTK_OBJECT(main_window), "scrolledwindow4", scrolledwindow4, (GtkDestroyNotify) gtk_widget_unref);
477
478   gtk_widget_show(scrolledwindow4);
479   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow4), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
480
481   gtk_container_add(GTK_CONTAINER(frame2), scrolledwindow4);
482
483   /*
484    *The packet list
485    */
486
487   packet_list = gtk_clist_new(3);
488   gtk_widget_ref(packet_list);
489   gtk_object_set_data_full(GTK_OBJECT(main_window), "packet_list", packet_list, (GtkDestroyNotify) gtk_widget_unref);
490   gtk_widget_show(packet_list);
491   gtk_container_add(GTK_CONTAINER(scrolledwindow4), packet_list);
492   gtk_clist_set_column_width(GTK_CLIST(packet_list), 0, 80);    /* Type */
493   gtk_clist_set_column_width(GTK_CLIST(packet_list), 1, 150);   /* Origin IP */
494   gtk_clist_set_column_width(GTK_CLIST(packet_list), 2, 20);    /* size */
495   gtk_clist_column_titles_show(GTK_CLIST(packet_list));
496
497   label17 = gtk_label_new("Type");
498   gtk_widget_ref(label17);
499   gtk_object_set_data_full(GTK_OBJECT(main_window), "label17", label17, (GtkDestroyNotify) gtk_widget_unref);
500   gtk_widget_show(label17);
501   gtk_clist_set_column_widget(GTK_CLIST(packet_list), 0, label17);
502
503   label18 = gtk_label_new("Origin");
504   gtk_widget_ref(label18);
505   gtk_object_set_data_full(GTK_OBJECT(main_window), "label18", label18, (GtkDestroyNotify) gtk_widget_unref);
506   gtk_widget_show(label18);
507   gtk_clist_set_column_widget(GTK_CLIST(packet_list), 1, label18);
508
509   label19 = gtk_label_new("Size");
510   gtk_widget_ref(label19);
511   gtk_object_set_data_full(GTK_OBJECT(main_window), "label19", label19, (GtkDestroyNotify) gtk_widget_unref);
512   gtk_widget_show(label19);
513   gtk_clist_set_column_widget(GTK_CLIST(packet_list), 2, label19);
514
515   /*
516    *Row selection callback
517    */
518   gtk_signal_connect(GTK_OBJECT(packet_list), "select_row", GTK_SIGNAL_FUNC(packet_selection), NULL);
519
520   /*
521    *The packet button
522    */
523
524   packet_button = gtk_button_new_with_label("Grab packets");
525   gtk_widget_ref(packet_button);
526   gtk_object_set_data_full(GTK_OBJECT(main_window), "packet_button", packet_button, (GtkDestroyNotify) gtk_widget_unref);
527
528   /* Connect the "clicked" signal of the button to our callback */
529   gtk_signal_connect(GTK_OBJECT(packet_button), "clicked", GTK_SIGNAL_FUNC(packet_callback), NULL);
530   gtk_widget_show(packet_button);
531   gtk_box_pack_start(GTK_BOX(pack_vbox), packet_button, FALSE, FALSE, 5);
532
533   /*
534    *The packet disp hbox
535    */
536   pack_disp_vbox = gtk_vbox_new(FALSE, 0);
537   gtk_widget_ref(pack_disp_vbox);
538   gtk_object_set_data_full(GTK_OBJECT(main_window), "pack_disp_vbox", pack_disp_vbox, (GtkDestroyNotify) gtk_widget_unref);
539   gtk_widget_show(pack_disp_vbox);
540   gtk_box_pack_start(GTK_BOX(hbox2), pack_disp_vbox, TRUE, TRUE, 0);
541
542   /*
543    *The packet disp frame
544    */
545
546   disp_frame = gtk_frame_new("Packet content");
547   gtk_widget_ref(disp_frame);
548   gtk_object_set_data_full(GTK_OBJECT(main_window), "disp_frame", disp_frame, (GtkDestroyNotify) gtk_widget_unref);
549   gtk_widget_show(disp_frame);
550   gtk_box_pack_start(GTK_BOX(pack_disp_vbox), disp_frame, TRUE, TRUE, 0);       /* Do not expand */
551
552   /*
553    *Scrolled window for the packet display
554    *list
555    */
556
557   scrolledwindow3 = gtk_scrolled_window_new(NULL, NULL);
558   gtk_widget_ref(scrolledwindow3);
559   gtk_object_set_data_full(GTK_OBJECT(main_window), "scrolledwindow3", scrolledwindow3, (GtkDestroyNotify) gtk_widget_unref);
560   gtk_widget_show(scrolledwindow3);
561   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow3), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
562
563   gtk_container_add(GTK_CONTAINER(disp_frame), scrolledwindow3);
564
565   //gtk_box_pack_start (GTK_BOX (disp_frame), scrolledwindow3, TRUE, TRUE, 0);
566
567   /*
568    *The packet display list
569    */
570   packet_content_list = gtk_clist_new(4);
571   gtk_widget_ref(packet_content_list);
572   gtk_object_set_data_full(GTK_OBJECT(main_window), "packet_content_list", packet_content_list,
573                            (GtkDestroyNotify) gtk_widget_unref);
574
575   gtk_widget_show(packet_content_list);
576   gtk_container_add(GTK_CONTAINER(scrolledwindow3), packet_content_list);
577   gtk_clist_set_column_width(GTK_CLIST(packet_content_list), 0, 70);    /* 0-7 */
578   gtk_clist_set_column_justification(GTK_CLIST(packet_content_list), 0, GTK_JUSTIFY_CENTER);
579   gtk_clist_set_column_width(GTK_CLIST(packet_content_list), 1, 70);    /* 8-15 */
580   gtk_clist_set_column_justification(GTK_CLIST(packet_content_list), 1, GTK_JUSTIFY_CENTER);
581   gtk_clist_set_column_width(GTK_CLIST(packet_content_list), 2, 70);    /* 16-23 */
582   gtk_clist_set_column_justification(GTK_CLIST(packet_content_list), 2, GTK_JUSTIFY_CENTER);
583   gtk_clist_set_column_width(GTK_CLIST(packet_content_list), 3, 70);    /* 24-31 */
584   gtk_clist_set_column_justification(GTK_CLIST(packet_content_list), 3, GTK_JUSTIFY_CENTER);
585   gtk_clist_column_titles_show(GTK_CLIST(packet_content_list));
586
587   label13 = gtk_label_new("0 - 7");
588   gtk_widget_ref(label13);
589   gtk_object_set_data_full(GTK_OBJECT(main_window), "label13", label13, (GtkDestroyNotify) gtk_widget_unref);
590   gtk_widget_show(label13);
591   gtk_clist_set_column_widget(GTK_CLIST(packet_content_list), 0, label13);
592
593   label14 = gtk_label_new("8 - 15");
594   gtk_widget_ref(label14);
595   gtk_object_set_data_full(GTK_OBJECT(main_window), "label14", label14, (GtkDestroyNotify) gtk_widget_unref);
596   gtk_widget_show(label14);
597   gtk_clist_set_column_widget(GTK_CLIST(packet_content_list), 1, label14);
598
599   label15 = gtk_label_new("16 - 23");
600   gtk_widget_ref(label15);
601   gtk_object_set_data_full(GTK_OBJECT(main_window), "label15", label15, (GtkDestroyNotify) gtk_widget_unref);
602   gtk_widget_show(label15);
603   gtk_clist_set_column_widget(GTK_CLIST(packet_content_list), 2, label15);
604
605   label16 = gtk_label_new("24 - 31");
606   gtk_widget_ref(label16);
607   gtk_object_set_data_full(GTK_OBJECT(main_window), "label16", label16, (GtkDestroyNotify) gtk_widget_unref);
608   gtk_widget_show(label16);
609   gtk_clist_set_column_widget(GTK_CLIST(packet_content_list), 3, label16);
610
611   //gtk_clist_set_selection_mode(GTK_CLIST (packet_content_list), GTK_SELECTION_NONE); /* no selections */
612
613   /*
614    *The packet button
615    */
616
617   packet_disp_button = gtk_button_new_with_label("Display hex");
618   gtk_widget_ref(packet_disp_button);
619   gtk_object_set_data_full(GTK_OBJECT(main_window), "packet_disp_button", packet_disp_button, (GtkDestroyNotify) gtk_widget_unref);
620
621   /* Connect the "clicked" signal of the button to our callback */
622   gtk_signal_connect(GTK_OBJECT(packet_disp_button), "clicked", GTK_SIGNAL_FUNC(packet_disp_callback), NULL);
623   gtk_widget_show(packet_disp_button);
624   gtk_box_pack_start(GTK_BOX(pack_disp_vbox), packet_disp_button, FALSE, FALSE, 5);
625
626   /*
627    *The "packets" notebook
628    */
629
630   label_packets = gtk_label_new("Packets");
631   gtk_widget_ref(label_packets);
632   gtk_object_set_data_full(GTK_OBJECT(main_window), "label_packets", label_packets, (GtkDestroyNotify) gtk_widget_unref);
633   gtk_widget_show(label_packets);
634   gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 1), label_packets);
635
636   /*
637    *The route hbox
638    */
639   route_hbox1 = gtk_hbox_new(FALSE, 0);
640   gtk_widget_ref(route_hbox1);
641   gtk_object_set_data_full(GTK_OBJECT(main_window), "route_hbox1", route_hbox1, (GtkDestroyNotify) gtk_widget_unref);
642   gtk_widget_show(route_hbox1);
643   //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
644   gtk_container_add(GTK_CONTAINER(notebook1), route_hbox1);
645
646   /*
647    *The routes frame
648    */
649
650   route_frame = gtk_frame_new("OLSR routes in kernel:");
651   gtk_widget_ref(route_frame);
652   gtk_object_set_data_full(GTK_OBJECT(main_window), "route_frame", route_frame, (GtkDestroyNotify) gtk_widget_unref);
653   gtk_widget_show(route_frame);
654
655   //gtk_container_add (GTK_CONTAINER (notebook1), route_frame);
656   gtk_widget_set_size_request(route_frame, 200, -1);
657   gtk_box_pack_start(GTK_BOX(route_hbox1), route_frame, TRUE, TRUE, 0); /* Do not expand */
658
659   /*
660    *Scrolled window for the packet display
661    *list
662    */
663
664   route_scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
665   gtk_widget_ref(route_scrolledwindow);
666   gtk_object_set_data_full(GTK_OBJECT(main_window), "route_scrolledwindow", route_scrolledwindow,
667                            (GtkDestroyNotify) gtk_widget_unref);
668   gtk_widget_show(route_scrolledwindow);
669   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(route_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
670
671   gtk_container_add(GTK_CONTAINER(route_frame), route_scrolledwindow);
672
673   //gtk_box_pack_start (GTK_BOX (route_frame), scrolledwindow3, TRUE, TRUE, 0);
674
675   /*
676    *The routes display list
677    */
678   route_list = gtk_clist_new(4);
679   gtk_widget_ref(route_list);
680   gtk_object_set_data_full(GTK_OBJECT(main_window), "route_list", route_list, (GtkDestroyNotify) gtk_widget_unref);
681
682   gtk_widget_show(route_list);
683   gtk_container_add(GTK_CONTAINER(route_scrolledwindow), route_list);
684   gtk_clist_set_column_width(GTK_CLIST(route_list), 0, 120);    /* dest */
685   //gtk_clist_set_column_justification(GTK_CLIST (route_list), 0, GTK_JUSTIFY_CENTER);
686   gtk_clist_set_column_width(GTK_CLIST(route_list), 1, 120);    /* gw */
687   //gtk_clist_set_column_justification(GTK_CLIST (route_list), 1, GTK_JUSTIFY_CENTER);
688   gtk_clist_set_column_width(GTK_CLIST(route_list), 2, 50);     /* weight */
689   gtk_clist_set_column_justification(GTK_CLIST(route_list), 2, GTK_JUSTIFY_CENTER);
690   gtk_clist_set_column_width(GTK_CLIST(route_list), 3, 70);     /* interface */
691   gtk_clist_set_column_justification(GTK_CLIST(route_list), 3, GTK_JUSTIFY_CENTER);
692   gtk_clist_column_titles_show(GTK_CLIST(route_list));
693
694   route_label1 = gtk_label_new("Destination");
695   gtk_widget_ref(route_label1);
696   gtk_object_set_data_full(GTK_OBJECT(main_window), "route_label1", route_label1, (GtkDestroyNotify) gtk_widget_unref);
697   gtk_widget_show(route_label1);
698   gtk_clist_set_column_widget(GTK_CLIST(route_list), 0, route_label1);
699
700   route_label2 = gtk_label_new("Gateway");
701   gtk_widget_ref(route_label2);
702   gtk_object_set_data_full(GTK_OBJECT(main_window), "route_label2", route_label2, (GtkDestroyNotify) gtk_widget_unref);
703   gtk_widget_show(route_label2);
704   gtk_clist_set_column_widget(GTK_CLIST(route_list), 1, route_label2);
705
706   route_label3 = gtk_label_new("Weight");
707   gtk_widget_ref(route_label3);
708   gtk_object_set_data_full(GTK_OBJECT(main_window), "route_label3", route_label3, (GtkDestroyNotify) gtk_widget_unref);
709   gtk_widget_show(route_label3);
710   gtk_clist_set_column_widget(GTK_CLIST(route_list), 2, route_label3);
711
712   route_label4 = gtk_label_new("Interface");
713   gtk_widget_ref(route_label4);
714   gtk_object_set_data_full(GTK_OBJECT(main_window), "route_label4", route_label4, (GtkDestroyNotify) gtk_widget_unref);
715   gtk_widget_show(route_label4);
716   gtk_clist_set_column_widget(GTK_CLIST(route_list), 3, route_label4);
717
718   //gtk_clist_set_selection_mode(GTK_CLIST (route_list), GTK_SELECTION_NONE); /* no selections */
719
720   /*
721    *The routes stats frame
722    */
723
724   route_stats_frame = gtk_frame_new("Stats:");
725   gtk_widget_ref(route_stats_frame);
726   gtk_object_set_data_full(GTK_OBJECT(main_window), "route_stats_frame", route_stats_frame, (GtkDestroyNotify) gtk_widget_unref);
727   gtk_widget_show(route_stats_frame);
728
729   //gtk_container_add (GTK_CONTAINER (notebook1), route_frame);
730   gtk_box_pack_start(GTK_BOX(route_hbox1), route_stats_frame, TRUE, TRUE, 1);
731
732   /*
733    *The "routes" notebook
734    */
735   label_routes = gtk_label_new("Routes");
736   gtk_widget_ref(label_routes);
737   gtk_object_set_data_full(GTK_OBJECT(main_window), "label_routes", label_routes, (GtkDestroyNotify) gtk_widget_unref);
738   gtk_widget_show(label_routes);
739   gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 2), label_routes);
740
741   empty1 = gtk_vbox_new(FALSE, 0);
742   gtk_widget_show(empty1);
743   gtk_container_add(GTK_CONTAINER(notebook1), empty1);
744
745   /*
746    *The "traffic" notebook
747    */
748   traffic_label = gtk_label_new("Traffic");
749   gtk_widget_ref(traffic_label);
750   gtk_object_set_data_full(GTK_OBJECT(main_window), "traffic_label", traffic_label, (GtkDestroyNotify) gtk_widget_unref);
751   gtk_widget_show(traffic_label);
752   gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 3), traffic_label);
753
754   /*
755    *The settings hbox
756    */
757   settings_hbox1 = gtk_hbox_new(FALSE, 0);
758   gtk_widget_ref(settings_hbox1);
759   gtk_object_set_data_full(GTK_OBJECT(main_window), "settings_hbox1", settings_hbox1, (GtkDestroyNotify) gtk_widget_unref);
760   gtk_widget_show(settings_hbox1);
761   //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
762   gtk_container_add(GTK_CONTAINER(notebook1), settings_hbox1);
763
764   /*
765    *The settings-info label field
766    */
767   info_label = gtk_label_new(NULL);
768   gtk_widget_ref(info_label);
769   gtk_misc_set_alignment((GtkMisc *) info_label, 0, 0);
770   //gtk_label_set_justify((GtkLabel *)net_label,GTK_JUSTIFY_LEFT);
771   gtk_object_set_data_full(GTK_OBJECT(main_window), "info_label", info_label, (GtkDestroyNotify) gtk_widget_unref);
772
773   //set_net_info("Not connected...");
774   gtk_widget_show(info_label);
775   gtk_box_pack_start(GTK_BOX(settings_hbox1), info_label, TRUE, TRUE, 0);
776
777   /*
778    *The "settings" notebook
779    */
780   settings_label = gtk_label_new("Settings");
781   gtk_widget_ref(settings_label);
782   gtk_object_set_data_full(GTK_OBJECT(main_window), "settings_label", settings_label, (GtkDestroyNotify) gtk_widget_unref);
783   gtk_widget_show(settings_label);
784   gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 4), settings_label);
785
786   /*
787    *The "about" hbox
788    */
789   about_hbox1 = gtk_hbox_new(FALSE, 0);
790   gtk_widget_ref(about_hbox1);
791   gtk_object_set_data_full(GTK_OBJECT(main_window), "about_hbox1", about_hbox1, (GtkDestroyNotify) gtk_widget_unref);
792   gtk_widget_show(about_hbox1);
793   //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
794   gtk_container_add(GTK_CONTAINER(notebook1), about_hbox1);
795   gtk_container_set_border_width(GTK_CONTAINER(about_hbox1), 10);
796
797   /*
798    *The about label field
799    */
800   about_label = gtk_label_new(NULL);
801   gtk_widget_ref(about_label);
802   gtk_misc_set_alignment((GtkMisc *) about_label, 0, 0);
803   gtk_label_set_justify((GtkLabel *) about_label, GTK_JUSTIFY_CENTER);
804   gtk_object_set_data_full(GTK_OBJECT(main_window), "about_label", about_label, (GtkDestroyNotify) gtk_widget_unref);
805
806   //set_net_info("Not connected...");
807   gtk_widget_show(about_label);
808   gtk_box_pack_start(GTK_BOX(about_hbox1), unik_logo, TRUE, TRUE, 0);
809   gtk_box_pack_start(GTK_BOX(about_hbox1), about_label, TRUE, TRUE, 0);
810   gtk_widget_show(unik_logo);
811
812   gtk_label_set_text((GtkLabel *) about_label, "OLSRD-GUI by Andreas Tonnesen (andreto@ifi.uio.no)");
813
814   /*
815    *The "about" notebook
816    */
817   label3 = gtk_label_new("About");
818   gtk_widget_ref(label3);
819   gtk_object_set_data_full(GTK_OBJECT(main_window), "About", label3, (GtkDestroyNotify) gtk_widget_unref);
820   gtk_widget_show(label3);
821   gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 5), label3);
822
823   return main_window;
824
825 }
826
827 /*
828  *Add a node to the node list
829  */
830 void
831 route_list_add(char *dest, char *gw, char *metric, char *dev)
832 {
833   gchar *tmp[4] = { dest, gw, dev, metric };
834   route_list_size++;
835
836   gtk_clist_freeze(GTK_CLIST(route_list));
837
838   gtk_clist_append(GTK_CLIST(route_list), tmp);
839
840   gtk_clist_thaw(GTK_CLIST(route_list));
841
842 }
843
844 /*
845  *Update the entyr with IP 'addr'
846  */
847 void
848 route_list_update(char *addr __attribute__((unused)))
849 {
850
851 }
852
853 /*
854  *Delete a node from the node list
855  */
856 int
857 route_list_del(char *dest)
858 {
859   int i = 0;
860   char *ip;
861
862   gtk_clist_freeze(GTK_CLIST(route_list));
863
864   for (i = 0; i < route_list_size; i++) {
865     gtk_clist_get_text(GTK_CLIST(route_list), i, 0, (gchar **) & ip);
866     if (strcmp(dest, ip) == 0) {
867       //printf("Found %d\n", i);
868       gtk_clist_remove(GTK_CLIST(route_list), i);
869       route_list_size--;
870       gtk_clist_thaw(GTK_CLIST(route_list));
871       return 1;
872     }
873   }
874
875   gtk_clist_thaw(GTK_CLIST(route_list));
876   return 0;
877 }
878
879 /*
880  *Remove a node from the list
881  */
882 int
883 remove_nodes_list(union olsr_ip_addr *node)
884 {
885   char *ip;
886   char *in_ip = ip_to_string(node);
887   int i;
888
889   for (i = 0; i < node_list_size; i++) {
890     gtk_clist_get_text(GTK_CLIST(node_list), i, 0, (gchar **) & ip);
891     if (strcmp(in_ip, ip) == 0) {
892       //printf("Found entry!\n");
893       gtk_clist_remove(GTK_CLIST(node_list), i);
894       node_list_size--;
895       return 1;
896     }
897   }
898
899   return 0;
900 }
901
902 /*
903  *If the node passed as a parameter exists then
904  *update it. If not add it to the list
905  */
906 void
907 update_nodes_list(struct node *node)
908 {
909   int i = 0;
910   char *ip;
911   int found = 0;
912   char *dest;
913   char *tmp[9] = { (char *)"", (char *)"", (char *)"", (char *)"", (char *)"", (char *)"", (char *)"", (char *)"", (char *)"" };
914   char timer[20];
915   struct tm *time_st;
916   char itoa_buf[10];
917
918   if (memcmp(&node->addr, &main_addr, ipsize) == 0)
919     dest = (char *)"local";
920   else
921     dest = ip_to_string(&node->addr);
922
923   gtk_clist_freeze(GTK_CLIST(node_list));
924
925   while ((i < node_list_size) && !found) {
926     gtk_clist_get_text(GTK_CLIST(node_list), i, 0, (gchar **) & ip);
927     if (strcmp(dest, ip) == 0)
928       found = 1;
929     i++;
930   }
931
932   /* Update node */
933   if (found) {
934     i--;                        /* Go backt to the right row */
935     //printf("Updating %s\n\n", ip_to_string(&node->addr));
936     /* don't update main addr */
937     /* Gateway */
938     if (memcmp(&node->addr, &main_addr, ipsize) != 0) {
939       if (memcmp(&node->gw_addr, &null_addr, ipsize) != 0)
940         gtk_clist_set_text(GTK_CLIST(node_list), i, 1, ip_to_string(&node->gw_addr));
941       /* Weigth */
942       if (node->hopcount != 0) {
943         gui_itoa(node->hopcount, itoa_buf);
944         gtk_clist_set_text(GTK_CLIST(node_list), i, 2, itoa_buf);
945       }
946       /* Device */
947       gtk_clist_set_text(GTK_CLIST(node_list), i, 3, &node->dev[0]);
948     }
949
950     /* Timer */
951     if (node->timer.tv_usec) {
952       memset(&timer[0], 0, 20);
953       time_st = localtime((time_t *) & node->timer.tv_sec);
954       sprintf(&timer[0], "%02d:%02d:%02d", time_st->tm_hour, time_st->tm_min, time_st->tm_sec);
955       gtk_clist_set_text(GTK_CLIST(node_list), i, 4, &timer[0]);
956     }
957
958     /* MID */
959     if (node->mid.next != &node->mid)
960       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "yes");
961     else
962       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "no");
963     /* HNA */
964     if (node->hna.next != &node->hna)
965       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "yes");
966     else
967       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "no");
968
969   }
970   /* Add new node */
971   else {
972     i = node_list_size;
973     /* Create entry */
974     gtk_clist_insert(GTK_CLIST(node_list), i, tmp);
975     /* Main address */
976     gtk_clist_set_text(GTK_CLIST(node_list), i, 0, dest);
977     if (memcmp(&node->addr, &main_addr, ipsize) == 0) {
978       if (memcmp(&node->gw_addr, &null_addr, ipsize) != 0)
979         gtk_clist_set_text(GTK_CLIST(node_list), i, 1, ip_to_string(&node->gw_addr));
980       /* Weigth */
981       if (node->hopcount != 0) {
982         gui_itoa(node->hopcount, itoa_buf);
983         gtk_clist_set_text(GTK_CLIST(node_list), i, 2, itoa_buf);
984       }
985       /* Device */
986       gtk_clist_set_text(GTK_CLIST(node_list), i, 3, &node->dev[0]);
987     }
988
989     /* MID */
990     if (node->mid.next != &node->mid)
991       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "yes");
992     else
993       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "no");
994     /* HNA */
995     if (node->hna.next != &node->hna)
996       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "yes");
997     else
998       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "no");
999
1000     node_list_size++;
1001   }
1002
1003   gtk_clist_thaw(GTK_CLIST(node_list));
1004
1005 }
1006
1007 /*
1008  *Add a packet to the packet list
1009  */
1010 void
1011 packet_list_add(char *type, char *from, char *length)
1012 {
1013   gchar *nfo[3] = { type, from, length };
1014
1015   //if(!freeze_packets)
1016   //{
1017   if (packet_list_size >= MAXPACKS)
1018     gtk_clist_remove(GTK_CLIST(packet_list), MAXPACKS - 1);
1019   else
1020     packet_list_size++;
1021
1022   gtk_clist_prepend(GTK_CLIST(packet_list), nfo);
1023
1024   //}
1025
1026 }
1027
1028 void
1029 set_net_info(gchar * info, int disp_button)
1030 {
1031   gchar title[255];
1032
1033   memset(&title[0], 0, 255);
1034   gtk_label_set_text((GtkLabel *) info_label, info);
1035   gtk_label_set_text((GtkLabel *) net_label, "Connected");
1036
1037   strcat(title, olsrd_version);
1038   strcat(title, " - ");
1039   strcat(title, ip_to_string(&main_addr));
1040
1041   gtk_window_set_title(GTK_WINDOW(main_window), title);
1042
1043   if (disp_button)
1044     gtk_widget_show(connect_button);
1045   else
1046     gtk_widget_hide(connect_button);
1047 }
1048
1049 void
1050 set_net_info_offline(void)
1051 {
1052   gtk_label_set_text((GtkLabel *) net_label, "Connection refused...");
1053   gtk_widget_show(connect_button);
1054 }
1055
1056 void
1057 set_net_info_connecting(void)
1058 {
1059   gtk_label_set_text((GtkLabel *) net_label, "Connecting...");
1060 }
1061
1062 /*
1063  * Local Variables:
1064  * c-basic-offset: 2
1065  * indent-tabs-mode: nil
1066  * End:
1067  */