1 /* Wireless tab */
2 #include "disk.h"
3
4 /* Boxes */
5 GtkWidget *topbox;
6 GtkWidget *botbox;
7
8 GtkWidget *wedit;
9 GtkWidget *woptions;
10
11 /* Widgets */
12 GtkWidget *wcommands;
13 GtkWidget *winterface; /* combo box */
14 GtkWidget *wdev; /* combo box */
15 GtkWidget *whosts; /* combo box */
16 GtkWidget *wapply;
17 GtkWidget *wpass; /* text entry */
18
19 GtkTreeStore *wtree;
20
21 /* In case we issue a second root command. */
22 gboolean exec2; /* Execute another command. */
23 char *secondcmd;
24 char *wtmp; /* Tmpfile */
25
26 /* Functions */
27 void CleanWireless();
28 void CleanOptions();
29 void WTopbox();
30 GtkWidget *WScrolled(GtkWidget *);
31 GtkWidget *ComboModes();
32 GtkWidget *ComboCommands();
33 GtkWidget *ComboWlanDevices();
34 GtkWidget *ComboWlanInterfaces();
35 void WGridEntries();
36 void ExecCreate();
37 void ExecDestroy();
38 void ExecConnect();
39 char *GetBssid(char *);
40 void ExecUp();
41 void ExecDown();
42 void ExecScan();
43 void ExecModify();
44 void ApplyClicked( GtkWidget *, gpointer);
45 void OptionsCreate();
46 void OptionsConnect();
47 gboolean ComboHosts();
48 GtkWidget *DrawHosts();
49 void DrawOptions(char *);
50 void command_changed( GtkWidget *, gpointer);
51 void winterface_changed( GtkWidget *, gpointer);
52 void WEditor();
53 void WBottomView();
54 GtkWidget *WTreeview(GtkWidget *);
55 void WFillTree(GtkWidget *);
56 void AfterRootCmd();
57 void wireless();
58
CleanWireless()59 void CleanWireless() {
60
61 if(GTK_IS_WIDGET (wbox))
62 gtk_widget_destroy(wbox);
63 }
64
CleanOptions()65 void CleanOptions() {
66
67 if(GTK_IS_WIDGET (woptions))
68 gtk_widget_destroy(woptions);
69
70 woptions = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
71 gtk_container_add (GTK_CONTAINER (topbox), woptions);
72 }
73
GetBssid(char * string)74 char *GetBssid(char *string) {
75
76 int start = 33; /* Skip ssid. */
77 char *bssid = malloc(20);
78 if(bssid == NULL)
79 return bssid;
80
81 memset(bssid, 0, 20);
82 while(strncmp(&string[start], " ", 1) == 0) //&& (start <= 40))
83 start++;
84
85 strncpy(bssid, &string[start], 18);
86 return bssid;
87 }
88
AfterRootCmd()89 void AfterRootCmd() {
90
91 if(exec2 == TRUE) {
92 exec2 = FALSE;
93 if(secondcmd != NULL)
94 execute_me(secondcmd, USR);
95 }
96 else {
97 if(wtmp != NULL) { /* Clean up */
98 unlink(wtmp);
99 free(wtmp);
100 wtmp = NULL;
101 }
102 wireless();
103 }
104 }
105
WTopbox()106 void WTopbox() {
107
108 /* A box at the upper half. */
109 topbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
110 gtk_container_add (GTK_CONTAINER (wbox), topbox);
111 gtk_widget_set_size_request(topbox, 300, 200); /* width, height */
112 }
113
WScrolled(GtkWidget * box)114 GtkWidget *WScrolled(GtkWidget *box) {
115 /* Scrolled window. */
116 GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
117 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
118 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
119 gtk_box_pack_start(GTK_BOX(box), scrolled_window, FALSE, TRUE, 0);
120 gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW(scrolled_window), TRUE);
121 gtk_scrolled_window_set_propagate_natural_width (GTK_SCROLLED_WINDOW(scrolled_window), TRUE);
122
123 return scrolled_window;
124 }
125
ComboModes()126 GtkWidget *ComboModes() {
127 GtkWidget *c = gtk_combo_box_text_new();
128 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "adhoc");
129
130 return c;
131 }
132
ComboCommands()133 GtkWidget *ComboCommands() {
134 GtkWidget *c = gtk_combo_box_text_new();
135 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Create");
136 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Destroy");
137 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Scan");
138 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Modify");
139 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Connect");
140 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Up");
141 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Down");
142 g_signal_connect (c, "changed", G_CALLBACK (command_changed), NULL);
143
144 gtk_grid_attach(GTK_GRID(wedit), c, 0, 0, 1, 1);
145 return c;
146 }
147
ComboWlanDevices()148 GtkWidget *ComboWlanDevices() {
149
150 /* Combo box with all wlan devices on the system. */
151
152 gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT (wdev));
153
154 char line[MAXLINE];
155 char *dev;
156 char *brk;
157
158 memset(line, 0, MAXLINE);
159 FILE *fp = popen("sysctl -n net.wlan.devices", "r");
160 while(fgets(line, MAXLINE, fp)) {
161
162 cosmetics(line);
163 dev = strtok_r(line, " ", &brk);
164 while(dev) {
165
166 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (wdev), NULL, dev);
167 dev = strtok_r( NULL, " ", &brk);
168 }
169 }
170 pclose(fp);
171
172 return wdev;
173 }
174
ComboWlanInterfaces()175 GtkWidget *ComboWlanInterfaces() {
176
177 /* Box with all currently configured wlan interfaces */
178
179 gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT (winterface));
180
181 char line[MAXLINE];
182 FILE *fp = popen("ifconfig -g wlan | sed 's/ /\\n/g'", "r");
183 while(fgets(line, MAXLINE, fp)) {
184
185 cosmetics(line);
186 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (winterface), NULL, line);
187 }
188 pclose(fp);
189
190 return winterface;
191 }
192
WGridEntries()193 void WGridEntries() {
194
195 wcommands = ComboCommands();
196 wdev = gtk_combo_box_text_new();
197 winterface = gtk_combo_box_text_new();
198 wapply = gtk_button_new_with_mnemonic(l.apply);
199
200
201 g_signal_connect(wapply, "clicked", G_CALLBACK(ApplyClicked), NULL);
202 g_signal_connect (winterface, "changed", G_CALLBACK (winterface_changed), NULL);
203
204 gtk_grid_attach(GTK_GRID(wedit), gtk_label_new(" "), 0, 4, 1, 1);
205 // gtk_grid_attach(GTK_GRID(wedit), gtk_label_new(" "), 0, 5, 1, 1);
206 gtk_grid_attach(GTK_GRID(wedit), wdev, 0, 6, 1, 1);
207 gtk_grid_attach(GTK_GRID(wedit), winterface, 0, 7, 1, 1);
208 gtk_grid_attach(GTK_GRID(wedit), wapply, 0, 8, 1, 1);
209 }
210
ExecCreate()211 void ExecCreate() {
212
213 const gchar *dev = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (GTK_COMBO_BOX_TEXT (wdev)));
214 if((dev == NULL) || (strlen(dev) == 0)) {
215 msg("No wlan devices chosen. Driver issues?");
216 return;
217 }
218
219 char *cmd = malloc(CMDSIZE);
220 if(cmd == NULL)
221 return;
222 memset(cmd, 0, CMDSIZE);
223 sprintf(cmd, "ifconfig wlan create wlandev %s", dev);
224
225 exec2 = FALSE;
226 execute_me(cmd, USR);
227 }
228
ExecDestroy()229 void ExecDestroy() {
230
231 char *what;
232 what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
233 if((what == NULL) || (strlen(what) == 0)) {
234 msg("no device!");
235 return;
236 }
237 char *cmd = malloc(CMDSIZE);
238 if(cmd == NULL)
239 return;
240 memset(cmd, 0, CMDSIZE);
241 sprintf(cmd, "ifconfig %s destroy", what);
242
243 exec2 = FALSE;
244 execute_me(cmd, USR);
245 }
246
ExecScan()247 void ExecScan() {
248
249 char *what;
250 what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
251 if(what == NULL) {
252 return;
253 }
254 char line[MAXLINE];
255 char cmd[CMDSIZE];
256 int row = 0;
257
258 memset(line, 0, MAXLINE);
259 memset(cmd, 0, CMDSIZE);
260
261 GtkWidget *g = DrawHosts();
262
263 sprintf(cmd, "ifconfig %s list scan", what);
264 FILE *fp = popen(cmd, "r");
265 if(fp == NULL)
266 return;
267 while(fgets(line, MAXLINE, fp)) {
268 cosmetics(line);
269 /* XXX: This might look better in a treeview. */
270 gtk_grid_attach(GTK_GRID (g), gtk_label_new(line), 0, row, 1, 1);
271 gtk_grid_attach(GTK_GRID (g), gtk_label_new("-- "), 1, row, 1, 1);
272
273 row++;
274 memset(line, 0, MAXLINE);
275 }
276 pclose(fp);
277
278 if(row == 0)
279 gtk_grid_attach(GTK_GRID (g), gtk_label_new("No results!"), 0, row, 1, 1);
280
281
282 gtk_grid_attach(GTK_GRID (g), gtk_label_new(" "), 0, (row+1), 1, 1);
283 gtk_widget_show_all(woptions);
284 }
285
ExecModify()286 void ExecModify() {
287 }
288
ExecDown()289 void ExecDown() {
290
291 char *what;
292 what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
293 if(what == NULL)
294 return;
295 char *cmd = malloc(CMDSIZE);
296 if(cmd == NULL)
297 return;
298 memset(cmd, 0, CMDSIZE);
299 sprintf(cmd, "ifconfig %s down", what);
300 free(what);
301 exec2 = FALSE;
302 execute_me(cmd, USR);
303 }
304
ExecUp()305 void ExecUp() {
306
307 char *what;
308 what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
309 if(what == NULL)
310 return;
311 char *cmd = malloc(CMDSIZE);
312 if(cmd == NULL)
313 return;
314 memset(cmd, 0, CMDSIZE);
315 sprintf(cmd, "ifconfig %s up", what);
316 free(what);
317 exec2 = FALSE;
318 execute_me(cmd, USR);
319 }
320
ExecConnect()321 void ExecConnect() {
322
323 /* Network interface. */
324 char *dev;
325 dev = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT (winterface));
326 if(dev == NULL) {
327 return;
328 }
329
330 /* Access point. */
331 char *h;
332 h = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT (whosts));
333 if(h == NULL) {
334 return;
335 }
336 /* Only care for bssid. */
337 char *bssid = GetBssid(h);
338
339 /* Passphrase. */
340 const gchar *gpass = gtk_entry_get_text(GTK_ENTRY (wpass));
341 if(!gtk_widget_is_visible(GTK_WIDGET (wpass)) || (gpass == NULL) || (strlen(gpass) == 0)) {
342 return;
343 }
344
345 /*
346 * XXX: This is certainly a dirty way to connect.
347 * echo > /tmp
348 * pkill wpa_supplicant
349 * wpa_supplicant -i -B -c
350 */
351 char *tmpfile = random_filename();
352 char *cmd = malloc(MAXLINE); /* Make it big. */
353 memset(cmd, 0, MAXLINE);
354 snprintf(cmd, MAXLINE, "echo 'ctrl_interface=/var/run/wpa_supplicant\nnetwork={\nbssid=%s\npsk=\"%s\"\n}\n' > %s", bssid, gpass, tmpfile);
355 FILE *fp = popen(cmd, "r");
356 pclose(fp);
357
358 /* pkill wpa_supplicant */
359 memset(cmd, 0, MAXLINE);
360 sprintf(cmd, "pkill wpa_supplicant");
361
362 /* Second command: wpa_supplicant -i -B -c */
363 secondcmd = malloc(MAXLINE); /* Make it big. */
364 memset(secondcmd, 0, MAXLINE);
365 snprintf(secondcmd, MAXLINE, "wpa_supplicant -i %s -B -c %s", dev, tmpfile);
366 exec2 = TRUE;
367 wtmp = tmpfile;
368
369 free(bssid);
370 free(dev);
371 free(h);
372 // unlink(tmpfile);
373 execute_me(cmd, USR);
374 }
375
ApplyClicked(GtkWidget * w,gpointer p)376 void ApplyClicked( GtkWidget *w, gpointer p) {
377
378 /* Default is to only execute one root command. */
379 exec2 = FALSE;
380 secondcmd = NULL;
381 wtmp = NULL;
382
383 char *what;
384 what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (wcommands));
385 if(what == NULL) {
386 return;
387 }
388 if(strcmp(what, "Create") == 0) {
389 free(what);
390 ExecCreate();
391 wireless();
392 }
393 else if(strcmp(what, "Destroy") == 0) {
394 free(what);
395 ExecDestroy();
396 wireless();
397 }
398 else if(strcmp(what, "Scan") == 0) {
399 free(what);
400 ExecScan();
401 }
402 else if(strcmp(what, "Modify") == 0) {
403 free(what);
404 ExecModify();
405 }
406 else if(strcmp(what, "Connect") == 0) {
407 free(what);
408 ExecConnect();
409 wireless();
410 }
411 else if(strcmp(what, "Up") == 0) {
412 free(what);
413 ExecUp();
414 //wireless(); XXX: ???
415 }
416 else if(strcmp(what, "Down") == 0) {
417 free(what);
418 ExecDown();
419 //wireless(); XXX: ???
420 }
421 }
422
OptionsCreate()423 void OptionsCreate() {
424
425 gtk_container_add(GTK_CONTAINER (woptions), gtk_label_new("Options:"));
426
427 // XXX: todo: Add Modes.
428 // gtk_container_add(GTK_CONTAINER (woptions), ComboModes());
429
430 gtk_widget_show_all(woptions);
431 }
432
OptionsConnect()433 void OptionsConnect() {
434
435 /* Did he choose an interface yet? */
436 char *dev;
437 dev = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
438 if((dev == NULL) || (strlen(dev) == 0)) {
439 msg("Choose an interface!");
440 return;
441 }
442
443 wpass = gtk_entry_new();
444 gtk_entry_buffer_set_max_length (gtk_entry_get_buffer(GTK_ENTRY (wpass)), 30);
445 gtk_entry_set_width_chars(GTK_ENTRY(wpass), 20);
446 gtk_entry_set_placeholder_text (GTK_ENTRY(wpass), "Passphrase");
447
448
449 gtk_container_add(GTK_CONTAINER (woptions), gtk_label_new("Options:"));
450 if(ComboHosts() == TRUE)
451 gtk_container_add(GTK_CONTAINER (woptions), whosts);
452 else
453 gtk_container_add(GTK_CONTAINER (woptions), gtk_label_new("I scanned, but no Access Points were found!"));
454 gtk_container_add(GTK_CONTAINER (woptions), wpass);
455
456 gtk_widget_show_all(woptions);
457 }
458
ComboHosts()459 gboolean ComboHosts() {
460
461 if(GTK_IS_WIDGET(whosts))
462 gtk_widget_destroy(whosts);
463 whosts = gtk_combo_box_text_new();
464
465 char *what;
466 what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
467 if(what == NULL) {
468 msg("Choose a wlan interface!");
469 return FALSE;
470 }
471 char line[MAXLINE];
472 char cmd[CMDSIZE];
473 int items = 0;
474
475 memset(line, 0, MAXLINE);
476 memset(cmd, 0, CMDSIZE);
477
478 sprintf(cmd, "ifconfig %s list scan", what);
479 FILE *fp = popen(cmd, "r");
480 if(fp == NULL)
481 return FALSE;
482 while(fgets(line, MAXLINE, fp)) {
483 /* Only show ssid and bssid */
484 line[56] = '\0';
485 gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (whosts), NULL, line);
486 memset(line, 0, MAXLINE);
487 items++;
488 }
489 pclose(fp);
490
491 if(items == 0)
492 return FALSE;
493 return TRUE;
494 }
495
DrawHosts()496 GtkWidget *DrawHosts() {
497
498 CleanOptions();
499
500 GtkWidget *s = WScrolled(woptions);
501
502 /* Grid */
503 GtkWidget *hg = gtk_grid_new();
504 gtk_grid_set_column_homogeneous(GTK_GRID(hg), FALSE);
505 // gtk_grid_insert_column(GTK_GRID(gh), 7);
506 gtk_grid_set_row_spacing(GTK_GRID(hg), 5);
507 gtk_grid_set_column_spacing(GTK_GRID(hg), 0);
508 gtk_container_add(GTK_CONTAINER (s), hg);
509
510 return hg;
511 }
512
DrawOptions(char * what)513 void DrawOptions(char *what) {
514
515 CleanOptions();
516
517
518 if(strcmp(what, "Create") == 0) {
519 OptionsCreate();
520 gtk_widget_show(wdev);
521 }
522 else if(strcmp(what, "Destroy") == 0) {
523 gtk_widget_show(winterface);
524 }
525 else if(strcmp(what, "Scan") == 0) {
526 /* No options */
527 gtk_widget_show(winterface);
528 }
529 else if(strcmp(what, "Connect") == 0) {
530 gtk_widget_show(winterface);
531 OptionsConnect();
532 }
533 else if(strcmp(what, "Up") == 0) {
534 /* No options */
535 gtk_widget_show(winterface);
536 }
537 else if(strcmp(what, "Down") == 0) {
538 /* No options */
539 gtk_widget_show(winterface);
540 }
541 else if(strcmp(what, "Modify") == 0) {
542 /* empty for now */
543 }
544 }
545
command_changed(GtkWidget * w,gpointer p)546 void command_changed( GtkWidget *w, gpointer p) {
547
548 if(GTK_IS_WIDGET (winterface))
549 gtk_widget_hide(winterface);
550 gtk_widget_show(wapply);
551
552 char *cmd;
553 cmd = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (wcommands));
554 if(cmd == NULL)
555 return;
556
557 /* Update devices and interfaces. */
558 wdev = ComboWlanDevices();
559 winterface = ComboWlanInterfaces();
560
561 gtk_widget_hide(GTK_WIDGET (wdev));
562 gtk_widget_hide(GTK_WIDGET (winterface));
563 /* Present relevant options to user. */
564 DrawOptions(cmd);
565 free(cmd);
566 }
567
winterface_changed(GtkWidget * w,gpointer p)568 void winterface_changed( GtkWidget *w, gpointer p) {
569
570 char *cmd;
571 cmd = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (wcommands));
572 if((cmd == NULL) || (strlen(cmd) == 0)) {
573 return;
574 }
575 if(strcmp(cmd, "Connect") == 0) {
576 DrawOptions(cmd);
577 }
578 }
579
WEditor()580 void WEditor() {
581
582 WTopbox();
583
584 /* Grid */
585 wedit = gtk_grid_new();
586 gtk_grid_set_column_homogeneous(GTK_GRID(wedit), FALSE);
587 gtk_grid_insert_column(GTK_GRID(wedit), 7);
588 gtk_grid_set_row_spacing(GTK_GRID(wedit), 5);
589 gtk_grid_set_column_spacing(GTK_GRID(wedit), 5);
590 gtk_box_pack_start(GTK_BOX(topbox), wedit, FALSE, FALSE, 10);
591
592 WGridEntries();
593
594 /* Options */
595 woptions = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
596 gtk_container_add (GTK_CONTAINER (topbox), woptions);
597 }
598
WTreeview(GtkWidget * box)599 GtkWidget *WTreeview(GtkWidget *box) {
600
601 GtkWidget *view = gtk_tree_view_new();
602
603 gtk_container_add(GTK_CONTAINER(box), view);
604 GtkCellRenderer *cell = gtk_cell_renderer_text_new();
605
606 g_object_set(cell, "font", opt.fontsize, NULL);
607 //g_object_set(cell,"editable", TRUE, NULL);
608 //gtk_tree_view_set_enable_search(view, TRUE);
609 g_object_set(view, "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL);
610
611
612 char *col_title = "Name";
613 GtkTreeViewColumn *col = gtk_tree_view_column_new();
614 gtk_tree_view_column_set_title(col, col_title);
615 gtk_tree_view_column_set_clickable(col, TRUE);
616 gtk_tree_view_column_set_reorderable(col, TRUE);
617 gtk_tree_view_column_set_resizable(col, TRUE);
618 gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
619
620 gtk_tree_view_column_pack_start(col, cell, TRUE);
621 gtk_tree_view_column_add_attribute(col, cell, "text", 0);
622
623 wtree = gtk_tree_store_new(1, G_TYPE_STRING);
624
625 gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(wtree));
626 g_object_unref(wtree); /* destroy model automatically with view. */
627 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
628 GTK_SELECTION_SINGLE);
629
630 return view;
631 }
632
WFillTree(GtkWidget * tv)633 void WFillTree(GtkWidget *tv) {
634
635 /* Execute "ifconfig -g inet*/
636 char cmd[CMDSIZE];
637 char *devlist;
638 char *devinfo;
639 char *dev;
640 char *brk;
641
642 GtkTreeIter child;
643 GtkTreeIter parent;
644
645
646 devlist = command("ifconfig -g wlan | tr \"\n\" \" \"");
647 if((devlist == NULL) || (strlen(devlist) == 0))
648 return;
649
650
651 dev = strtok_r(devlist, " ", &brk);
652 while(dev) {
653
654 gtk_tree_store_append(wtree, &parent, NULL);
655 gtk_tree_store_set(wtree, &parent, 0, dev, -1);
656
657 sprintf(cmd, "ifconfig %s", dev);
658 devinfo = command(cmd);
659 if(devinfo != NULL) {
660 gtk_tree_store_append(wtree, &child, &parent);
661 gtk_tree_store_set(wtree, &child, 0, devinfo, -1);
662 free(devinfo);
663 }
664 /* next device */
665 dev = strtok_r( NULL, " ", &brk);
666 }
667
668 free(devlist);
669
670 gtk_tree_view_expand_all(GTK_TREE_VIEW(tv));
671 gtk_tree_view_set_enable_search (GTK_TREE_VIEW(tv), TRUE);
672 gtk_tree_view_set_enable_tree_lines (GTK_TREE_VIEW(tv), TRUE);
673 gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(tv), GTK_TREE_VIEW_GRID_LINES_BOTH);
674
675 }
676
WBottomView()677 void WBottomView() {
678
679 /* A top level container. */
680 botbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
681 gtk_container_add (GTK_CONTAINER (wbox), botbox);
682
683 /* A scrolled window. */
684 GtkWidget *sw = WScrolled(botbox);
685
686 /* A treeview */
687 GtkWidget *tv = WTreeview(sw);
688
689 /* Fill the treestore. */
690 WFillTree(tv);
691
692 /* Update treeview nicely. */
693 gtk_widget_hide(sw);
694 gtk_widget_show(sw);
695 }
696
wireless()697 void wireless() {
698
699 CleanWireless();
700
701 /* A top level container. */
702 wbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
703 gtk_container_add (GTK_CONTAINER (tab9), wbox);
704
705 /* Editor */
706 WEditor();
707
708 /* Display current wireless interfaces. */
709 WBottomView();
710
711 gtk_widget_show_all(wbox);
712 gtk_widget_hide(wapply);
713 gtk_widget_hide(winterface);
714 gtk_widget_hide(wdev);
715 }
716
717