* Copyright (c) 1994 Søren Schmidt
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software withough specific prior written permission
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <machine/console.h>
char legal_colors
[16][16] = {
"black", "blue", "green", "cyan",
"red", "magenta", "brown", "white",
"grey", "lightblue", "lightgreen", "lightcyan",
"lightred", "lightmagenta", "yellow", "lightwhite"
nextarg(int ac
, char **av
, int *indp
, int oc
)
fprintf(stderr
, "%s: option requires two arguments -- %c\n", av
[0], oc
);
mkfullname(const char *s1
, const char *s2
, const char *s3
)
f
= strlen(s1
) + strlen(s2
) + strlen(s3
) + 1;
buf
= (char *)realloc(buf
, f
);
load_scrnmap(char *filename
)
char *prefix
[] = {"", "", SCRNMAP_PATH
, NULL
};
char *postfix
[] = {"", ".scm", ".scm"};
for (i
=0; prefix
[i
]; i
++) {
name
= mkfullname(prefix
[i
], filename
, postfix
[i
]);
if (fd
= fopen(name
, "r"))
perror("font file not found");
if (decode(fd
, scrnmap
) != sizeof(scrnmap
)) {
fprintf(stderr
, "bad scrnmap file\n");
if (ioctl(0, PIO_SCRNMAP
, scrnmap
) < 0)
perror("can't load screenmap");
if (ioctl(0, GIO_SCRNMAP
, &map
) < 0) {
perror("getting scrnmap");
for (i
=0; i
<sizeof(map
); i
++) {
if (i
> 0 && i
% 16 == 0)
fprintf(stdout
, " %02x", map
[i
]);
fprintf(stdout
, " %03d", map
[i
]);
load_font(char *type
, char *filename
)
char *prefix
[] = {"", "", FONT_PATH
, NULL
};
char *postfix
[] = {"", ".fnt", ".fnt"};
for (i
=0; prefix
[i
]; i
++) {
name
= mkfullname(prefix
[i
], filename
, postfix
[i
]);
if (fd
= fopen(name
, "r"))
perror("font file not found");
if (!strcmp(type
, "8x8")) {
else if (!strcmp(type
, "8x14")) {
else if (!strcmp(type
, "8x16")) {
perror("bad font size specification");
fontmap
= (char*) malloc(size
);
if (decode(fd
, fontmap
) != size
) {
fprintf(stderr
, "bad font file\n");
if (ioctl(0, io
, fontmap
) < 0)
perror("can't load font");
set_screensaver_timeout(char *arg
)
if ((*arg
== '\0') || (nsec
< 1)) {
fprintf(stderr
, "argument must be a positive number\n");
if (ioctl(0, CONS_BLANKTIME
, &nsec
) == -1)
perror("setting screensaver period");
set_screensaver_type(char *type
)
if (!strcmp(type
, "help")) {
printf("available screen saver types:\n");
e
= ioctl(0, CONS_GSAVER
, &saver
);
printf("\t%d\t%s\n", saver
.num
, saver
.name
);
if (e
== -1 && errno
!= EIO
)
perror("getting screensaver info");
e
= ioctl(0, CONS_GSAVER
, &saver
);
if (e
== 0 && !strcmp(type
, saver
.name
)) {
if (ioctl(0, CONS_SSAVER
, &saver
) == -1)
perror("setting screensaver type");
if (e
== -1 && errno
!= EIO
)
perror("getting screensaver info");
fprintf(stderr
, "%s: No such screensaver\n", type
);
set_cursor_values(char *size
)
start
= strtol(size
, &v1
, 0);
if ((start
< 0) || (*v1
!= '.'))
end
= strtol(size
, &v1
, 0);
if ((end
< 0) || (*size
== '\0') || (*v1
!= '\0')) {
"argument to -c must be start.end\n");
fprintf(stderr
, "setting cursor to %d.%d\n", start
, end
);
fprintf(stdout
, "\e[=%d;%dC", start
, end
);
video_mode(int argc
, char **argv
, int *index
)
if (!strcmp(argv
[*index
], "80x25"))
else if (!strcmp(argv
[*index
], "80x50"))
if (ioctl(0, mode
, NULL
) < 0)
perror("Cannot set videomode");
get_color_number(char *color
)
if (!strcmp(color
, legal_colors
[i
]))
set_normal_colors(int argc
, char **argv
, int *index
)
if (*index
< argc
&& (color
= get_color_number(argv
[*index
])) != -1) {
fprintf(stderr
, "\e[=%dF", color
);
&& (color
= get_color_number(argv
[*index
])) != -1
fprintf(stderr
, "\e[=%dG", color
);
set_reverse_colors(int argc
, char **argv
, int *index
)
if ((color
= get_color_number(argv
[*(index
)-1])) != -1) {
fprintf(stderr
, "\e[=%dH", color
);
&& (color
= get_color_number(argv
[*index
])) != -1
fprintf(stderr
, "\e[=%dI", color
);
set_border_color(char *arg
)
if ((color
= get_color_number(arg
)) != -1) {
fprintf(stderr
, "\e[=%dA", color
);
fprintf(stdout
, "\e[=0G\n\n");
fprintf(stdout
, "\e[=15F\e[=0G %2d \e[=%dF%-16s"
"\e[=15F\e[=0G %2d \e[=%dF%-16s "
"\e[=15F %2d \e[=%dGBACKGROUND\e[=0G\n",
i
, i
, legal_colors
[i
], i
+8, i
+8,
legal_colors
[i
+8], i
, i
);
fprintf(stdout
, "\e[=%dF\e[=%dG\e[=%dH\e[=%dI\n",
info
.mv_norm
.fore
, info
.mv_norm
.back
,
info
.mv_rev
.fore
, info
.mv_rev
.back
);
"Usage: vidcontrol mode (available modes: 80x25, 80x50)\n"
" show (show available colors)\n"
" fgcol bgcol (set fore- & background colors)\n"
" -r fgcol bgcol (set reverse fore- & background colors)\n"
" -b color (set border color)\n"
" -c n.m (set cursor start line n & end line m)\n"
" -d (dump scrnmap map to stdout)\n"
" -l filename (load scrnmap map file)\n"
" -f DxL filename (load font, D dots wide & L lines high)\n"
" -s saver | help (set screensaver type or help for a list)\n"
" -t N (set screensaver timeout in seconds)\n"
main(int argc
, char **argv
)
info
.size
= sizeof(info
);
if (ioctl(0, CONS_GETINFO
, &info
) < 0) {
perror("Must be on a vty");
while((opt
= getopt(argc
, argv
, "b:c:df:l:r:s:t:vx")) != -1)
set_cursor_values(optarg
);
set_border_color(optarg
);
nextarg(argc
, argv
, &optind
, 'f'));
set_reverse_colors(argc
, argv
, &optind
);
set_screensaver_type(optarg
);
set_screensaver_timeout(optarg
);
if (video_mode(argc
, argv
, &optind
)) ;
if (set_normal_colors(argc
, argv
, &optind
)) ;
if (optind
< argc
&& !strcmp(argv
[optind
], "show")) {
if ((optind
!= argc
) || (argc
== 1)) {