1 /* Tracksplitting - Parameters
2 
3  * Copyright (C) 1998 J.A. Bezemer
4  *
5  * Licensed under the terms of the GNU General Public License.
6  * ABSOLUTELY NO WARRANTY.
7  * See the file `COPYING' in this directory.
8  */
9 
10 #include "tracksplit_parammenu.h"
11 #include "errorwindow.h"
12 #include "stringinput.h"
13 #include "buttons.h"
14 #include "clrscr.h"
15 #include "boxes.h"
16 #include "helpline.h"
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <string.h>
20 #ifndef OLD_CURSES
21 #include <ncurses.h>
22 #else
23 #include <curses.h>
24 #endif
25 
26 
27 int
tracksplit_parammenu(int * make_use_rms,int * make_graphs,long * blocklen,int * global_silence_factor,int * local_silence_threshold,int * min_silence_blocks,int * min_track_blocks,int * extra_blocks_start,int * extra_blocks_end)28 tracksplit_parammenu (int *make_use_rms, int *make_graphs, long *blocklen,
29 		      int *global_silence_factor,
30 		      int *local_silence_threshold, int *min_silence_blocks,
31 		      int *min_track_blocks, int *extra_blocks_start,
32 		      int *extra_blocks_end)
33 /* Returns 0: canceled, 1: PrevScreen, 2: NextScreen */
34 {
35   button_t next_button, cancel_button, prev_button;
36   button_t make_use_rms_check, make_graphs_check;
37   stringinput_t blocklen_string, global_silence_factor_string, local_silence_threshold_string,
38     min_silence_blocks_string, min_track_blocks_string, extra_blocks_start_string,
39     extra_blocks_end_string;
40   int dont_stop = TRUE;
41   int returnval = 0;
42   int focus = 11;
43   int in_ch;
44   long templong;
45 
46   char *helplines[12] =
47   {
48     " Save results or use saved results of lengthy computation.      TAB: Next field",
49     " For manual (double-)checking/adjustment. Needs a few MB's.     TAB: Next field",
50     " Number of samples to compute RMS of; 4410 = 0.1 sec.           TAB: Next field",
51     " The relative threshold during the initial search for tracks.   TAB: Next field",
52     " Begin/end of track ...% above local (silence) power level.     TAB: Next field",
53     " Shorter periods of silence not treated as track separation.    TAB: Next field",
54     " Shorter tracks are ignored.                                    TAB: Next field",
55     " Correction for fade-in effects that are hard to detect.        TAB: Next field",
56     " Correction for fade-out effects that are hard to detect.       TAB: Next field",
57     " To Track Splitting - File Name.                                TAB: Next field",
58     " Back to main menu.                                             TAB: Next field",
59     " Start searching for tracks.                                    TAB: Next field"};
60 
61   make_use_rms_check.text = "";	/* see below */
62   make_use_rms_check.y = 4;
63   make_use_rms_check.x = 2;
64   make_use_rms_check.selected = FALSE;
65 
66   make_graphs_check.text = "";	/* see below */
67   make_graphs_check.y = 6;
68   make_graphs_check.x = 2;
69   make_graphs_check.selected = FALSE;
70 
71   blocklen_string.maxlen = 500;
72   blocklen_string.string = (char *) malloc (
73 				    blocklen_string.maxlen * sizeof (char));
74   sprintf (blocklen_string.string, "%ld", *blocklen);
75   blocklen_string.y = 8;
76   blocklen_string.x = 54;
77   blocklen_string.w = 12;
78   blocklen_string.cursorpos =
79     strlen (blocklen_string.string);
80   blocklen_string.firstcharonscreen = 0;
81 
82   global_silence_factor_string.maxlen = 500;
83   global_silence_factor_string.string = (char *) malloc (
84 		       global_silence_factor_string.maxlen * sizeof (char));
85   sprintf (global_silence_factor_string.string, "%d",
86 	   *global_silence_factor);
87   global_silence_factor_string.y = 10;
88   global_silence_factor_string.x = 54;
89   global_silence_factor_string.w = 12;
90   global_silence_factor_string.cursorpos =
91     strlen (global_silence_factor_string.string);
92   global_silence_factor_string.firstcharonscreen = 0;
93 
94   local_silence_threshold_string.maxlen = 500;
95   local_silence_threshold_string.string = (char *) malloc (
96 		     local_silence_threshold_string.maxlen * sizeof (char));
97   sprintf (local_silence_threshold_string.string, "%d",
98 	   *local_silence_threshold);
99   local_silence_threshold_string.y = 11;
100   local_silence_threshold_string.x = 54;
101   local_silence_threshold_string.w = 12;
102   local_silence_threshold_string.cursorpos =
103     strlen (local_silence_threshold_string.string);
104   local_silence_threshold_string.firstcharonscreen = 0;
105 
106   min_silence_blocks_string.maxlen = 500;
107   min_silence_blocks_string.string = (char *) malloc (
108 			  min_silence_blocks_string.maxlen * sizeof (char));
109   sprintf (min_silence_blocks_string.string, "%d",
110 	   *min_silence_blocks);
111   min_silence_blocks_string.y = 13;
112   min_silence_blocks_string.x = 54;
113   min_silence_blocks_string.w = 12;
114   min_silence_blocks_string.cursorpos =
115     strlen (min_silence_blocks_string.string);
116   min_silence_blocks_string.firstcharonscreen = 0;
117 
118   min_track_blocks_string.maxlen = 500;
119   min_track_blocks_string.string = (char *) malloc (
120 			    min_track_blocks_string.maxlen * sizeof (char));
121   sprintf (min_track_blocks_string.string, "%d",
122 	   *min_track_blocks);
123   min_track_blocks_string.y = 14;
124   min_track_blocks_string.x = 54;
125   min_track_blocks_string.w = 12;
126   min_track_blocks_string.cursorpos =
127     strlen (min_track_blocks_string.string);
128   min_track_blocks_string.firstcharonscreen = 0;
129 
130   extra_blocks_start_string.maxlen = 500;
131   extra_blocks_start_string.string = (char *) malloc (
132 			  extra_blocks_start_string.maxlen * sizeof (char));
133   sprintf (extra_blocks_start_string.string, "%d",
134 	   *extra_blocks_start);
135   extra_blocks_start_string.y = 16;
136   extra_blocks_start_string.x = 54;
137   extra_blocks_start_string.w = 12;
138   extra_blocks_start_string.cursorpos =
139     strlen (extra_blocks_start_string.string);
140   extra_blocks_start_string.firstcharonscreen = 0;
141 
142   extra_blocks_end_string.maxlen = 500;
143   extra_blocks_end_string.string = (char *) malloc (
144 			    extra_blocks_end_string.maxlen * sizeof (char));
145   sprintf (extra_blocks_end_string.string, "%d",
146 	   *extra_blocks_end);
147   extra_blocks_end_string.y = 17;
148   extra_blocks_end_string.x = 54;
149   extra_blocks_end_string.w = 12;
150   extra_blocks_end_string.cursorpos =
151     strlen (extra_blocks_end_string.string);
152   extra_blocks_end_string.firstcharonscreen = 0;
153 
154   prev_button.text = " < Previous screen ";
155   prev_button.y = 20;
156   prev_button.x = 5;
157   prev_button.selected = FALSE;
158 
159   next_button.text = " Start computation ";
160   next_button.y = 20;
161   next_button.x = 56;
162   next_button.selected = FALSE;
163 
164   cancel_button.text = " Cancel ";
165   cancel_button.y = 20;
166   cancel_button.x = 36;
167   cancel_button.selected = FALSE;
168 
169   clearscreen (TRACKSPLIT_PARAMMENU_HEADERTEXT);
170 
171   do
172     {
173       header (TRACKSPLIT_PARAMMENU_HEADERTEXT);
174 
175       if (*make_use_rms)
176 	make_use_rms_check.text = "[X]";
177       else
178 	make_use_rms_check.text = "[ ]";
179 
180       if (*make_graphs)
181 	make_graphs_check.text = "[X]";
182       else
183 	make_graphs_check.text = "[ ]";
184 
185       if (focus == 0)
186 	make_use_rms_check.selected = TRUE;
187       else
188 	make_use_rms_check.selected = FALSE;
189 
190       if (focus == 1)
191 	make_graphs_check.selected = TRUE;
192       else
193 	make_graphs_check.selected = FALSE;
194 
195       if (focus == 9)
196 	prev_button.selected = TRUE;
197       else
198 	prev_button.selected = FALSE;
199 
200       if (focus == 10)
201 	cancel_button.selected = TRUE;
202       else
203 	cancel_button.selected = FALSE;
204 
205       if (focus == 11)
206 	next_button.selected = TRUE;
207       else
208 	next_button.selected = FALSE;
209 
210       stringinput_display (&blocklen_string);
211       mvprintw (blocklen_string.y, 2,
212 		"Length of blocks of signal power data (samples)   :");
213 
214       stringinput_display (&global_silence_factor_string);
215       mvprintw (global_silence_factor_string.y, 2,
216 		"Global silence factor (0.1 %)                     :");
217 
218       stringinput_display (&local_silence_threshold_string);
219       mvprintw (local_silence_threshold_string.y, 2,
220 		"Local silence factor (%)                          :");
221 
222       stringinput_display (&min_silence_blocks_string);
223       mvprintw (min_silence_blocks_string.y, 2,
224 		"Minimal length of inter-track silence (blocks)    :");
225 
226       stringinput_display (&min_track_blocks_string);
227       mvprintw (min_track_blocks_string.y, 2,
228 		"Minimal length of tracks (blocks)                 :");
229 
230       stringinput_display (&extra_blocks_start_string);
231       mvprintw (extra_blocks_start_string.y, 2,
232 		"Number of extra blocks at track start             :");
233 
234       stringinput_display (&extra_blocks_end_string);
235       mvprintw (extra_blocks_end_string.y, 2,
236 		"Number of extra blocks at track end               :");
237 
238       button_display (&prev_button);
239       mybox (prev_button.y - 1, prev_button.x - 1,
240 	     3, strlen (prev_button.text) + 2);
241       button_display (&cancel_button);
242       mybox (cancel_button.y - 1, cancel_button.x - 1,
243 	     3, strlen (cancel_button.text) + 2);
244       button_display (&next_button);
245       mybox (next_button.y - 1, next_button.x - 1,
246 	     3, strlen (next_button.text) + 2);
247 
248       button_display (&make_use_rms_check);
249       mvprintw (make_use_rms_check.y, make_use_rms_check.x + 4,
250 		"Save/load signal power (RMS) data to/from .rms file");
251 
252       button_display (&make_graphs_check);
253       mvprintw (make_graphs_check.y, make_graphs_check.x + 4,
254 		"Generate graph files");
255 
256       helpline (helplines[focus]);
257 
258       switch (focus)
259 	{
260 	case 2:
261 	  stringinput_display (&blocklen_string);
262 	  break;
263 	case 3:
264 	  stringinput_display (&global_silence_factor_string);
265 	  break;
266 	case 4:
267 	  stringinput_display (&local_silence_threshold_string);
268 	  break;
269 	case 5:
270 	  stringinput_display (&min_silence_blocks_string);
271 	  break;
272 	case 6:
273 	  stringinput_display (&min_track_blocks_string);
274 	  break;
275 	case 7:
276 	  stringinput_display (&extra_blocks_start_string);
277 	  break;
278 	case 8:
279 	  stringinput_display (&extra_blocks_end_string);
280 	  break;
281 	default:
282 	  move (0, 79);
283 	}
284 
285       refresh ();
286 
287       in_ch = getch ();
288 
289       switch (focus)
290 	{
291 	case 0:		/* Make/use .RMS file */
292 	  switch (in_ch)
293 	    {
294 	    case KEY_ENTER:
295 	    case 13:
296 	    case ' ':
297 	    case 'x':
298 	    case 'X':
299 	      *make_use_rms = 1 - *make_use_rms;
300 	      break;
301 
302 	    case KEY_LEFT:
303 	    case KEY_UP:
304 	      focus--;
305 	      break;
306 	    case KEY_RIGHT:
307 	    case KEY_DOWN:
308 	      focus++;
309 	      break;
310 	    }
311 	  break;
312 
313 	case 1:		/* Make graph files */
314 	  switch (in_ch)
315 	    {
316 	    case KEY_ENTER:
317 	    case 13:
318 	    case ' ':
319 	    case 'x':
320 	    case 'X':
321 	      *make_graphs = 1 - *make_graphs;
322 	      break;
323 
324 	    case KEY_LEFT:
325 	    case KEY_UP:
326 	      focus--;
327 	      break;
328 	    case KEY_RIGHT:
329 	    case KEY_DOWN:
330 	      focus++;
331 	      break;
332 	    }
333 	  break;
334 
335 	case 2:		/* Block length */
336 	  stringinput_stdkeys (in_ch, &blocklen_string);
337 	  switch (in_ch)
338 	    {
339 	    case KEY_ENTER:
340 	    case 13:
341 	      templong = atol (blocklen_string.string);
342 	      if (templong < 1)
343 		{
344 		  error_window ("Enter a whole number, greater than 0. \
345 Default: 4410.");
346 		  blocklen_string.cursorpos =
347 		    strlen (blocklen_string.string);
348 		}
349 	      else
350 		{
351 		  *blocklen = templong;
352 		  sprintf (blocklen_string.string,
353 			   "%ld", templong);
354 		  blocklen_string.cursorpos =
355 		    strlen (blocklen_string.string);
356 		  focus++;
357 		}
358 	      break;
359 
360 	    case KEY_UP:
361 	      focus--;
362 	      break;
363 	    case KEY_DOWN:
364 	      focus++;
365 	      break;
366 	    }
367 	  break;
368 
369 	case 3:		/* Global silence factor */
370 	  stringinput_stdkeys (in_ch,
371 			       &global_silence_factor_string);
372 	  switch (in_ch)
373 	    {
374 	    case KEY_ENTER:
375 	    case 13:
376 	      templong = atol (
377 				global_silence_factor_string.string);
378 	      if (templong < 0 || templong > 10000)
379 		{
380 		  error_window ("Enter a whole, positive number, preferably \
381 less than 1000. Default: 150.");
382 		  global_silence_factor_string.cursorpos =
383 		    strlen (
384 			     global_silence_factor_string.string);
385 		}
386 	      else
387 		{
388 		  *global_silence_factor = templong;
389 		  sprintf (global_silence_factor_string.string,
390 			   "%ld", templong);
391 		  global_silence_factor_string.cursorpos =
392 		    strlen (global_silence_factor_string.string);
393 		  focus++;
394 		}
395 	      break;
396 
397 	    case KEY_UP:
398 	      focus--;
399 	      break;
400 	    case KEY_DOWN:
401 	      focus++;
402 	      break;
403 	    }
404 	  break;
405 
406 	case 4:		/* Local silence threshold */
407 	  stringinput_stdkeys (in_ch,
408 			       &local_silence_threshold_string);
409 	  switch (in_ch)
410 	    {
411 	    case KEY_ENTER:
412 	    case 13:
413 	      templong = atol (
414 				local_silence_threshold_string.string);
415 	      if (templong < 0 || templong > 10000)
416 		{
417 		  error_window ("Enter a whole, positive number. \
418 Default: 5.");
419 		  local_silence_threshold_string.cursorpos =
420 		    strlen (
421 			     local_silence_threshold_string.string);
422 		}
423 	      else
424 		{
425 		  *local_silence_threshold = templong;
426 		  sprintf (local_silence_threshold_string.string,
427 			   "%ld", templong);
428 		  local_silence_threshold_string.cursorpos =
429 		    strlen (
430 			     local_silence_threshold_string.string);
431 		  focus++;
432 		}
433 	      break;
434 
435 	    case KEY_UP:
436 	      focus--;
437 	      break;
438 	    case KEY_DOWN:
439 	      focus++;
440 	      break;
441 	    }
442 	  break;
443 
444 	case 5:		/* Min. silence length (blocks) */
445 	  stringinput_stdkeys (in_ch,
446 			       &min_silence_blocks_string);
447 	  switch (in_ch)
448 	    {
449 	    case KEY_ENTER:
450 	    case 13:
451 	      templong = atol (
452 				min_silence_blocks_string.string);
453 	      if (templong < 0 || templong > 10000)
454 		{
455 		  error_window ("Enter a whole, positive number. \
456 Default: 20.");
457 		  min_silence_blocks_string.cursorpos =
458 		    strlen (
459 			     min_silence_blocks_string.string);
460 		}
461 	      else
462 		{
463 		  *min_silence_blocks = templong;
464 		  sprintf (min_silence_blocks_string.string,
465 			   "%ld", templong);
466 		  min_silence_blocks_string.cursorpos =
467 		    strlen (
468 			     min_silence_blocks_string.string);
469 		  focus++;
470 		}
471 	      break;
472 
473 	    case KEY_UP:
474 	      focus--;
475 	      break;
476 	    case KEY_DOWN:
477 	      focus++;
478 	      break;
479 	    }
480 	  break;
481 
482 	case 6:		/* Min. track length (blocks) */
483 	  stringinput_stdkeys (in_ch,
484 			       &min_track_blocks_string);
485 	  switch (in_ch)
486 	    {
487 	    case KEY_ENTER:
488 	    case 13:
489 	      templong = atol (
490 				min_track_blocks_string.string);
491 	      if (templong < 0 || templong > 10000)
492 		{
493 		  error_window ("Enter a whole, positive number. \
494 Default: 50.");
495 		  min_track_blocks_string.cursorpos =
496 		    strlen (
497 			     min_track_blocks_string.string);
498 		}
499 	      else
500 		{
501 		  *min_track_blocks = templong;
502 		  sprintf (min_track_blocks_string.string,
503 			   "%ld", templong);
504 		  min_track_blocks_string.cursorpos =
505 		    strlen (
506 			     min_track_blocks_string.string);
507 		  focus++;
508 		}
509 	      break;
510 
511 	    case KEY_UP:
512 	      focus--;
513 	      break;
514 	    case KEY_DOWN:
515 	      focus++;
516 	      break;
517 	    }
518 	  break;
519 
520 	case 7:		/* Extra blocks at track start */
521 	  stringinput_stdkeys (in_ch,
522 			       &extra_blocks_start_string);
523 	  switch (in_ch)
524 	    {
525 	    case KEY_ENTER:
526 	    case 13:
527 	      templong = atol (
528 				extra_blocks_start_string.string);
529 	      if (templong < 0 || templong > 10000)
530 		{
531 		  error_window ("Enter a whole, positive number. \
532 Default: 3.");
533 		  extra_blocks_start_string.cursorpos =
534 		    strlen (
535 			     extra_blocks_start_string.string);
536 		}
537 	      else
538 		{
539 		  *extra_blocks_start = templong;
540 		  sprintf (extra_blocks_start_string.string,
541 			   "%ld", templong);
542 		  extra_blocks_start_string.cursorpos =
543 		    strlen (
544 			     extra_blocks_start_string.string);
545 		  focus++;
546 		}
547 	      break;
548 
549 	    case KEY_UP:
550 	      focus--;
551 	      break;
552 	    case KEY_DOWN:
553 	      focus++;
554 	      break;
555 	    }
556 	  break;
557 
558 	case 8:		/* Extra blocks at track end */
559 	  stringinput_stdkeys (in_ch,
560 			       &extra_blocks_end_string);
561 	  switch (in_ch)
562 	    {
563 	    case KEY_ENTER:
564 	    case 13:
565 	      templong = atol (
566 				extra_blocks_end_string.string);
567 	      if (templong < 0 || templong > 10000)
568 		{
569 		  error_window ("Enter a whole, positive number. \
570 Default: 6.");
571 		  extra_blocks_end_string.cursorpos =
572 		    strlen (
573 			     extra_blocks_end_string.string);
574 		}
575 	      else
576 		{
577 		  *extra_blocks_end = templong;
578 		  sprintf (extra_blocks_end_string.string,
579 			   "%ld", templong);
580 		  extra_blocks_end_string.cursorpos =
581 		    strlen (
582 			     extra_blocks_end_string.string);
583 		  focus++;
584 		}
585 	      break;
586 
587 	    case KEY_UP:
588 	      focus--;
589 	      break;
590 	    case KEY_DOWN:
591 	      focus++;
592 	      break;
593 	    }
594 	  break;
595 
596 	case 9:		/* < Previous */
597 	  if (in_ch == KEY_ENTER || in_ch == 13)
598 	    {
599 	      returnval = 1;
600 	      dont_stop = FALSE;
601 	    }
602 	  else
603 	    switch (in_ch)
604 	      {
605 	      case KEY_LEFT:
606 	      case KEY_UP:
607 		focus--;
608 		break;
609 	      case KEY_RIGHT:
610 	      case KEY_DOWN:
611 		focus++;
612 		break;
613 	      }
614 	  break;
615 
616 	case 10:		/* Cancel */
617 	  if (in_ch == KEY_ENTER || in_ch == 13)
618 	    {
619 	      returnval = 0;
620 	      dont_stop = FALSE;
621 	    }
622 	  else
623 	    switch (in_ch)
624 	      {
625 	      case KEY_LEFT:
626 	      case KEY_UP:
627 		focus--;
628 		break;
629 	      case KEY_RIGHT:
630 	      case KEY_DOWN:
631 		focus++;
632 		break;
633 	      }
634 	  break;
635 
636 	case 11:		/* Next > */
637 	  if (in_ch == KEY_ENTER || in_ch == 13)
638 	    {
639 	      templong = atol (blocklen_string.string);
640 	      if (templong < 1)
641 		{
642 		  error_window ("Enter a whole number, greater than 0, as \
643 block length. Default: 4410.");
644 		  blocklen_string.cursorpos =
645 		    strlen (blocklen_string.string);
646 		  focus = 2;
647 		  break;
648 		}
649 	      *blocklen = templong;
650 
651 	      templong = atol (global_silence_factor_string.string);
652 	      if (templong < 1 || templong > 10000)
653 		{
654 		  error_window ("Enter a whole, positive number as \
655 global silence factor. Default: 150.");
656 		  global_silence_factor_string.cursorpos =
657 		    strlen (global_silence_factor_string.string);
658 		  focus = 3;
659 		  break;
660 		}
661 	      *global_silence_factor = templong;
662 
663 	      templong = atol (local_silence_threshold_string.string);
664 	      if (templong < 1 || templong > 10000)
665 		{
666 		  error_window ("Enter a whole, positive number as \
667 local silence factor. Default: 5.");
668 		  local_silence_threshold_string.cursorpos =
669 		    strlen (local_silence_threshold_string.string);
670 		  focus = 4;
671 		  break;
672 		}
673 	      *local_silence_threshold = templong;
674 
675 	      templong = atol (min_silence_blocks_string.string);
676 	      if (templong < 1 || templong > 10000)
677 		{
678 		  error_window ("Enter a whole, positive number as \
679 minimal silence duration. Default: 20.");
680 		  min_silence_blocks_string.cursorpos =
681 		    strlen (min_silence_blocks_string.string);
682 		  focus = 5;
683 		  break;
684 		}
685 	      *min_silence_blocks = templong;
686 
687 	      templong = atol (min_track_blocks_string.string);
688 	      if (templong < 1 || templong > 10000)
689 		{
690 		  error_window ("Enter a whole, positive number as \
691 minimal track length. Default: 50.");
692 		  min_track_blocks_string.cursorpos =
693 		    strlen (min_track_blocks_string.string);
694 		  focus = 6;
695 		  break;
696 		}
697 	      *min_track_blocks = templong;
698 
699 	      templong = atol (extra_blocks_start_string.string);
700 	      if (templong < 1 || templong > 10000)
701 		{
702 		  error_window ("Enter a whole, positive number as \
703 block addition. Default: 3.");
704 		  extra_blocks_start_string.cursorpos =
705 		    strlen (extra_blocks_start_string.string);
706 		  focus = 7;
707 		  break;
708 		}
709 	      *extra_blocks_start = templong;
710 
711 	      templong = atol (extra_blocks_end_string.string);
712 	      if (templong < 1 || templong > 10000)
713 		{
714 		  error_window ("Enter a whole, positive number as \
715 block addition. Default: 6.");
716 		  extra_blocks_end_string.cursorpos =
717 		    strlen (extra_blocks_end_string.string);
718 		  focus = 8;
719 		  break;
720 		}
721 	      *extra_blocks_end = templong;
722 
723 	      returnval = 2;
724 	      dont_stop = FALSE;
725 	    }
726 	  else
727 	    switch (in_ch)
728 	      {
729 	      case KEY_LEFT:
730 	      case KEY_UP:
731 		focus--;
732 		break;
733 	      case KEY_RIGHT:
734 	      case KEY_DOWN:
735 		focus++;
736 		break;
737 	      }
738 	  break;
739 
740 	}			/* switch(focus) */
741 
742       if (in_ch == 9)		/* TAB */
743 	focus++;
744 
745       if (in_ch == 27)
746 	dont_stop = FALSE;
747 
748       if (focus > 11)
749 	focus = 0;
750       if (focus < 0)
751 	focus = 11;
752     }
753   while (dont_stop);
754 
755   return returnval;
756 }
757