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