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

📄 hyperion.c

📁 早期freebsd实现
💻 C
字号:
/* */#include <stdio.h>#include <sys/types.h>#include <fcntl.h>#include <sys/ioctl.h>#include <grfioctl.h>#include "X.h"#define  NEED_EVENTS#include "Xproto.h"#include "scrnintstr.h"#include "cursorstr.h"#include "pixmapstr.h"#include "inputstr.h"#include "regionstr.h"#include "hppriv.h"#include "hyperion.h"extern int lastEventTime;extern void hpChangeScreens();extern Bool hpInitCursor(), mfbCreateDefColormap();extern hpPrivScreenPtr hp_screens[];static BoolhyperSaveScreen(pScreen, on)    ScreenPtr pScreen;    Bool on;{    HYPER *gp_hardware = getHyHardware(pScreen);    if (on != SCREEN_SAVER_ON)    {	lastEventTime = GetTimeInMillis();	/* Turn on Video */	gp_hardware -> nblank = HY_VIDEO_ON;	getPrivScreenPtr(pScreen)->screenBlanked = FALSE;    }    else    {	/* Turn off video */	gp_hardware -> nblank = HY_VIDEO_OFF;	getPrivScreenPtr(pScreen)->screenBlanked = TRUE;    }        return TRUE;}BoolhyperScreenInfo(index, argv, argc)    int index;    char **argv;    int argc;{    hpPrivScreenPtr thisScreen;    int fd, gcid;    thisScreen = (hpPrivScreenPtr) xalloc(sizeof(hpPrivScreen));    if (!thisScreen)	return FALSE;    hp_screens[index] = thisScreen;    if ((fd = open(argv[2], O_WRONLY)) <  0)    {        perror(argv[0]);        ErrorF("%s: couldn't open %s \n", argv[0], argv[2]);        return FALSE;    }    {	struct grfinfo gi;	if (ioctl(fd, GRFIOCGINFO, &gi) < 0 || ioctl(fd, GRFIOCON, 0) < 0)	{	    ErrorF("%s: couldn't GCON and GCID %s \n", argv[0], argv[2]);	    return FALSE; 	}	thisScreen->fbOffset = gi.gd_regsize;	gcid = gi.gd_id;    }        if (gcid != GCID_HYPERION) /* Not a Hyperion */    {	ErrorF("%s: device %s not this kind of display.\n", argv[0],	       argv[2]);	close(fd);	return FALSE;    }    thisScreen->fd   = fd;    thisScreen->gcid = gcid;    /*     * Map the hyperion in to our address space.  We could ask the O.S.     * to map it in where it prefers, but this would limit the amount of     * data we can malloc() at a later time.     * However, we don't know how much address space it will take up until     * we can examine its memWide and memHigh values....     */    {	u_char *Addr = (u_char *) 0;	char *str_addr = (char *)getenv("XDISPADDR");	if (str_addr)	    Addr = (u_char *) atoi(str_addr);		if (ioctl (fd, GRFIOCMAP, &Addr) < 0)	{	    (void) ioctl (fd, GRFIOCOFF, 0);	    perror("GRFIOCMAP:");	    ErrorF("%s: Error getting address of %s\n", argv[0], argv[1]);	    close(fd);	    return FALSE;	}	thisScreen->pHardwareScreen = (pointer) Addr;    }    {	HYPER *hy = (HYPER *)thisScreen->pHardwareScreen;	thisScreen->memHeight = (hy->t_memhigh << 8) | hy->b_memhigh;	thisScreen->memWidth  = (hy->t_memwide << 8) | hy->b_memwide;    }#if 0    thisScreen->WholeGlyph = hyWholeGlyph;#endif    /* store the screen minor number in the devPrivate structure;     * if there are four arguments, the fourth is the screen minor number;     */    if (argc == 4)	thisScreen->minor_num = atoi(argv[3]);    else	thisScreen->minor_num = 0;    thisScreen->screenBlanked = FALSE;    return TRUE;}voidhyperMaskConfig(pScreen, writeEnableMask, replacementRule)     register ScreenPtr pScreen;     register int writeEnableMask, replacementRule;{    /* no-op */;}extern Bool hpmfbCloseScreen();static BoolhyperCloseScreen(index, pScreen)    int index;    ScreenPtr pScreen;{    register HYPER *gp_hardware = getHyHardware(pScreen);    getPrivScreenPtr(pScreen)->screenBlanked = FALSE;	    gp_hardware -> nblank = HY_VIDEO_ON;    /* this should probably be done with a wrapper */    return hpmfbCloseScreen(index, pScreen);}BoolhyperScreenInit(index, pScreen, argc, argv)    int index;    ScreenPtr pScreen;    int argc;		/* these two may NOT be changed */    char **argv;{    int dpi;    HYPER *gp_hardware;    hpPrivScreenPtr pPrivScreen;    /* always restore the devPrivate field here;     * if it has not been allocated, this will null it out so code elsewhere     * will be sure to allocate one;     * If we've already allocated one, this will restore it;     */    pScreen->devPrivate = (pointer)hp_screens[index];    pPrivScreen = getPrivScreenPtr(pScreen);    gp_hardware = (HYPER *)(pPrivScreen->pHardwareScreen);    pPrivScreen->MoveBits = hyperMoveBits;    pPrivScreen->MaskConfig = hyperMaskConfig;    pPrivScreen->ChangeScreen = hpChangeScreens;    dpi = 109; /* XXX probably bogus */    if (!hpmfbScreenInit(pScreen,			 ((u_char *) gp_hardware) + pPrivScreen->fbOffset,			 (gp_hardware->t_dispwide<<8)+gp_hardware->b_dispwide,			 (gp_hardware->t_disphigh<<8)+gp_hardware->b_disphigh,			 dpi, dpi))	return FALSE;    pScreen->SaveScreen = hyperSaveScreen;    pScreen->CloseScreen = hyperCloseScreen;    if (!hpInitCursor(pScreen, 1))	return FALSE;    pScreen->whitePixel = 1;    pScreen->blackPixel = 0;    if (!mfbCreateDefColormap(pScreen))    {	ErrorF("Can't alloc black & white pixels in hyperScreenInit\n");	return FALSE;    }    (void) hyperSaveScreen(pScreen, SCREEN_SAVER_OFF);    return TRUE;}

⌨️ 快捷键说明

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