diff options
Diffstat (limited to 'fb/progress.c')
-rw-r--r-- | fb/progress.c | 398 |
1 files changed, 0 insertions, 398 deletions
diff --git a/fb/progress.c b/fb/progress.c deleted file mode 100644 index d5c7751..0000000 --- a/fb/progress.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * framebuffer tool, inspired from fbi ((c) 1998,99 Gerd Knorr <kraxel@goldbach.in-berlin.de>) - * - * (c) 2002 Florent Villard (warly@mandrakesoft.com) - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <termios.h> -#include <getopt.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <linux/fb.h> -#include <sys/stat.h> -#include <linux/kd.h> -#include <linux/vt.h> -#include <sys/user.h> - -int fd; -static int fb; -unsigned char *fb_mem; -static int tty; -struct fb_fix_screeninfo fb_fix; -struct fb_var_screeninfo fb_var; -static struct fb_var_screeninfo fb_ovar; -static unsigned short ored[256], ogreen[256], oblue[256]; -static struct fb_cmap ocmap = { 0, 256, ored, ogreen, oblue }; -static int kd_mode; -static struct vt_mode vt_omode; -static struct termios term; -int fb_mem_offset = 0; -static int orig_vt_no = 0; -struct termios saved_attributes; -int saved_fl; -char *fbdev = NULL; - -/* Command line options. */ -struct option progress_options[] = { - {"version", no_argument, NULL, 'v'}, /* version */ - {"help", no_argument, NULL, 'h'}, /* help */ - {"device", required_argument, NULL, 'd'}, /* device */ - {"nochange", no_argument, NULL, 'n'}, - {"tty", required_argument, NULL, 't'}, - {0,0,0,0} -}; - - -void -fb_memset (void *addr, int c, size_t len) -{ -#if 1 /* defined(__powerpc__) */ - unsigned int i, *p; - - i = (c & 0xff) << 8; - i |= i << 16; - len >>= 2; - for (p = addr; len--; p++) - *p = i; -#else - memset(addr, c, len); -#endif -} - -void -fb_cleanup(void) -{ - /* restore console */ - if (-1 == ioctl(fb,FBIOPUT_VSCREENINFO,&fb_ovar)) - perror("ioctl FBIOPUT_VSCREENINFO"); - if (-1 == ioctl(fb,FBIOGET_FSCREENINFO,&fb_fix)) - perror("ioctl FBIOGET_FSCREENINFO"); - if (fb_ovar.bits_per_pixel == 8 || - fb_fix.visual == FB_VISUAL_DIRECTCOLOR) { - if (-1 == ioctl(fb,FBIOPUTCMAP,&ocmap)) - perror("ioctl FBIOPUTCMAP"); - } - close(fb); - - if (-1 == ioctl(tty,KDSETMODE, kd_mode)) - perror("ioctl KDSETMODE"); - if (-1 == ioctl(tty,VT_SETMODE, &vt_omode)) - perror("ioctl VT_SETMODE"); - if (orig_vt_no && -1 == ioctl(tty,VT_ACTIVATE, orig_vt_no)) - perror("ioctl VT_ACTIVATE"); - tcsetattr(tty, TCSANOW, &term); - close(tty); -} - -void -fb_setvt(int vtno, int nochange) -{ - struct vt_stat vts; - char vtname[12]; - - if (-1 == ioctl(tty,VT_GETSTATE, &vts)) { - perror("ioctl VT_GETSTATE"); - exit(1); - } - orig_vt_no = vts.v_active; - if ((orig_vt_no != vtno) && nochange) exit(0); - - if (vtno < 0) { - if (-1 == ioctl(tty,VT_OPENQRY, &vtno) || vtno == -1) { - perror("ioctl VT_OPENQRY"); - exit(1); - } - } - - vtno &= 0xff; - sprintf(vtname, "/dev/tty%d", vtno); - chown(vtname, getuid(), getgid()); - if (-1 == access(vtname,R_OK | W_OK)) { - fprintf(stderr,"access %s: %s\n",vtname,strerror(errno)); - exit(1); - } - switch (fork()) { - case 0: - break; - case -1: - perror("fork"); - exit(1); - default: - exit(0); - } - close(tty); - close(0); - close(1); - close(2); - setsid(); - open(vtname,O_RDWR); - dup(0); - dup(0); - - if (-1 == ioctl(tty,VT_ACTIVATE, vtno)) { - perror("ioctl VT_ACTIVATE"); - exit(1); - } - if (-1 == ioctl(tty,VT_WAITACTIVE, vtno)) { - perror("ioctl VT_WAITACTIVE"); - exit(1); - } -} - - -int -fb_init(char *device, int vt, int nochange) -{ - struct stat st; - char fbdev[16]; - - tty = 0; - if (vt != 0) - fb_setvt(vt,nochange); - - /* FIXME: where are MAJOR() / MINOR() ??? */ - fstat(tty,&st); -#if 0 - if (((st.st_rdev >> 8) & 0xff) != TTY_MAJOR) { - /* catch that here, give a more user friendly error message that just - * throw a error about a failed ioctl later on ... */ - fprintf(stderr, - "ERROR: tty is not a linux console. You can not start this\n" - " tool from a pseudo tty (xterm/ssh/screen/...).\n"); - exit(1); - } -#endif - if (NULL == device) { - device = getenv("FRAMEBUFFER"); - if (NULL == device) { - struct fb_con2fbmap c2m; - if (-1 == (fb = open("/dev/fb0",O_WRONLY,0))) { - fprintf(stderr,"open /dev/fb0: %s\n",strerror(errno)); - exit(1); - } - c2m.console = st.st_rdev & 0xff; - if (-1 == ioctl(fb, FBIOGET_CON2FBMAP, &c2m)) { - perror("ioctl FBIOGET_CON2FBMAP"); - exit(1); - } - close(fb); - //fprintf(stderr,"map: vt%02d => fb%d\n",c2m.console,c2m.framebuffer); - sprintf(fbdev,"/dev/fb%d",c2m.framebuffer); - device = fbdev; - } - } - /* get current settings (which we have to restore) */ - if (-1 == (fb = open(device,O_RDWR /* O_WRONLY */))) { - fprintf(stderr,"open %s: %s\n",device,strerror(errno)); - exit(1); - } - if (-1 == ioctl(fb,FBIOGET_VSCREENINFO,&fb_ovar)) { - perror("ioctl FBIOGET_VSCREENINFO"); - exit(1); - } - if (-1 == ioctl(fb,FBIOGET_FSCREENINFO,&fb_fix)) { - perror("ioctl FBIOGET_FSCREENINFO"); - exit(1); - } - if (fb_ovar.bits_per_pixel == 8 || - fb_fix.visual == FB_VISUAL_DIRECTCOLOR) { - if (-1 == ioctl(fb,FBIOGETCMAP,&ocmap)) { - perror("ioctl FBIOGETCMAP"); - exit(1); - } - } - if (-1 == ioctl(tty,KDGETMODE, &kd_mode)) { - perror("ioctl KDGETMODE"); - exit(1); - } - if (-1 == ioctl(tty,VT_GETMODE, &vt_omode)) { - perror("ioctl VT_GETMODE"); - exit(1); - } - tcgetattr(tty, &term); - - /* get mode info */ - if (-1 == ioctl(fb,FBIOGET_VSCREENINFO,&fb_var)) { - perror("ioctl FBIOGET_VSCREENINFO"); - exit(1); - } - - /* checks & initialisation */ - if (-1 == ioctl(fb,FBIOGET_FSCREENINFO,&fb_fix)) { - perror("ioctl FBIOGET_FSCREENINFO"); - exit(1); - } - if (fb_fix.type != FB_TYPE_PACKED_PIXELS) { - fprintf(stderr,"can handle only packed pixel frame buffers\n"); - goto err; - } - fb_mem_offset = (unsigned long)(fb_fix.smem_start) & (~PAGE_MASK); - fb_mem = mmap(NULL,fb_fix.smem_len+fb_mem_offset,PROT_WRITE,MAP_SHARED,fb,0); - if (-1L == (long)fb_mem) { - perror("mmap"); - goto err; - } - /* move viewport to upper left corner */ - if (fb_var.xoffset != 0 || fb_var.yoffset != 0) { - fb_var.xoffset = 0; - fb_var.yoffset = 0; - if (-1 == ioctl(fb,FBIOPAN_DISPLAY,&fb_var)) { - perror("ioctl FBIOPAN_DISPLAY"); - goto err; - } - } -// if (-1 == ioctl(tty,KDSETMODE, KD_GRAPHICS)) { -// perror("ioctl KDSETMODE"); -// goto err; -// } - - /* cls */ - //fb_memset(fb_mem+fb_mem_offset,0,fb_fix.smem_len); - return fb; - - err: - fb_cleanup(); - exit(1); -} - -void -tty_restore() -{ - fcntl(0,F_SETFL,saved_fl); - tcsetattr (0, TCSANOW, &saved_attributes); -} - -void -tty_raw() -{ - struct termios tattr; - - fcntl(0,F_GETFL,&saved_fl); - tcgetattr (0, &saved_attributes); - - fcntl(0,F_SETFL,O_NONBLOCK); - memcpy(&tattr,&saved_attributes,sizeof(struct termios)); - tattr.c_lflag &= ~(ICANON|ECHO); - tattr.c_cc[VMIN] = 1; - tattr.c_cc[VTIME] = 0; - tcsetattr (0, TCSAFLUSH, &tattr); -} - -void -version(void) -{ - fprintf(stderr, "progress version " VERSION - " (c) 2002 Florent Villard <warly@mandrakesoft.com>; compiled on %s.\n", __DATE__ ); -} - -void -usage(char *name) -{ - char *h; - h = strrchr(name, '/'); - fprintf(stderr, - "\n" - "This program displays rectangles using the Linux framebuffer device.\n" - "\n" - " Usage: %s [ options ] x y dx dy color\n" - "\n" - " --help [-h] Print this text\n" - " --version [-v] Show the %s version number\n" - " --device [-d] dev Framebuffer device [%s]\n" - " --nochange [-n] Exit if tty is not the current one\n" - " --tty [-t] tty Display on a specific tty (actual if omitted)\n" - "\n" - "\n" - ,h ? h + 1 : name, h ? h + 1 : name,fbdev ? fbdev : "/dev/fb0"); -} - - - -int -main(int argc, char *argv[]) -{ - int i,j,bytes; - int x,y,X,Y; - int color; - int opt_index = 0; - int c,tty=0; - int nochange = 0; - char * tab; - char * a; - for (;;) { - c = getopt_long(argc, argv, "vhnd:t:", progress_options, &opt_index); - if (c == -1) - break; - switch (c) { - case 'd': - fbdev = optarg; - break; - case 'v': - version(); - exit(1); - break; - case 'n': - nochange=1; - break; - case 't': - tty = atoi(optarg); - break; - default: - case 'h': - usage(argv[0]); - exit(1); - } - } - if (optind > argc - 5) { - usage(argv[0]); - exit(1); - } - fd = fb_init(fbdev, tty, nochange); - x = atoi((char *)*(argv+optind++)); - if ( x > fb_var.xres ) x = 0; - y = atoi((char *)*(argv+optind++)); - if ( y > fb_var.yres ) y = 0; - X = atoi((char *)*(argv+optind++)); - if ( X + x > fb_var.xres ) X = fb_var.xres-x; - Y = atoi((char *)*(argv+optind++)); - if ( Y + y > fb_var.yres ) Y = fb_var.yres-y; - color = strtol((char *)*(argv+optind++),NULL,16); - - // printf("x %d y %d X %d Y %d color %x bit per pixel %d red %d green %d blue %d tty %d\n",x,y,X,Y,color,fb_var.bits_per_pixel,fb_var.red.length,fb_var.green.length,fb_var.blue.length,tty); - exit; - switch (fb_var.bits_per_pixel){ - case 24: break; - case 16: - case 15: - color = ((color & 0xff0000) >> 16 >> 3 << (fb_var.green.length + fb_var.blue.length)) + ((color & 0x00ff00) >> 8 >> 2 << (fb_var.blue.length)) + ((color & 0x0000ff) >> 3); - break; - default: - perror("unsupported bits per pixel mode"); - exit(1); - } - bytes = (fb_var.bits_per_pixel+7)/8; - tty_raw(); - tab = (char *)malloc(sizeof(char)*bytes*X); - a = (char *)malloc(sizeof(char)*bytes); - for (j = 0; j < bytes; j++){ - a[j] = color >> (8*j); - } - for (i = 0; i < X; i++) { - for (j = 0; j < bytes; j++){ - tab[bytes*i+j] = a[j]; - } - memcpy(fb_mem+(y*fb_var.xres+x+i)*bytes, a, bytes); - } - for (j = 1; j < Y; j++){ - memcpy(fb_mem+(y+j)*bytes*fb_var.xres+x*bytes, tab, bytes*X); - } - tty_restore(); - return 0; -} |