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

📄 scvidctl.c

📁 基于组件方式开发操作系统的OSKIT源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    scp->status &= ~(GRAPHICS_MODE | MOUSE_ENABLED);    scp->xsize = xsize;    scp->ysize = ysize;    scp->font_size = fontsize;    scp->xoff = (scp->xpixel/8 - xsize)/2;    scp->yoff = (scp->ypixel/fontsize - ysize)/2;    /* allocate buffers */    sc_alloc_scr_buffer(scp, TRUE, TRUE);    if (ISMOUSEAVAIL(scp->adp->va_flags))	sc_alloc_cut_buffer(scp, FALSE);    sc_alloc_history_buffer(scp, sc_history_size, i, FALSE);    splx(s);    if (scp == cur_console)	set_border(scp, scp->border);    scp->status &= ~UNKNOWN_MODE;#ifdef SC_VIDEO_DEBUG    printf("set_pixel_mode(): status:%x\n", scp->status);#endif    if (tp == NULL)	return 0;    if (tp->t_winsize.ws_col != scp->xsize	|| tp->t_winsize.ws_row != scp->ysize) {	tp->t_winsize.ws_col = scp->xsize;	tp->t_winsize.ws_row = scp->ysize;	pgsignal(tp->t_pgrp, SIGWINCH, 1);    }    return 0;}intsc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p){    scr_stat *scp;    int error;    int s;    scp = sc_get_scr_stat(tp->t_dev);    switch (cmd) {    case CONS_CURRENT:  	/* get current adapter type */	if (scp->adp == NULL)	    return ENODEV;	*(int *)data = scp->adp->va_type;	return 0;    case CONS_CURRENTADP:	/* get current adapter index */	*(int *)data = scp->ad;	return 0;    case OLD_CONS_ADPINFO:	/* adapter information */	if (scp->adp == NULL)	    return ENODEV;	((old_video_adapter_t *)data)->va_index = scp->adp->va_index;	((old_video_adapter_t *)data)->va_type = scp->adp->va_type;	((old_video_adapter_t *)data)->va_flags = scp->adp->va_flags;	((old_video_adapter_t *)data)->va_crtc_addr = scp->adp->va_crtc_addr;	((old_video_adapter_t *)data)->va_window = scp->adp->va_window;	((old_video_adapter_t *)data)->va_window_size	    = scp->adp->va_window_size;	((old_video_adapter_t *)data)->va_window_gran	    = scp->adp->va_window_gran;	((old_video_adapter_t *)data)->va_buffer = scp->adp->va_buffer;	((old_video_adapter_t *)data)->va_buffer_size	    = scp->adp->va_buffer_size;	((old_video_adapter_t *)data)->va_mode = scp->adp->va_mode;	((old_video_adapter_t *)data)->va_initial_mode	    = scp->adp->va_initial_mode;	((old_video_adapter_t *)data)->va_initial_bios_mode	    = scp->adp->va_initial_bios_mode;	return 0;    case CONS_ADPINFO:		/* adapter information */	if (scp->adp == NULL)	    return ENODEV;	((video_adapter_info_t *)data)->va_index = scp->adp->va_index;	((video_adapter_info_t *)data)->va_type = scp->adp->va_type;	bcopy(scp->adp->va_name, ((video_adapter_info_t *)data)->va_name,	      imin(strlen(scp->adp->va_name) + 1,		   sizeof(((video_adapter_info_t *)data)->va_name))); 	((video_adapter_info_t *)data)->va_unit = scp->adp->va_unit;	((video_adapter_info_t *)data)->va_flags = scp->adp->va_flags;	((video_adapter_info_t *)data)->va_io_base = scp->adp->va_io_base;	((video_adapter_info_t *)data)->va_io_size = scp->adp->va_io_size;	((video_adapter_info_t *)data)->va_crtc_addr = scp->adp->va_crtc_addr;	((video_adapter_info_t *)data)->va_mem_base = scp->adp->va_mem_base;	((video_adapter_info_t *)data)->va_mem_size = scp->adp->va_mem_size;	((video_adapter_info_t *)data)->va_window = scp->adp->va_window;	((video_adapter_info_t *)data)->va_window_size	    = scp->adp->va_window_size;	((video_adapter_info_t *)data)->va_window_gran	    = scp->adp->va_window_gran;	((video_adapter_info_t *)data)->va_buffer = scp->adp->va_buffer;	((video_adapter_info_t *)data)->va_buffer_size	    = scp->adp->va_buffer_size;	((video_adapter_info_t *)data)->va_mode = scp->adp->va_mode;	((video_adapter_info_t *)data)->va_initial_mode	    = scp->adp->va_initial_mode;	((video_adapter_info_t *)data)->va_initial_bios_mode	    = scp->adp->va_initial_bios_mode;	((video_adapter_info_t *)data)->va_line_width = scp->adp->va_line_width;	return 0;    case CONS_GET:      	/* get current video mode */	*(int *)data = scp->mode;	return 0;    case CONS_MODEINFO:		/* get mode information */	return ((*vidsw[scp->ad]->get_info)(scp->adp, 		    ((video_info_t *)data)->vi_mode, (video_info_t *)data) 		? ENODEV : 0);    case CONS_FINDMODE:		/* find a matching video mode */	return ((*vidsw[scp->ad]->query_mode)(scp->adp, (video_info_t *)data) 		? ENODEV : 0);    case CONS_SETWINORG:	return ((*vidsw[scp->ad]->set_win_org)(scp->adp, *(u_int *)data) 		   ? ENODEV : 0);    /* generic text modes */    case SW_TEXT_80x25:	case SW_TEXT_80x30:    case SW_TEXT_80x43: case SW_TEXT_80x50:    case SW_TEXT_80x60:	/* FALL THROUGH */    /* VGA TEXT MODES */    case SW_VGA_C40x25:    case SW_VGA_C80x25: case SW_VGA_M80x25:    case SW_VGA_C80x30: case SW_VGA_M80x30:    case SW_VGA_C80x50: case SW_VGA_M80x50:    case SW_VGA_C80x60: case SW_VGA_M80x60:    case SW_B40x25:     case SW_C40x25:    case SW_B80x25:     case SW_C80x25:    case SW_ENH_B40x25: case SW_ENH_C40x25:    case SW_ENH_B80x25: case SW_ENH_C80x25:    case SW_ENH_B80x43: case SW_ENH_C80x43:    case SW_EGAMONO80x25:#ifdef PC98    /* PC98 TEXT MODES */    case SW_PC98_80x25:    case SW_PC98_80x30:#endif	if (!(scp->adp->va_flags & V_ADP_MODECHANGE)) 	    return ENODEV;	return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0);    /* GRAPHICS MODES */    case SW_BG320:     case SW_BG640:    case SW_CG320:     case SW_CG320_D:   case SW_CG640_E:    case SW_CG640x350: case SW_ENH_CG640:    case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320:    case SW_VGA_MODEX:	if (!(scp->adp->va_flags & V_ADP_MODECHANGE))	    return ENODEV;	return sc_set_graphics_mode(scp, tp, cmd & 0xff);    case KDSETMODE:     	/* set current mode of this (virtual) console */	switch (*(int *)data) {	case KD_TEXT:   	/* switch to TEXT (known) mode */	    /*	     * If scp->mode is of graphics modes, we don't know which	     * text mode to switch back to...	     */	    if (scp->status & GRAPHICS_MODE)		return EINVAL;	    /* restore fonts & palette ! */#if 0	    if (ISFONTAVAIL(scp->adp->va_flags) 		&& !(scp->status & (GRAPHICS_MODE | PIXEL_MODE)))		/*		 * FONT KLUDGE		 * Don't load fonts for now... XXX		 */		if (fonts_loaded & FONT_8)		    copy_font(scp, LOAD, 8, font_8);		if (fonts_loaded & FONT_14)		    copy_font(scp, LOAD, 14, font_14);		if (fonts_loaded & FONT_16)		    copy_font(scp, LOAD, 16, font_16);	    }#endif	    load_palette(scp->adp, palette);	    /* move hardware cursor out of the way */	    (*vidsw[scp->ad]->set_hw_cursor)(scp->adp, -1, -1);	    /* FALL THROUGH */	case KD_TEXT1:  	/* switch to TEXT (known) mode */	    /*	     * If scp->mode is of graphics modes, we don't know which	     * text/pixel mode to switch back to...	     */	    if (scp->status & GRAPHICS_MODE)		return EINVAL;	    s = spltty();	    if ((error = sc_clean_up(scp))) {		splx(s);		return error;	    }#ifndef PC98	    scp->status |= UNKNOWN_MODE;	    splx(s);	    /* no restore fonts & palette */	    if (scp == cur_console)		set_mode(scp);	    sc_clear_screen(scp);	    scp->status &= ~UNKNOWN_MODE;#else /* PC98 */	    scp->status &= ~UNKNOWN_MODE;	    /* no restore fonts & palette */	    if (scp == cur_console)		set_mode(scp);	    sc_clear_screen(scp);	    splx(s);#endif /* PC98 */	    return 0;	case KD_PIXEL:		/* pixel (raster) display */	    if (!(scp->status & (GRAPHICS_MODE | PIXEL_MODE)))		return EINVAL;	    if (scp->status & GRAPHICS_MODE)		return sc_set_pixel_mode(scp, tp, scp->xsize, scp->ysize, 					 scp->font_size);	    s = spltty();	    if ((error = sc_clean_up(scp))) {		splx(s);		return error;	    }	    scp->status |= (UNKNOWN_MODE | PIXEL_MODE);	    splx(s);	    if (scp == cur_console) {		set_mode(scp);		load_palette(scp->adp, palette);	    }	    sc_clear_screen(scp);	    scp->status &= ~UNKNOWN_MODE;	    return 0;	case KD_GRAPHICS:	/* switch to GRAPHICS (unknown) mode */	    s = spltty();	    if ((error = sc_clean_up(scp))) {		splx(s);		return error;	    }	    scp->status |= UNKNOWN_MODE;	    splx(s);#ifdef PC98	    if (scp == cur_console)		set_mode(scp);#endif	    return 0;	default:	    return EINVAL;	}	/* NOT REACHED */    case KDRASTER:		/* set pixel (raster) display mode */	if (ISUNKNOWNSC(scp) || ISTEXTSC(scp))	    return ENODEV;	return sc_set_pixel_mode(scp, tp, ((int *)data)[0], ((int *)data)[1], 				 ((int *)data)[2]);    case KDGETMODE:     	/* get current mode of this (virtual) console */	/* 	 * From the user program's point of view, KD_PIXEL is the same 	 * as KD_TEXT... 	 */	*data = ISGRAPHSC(scp) ? KD_GRAPHICS : KD_TEXT;	return 0;    case KDSBORDER:     	/* set border color of this (virtual) console */	scp->border = *data;	if (scp == cur_console)	    set_border(scp, scp->border);	return 0;    }    return ENOIOCTL;}#endif /* NSC > 0 */

⌨️ 快捷键说明

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