📄 ggi.cpp
字号:
TEST_KEY('M', 0, SNES_X_MASK); TEST_KEY('E', 0, SNES_X_MASK); TEST_KEY('X', 0, SNES_Y_MASK); TEST_KEY(GIIUC_Comma, 0, SNES_Y_MASK); TEST_KEY('R', 0, SNES_Y_MASK); TEST_KEY('D', 0, SNES_A_MASK); TEST_KEY(GIIUC_Period,0, SNES_A_MASK); TEST_KEY('T', 0, SNES_A_MASK); TEST_KEY('C', 0, SNES_B_MASK); TEST_KEY(GIIUC_Slash, 0, SNES_B_MASK); TEST_KEY('Y', 0, SNES_B_MASK); // Joypad 2: TEST_KEY(GIIK_P8, 1, SNES_UP_MASK); TEST_KEY(GIIK_P2, 1, SNES_DOWN_MASK); TEST_KEY(GIIK_P6, 1, SNES_RIGHT_MASK); TEST_KEY(GIIK_P4, 1, SNES_LEFT_MASK); TEST_KEY(GIIK_PEnter, 1, SNES_START_MASK); TEST_KEY(GIIK_PPlus, 1, SNES_SELECT_MASK); TEST_KEY(GIIK_P0, 1, SNES_TL_MASK); TEST_KEY(GIIK_PSeparator,1,SNES_TR_MASK); TEST_KEY(GIIK_P7, 1, SNES_X_MASK); TEST_KEY(GIIK_P1, 1, SNES_Y_MASK); TEST_KEY(GIIK_P9, 1, SNES_A_MASK); TEST_KEY(GIIK_P3, 1, SNES_B_MASK); if(down) { if(event.key.label == GIIUC_Escape)S9xExit(); if(event.key.label == '1')PPU.BG_Forced ^= 1; if(event.key.label == '2')PPU.BG_Forced ^= 2; if(event.key.label == '3')PPU.BG_Forced ^= 4; if(event.key.label == '4')PPU.BG_Forced ^= 8; if(event.key.label == '5')PPU.BG_Forced ^= 16; if(event.key.label == '6')Settings.SwapJoypads ^= TRUE; if(event.key.label == '7')Settings.Transparency ^= TRUE; if(event.key.label == '8')Settings.BGLayering ^= TRUE; if(event.key.label == '9')Settings.InterpolatedSound ^= TRUE; if(event.key.label == '0')Settings.DisableHDMA ^= TRUE; if(event.key.label == GIIK_Break)Settings.Paused ^= TRUE; if(event.key.label == GIIUC_BackSpace) Settings.DisableGraphicWindows = !Settings.DisableGraphicWindows; if(event.key.label == GIIK_P5)kbdtrans_enabled ^= 1; int fn = -1; if(event.key.label == GIIK_F1)fn = 1; if(event.key.label == GIIK_F2)fn = 2; if(event.key.label == GIIK_F3)fn = 3; if(event.key.label == GIIK_F4)fn = 4; if(event.key.label == GIIK_F5)fn = 5; if(event.key.label == GIIK_F6)fn = 6; if(event.key.label == GIIK_F7)fn = 7; if(event.key.label == GIIK_F8)fn = 8; if(event.key.label == GIIK_F9)fn = 9; if(event.key.label == GIIK_F10)fn = 10; if(event.key.label == GIIK_F11)fn = 11; if(event.key.label == GIIK_F12)fn = 12; int alt = event.key.modifiers & GII_MOD_ALT; int shift = event.key.modifiers & GII_MOD_SHIFT; int control = event.key.modifiers & GII_MOD_CTRL; if(!alt && !shift && !control) { if(fn == 11) S9xLoadSnapshot (S9xChooseFilename (TRUE)); else if(fn > 0) { char def [PATH_MAX]; char filename [PATH_MAX]; char drive [_MAX_DRIVE]; char dir [_MAX_DIR]; char ext [_MAX_EXT]; _splitpath (Memory.ROMFilename, drive, dir, def, ext); sprintf (filename, "%s%s%s.%03d", S9xGetSnapshotDirectory (), SLASH_STR, def, fn - 1); S9xLoadSnapshot (filename); } } else if(alt || control) { if (fn >= 4) S9xToggleSoundChannel (fn - 4);#ifdef DEBUGGER else if (fn == 1) CPU.Flags |= DEBUG_MODE_FLAG;#endif else if (fn == 1) S9xSPCDump(S9xChooseFilename(2)); else if (fn == 2) S9xLoadSnapshot(S9xChooseFilename (TRUE)); else if (fn == 3) Snapshot(S9xChooseFilename(FALSE)); } else if(fn > 0) { char def [PATH_MAX]; char filename [PATH_MAX]; char drive [_MAX_DRIVE]; char dir [_MAX_DIR]; char ext [_MAX_EXT]; _splitpath (Memory.ROMFilename, drive, dir, def, ext); sprintf (filename, "%s%s%s.%03d", S9xGetSnapshotDirectory (), SLASH_STR, def, fn - 1); Snapshot (filename); } if(event.key.button == 12) { if(shift) { if (Settings.FrameTime > 1000) Settings.FrameTime -= 1000; else if(Settings.FrameTime > 100) Settings.FrameTime -= 100; } else { if (Settings.SkipFrames <= 1) Settings.SkipFrames = AUTO_FRAMERATE; else if (Settings.SkipFrames != AUTO_FRAMERATE) Settings.SkipFrames--; } DrawSpeedIndicator(); } if(event.key.button == 13) { if(shift) { if(Settings.FrameTime < 600) Settings.FrameTime += 100; else Settings.FrameTime += 1000; } else { if (Settings.SkipFrames == AUTO_FRAMERATE) Settings.SkipFrames = 1; else if (Settings.SkipFrames < 20) Settings.SkipFrames++; } DrawSpeedIndicator(); } if(event.key.label=='P') { if(alt==0) { text_mode = TRUE; if(vis)ggiClose(vis); fprintf(stderr, "P: ggiExit: %d\n", ggiExit()); fprintf(stderr, "The game is now running in videoless mode.\r\n" "Press ENTER to re-enable graphics.\r\n"); } else { fprintf(stderr, "Alt: %d, Shift: %d, Ctrl: %d\n", alt,shift,control); event.any.type = evCommand; event.cmd.code = GGICMD_NOHALT_ON_UNMAP; ggiEventSend(vis, &event); // FIXME: Unraw keyboard here! } pause_mode = TRUE; fcntl(STDIN_FILENO, F_SETFL, (saved_fcntl = fcntl(STDIN_FILENO, F_GETFL))|O_NONBLOCK); /* Exit loop, input handling became unstable. */ break; } } }}void S9xSetTitle (const char *title){ title=title;}void S9xPutImage (int width, int height){ #if 1 if(text_mode)return; if(dihdah) { int a, k; putchar('F'); fwrite(&width, 1, sizeof(int), stdout); fwrite(&height, 1, sizeof(int), stdout); fwrite(GFX.Screen, 1, width*height, stdout); fflush(stdout); fcntl(STDIN_FILENO, F_SETFL, (a=fcntl(STDIN_FILENO, F_GETFL))|O_NONBLOCK); k = getchar(); fcntl(STDIN_FILENO, F_SETFL, a); if(k=='K') { ggi_event e; fread(&e, 1, sizeof(e), stdin); if(kbdtrans_enabled)ggiEventSend(vis, &e); } } #endif if(Settings.SixteenBit) { /* 16 bpp source */ switch(Bitness()) { case 8: Convert16to8(); break; case 15: Convert16to15(); break; case 16: Convert16to16(); break; case 24: Convert16to24(); break; case 32: Convert16to32(); break; default: break; } } else { /* 8 bpp source */ switch(Bitness()) { case 8: Convert8to8(); break; default: break; } } ggiFlush(vis);}const char *S9xSelectFilename (const char *def, const char *dir1, const char *ext1, const char *title){ char InputBuf[PATH_MAX]; strcpy(InputBuf, def); char *s = InputBuf; int cpos, len=strlen(s); int fx, fy; ggiGetCharSize(vis, &fx, &fy); int max = vis_mode.visible.x / fx - 4; ggiSetPalette(vis, 0,16, init_pal16); ggiSetGCForeground(vis, 0); ggiDrawBox(vis, 0,0, vis_mode.visible.x, fy*4); unsigned bright, gray, blue, cyan; switch(GT_DEPTH(vis_mode.graphtype)) { case 8: blue=1; gray=7; cyan=11; bright=15; break; case 16: case 15: /* These don't work anyway */ break; default: blue = 0x0000FF; cyan = 0x00FFFF; gray = 0x7F7F7F; bright = 0xFFFFFF; } ggiSetGCForeground(vis, bright); ggiSetGCBackground(vis, 0); ggiPuts(vis, 0,fy, title); if(len > max)s[len=max]=0; cpos = len; char *retval = NULL; for(int x=2; ;) { int a, tick=0; for(;;) { struct timeval tv = {0,100000}; for(a=0; a<max; a++) { int f = tick<6&&a==cpos; ggiSetGCForeground(vis, f?blue:cyan); ggiSetGCBackground(vis, f?gray:blue); ggiPutc(vis, (x+a)*fx, fy+fy, a<len?s[a]:' '); } ggiFlush(vis); if(ggiEventPoll(vis, gii_event_mask(emKeyPress | emKeyRepeat), &tv))break; if(++tick==8)tick=4; } switch(a=ggiGetc(vis)) { case '\n': case '\r': goto Done; case GIIK_Left: if(cpos>0)cpos--; break; case GIIK_Right: if(cpos<len)cpos++; break; case GIIK_Home: cpos=0; break; case GIIK_End: cpos=len; break; case GIIUC_Escape: goto Cancelled; case GIIUC_Delete: case GIIUC_BackSpace: if(!cpos)break; cpos--; /* through */ /*case del:*/ if(cpos < len) { memmove(s+cpos, s+1+cpos, len-cpos); len--; } break; default: if(len<max && a>=' ' && a<=255) { memmove(s+cpos+1, s+cpos, len-cpos+1); s[cpos++]=a; len++; } } }Done: ; char fname [PATH_MAX]; char drive [_MAX_DRIVE]; char dir [_MAX_DIR]; char ext [_MAX_EXT]; _splitpath (InputBuf, drive, dir, fname, ext); static char path [PATH_MAX]; _makepath (path, drive, *dir ? dir : dir1, fname, *ext ? ext : ext1); retval = path; Cancelled: ggiSetGCBackground(vis, 0); ggiSetGCForeground(vis, 0); ggiFillscreen(vis); S9xSetPalette(); DrawSpeedIndicator(); return retval;}void S9xParseDisplayArg(char **argv, int &ind, int){ CheckFirst(); if((!strcmp(argv[ind], "-m") || !strcasecmp(argv[ind], "-mode")) && argv[ind + 1]) ggiParseMode(argv[++ind], &vis_mode); else if(!strcasecmp(argv[ind], "-scale") || !strcasecmp(argv[ind], "-sc")) stretch = TRUE; else if (!strncasecmp (argv [ind], "-y", 2)) { Settings.SixteenBit = TRUE; Settings.SupportHiRes = TRUE; Settings.ForceTransparency = TRUE; switch (argv[ind][2]) { case 0: interpolate = TRUE; break; case '1': interpolate = TRUE; break; case '2': interpolate = 2; break; case '3': interpolate = 3; break; case '4': interpolate = 4; break; case '5': interpolate = 5; break; } } else if(!strcasecmp(argv[ind], "-dihdah") || !strcasecmp(argv[ind], "-send")) { dihdah = TRUE; kbdtrans_enabled = TRUE; } else S9xUsage();}void S9xExtraUsage (){ S9xMessage(S9X_INFO, S9X_USAGE, "\-mode or -m modestr Select screen mode (see libggi manual, specially doc/env.txt)"); S9xMessage(S9X_INFO, S9X_USAGE, "\-scale or -sc Scale SNES screen to fit S-VGA screen (this probably slows a lot!)"); S9xMessage(S9X_INFO, S9X_USAGE, "\-y1,-y2,-y3,-y4,-y5 Select interpolating: 1=interpolate, 2=Super 2xSaI, 3=Super Eagle, 4=2xSaI, 5=soft"); S9xMessage(S9X_INFO, S9X_USAGE, "\-send or -dihdah Send palette/screen actions to stdout, read kbd actions from stdin. Can be used for remote controlling.");}bool8 S9xReadMousePosition (int which1, int &x, int &y, uint32 &buttons){ which1=which1, x=x, y=y, buttons=buttons; return FALSE;}bool8 S9xReadSuperScopePosition (int &x, int &y, uint32 &buttons){ x=x, y=y, buttons=buttons; return FALSE;}void S9xMessage (int type, int number, const char *message){ CheckFirst(); type=type, number=number; fprintf (stderr, "%s\n", message);}bool JustifierOffscreen(){ return false;}void JustifierButtons(uint32& justifiers){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -