int FB_exit() { int ioctl_err; char *errstr; if(!FB_visible && (b_store != NULL)) { free(b_store); b_store = NULL; } ioctl_err = ioctl(fbufd,FBIOPUT_VSCREENINFO,&backup_var_info); if(ioctl_err < 0) { errstr = strerror(errno); fprintf(stderr,"FBlib:ioctl FBIOPUT_VSCREENINFO failed: %s \n",errstr); return IOCTL_ERR; } fb_unmap(); close(fbufd); if(uses_keyboard) FB_kb_end(); printf("\n"); /* Cause a redraw to align the bottom of the screen */ return OK; }
void fb_cleanup(void) { Debug("fb_cleanup()\n"); if (saved_fb) fb_restore(); if (fb) fb_unmap(); if (fb_fd != -1) { if (saved_cmap.len) { fb_cmap = saved_cmap; RESTORE_AND_FREE_COMPONENT(red); RESTORE_AND_FREE_COMPONENT(green); RESTORE_AND_FREE_COMPONENT(blue); if (fb_cmap.transp) RESTORE_AND_FREE_COMPONENT(transp); fb_set_cmap(); } //fb_var = saved_var; memcpy(&fb_var, &saved_var, sizeof(struct fb_var_screeninfo)); fb_set_var(); fb_get_var(); /* FIXME: compare fb_var with saved_var */ fb_get_fix(); /* FIXME: compare fb_fix with saved_fix */ fb_close(); } }
void fb_switch(int n_sig) { static int switching=0; signal(SIGUSR2, fb_switch); /* reset signal handler */ if(switching && (n_sig == SIGUSR2)) return; if(switching == 0) switching = 1; if(FB_visible) { b_store = (char*)malloc(visiblesize); if(b_store == NULL) fprintf(stderr,"FBlib:cannot use backing store for VT switch"); else memcpy(b_store, fbp, visiblesize); fb_unmap(); fbp = b_store; FB_visible = 0; if(ioctl(TTY,VT_RELDISP,1) < 0) { fprintf(stderr,"FBlib:ioctl VT_RELDISP failed: %s \n",strerror(errno)); fb_map(); free(b_store); FB_visible=1; } } else { if(ioctl(TTY,VT_RELDISP,VT_ACKACQ) < 0) { fprintf(stderr,"FBlib:ioctl VT_RELDISP failed: %s (FATAL error)\n",strerror(errno)); FB_exit(); exit(1); } fb_map(); memcpy(fbp, b_store, visiblesize); free(b_store); b_store=NULL; FB_visible=1; } switching=0; return; }