SvgaLib/demos/svidtune.c

181 lines
5.1 KiB
C
Raw Permalink Normal View History

/* Program to test the svgalib keyboard functions. */
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <vga.h>
#include <vgagl.h>
#include <vgakeyboard.h>
void usage(void)
{
puts("Usage: svidtune [mode]\n"
);
exit(2);
}
int main(int argc, char **argv)
{
int x=-1,xmax,ymax;
char buffer[2];
int vgamode;
int key, retval = 0;
int pixelClock;
int HDisplay;
int HSyncStart;
int HSyncEnd;
int HTotal;
int VDisplay;
int VSyncStart;
int VSyncEnd;
int VTotal;
int flags;
float hsf,vsf;
char flagstring[256];
if (argc > 2)
usage();
if(argc==2){
if(!sscanf(argv[1], "%d", &x))
usage();
};
vga_init();
if(x==-1)vgamode = vga_getdefaultmode(); else vgamode=x;
if (vgamode == -1)
vgamode = G640x480x256;
if (!vga_hasmode(vgamode)) {
printf("Mode not available.\n");
exit(1);
}
vga_setmode(vgamode);
gl_setcontextvga(vgamode);
gl_enableclipping();
gl_setfont(8, 8, gl_font8x8);
gl_setwritemode(FONT_COMPRESSED + WRITEMODE_OVERWRITE);
gl_setfontcolors(0, vga_white());
buffer[1] = 0;
for(;!buffer[1];) {
vga_getcurrenttiming(&pixelClock,
&HDisplay,
&HSyncStart,
&HSyncEnd,
&HTotal,
&VDisplay,
&VSyncStart,
&VSyncEnd,
&VTotal,
&flags);
sprintf(flagstring,"%s%s%s%s%s%s",
flags&1?"+hsync ":"",
flags&2?"-hsync ":"",
flags&4?"+vsync ":"",
flags&8?"-vsync ":"",
flags&16?"interlaced ":"",
flags&32?"doublescan":"");
hsf=pixelClock*1000.0/HTotal;
vsf=hsf/VTotal;
if(flags&32)vsf=vsf/2;
gl_printf(500,500,"<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><>");
gl_printf(10,5, "Clock:%i", pixelClock);
gl_printf(10,25, "HDisplay:%i", HDisplay);
gl_printf(10,45, "HSyncStart:%i", HSyncStart);
gl_printf(10,65, "HSyncEnd:%i", HSyncEnd);
gl_printf(10,85, "HTotal:%i", HTotal);
gl_printf(10,105, "VDisplay:%i", VDisplay);
gl_printf(10,125, "VSyncStart:%i", VSyncStart);
gl_printf(10,145, "VSyncEnd:%i", VSyncEnd);
gl_printf(10,165, "VTotal:%i", VTotal);
gl_printf(10,185, "flags:%i = %s", flags,flagstring);
gl_printf(10,205, "Horz freq:%.3f kHz", hsf/1000);
gl_printf(10,215, "Vert freq:%.2f Hz", vsf);
if(VDisplay>270){
gl_printf(10,235, "Up, Down, Left, Right, Wider, Narrower, lOnger, Shorter");
gl_printf(10,258, "'p' - prints current modeline to stdout, 'P' - to config file ");
};
xmax = vga_getxdim() - 1;
ymax = vga_getydim() - 1;
vga_setcolor(vga_white());
vga_drawline(0, 0, xmax, 0);
vga_drawline(xmax, 0, xmax, ymax);
vga_drawline(xmax, ymax, 0, ymax);
vga_drawline(0, ymax, 0, 0);
key = vga_getch();
switch(key) {
case 4:
case 'q':
buffer[1]=1;
break;
case 'l':
vga_changetiming(0,0,8,8,0,0,0,0,0,0);
break;
case 'r':
vga_changetiming(0,0,-8,-8,0,0,0,0,0,0);
break;
case 'u':
vga_changetiming(0,0,0,0,0,0,1,1,0,0);
break;
case 'd':
vga_changetiming(0,0,0,0,0,0,-1,-1,0,0);
break;
case 'w':
vga_changetiming(0,0,-4,-4,-8,0,0,0,0,0);
break;
case 'n':
vga_changetiming(0,0,4,4,8,0,0,0,0,0);
break;
case 's':
vga_changetiming(0,0,0,0,0,0,1,1,2,0);
break;
case 'o':
vga_changetiming(0,0,0,0,0,0,-1,-1,-2,0);
break;
case 'p':
fprintf(stderr,"Modeline %c%ix%i@%.0f%c %.3f %i %i %i %i %i %i %i %i %s\n",'"',xmax+1,ymax+1,vsf,'"',
pixelClock/1000.0,
HDisplay,
HSyncStart,
HSyncEnd,
HTotal,
VDisplay,
VSyncStart,
VSyncEnd,
VTotal,
flagstring);
break;
case 'P':{
FILE *f;
f=fopen("/etc/vga/libvga.config","a");
fprintf(f,"Modeline %c%ix%i@%.0f%c %.3f %i %i %i %i %i %i %i %i %s\n",'"',xmax+1,ymax+1,vsf,'"',
pixelClock/1000.0,
HDisplay,
HSyncStart,
HSyncEnd,
HTotal,
VDisplay,
VSyncStart,
VSyncEnd,
VTotal,
flagstring);
fclose(f);
};
break;
};
}
vga_setmode(TEXT);
exit(retval);
}