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