diff --git a/plugins/GSdx/GSLinuxDialog.cpp b/plugins/GSdx/GSLinuxDialog.cpp index 6f4444ce10..8b885a5700 100644 --- a/plugins/GSdx/GSLinuxDialog.cpp +++ b/plugins/GSdx/GSLinuxDialog.cpp @@ -71,6 +71,7 @@ bool RunLinuxDialog() gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "640x480@60"); gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "800x600@60"); gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "1024x768@60"); + gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "1280x960@60"); gtk_combo_box_append_text(GTK_COMBO_BOX(res_combo_box), "And a few other values like that."); // Or whatever the default value is. @@ -180,6 +181,17 @@ bool RunLinuxDialog() if (gtk_combo_box_get_active(GTK_COMBO_BOX(aspect_combo_box)) != -1) aspect = gtk_combo_box_get_active(GTK_COMBO_BOX(aspect_combo_box)); #endif + if (gtk_combo_box_get_active(GTK_COMBO_BOX(res_combo_box)) != -1) { + int resolution = gtk_combo_box_get_active(GTK_COMBO_BOX(res_combo_box)); + switch (resolution) { + case 0: theApp.SetConfig("w", 640); theApp.SetConfig("h", 480); break; + case 1: theApp.SetConfig("w", 800); theApp.SetConfig("h", 600); break; + case 2: theApp.SetConfig("w", 1024); theApp.SetConfig("h", 768); break; + case 3: theApp.SetConfig("w", 1280); theApp.SetConfig("h", 960); break; + default: theApp.SetConfig("w", 640); theApp.SetConfig("h", 480); + } + + } theApp.SetConfig("filter", (int)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(filter_check))); theApp.SetConfig("logz", (int)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(logz_check))); diff --git a/plugins/GSdx/GSWnd.cpp b/plugins/GSdx/GSWnd.cpp index f2bed4f142..c5406d8853 100644 --- a/plugins/GSdx/GSWnd.cpp +++ b/plugins/GSdx/GSWnd.cpp @@ -340,7 +340,10 @@ bool GSWnd::Create(const string& title, int w, int h) { if(m_window != NULL) return false; - if(w <= 0 || h <= 0) {w = 640; h = 480;} + if(w <= 0 || h <= 0) { + w = theApp.GetConfig("w", 640); + h = theApp.GetConfig("h", 480); + } m_window = SDL_CreateWindow(title.c_str(), 100, 100, w, h, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE); @@ -364,8 +367,11 @@ Display* GSWnd::GetDisplay() GSVector4i GSWnd::GetClientRect() { // TODO + int h, w; + w = theApp.GetConfig("w", 640); + h = theApp.GetConfig("h", 480); - return GSVector4i(0, 0, 640, 480); + return GSVector4i(0, 0, w, h); } // Returns FALSE if the window has no title, or if th window title is under the strict diff --git a/plugins/GSdx/GSdx.cpp b/plugins/GSdx/GSdx.cpp index 4adf64ad50..f642ba5876 100644 --- a/plugins/GSdx/GSdx.cpp +++ b/plugins/GSdx/GSdx.cpp @@ -43,25 +43,54 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv #else -size_t GetPrivateProfileString(const char* lpAppName, const char* lpKeyName, const char* lpDefault, char* lpReturnedString, size_t nSize, const char* lpFileName) +size_t GSdxApp::GetPrivateProfileString(const char* lpAppName, const char* lpKeyName, const char* lpDefault, char* lpReturnedString, size_t nSize, const char* lpFileName) { - // TODO: linux + BuildConfigurationMap(lpFileName); + + std::string key(lpKeyName); + std::string value = m_configuration_map[key]; + if (value.empty()) + strcpy(lpReturnedString, lpDefault); + else + strcpy(lpReturnedString, value.c_str()); return 0; } -bool WritePrivateProfileString(const char* lpAppName, const char* lpKeyName, const char* pString, const char* lpFileName) +bool GSdxApp::WritePrivateProfileString(const char* lpAppName, const char* lpKeyName, const char* pString, const char* lpFileName) { - // TODO: linux + BuildConfigurationMap(lpFileName); - return false; + std::string key(lpKeyName); + std::string value(pString); + m_configuration_map[key] = value; + + // Save config to a file + FILE* f = fopen(lpFileName, "w"); + + if (f == NULL) return false; // FIXME print a nice message + + map::iterator it; + for (it = m_configuration_map.begin(); it != m_configuration_map.end(); ++it) { + // Do not save the inifile key which is not an option + if (it->first.compare("inifile") == 0) continue; + + fprintf(f, "%s = %s\n", it->first.c_str(), it->second.c_str()); + } + fclose(f); + + return false; } -int GetPrivateProfileInt(const char* lpAppName, const char* lpKeyName, int nDefault, const char* lpFileName) +int GSdxApp::GetPrivateProfileInt(const char* lpAppName, const char* lpKeyName, int nDefault, const char* lpFileName) { - // TODO: linux + BuildConfigurationMap(lpFileName); - return nDefault; + std::string value = m_configuration_map[std::string(lpKeyName)]; + if (value.empty()) + return nDefault; + else + return atoi(value.c_str()); } #endif @@ -128,6 +157,31 @@ GSdxApp::GSdxApp() m_gpu_scale.push_back(GSSetting(2 | (2 << 2), "H x 4 - V x 4", "")); } +#ifdef _LINUX +void GSdxApp::BuildConfigurationMap(const char* lpFileName) +{ + // Check if the map was already built + std::string inifile_value(lpFileName); + if ( inifile_value.compare(m_configuration_map["inifile"]) == 0 ) return; + m_configuration_map["inifile"] = inifile_value; + + // Load config from file + char value[255]; + char key[255]; + FILE* f = fopen(lpFileName, "r"); + + if (f == NULL) return false; // FIXME print a nice message + + while( fscanf(f, "%s = %s\n", key, value) != EOF ) { + std::string key_s(key); + std::string value_s(value); + m_configuration_map[key_s] = value_s; + } + + fclose(f); +} +#endif + void* GSdxApp::GetModuleHandlePtr() { return s_hModule; diff --git a/plugins/GSdx/GSdx.h b/plugins/GSdx/GSdx.h index 6e0949e6ca..381adb2e74 100644 --- a/plugins/GSdx/GSdx.h +++ b/plugins/GSdx/GSdx.h @@ -27,6 +27,9 @@ class GSdxApp { std::string m_ini; std::string m_section; +#ifdef _LINUX + std::map< std::string, std::string > m_configuration_map; +#endif public: GSdxApp(); @@ -36,6 +39,12 @@ public: #ifdef _WINDOWS HMODULE GetModuleHandle() {return (HMODULE)GetModuleHandlePtr();} #endif +#ifdef _LINUX + void BuildConfigurationMap(const char* lpFileName); + size_t GetPrivateProfileString(const char* lpAppName, const char* lpKeyName, const char* lpDefault, char* lpReturnedString, size_t nSize, const char* lpFileName); + bool WritePrivateProfileString(const char* lpAppName, const char* lpKeyName, const char* pString, const char* lpFileName); + int GetPrivateProfileInt(const char* lpAppName, const char* lpKeyName, int nDefault, const char* lpFileName); +#endif string GetConfig(const char* entry, const char* value); void SetConfig(const char* entry, const char* value);