⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vgabgvt.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
字号:
/*   */#ifdef BACKGROUND#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <signal.h>#include <termios.h>#include <string.h>#include <unistd.h>#include <stdarg.h>#include <sys/mman.h>#include <sys/kd.h>#include <sys/ioctl.h>#include <sys/stat.h>#include <sys/vt.h>#include <sys/wait.h>#include <errno.h>#include <ctype.h>#include "vga.h"#include "libvga.h"#include "driver.h"#include "mouse/vgamouse.h"#include "keyboard/vgakeyboard.h"#include "vgabg.h"#define RELEASE 1#define ACQUIRE 2/* #define QUEUE_SIZE 200*/#if 0#define SETSIG(sa, sig, fun) {\	sa.sa_handler = fun; \	sa.sa_flags = 0; \	sa.sa_mask = vt_block_mask; \	sigaction(sig, &sa, NULL); \}#endif#define SETSIG_RE(sa, sig, fun) {\	sa.sa_handler = fun; \	sa.sa_flags = 0; \	sa.sa_mask = __vt_block_mask_release; \	sigaction(sig, &sa, NULL); \}#define SETSIG_AQ(sa, sig, fun) {\	sa.sa_handler = fun; \	sa.sa_flags = 0; \	sa.sa_mask = __vt_block_mask_aquire; \	sigaction(sig, &sa, NULL); \}/*#define DEBUG  *//* Virtual console switching */static int release_acquire=0;static int forbidvtrelease = 0;static int forbidvtacquire = 0;static int lock_count = 0;static int release_flag = 0;static int __vt_switching_not_ok = 0;static int __vt_switching_asked = 0;static int __vt_check_last_signal = 0;	/* Never the same signal twice */static sigset_t __vt_block_mask_aquire;static sigset_t __vt_block_mask_release;static sigset_t __vt_block_mask_switching;#if 0static sigset_t vt_block_mask;unsigned char *__svga_graph_mem_orginal;unsigned char *__svga_graph_mem_check;static int __svgalib_oktowrite = 1;/* __svgalib_oktowrite tells if it is safe to write registers. */static int __svgalib_virtual_mem_fd = -1;static int __svga_processnumber = -1;#endifstatic int __vt_switching_state=RELEASE;static int __vt_switching_signal_no;/*static int __vt_switching_to_queue[QUEUE_SIZE] = {0};static int __vt_switching_signal_no_queue[QUEUE_SIZE] = {0};static int __vt_signalqueuepointer = 0;static int __vt_signalqueuenewpointer = 0;*//* User defined functions for vc switching. */void (*__svgalib_go_to_background) (void) = 0;void (*__svgalib_come_from_background) (void) = 0;#endif#ifdef BACKGROUNDstatic void releasevt_signal(int n);static void acquirevt_signal(int n);static void __releasevt_signal(int n){/*    struct sigaction siga; */    if (lock_count) {	release_flag = 1;	return;    }#ifdef DEBUG    printf("Release request.\n");#endif    forbidvtacquire = 1;    /*SETSIG(siga, SVGALIB_RELEASE_SIG, releasevt_signal); */    if (forbidvtrelease) {	forbidvtacquire = 0;	ioctl(__svgalib_tty_fd, VT_RELDISP, 0);	return;    }    if (__svgalib_go_to_background)	(__svgalib_go_to_background) ();    __vt_check_last_signal = RELEASE;    __vt_switching_state=RELEASE;    __svgalib_flipaway();    ioctl(__svgalib_tty_fd, VT_RELDISP, 1);#ifdef DEBUG    printf("Finished release.\n");#endif    forbidvtacquire = 0;        if((__svgalib_textprog&3)==3){           pid_t child;           if((child=fork())==0){           execv(__svgalib_TextProg,__svgalib_TextProg_argv);           } else {           waitpid(child,NULL,0);           };          };    /* Suspend program until switched to again. */#ifdef DEBUG    printf("Suspended.\n");#endif    __svgalib_oktowrite = 0;    if (!__svgalib_runinbackground)	__svgalib_waitvtactive();#ifdef DEBUG    printf("Waked.\n");#endif}static void releasevt_signal(int n){    struct sigaction siga;#ifdef DEBUG    printf("vt: rel ");#endif    if (__vt_switching_not_ok || __vt_switching_asked) {	if (__vt_check_last_signal != RELEASE)	    {	     __vt_switching_asked=1;	     __vt_switching_signal_no=n;	     __vt_switching_state=RELEASE;	    }    } else {	/* __svgalib_dont_switch_vt_yet(); */	if (__vt_check_last_signal != RELEASE)	    __releasevt_signal(n);	/* sets __vt_check_last_signal */	/* __svgalib_is_vt_switching_needed(); */    }    SETSIG_AQ(siga, SVGALIB_ACQUIRE_SIG, acquirevt_signal);    SETSIG_RE(siga, SVGALIB_RELEASE_SIG, releasevt_signal);#ifdef DEBUG    printf("ok\n");#endif    return;}static void __acquirevt_signal(int n){/*    struct sigaction siga; */#ifdef DEBUG    printf("Acquisition request.\n");#endif    /* vt_check_last_signal=ACQUIRE; */    forbidvtrelease = 1;    /*SETSIG(siga, SVGALIB_ACQUIRE_SIG, acquirevt_signal); */    if (forbidvtacquire) {	forbidvtrelease = 0;	return;    }    __vt_check_last_signal = ACQUIRE;    __vt_switching_state=ACQUIRE;    __svgalib_flipback();    ioctl(__svgalib_tty_fd, VT_RELDISP, VT_ACKACQ);#ifdef DEBUG    printf("Finished acquisition.\n");#endif    /*forbidvtrelease = 0; */    __svgalib_oktowrite = 1;    if (__svgalib_come_from_background)	(__svgalib_come_from_background) ();    forbidvtrelease = 0;}static void acquirevt_signal(int n){    struct sigaction siga;#ifdef DEBUG    printf("vt: acq ");#endif    if (__vt_switching_not_ok || __vt_switching_asked) {	if (__vt_check_last_signal != ACQUIRE)	    {	     __vt_switching_asked=1;	     __vt_switching_signal_no=n;             __vt_switching_state=ACQUIRE;	    }    } else {	/* __svgalib_dont_switch_vt_yet(); */	if (__vt_check_last_signal != ACQUIRE)	    __acquirevt_signal(n);	/* sets __vt_check_last_signal */	/* __svgalib_is_vt_switching_needed(); */    }    SETSIG_RE(siga, SVGALIB_RELEASE_SIG, releasevt_signal);    SETSIG_AQ(siga, SVGALIB_ACQUIRE_SIG, acquirevt_signal);#ifdef DEBUG    printf("ok\n");#endif    return;}void __svgalib_dont_switch_vt_yet(void){    __vt_switching_not_ok++;    return;}void __svgalib_is_vt_switching_needed(void){         __vt_switching_not_ok--;    if (__vt_switching_not_ok < 0) {	__vt_switching_not_ok = 0;	printf("svgalib: lock warning, over done.\n");    }          if (__vt_switching_not_ok) return;    if (__vt_switching_asked)        {         /* Block signals... hmm ignore them */         sigprocmask(SIG_BLOCK,&__vt_block_mask_switching,NULL);	 if (__vt_switching_state==RELEASE &&	     __vt_check_last_signal!=RELEASE) {#ifdef DEBUG	     printf("RELEASE ");#endif	     __releasevt_signal(__vt_switching_signal_no);	     __vt_switching_signal_no=0;             __vt_switching_state=ACQUIRE;#ifdef DEBUG	     printf("OK.\n");#endif	 }	  else	  {	   if (__vt_switching_state==ACQUIRE &&	       __vt_check_last_signal!=ACQUIRE) {#ifdef DEBUG	       printf("ACQUIRE ");#endif	       __acquirevt_signal(__vt_switching_signal_no);	       __vt_switching_signal_no=0;               __vt_switching_state=RELEASE;#ifdef DEBUG	       printf("OK.\n");#endif	    }	   }              	 __vt_switching_asked=0;         sigprocmask(SIG_UNBLOCK,&__vt_block_mask_switching,NULL);        }    return;}/* These both variables should be static. However, oldvtmode is   restored in vga.c.. so.. */struct vt_mode __svgalib_oldvtmode;static struct vt_mode newvtmode;void __svgalib_takevtcontrol(void){    struct sigaction siga;    ioctl(__svgalib_tty_fd, VT_GETMODE, &__svgalib_oldvtmode);    newvtmode = __svgalib_oldvtmode;    newvtmode.mode = VT_PROCESS;	/* handle VT changes */    newvtmode.relsig = SVGALIB_RELEASE_SIG;	/* I didn't find SIGUSR1/2 anywhere */    newvtmode.acqsig = SVGALIB_ACQUIRE_SIG;	/* in the kernel sources, so I guess */                                        /* they are free */    sigemptyset(&__vt_block_mask_switching);    sigaddset(&__vt_block_mask_switching,SVGALIB_RELEASE_SIG|SVGALIB_ACQUIRE_SIG);    sigemptyset(&__vt_block_mask_aquire);    sigaddset(&__vt_block_mask_aquire, SVGALIB_RELEASE_SIG);    sigemptyset(&__vt_block_mask_release);    sigaddset(&__vt_block_mask_release, SVGALIB_ACQUIRE_SIG);    SETSIG_RE(siga, SVGALIB_RELEASE_SIG, releasevt_signal);    SETSIG_AQ(siga, SVGALIB_ACQUIRE_SIG, acquirevt_signal);    ioctl(__svgalib_tty_fd, VT_SETMODE, &newvtmode);    return;}void vga_lockvc(void){    lock_count++;    if (__svgalib_flip_status())	__svgalib_waitvtactive();    return;}void vga_unlockvc(void){    if (--lock_count <= 0) {	lock_count = 0;	if (release_flag) {	    release_flag = 0;	    releasevt_signal(SVGALIB_RELEASE_SIG);	}    }    return;}void vga_runinbackground(int stat,...){    va_list params;    va_start(params, stat);    switch (stat) {    case VGA_GOTOBACK:	__svgalib_go_to_background = va_arg(params, void *);	break;    case VGA_COMEFROMBACK:	__svgalib_come_from_background = va_arg(params, void *);	break;    default:	__svgalib_runinbackground = stat;	break;    }    va_end(params);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -