📄 hyperion.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 + -