#include #include #include curshell(fx, fy, width, height, wrap, up, down, left, right, enter, cur_proc) int fx, fy; /* starting point */ int width, height; /* max values for fx and fy */ int wrap; /* do what upon hitting bounds */ char up[], down[], left[], right[], enter[]; int (*cur_proc) (); { char and[5]; char ch; /* input char read */ int changed=1; /* true if change in cursor loc */ int fd; int go=1; /* while true, keep reading */ int inc=16; /* pixels per keystroke */ int oldflags; /* original sg_flags values */ int stop=0; /* cur_proc flag to exit */ struct sgttyb tty_arg; /* terminal I/O stuff */ if ((fd = open("/dev/tty", O_RDWR, 0)) < 0) errprnt("couldnt open tty keyboard for reading"); ioctl(fd, TIOCGETP, &tty_arg); oldflags = tty_arg.sg_flags; tty_arg.sg_flags |= CBREAK; tty_arg.sg_flags &= ~ECHO; ioctl(fd, TIOCSETP, &tty_arg); tty_arg.sg_flags = oldflags; if ((strcmp(up,"") == 0) && (strcmp(down,"") == 0)) strcpy(and,""); else if ((strcmp(left,"") == 0) && (strcmp(right,"") == 0)) strcpy(and,""); else strcpy(and," and "); while (go) { if (changed) { if (wrap) { while (fx > width-1) fx -= width; while (fx < 0) fx += width; while (fy > height-1) fy -= height; while (fy < 0) fy += height; } else { if (fx > width-1) fx = width-1; if (fx < 0) fx = 0; if (fy > height-1) fy = height-1; if (fy < 0) fy = 0; } cur_proc(&fx, &fy, 0, &stop); } changed = 1; if (stop) ch = ' '; else read(fd, &ch, 1); switch (ch) { case '+': inc <<= 1; if (inc > 64) inc = 64; changed = 0; break; case '-': inc >>= 1; if (inc < 1) inc = 1; changed = 0; break; case '\t': cur_proc(&fx, &fy, 1, &stop); changed = 0; break; case 'k': fy -= inc; break; case 'K': fy -= 1; break; case 'l': fx += inc; break; case 'L': fx += 1; break; case 'j': fy += inc; break; case 'J': fy += 1; break; case 'h': fx -= inc; break; case 'H': fx -= 1; break; case 'u': fy -= inc; fx += inc; break; case 'U': fy -= 1; fx += 1; break; case 'n': fy += inc; fx += inc; break; case 'N': fy += 1; fx += 1; break; case 'b': fy += inc; fx -= inc; break; case 'B': fy += 1; fx -= 1; break; case 'y': fy -= inc; fx -= inc; break; case 'Y': fy -= 1; fx -= 1; break; case ' ': go = 0; break; default : changed = 0; fprintf(stderr,"\n legal choices are :\n"); fprintf(stderr," + double increment\n"); fprintf(stderr," - halve increment\n"); fprintf(stderr," %s\n",enter); fprintf(stderr," quit\n"); fprintf(stderr,"K %s\n",up); fprintf(stderr,"L %s\n",right); fprintf(stderr,"J %s\n",down); fprintf(stderr,"H %s\n",left); fprintf(stderr,"U %s%s%s\n",up,and,right); fprintf(stderr,"N %s%s%s\n",down,and,right); fprintf(stderr,"B %s%s%s\n",down,and,left); fprintf(stderr,"Y %s%s%s\n",up,and,left); fprintf(stderr," Y K U\n"); fprintf(stderr," \\ | /\n"); fprintf(stderr," \\|/\n"); fprintf(stderr,"H -- -- L\n"); fprintf(stderr," /|\\\n"); fprintf(stderr," / | \\\n"); fprintf(stderr," B J N\n"); fprintf(stderr,"Lower case letters move cursor by `increment',\n"); fprintf(stderr,"Capital letters move cursor by one pixel.\n"); break; } } ioctl(fd, TIOCSETP, &tty_arg); close(fd); return(stop); }