X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui.cpp;h=e1bf5c1e15c450344d0d7c532a65f75b8a8f905d;hb=2acc4f075932e711cfacd198672f7c99ea4b853e;hp=b1ffb370a3bc7eaee05c4ae27598c0d6e708c704;hpb=48f33973f6bb549fc25ec4ebbfa0a324849f4d6d;p=virtualjaguar diff --git a/src/gui.cpp b/src/gui.cpp index b1ffb37..e1bf5c1 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -5,17 +5,20 @@ // by James L. Hammons // -#include #include #include +#include +#include +#include #include "types.h" #include "tom.h" +#include "video.h" #include "font1.h" #include "gui.h" -// Private function prototypes +using namespace std; // For STL stuff -uint32 CountROMFiles(char * path); +// Private function prototypes void InitGUI(void) @@ -26,34 +29,10 @@ void GUIDone(void) { } -// -// Render the backbuffer to the primary screen surface -// -void BlitBackbuffer(void) -{ - extern SDL_Surface * surface, * mainSurface; - extern int16 * backbuffer; - - if (SDL_MUSTLOCK(surface)) - while (SDL_LockSurface(surface) < 0) - SDL_Delay(10); - - memcpy(surface->pixels, backbuffer, tom_getVideoModeWidth() * tom_getVideoModeHeight() * 2); - - if (SDL_MUSTLOCK(surface)) - SDL_UnlockSurface(surface); - - SDL_Rect srcrect, dstrect; - srcrect.x = srcrect.y = 0, srcrect.w = surface->w, srcrect.h = surface->h; - dstrect.x = dstrect.y = 0, dstrect.w = surface->w, dstrect.h = surface->h; - SDL_BlitSurface(surface, &srcrect, mainSurface, &dstrect); - SDL_Flip(mainSurface); -} - // // Draw text at the given x/y coordinates. Can invert text as well. // -void DrawText(int16 * screen, uint32 x, uint32 y, bool invert, const char * text, ...) +void DrawString(int16 * screen, uint32 x, uint32 y, bool invert, const char * text, ...) { char string[4096]; va_list arg; @@ -62,7 +41,7 @@ void DrawText(int16 * screen, uint32 x, uint32 y, bool invert, const char * text vsprintf(string, text, arg); va_end(arg); - uint32 pitch = TOMGetSDLScreenPitch() / 2; // Returns pitch in bytes but we need words... + uint32 pitch = GetSDLScreenPitch() / 2; // Returns pitch in bytes but we need words... uint32 length = strlen(string), address = x + (y * pitch); for(uint32 i=0; i fileList; - if (numFiles == 0) - return false; + // Read in the candidate files from the directory pointed to by "path" - char * names = (char *)malloc(numFiles * FILENAME_MAX); - - if (names == NULL) - { - WriteLog("Could not allocate memory for %u files!\nAborting!\n", numFiles); - return false; - } - - int i = 0; DIR * dp = opendir(path); dirent * de; while ((de = readdir(dp)) != NULL) { char * ext = strrchr(de->d_name, '.'); + if (ext != NULL) - { if (stricmp(ext, ".zip") == 0 || stricmp(ext, ".jag") == 0) - { - // Do a QnD insertion sort... - // (Yeah, it's n^2/2 time, but there aren't that many items...) - uint32 pos = 0; - - for(int k=0; kd_name) < 0) - pos++; - else - break; - } - - uint32 blockSize = (i - pos) * FILENAME_MAX; - - if (blockSize) -//This only works on Win32 for some reason... -// memcpy(&names[(pos + 1) * FILENAME_MAX], &names[pos * FILENAME_MAX], blockSize); - for(int k=blockSize-1; k>=0; k--) - names[((pos + 1) * FILENAME_MAX) + k] = names[(pos * FILENAME_MAX) + k]; - - strcpy(&names[pos * FILENAME_MAX], de->d_name); - i++; - } - } + fileList.push_back(string(de->d_name)); } closedir(dp); @@ -148,10 +90,12 @@ bool UserSelectFile(char * path, char * filename) uint32 cursor = 0, startFile = 0; - if (numFiles > 1) // Only go GUI if more than one possibility! + if (fileList.size() > 1) // Only go GUI if more than one possibility! { + sort(fileList.begin(), fileList.end()); + bool done = false; - uint32 limit = (numFiles > 24 ? 24 : numFiles); + uint32 limit = (fileList.size() > 24 ? 24 : fileList.size()); SDL_Event event; while (!done) @@ -164,14 +108,14 @@ bool UserSelectFile(char * path, char * filename) for(uint32 i=0; i 38) + s[38] = 0; + DrawString(backbuffer, 0, i*8, invert, " %s ", s.c_str()); } - BlitBackbuffer(); + RenderBackbuffer(); if (event.type == SDL_KEYDOWN) { @@ -183,7 +127,7 @@ bool UserSelectFile(char * path, char * filename) cursor++; else // Otherwise, scroll the window... { - if (cursor + startFile != numFiles - 1) + if (cursor + startFile != fileList.size() - 1) startFile++; } } @@ -214,9 +158,10 @@ bool UserSelectFile(char * path, char * filename) { // Advance cursor to filename with first letter pressed... uint8 which = (key - SDLK_a) + 65; // Convert key to A-Z char - for(uint32 i=0; i startFile + limit - 1) @@ -235,42 +180,12 @@ bool UserSelectFile(char * path, char * filename) } strcpy(filename, path); - // Potential GPF here: If length of dir is zero, then this will cause a page fault! - if (path[strlen(path) - 1] != '/') - strcat(filename, "/"); - strcat(filename, &names[(cursor + startFile) * FILENAME_MAX]); - free(names); - - return true; -} - -// -// Count # of possible ROM files in the current directory -// -uint32 CountROMFiles(char * path) -{ - uint32 numFiles = 0; - DIR * dp = opendir(path); - if (dp == NULL) - { - WriteLog("VJ: Could not open directory \"%s\"!\nAborting!\n", path); - return 0; - } - else - { - dirent * de; + if (strlen(path) > 0) + if (path[strlen(path) - 1] != '/') + strcat(filename, "/"); - while ((de = readdir(dp)) != NULL) - { - char * ext = strrchr(de->d_name, '.'); - if (ext != NULL) - if (stricmp(ext, ".zip") == 0 || stricmp(ext, ".jag") == 0) - numFiles++; - } + strcat(filename, fileList[startFile + cursor].c_str()); - closedir(dp); - } - - return numFiles; + return true; }