This commit was generated by cvs2svn to compensate for changes in r158,
[gnokii.git] / xgnokii / xgnokii_netmon.c
1 /*
2
3   X G N O K I I
4
5   A Linux/Unix GUI for Nokia mobile phones.
6   Copyright (C) 1999 Pavel Janík ml., Hugh Blemings
7   & Ján Derfiòák <ja@mail.upjs.sk>.
8
9   Released under the terms of the GNU GPL, see file COPYING for more details.
10
11   Last modification: Sun Apr 30 2000
12   Modified by Jan Derfinak
13
14 */
15
16 #ifndef WIN32
17 # include <unistd.h>
18 #endif
19 #include <pthread.h>
20 #include <stdlib.h>  /* for atoi */
21 #include <string.h>
22 #include <gtk/gtk.h>
23 #include "misc.h"
24 #include "xgnokii_common.h"
25 #include "xgnokii.h"
26 #include "xgnokii_lowlevel.h"
27 #include "xgnokii_netmon.h"
28 #include "xpm/Display.xpm"
29
30 static GtkWidget *GUI_NetmonWindow;
31 static DisplayData displayData = {NULL, 0};
32 static GtkWidget *tableLabels[4][7];
33 static GtkWidget *tableProgress[7];
34
35
36 static inline void Help1 (GtkWidget *w, gpointer data)
37 {
38   gchar *indx = g_strdup_printf ("/help/%s/windows/netmon/index.html", xgnokiiConfig.locale);
39   Help (w, indx);
40   g_free (indx);
41 }
42
43
44 static inline void CloseNetmon (GtkWidget *w, gpointer data)
45 {
46   PhoneEvent *e;
47
48   e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
49   e->event = Event_NetMonitor;
50   e->data = (gpointer) 0;
51   GUI_InsertEvent (e);
52   gtk_widget_hide (GUI_NetmonWindow);
53 }
54
55
56 static inline void NetmonOnOff (GtkWidget *w, gpointer data)
57 {
58   PhoneEvent *e;
59
60   e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
61   e->event = Event_NetMonitorOnOff;
62   e->data = data;
63   GUI_InsertEvent (e);
64 }
65
66
67 static inline void RefreshDisplay ()
68 {
69   static gchar number[3];
70
71   if (!GTK_WIDGET_VISIBLE(GUI_NetmonWindow))
72     return;
73
74   g_snprintf (number, 3, "%.2d", displayData.curDisp);
75   if (displayData.number)
76     gtk_label_set_text (GTK_LABEL (displayData.number), number);
77
78   pthread_mutex_lock (&netMonMutex);
79   if (phoneMonitor.netmonitor.screen && displayData.label)
80     gtk_label_set_text (GTK_LABEL (displayData.label),
81                         g_strchomp (phoneMonitor.netmonitor.screen));
82   pthread_mutex_unlock (&netMonMutex);
83 }
84
85
86 static void SetDisplay (GtkWidget *widget, gpointer data)
87 {
88   PhoneEvent *e;
89
90   e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
91   e->event = Event_NetMonitor;
92   e->data = data;
93   GUI_InsertEvent (e);
94   displayData.curDisp = GPOINTER_TO_INT (data);
95
96   RefreshDisplay ();
97 }
98
99 static void ChangedSpinner (GtkWidget *widget, GtkSpinButton *spin)
100 {
101   PhoneEvent *e;
102
103   displayData.curDisp = gtk_spin_button_get_value_as_int (spin);
104   e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
105   e->event = Event_NetMonitor;
106   e->data = (gpointer) displayData.curDisp;
107   GUI_InsertEvent (e);
108
109   RefreshDisplay ();
110 }
111
112
113 static void ParseScreen (gchar *screen, gint i)
114 {
115   gchar buf[5];
116   gchar *ptr = screen;
117
118   if (ptr == NULL || *ptr == '\0')
119     return;
120
121   strncpy (buf, ptr, 3);
122   buf[3] = '\0';
123   gtk_label_set_text (GTK_LABEL (tableLabels[0][i]), buf);
124   ptr += 3;
125   strncpy (buf, ptr, 3);
126   buf[3] = '\0';
127   gtk_label_set_text (GTK_LABEL (tableLabels[2][i]), buf);
128   ptr += 3;
129   if (*ptr != '-')
130   {
131     buf[0] = '-';
132     strncpy (buf + 1, ptr, 3);
133     buf[4] = '\0';
134   }
135   else
136   {
137     strncpy (buf, ptr, 3);
138     buf[3] = '\0';
139   }
140   gtk_label_set_text (GTK_LABEL (tableLabels[1][i]), buf);
141   ptr += 3;
142   gtk_progress_set_value (GTK_PROGRESS (tableProgress[i]), atoi (buf));
143   strncpy (buf, ptr, 3);
144   buf[3] = '\0';
145   gtk_label_set_text (GTK_LABEL (tableLabels[3][i]), buf);
146   ptr += 4;
147
148   if (i == 6)
149     return;
150
151   i++;
152   strncpy (buf, ptr, 3);
153   buf[3] = '\0';
154   gtk_label_set_text (GTK_LABEL (tableLabels[0][i]), buf);
155   ptr += 3;
156   strncpy (buf, ptr, 3);
157   buf[3] = '\0';
158   gtk_label_set_text (GTK_LABEL (tableLabels[2][i]), buf);
159   ptr += 3;
160   if (*ptr != '-')
161   {
162     buf[0] = '-';
163     strncpy (buf + 1, ptr, 3);
164     buf[4] = '\0';
165   }
166   else
167   {
168     strncpy (buf, ptr, 3);
169     buf[3] = '\0';
170   }
171   gtk_label_set_text (GTK_LABEL (tableLabels[1][i]), buf);
172   ptr += 3;
173   gtk_progress_set_value (GTK_PROGRESS (tableProgress[i]), atoi (buf));
174   strncpy (buf, ptr, 3);
175   buf[3] = '\0';
176   gtk_label_set_text (GTK_LABEL (tableLabels[3][i]), buf);
177   ptr += 4;
178
179   i++;
180   strncpy (buf, ptr, 3);
181   buf[3] = '\0';
182   gtk_label_set_text (GTK_LABEL (tableLabels[0][i]), buf);
183   ptr += 3;
184   strncpy (buf, ptr, 3);
185   buf[3] = '\0';
186   gtk_label_set_text (GTK_LABEL (tableLabels[2][i]), buf);
187   ptr += 3;
188   if (*ptr != '-')
189   {
190     buf[0] = '-';
191     strncpy (buf + 1, ptr, 3);
192     buf[4] = '\0';
193   }
194   else
195   {
196     strncpy (buf, ptr, 3);
197     buf[3] = '\0';
198   }
199   gtk_label_set_text (GTK_LABEL (tableLabels[1][i]), buf);
200   ptr += 3;
201   gtk_progress_set_value (GTK_PROGRESS (tableProgress[i]), atoi (buf));
202   strncpy (buf, ptr, 3);
203   buf[3] = '\0';
204   gtk_label_set_text (GTK_LABEL (tableLabels[3][i]), buf);
205 }
206
207
208 void GUI_RefreshNetmon ()
209 {
210   if (!GTK_WIDGET_VISIBLE (GUI_NetmonWindow))
211     return;
212
213   pthread_mutex_lock (&netMonMutex);
214   ParseScreen (phoneMonitor.netmonitor.screen3, 0);
215   ParseScreen (phoneMonitor.netmonitor.screen4, 3);
216   ParseScreen (phoneMonitor.netmonitor.screen5, 6);
217   pthread_mutex_unlock (&netMonMutex);
218
219   RefreshDisplay ();
220 }
221
222
223 void AddToBorder (GtkWidget* table, gchar *text, gint i, gint j, gint k, gint l)
224 {
225   GtkWidget *label = gtk_label_new (text);
226   GtkWidget *frame = gtk_frame_new (NULL);
227
228   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
229   gtk_container_add (GTK_CONTAINER (frame), label);
230   gtk_table_attach_defaults (GTK_TABLE (table), frame, i, j, k, l);
231 }
232
233
234 inline void GUI_ShowNetmon ()
235 {
236   PhoneEvent *e;
237
238   e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
239   e->event = Event_NetMonitor;
240   e->data = (gpointer) displayData.curDisp;;
241   GUI_InsertEvent (e);
242   gtk_widget_show (GUI_NetmonWindow);
243 }
244
245 static GtkItemFactoryEntry menu_items[] = {
246   { NULL, NULL,         NULL, 0, "<Branch>"},
247   { NULL, "<control>W", CloseNetmon, 0, NULL},
248   { NULL, NULL,         NULL, 0, "<Branch>"},
249   { NULL, NULL,         NetmonOnOff, 1, NULL},
250   { NULL, NULL,         NetmonOnOff, 0, NULL},
251   { NULL, NULL,         NULL, 0, "<LastBranch>"},
252   { NULL, NULL,         Help1, 0, NULL},
253   { NULL, NULL,         GUI_ShowAbout, 0, NULL},
254 };
255
256
257 static void InitMainMenu (void)
258 {
259   menu_items[0].path = g_strdup (_("/_File"));
260   menu_items[1].path = g_strdup (_("/File/_Close"));
261   menu_items[2].path = g_strdup (_("/_Tools"));
262   menu_items[3].path = g_strdup (_("/Tools/Net monitor o_n"));
263   menu_items[4].path = g_strdup (_("/Tools/Net monitor o_ff"));
264   menu_items[5].path = g_strdup (_("/_Help"));
265   menu_items[6].path = g_strdup (_("/Help/_Help"));
266   menu_items[7].path = g_strdup (_("/Help/_About"));
267 }
268
269
270 #define DISPLAY_X       12
271 #define DISPLAY_Y       15
272   
273 static inline gint ExposeDisplay (GtkWidget *widget, GdkEventExpose *event)
274 {
275   GdkRectangle rec;
276   GtkRequisition r;
277
278   gtk_widget_size_request (displayData.number, &r);
279   rec.x = DISPLAY_X;
280   rec.y = DISPLAY_Y;
281   rec.width = r.width;
282   rec.height = r.height;
283   gtk_widget_draw (displayData.number, &rec);
284
285   gtk_widget_size_request (displayData.label, &r);
286   rec.x += 3;
287   rec.y += 12;
288   rec.width = r.width;
289   rec.height = r.height;
290   gtk_widget_draw (displayData.label, &rec);
291
292   return FALSE;
293 }
294
295
296 void GUI_CreateNetmonWindow ()
297 {
298   int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
299   GtkItemFactory *item_factory;
300   GtkAccelGroup *accel_group;
301   GtkWidget *menubar;
302   GtkWidget *main_vbox;
303   GtkWidget *hbox, *vbox;
304   GtkWidget *toolbar;
305   GtkWidget *table;
306   GtkWidget *display;
307   GtkWidget *label;
308   GtkWidget *frame;
309   GtkWidget *button;
310   GtkWidget *pixmap;
311   GtkAdjustment *adj;
312   gint i,j;
313
314
315   InitMainMenu ();
316   GUI_NetmonWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
317   gtk_window_set_wmclass (GTK_WINDOW (GUI_NetmonWindow), "NetmonWindow", "Xgnokii");
318   gtk_window_set_title (GTK_WINDOW (GUI_NetmonWindow), _("Net Monitor"));
319   //gtk_widget_set_usize (GTK_WIDGET (GUI_NetmonWindow), 436, 220);
320   gtk_signal_connect (GTK_OBJECT (GUI_NetmonWindow), "delete_event",
321                       GTK_SIGNAL_FUNC (DeleteEvent), NULL);
322   gtk_widget_realize (GUI_NetmonWindow);
323
324   accel_group = gtk_accel_group_new ();
325   item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", 
326                                        accel_group);
327
328   gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
329
330   gtk_accel_group_attach (accel_group, GTK_OBJECT (GUI_NetmonWindow));
331   
332   /* Finally, return the actual menu bar created by the item factory. */ 
333   menubar = gtk_item_factory_get_widget (item_factory, "<main>");
334
335   main_vbox = gtk_vbox_new (FALSE, 1);
336   gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
337   gtk_container_add (GTK_CONTAINER (GUI_NetmonWindow), main_vbox);
338   gtk_widget_show (main_vbox);
339
340   gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
341   gtk_widget_show (menubar);
342
343   frame = gtk_frame_new (NULL);
344   gtk_container_border_width (GTK_CONTAINER (frame), 10);
345   gtk_widget_show (frame);
346
347   hbox = gtk_hbox_new (FALSE, 0);
348   gtk_container_border_width (GTK_CONTAINER (hbox), 3);
349   gtk_container_add (GTK_CONTAINER (frame), hbox);
350
351   gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
352   gtk_widget_show (hbox);
353
354   display = gtk_fixed_new ();
355   gtk_box_pack_start (GTK_BOX (hbox), display, FALSE, FALSE, 10);
356   gtk_widget_show (display);
357
358   pixmap = NewPixmap (Display_xpm, GUI_NetmonWindow->window,
359                       &GUI_NetmonWindow->style->bg[GTK_STATE_NORMAL]);
360
361   gtk_signal_connect_after (GTK_OBJECT (pixmap), "expose_event",
362                       (GtkSignalFunc) ExposeDisplay, NULL);
363
364   gtk_fixed_put (GTK_FIXED (display), pixmap, 0 , 0);
365   gtk_widget_show (pixmap);
366
367   displayData.number = gtk_label_new ("");
368   gtk_fixed_put (GTK_FIXED (display), displayData.number, DISPLAY_X, DISPLAY_Y);
369   gtk_widget_show (displayData.number);
370   displayData.label = gtk_label_new ("");
371   gtk_fixed_put (GTK_FIXED (display), displayData.label, DISPLAY_X + 3, DISPLAY_Y + 12);
372   gtk_widget_show (displayData.label);
373   displayData.curDisp = 0x01;
374
375   vbox = gtk_vbox_new (TRUE, 0);
376
377   /* 1. line */
378   toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT);
379   gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
380
381   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "1", _("Active cell"),
382                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 1);
383
384   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "2", _("Active cell"),
385                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 2);
386
387   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "3", _("NCELL list I"),
388                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 3);
389
390   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "4", _("NCELL list II"),
391                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 4);
392
393   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "5", _("NCELL list III"),
394                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 5);
395
396   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "6", _("Prefered/Denied networks"),
397                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 6);
398
399   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "7", _("System information bits"),
400                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 7);
401
402   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "10", _("TMSI, Paging, PLU"),
403                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 10);
404
405   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "11", _("Cells info"),
406                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 11);
407
408   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "12", _("DTX, Cipher, Hopping"),
409                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 12);
410
411   gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 0);
412   gtk_widget_show (toolbar);
413
414   /* 2. line */
415   toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT);
416   gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
417
418   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "13", _("Uplink DTX"),
419                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 13);
420
421   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "17", _("BTS TEST"),
422                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 17);
423
424   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "19", _("CELL BARR-Flag"),
425                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 19);
426
427   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "20", _("Accumulator, Charge status"),
428                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 20);
429
430   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "21", _("?Constant voltage charging display"),
431                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 21);
432
433   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "22", _("?Battery full detection"),
434                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 22);
435
436   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "23", _("Accumulator"),
437                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 23);
438
439   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "35", _("SW-Resets"),
440                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 35);
441
442   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "36", _("Reset-Counter"),
443                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 36);
444
445   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "39", _("Cause codes for last connection abortion"),
446                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 39);
447
448   gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 0);
449   gtk_widget_show (toolbar);
450
451   /* 3. line */
452   toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT);
453   gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
454
455   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "40", _("Reset handover counters"),
456                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 40);
457
458   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "41", _("Handover Counter"),
459                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 41);
460
461   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "42", _("Handover Counter (Dual)"),
462                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 42);
463
464   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "43", _("L2-Timeouts"),
465                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 43);
466
467   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "51", _("SIM"),
468                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 51);
469
470   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "54", _("?Block display 1"),
471                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 54);
472
473   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "56", NULL,
474                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 56);
475
476   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "57", _("Memory status before reset"),
477                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 57);
478
479   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "60", _("Reset Counters"),
480                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 60);
481
482   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "61", _("Counter for PLMN Search and Cell reselection (Singleband)"),
483                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 61);
484
485   gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 0);
486   gtk_widget_show (toolbar);
487
488   /* 4. line */
489   toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT);
490   gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
491
492   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "62", _("Neighbourhood measurement"),
493                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 62);
494
495   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "63", _("Calls"),
496                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 63);
497
498   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "70", _("Temporary counters of DSP"),
499                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 70);
500
501   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "83", _("Control of task information displays"),
502                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 83);
503
504   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "84", _("Information about task numbers 0-7"),
505                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 84);
506
507   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "85", _("Information about task numbers 8-15"),
508                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 85);
509
510   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "86", _("Information about task numbers 16-23"),
511                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 86);
512
513   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "87", _("Information about OS_SYSTEM_STACK"),
514                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 87);
515
516   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "88", _("Information about current MCU and DSP software versions"),
517                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 88);
518
519   gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "89", _("Hardware version"),
520                            NULL, NULL, (GtkSignalFunc) SetDisplay, (gpointer) 89);
521
522   gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 0);
523   gtk_widget_show (toolbar);
524
525   gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 10);
526   gtk_widget_show (vbox);
527
528   table = gtk_table_new (6, 8, FALSE);
529
530   frame = gtk_frame_new (NULL);
531   gtk_container_add (GTK_CONTAINER (frame), table);
532   gtk_container_border_width (GTK_CONTAINER (frame), 10);
533   gtk_container_border_width (GTK_CONTAINER (table), 3);
534   gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
535   gtk_widget_show (frame);
536
537   AddToBorder (table, "", 0, 1, 0, 1);
538   AddToBorder (table, _("Chan"), 1, 2, 0, 1);
539   AddToBorder (table, _("RxLv"), 2, 3, 0, 1);  
540   AddToBorder (table, _("C1"), 3, 4, 0, 1);  
541   AddToBorder (table, _("C2"), 4, 5, 0, 1);  
542   AddToBorder (table, _("ACT"), 0, 1, 1, 2);  
543   AddToBorder (table, _("NC2"), 0, 1, 2, 3);  
544   AddToBorder (table, _("NC3"), 0, 1, 3, 4);  
545   AddToBorder (table, _("NC4"), 0, 1, 4, 5);  
546   AddToBorder (table, _("NC5"), 0, 1, 5, 6);  
547   AddToBorder (table, _("NC6"), 0, 1, 6, 7);  
548   AddToBorder (table, _("NC7"), 0, 1, 7, 8);  
549
550   for (i = 0; i < 4; i++)
551     for (j = 0; j < 7; j++)
552     {
553       tableLabels[i][j] = gtk_label_new ("");
554       frame = gtk_frame_new (NULL);
555       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
556       gtk_container_add (GTK_CONTAINER (frame), tableLabels[i][j]);
557       gtk_table_attach_defaults (GTK_TABLE (table), frame, i + 1, i + 2, j + 1, j + 2);
558     }
559
560   for (i = 0; i < 7; i++)
561   {
562     adj = (GtkAdjustment *) gtk_adjustment_new (-114, -114, -40, 0, 0, 0);
563     tableProgress[i] = gtk_progress_bar_new_with_adjustment (adj);
564     gtk_table_attach_defaults (GTK_TABLE (table),  tableProgress[i], 5, 6, i + 1, i + 2);
565   }
566
567   hbox = gtk_hbox_new (FALSE, 0);
568   gtk_table_attach_defaults (GTK_TABLE (table), hbox, 5, 6, 0, 1);
569
570   adj = (GtkAdjustment *) gtk_adjustment_new (1, 1, 89, 1, 10, 0);
571   button = gtk_spin_button_new (adj, 0, 0);
572   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (button), TRUE);
573   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (button), TRUE);
574   gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (button), GTK_SHADOW_OUT);
575   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
576                       GTK_SIGNAL_FUNC (ChangedSpinner), (gpointer) button);
577   gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
578
579   label = gtk_label_new (_("Page:"));
580   gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 5);
581
582   gtk_table_set_col_spacing (GTK_TABLE (table), 4, 10);
583   gtk_widget_show_all (table);
584   GUIEventAdd (GUI_EVENT_NETMON_CHANGED, GUI_RefreshNetmon);
585 }