void MDFN_printf(const char *format, ...) { char *format_temp; char *temp; unsigned int x, newlen; va_list ap; va_start(ap,format); // First, determine how large our format_temp buffer needs to be. uint8 lastchar_backup = lastchar; // Save lastchar! for(newlen=x=0;x<strlen(format);x++) { if(lastchar == '\n' && format[x] != '\n') { int y; for(y=0;y<curindent;y++) newlen++; } newlen++; lastchar = format[x]; } format_temp = (char *)malloc(newlen + 1); // Length + NULL character, duh // Now, construct our format_temp string lastchar = lastchar_backup; // Restore lastchar for(newlen=x=0;x<strlen(format);x++) { if(lastchar == '\n' && format[x] != '\n') { int y; for(y=0;y<curindent;y++) format_temp[newlen++] = ' '; } format_temp[newlen++] = format[x]; lastchar = format[x]; } format_temp[newlen] = 0; temp = new char[4096]; vsnprintf(temp, 4096, format_temp, ap); free(format_temp); MDFND_Message(temp); free(temp); va_end(ap); }
void PumpWrap(void) { SDL_Event event; SDL_Event gtevents_temp[gtevents_size]; int numevents = 0; bool NITI; NITI = Netplay_IsTextInput(); if(Debugger_IsActive() || NITI || IsConsoleCheatConfigActive() || Help_IsActive()) { if(!krepeat) SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); krepeat = 1; } else { if(krepeat) SDL_EnableKeyRepeat(0, 0); krepeat = 0; } while(SDL_PollEvent(&event)) { if(Debugger_IsActive()) Debugger_Event(&event); else if(IsConsoleCheatConfigActive()) CheatEventHook(&event); NetplayEventHook(&event); /* This is a very ugly hack for some joystick hats that don't behave very well. */ if(event.type == SDL_JOYHATMOTION) { SDL_Event ne[64]; int count; //printf("Cheep: %d\n", event.jhat.value); if((count = SDL_PeepEvents(ne, 64, SDL_PEEKEVENT, SDL_EVENTMASK(SDL_JOYHATMOTION))) >= 1) { int x; int docon = 0; for(x=0;x<count;x++) if(event.jhat.which == ne[x].jhat.which) docon = 1; if(docon) continue; } } // && event.jhat. //if(event.type == SDL_JOYAXISMOTION) printf("Which: %d, axis: %d, value: %d\n", event.jaxis.which, event.jaxis.axis, event.jaxis.value); /* Handle the event, and THEN hand it over to the GUI. Order is important due to global variable mayhem(CEVT_TOGGLEFS. */ switch(event.type) { case SDL_ACTIVEEVENT: break; case SDL_SYSWMEVENT: break; case SDL_VIDEORESIZE: VideoResize(event.resize.w, event.resize.h); break; case SDL_VIDEOEXPOSE: break; case SDL_QUIT: NeedExitNow = 1;break; case SDL_USEREVENT: switch(event.user.code) { case CEVT_SET_STATE_STATUS: MT_SetStateStatus((StateStatusStruct *)event.user.data1); break; case CEVT_SET_MOVIE_STATUS: MT_SetMovieStatus((StateStatusStruct *)event.user.data1); break; case CEVT_WANT_EXIT: if(!Netplay_TryTextExit()) { SDL_Event evt; evt.quit.type = SDL_QUIT; SDL_PushEvent(&evt); } break; case CEVT_SET_GRAB_INPUT: SDL_WM_GrabInput(*(int *)event.user.data1 ? SDL_GRAB_ON : SDL_GRAB_OFF); free(event.user.data1); break; case CEVT_TOGGLEFS: NeedVideoChange = 1; break; case CEVT_VIDEOSYNC: NeedVideoChange = -1; break; case CEVT_PRINTERROR: MDFND_PrintError((char *)event.user.data1); free(event.user.data1); break; case CEVT_PRINTMESSAGE: MDFND_Message((char *)event.user.data1); free(event.user.data1); break; case CEVT_SHOWCURSOR: SDL_ShowCursor(*(int *)event.user.data1); free(event.user.data1); break; case CEVT_DISP_MESSAGE: VideoShowMessage((UTF8*)event.user.data1); break; default: if(numevents < gtevents_size) { memcpy(>events_temp[numevents], &event, sizeof(SDL_Event)); numevents++; } break; } break; default: if(numevents < gtevents_size) { memcpy(>events_temp[numevents], &event, sizeof(SDL_Event)); numevents++; } break; } } SDL_mutexP(EVMutex); for(int i = 0; i < numevents; i++) { memcpy((void *)>events[gte_write], >events_temp[i], sizeof(SDL_Event)); gte_write = (gte_write + 1) & (gtevents_size - 1); } SDL_mutexV(EVMutex); if(!CurGame) GameThread_HandleEvents(); }