diff --git a/include/frontend.hpp b/include/frontend.hpp index f78725b..1c06284 100755 --- a/include/frontend.hpp +++ b/include/frontend.hpp @@ -54,7 +54,7 @@ class WindowScreen { public: ScreenInfo m_info; - WindowScreen(ScreenType stype, CaptureStatus* capture_status, DisplayData* display_data, AudioData* audio_data, ExtraButtonShortcuts* extra_button_shortcuts, ConsumerMutex *draw_lock); + WindowScreen(ScreenType stype, CaptureStatus* capture_status, DisplayData* display_data, AudioData* audio_data, ExtraButtonShortcuts* extra_button_shortcuts, ConsumerMutex *draw_lock, bool created_proper_folder); ~WindowScreen(); void build(); @@ -98,6 +98,7 @@ private: int rotation; const PARData *par; }; + bool created_proper_folder; CaptureStatus* capture_status; std::string win_title; sf::RenderWindow m_win; diff --git a/include/utils.hpp b/include/utils.hpp index 2ea556b..9f207db 100755 --- a/include/utils.hpp +++ b/include/utils.hpp @@ -30,8 +30,8 @@ std::string get_version_string(bool get_letter = true); std::string LayoutNameGenerator(int index); -std::string LayoutPathGenerator(int index); -std::string load_layout_name(int index, bool &success); +std::string LayoutPathGenerator(int index, bool created_proper_folder); +std::string load_layout_name(int index, bool created_proper_folder, bool &success); bool is_big_endian(void); uint32_t to_le(uint32_t value); uint32_t to_be(uint32_t value); diff --git a/source/WindowScreen.cpp b/source/WindowScreen.cpp index 74b061b..680f0df 100755 --- a/source/WindowScreen.cpp +++ b/source/WindowScreen.cpp @@ -24,9 +24,9 @@ const std::string no_effect_fragment_shader = \ static bool loaded_shaders = false; static int n_shader_refs = 0; -static sf::Shader *base_shader; +static sf::Shader *base_shader = NULL; -WindowScreen::WindowScreen(ScreenType stype, CaptureStatus* capture_status, DisplayData* display_data, AudioData* audio_data, ExtraButtonShortcuts* extra_button_shortcuts, ConsumerMutex *draw_lock) { +WindowScreen::WindowScreen(ScreenType stype, CaptureStatus* capture_status, DisplayData* display_data, AudioData* audio_data, ExtraButtonShortcuts* extra_button_shortcuts, ConsumerMutex *draw_lock, bool created_proper_folder) { this->draw_lock = draw_lock; this->m_stype = stype; insert_basic_crops(this->possible_crops, this->m_stype, false, false); @@ -70,7 +70,7 @@ WindowScreen::WindowScreen(ScreenType stype, CaptureStatus* capture_status, Disp this->capture_status = capture_status; if(this->display_data->mono_app_mode && this->m_stype == ScreenType::JOINT) this->m_info.is_fullscreen = true; - if(!loaded_shaders) { + if(sf::Shader::isAvailable() && (!loaded_shaders)) { base_shader = new sf::Shader(); if(base_shader->loadFromMemory(no_effect_fragment_shader, sf::Shader::Type::Fragment)) loaded_shaders = true; @@ -80,6 +80,7 @@ WindowScreen::WindowScreen(ScreenType stype, CaptureStatus* capture_status, Disp this->in_bot_shader = base_shader; this->top_shader = base_shader; this->bot_shader = base_shader; + this->created_proper_folder = created_proper_folder; } WindowScreen::~WindowScreen() { @@ -91,7 +92,7 @@ WindowScreen::~WindowScreen() { FPSArrayDestroy(&this->in_fps); FPSArrayDestroy(&this->draw_fps); FPSArrayDestroy(&this->poll_fps); - if(n_shader_refs == 1) { + if(sf::Shader::isAvailable() && (n_shader_refs == 1)) { delete base_shader; loaded_shaders = false; } @@ -494,11 +495,12 @@ void WindowScreen::post_texture_conversion_processing(out_rect_data &rect_data, else { rect_data.out_tex.clear(); if(this->capture_status->connected && actually_draw) { - sf::Shader* chosen_shader = this->in_top_shader; - if(!is_top) - chosen_shader = this->in_bot_shader; - if(sf::Shader::isAvailable()) + if(sf::Shader::isAvailable()) { + sf::Shader* chosen_shader = this->in_top_shader; + if(!is_top) + chosen_shader = this->in_bot_shader; rect_data.out_tex.draw(in_rect, chosen_shader); + } else rect_data.out_tex.draw(in_rect); //Place postprocessing effects here diff --git a/source/WindowScreen_Menu.cpp b/source/WindowScreen_Menu.cpp index 4b0f20b..7cce90e 100755 --- a/source/WindowScreen_Menu.cpp +++ b/source/WindowScreen_Menu.cpp @@ -760,18 +760,18 @@ void WindowScreen::setup_fileconfig_menu(bool is_save, bool reset_data, bool ski this->possible_files.push_back(file_data); } file_data.index = STARTUP_FILE_INDEX; - file_data.name = load_layout_name(file_data.index, success); + file_data.name = load_layout_name(file_data.index, success, this->created_proper_folder); this->possible_files.push_back(file_data); for(int i = 1; i <= 4; i++) { file_data.index = i; - file_data.name = load_layout_name(file_data.index, success); + file_data.name = load_layout_name(file_data.index, success, this->created_proper_folder); this->possible_files.push_back(file_data); } int first_free; bool failed = false; for(first_free = 5; first_free <= 100; first_free++) { file_data.index = first_free; - file_data.name = load_layout_name(file_data.index, success); + file_data.name = load_layout_name(file_data.index, success, this->created_proper_folder); if(!success) { failed = true; break; diff --git a/source/cc3dsfs.cpp b/source/cc3dsfs.cpp index c4da17d..25e5393 100755 --- a/source/cc3dsfs.cpp +++ b/source/cc3dsfs.cpp @@ -151,7 +151,7 @@ static void defaults_reload(FrontendData *frontend_data, AudioData* audio_data, frontend_data->reload = true; } -static void load_layout_file(int load_index, FrontendData *frontend_data, AudioData* audio_data, OutTextData &out_text_data, ExtraButtonShortcuts* extra_button_shortcuts, CaptureStatus* capture_status, bool skip_io, bool do_print) { +static void load_layout_file(int load_index, FrontendData *frontend_data, AudioData* audio_data, OutTextData &out_text_data, ExtraButtonShortcuts* extra_button_shortcuts, CaptureStatus* capture_status, bool skip_io, bool do_print, bool created_proper_folder) { if(skip_io) return; @@ -164,10 +164,10 @@ static void load_layout_file(int load_index, FrontendData *frontend_data, AudioD bool name_load_success = false; std::string layout_name = LayoutNameGenerator(load_index); - std::string layout_path = LayoutPathGenerator(load_index); + std::string layout_path = LayoutPathGenerator(load_index, created_proper_folder); bool op_success = load(layout_path, layout_name, frontend_data->top_screen->m_info, frontend_data->bot_screen->m_info, frontend_data->joint_screen->m_info, frontend_data->display_data, audio_data, out_text_data, extra_button_shortcuts, capture_status); if(do_print && op_success) { - std::string load_name = load_layout_name(load_index, name_load_success); + std::string load_name = load_layout_name(load_index, created_proper_folder, name_load_success); UpdateOutText(out_text_data, "Layout loaded from: " + layout_path + layout_name, "Layout " + load_name + " loaded", TEXT_KIND_SUCCESS); } else if(!op_success) @@ -175,11 +175,6 @@ static void load_layout_file(int load_index, FrontendData *frontend_data, AudioD } static bool save(const std::string path, const std::string name, const std::string save_name, const ScreenInfo &top_info, const ScreenInfo &bottom_info, const ScreenInfo &joint_info, DisplayData &display_data, AudioData *audio_data, OutTextData &out_text_data, ExtraButtonShortcuts* extra_button_shortcuts, CaptureStatus* capture_status) { - #if (!defined(_MSC_VER)) || (_MSC_VER > 1916) - std::filesystem::create_directories(path); - #else - std::experimental::filesystem::create_directories(path); - #endif std::ofstream file(path + name); if(!file.good()) { UpdateOutText(out_text_data, "File " + path + name + " save failed.", "Save failed", TEXT_KIND_ERROR); @@ -204,7 +199,7 @@ static bool save(const std::string path, const std::string name, const std::stri return true; } -static void save_layout_file(int save_index, FrontendData *frontend_data, AudioData* audio_data, OutTextData &out_text_data, ExtraButtonShortcuts* extra_button_shortcuts, CaptureStatus* capture_status, bool skip_io, bool do_print) { +static void save_layout_file(int save_index, FrontendData *frontend_data, AudioData* audio_data, OutTextData &out_text_data, ExtraButtonShortcuts* extra_button_shortcuts, CaptureStatus* capture_status, bool skip_io, bool do_print, bool created_proper_folder) { if(skip_io) return; @@ -212,9 +207,9 @@ static void save_layout_file(int save_index, FrontendData *frontend_data, AudioD return; bool name_load_success = false; - std::string save_name = load_layout_name(save_index, name_load_success); + std::string save_name = load_layout_name(save_index, created_proper_folder, name_load_success); std::string layout_name = LayoutNameGenerator(save_index); - std::string layout_path = LayoutPathGenerator(save_index); + std::string layout_path = LayoutPathGenerator(save_index, created_proper_folder); bool op_success = save(layout_path, layout_name, save_name, frontend_data->top_screen->m_info, frontend_data->bot_screen->m_info, frontend_data->joint_screen->m_info, frontend_data->display_data, audio_data, out_text_data, extra_button_shortcuts, capture_status); if(do_print && op_success) { UpdateOutText(out_text_data, "Layout saved to: " + layout_path + layout_name, "Layout " + save_name + " saved", TEXT_KIND_SUCCESS); @@ -322,7 +317,7 @@ static float get_time_multiplier(CaptureData* capture_data, bool should_ignore_d } } -static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data, bool mono_app) { +static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data, bool mono_app, bool created_proper_folder) { VideoOutputData *out_buf; double last_frame_time = 0.0; int num_elements_fps_array = 0; @@ -343,14 +338,14 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data, memset(out_buf, 0, sizeof(VideoOutputData)); draw_lock.unlock(); - WindowScreen *top_screen = new WindowScreen(ScreenType::TOP, &capture_data->status, &frontend_data.display_data, audio_data, &extra_button_shortcuts, &draw_lock); - WindowScreen *bot_screen = new WindowScreen(ScreenType::BOTTOM, &capture_data->status, &frontend_data.display_data, audio_data, &extra_button_shortcuts, &draw_lock); - WindowScreen *joint_screen = new WindowScreen(ScreenType::JOINT, &capture_data->status, &frontend_data.display_data, audio_data, &extra_button_shortcuts, &draw_lock); + WindowScreen *top_screen = new WindowScreen(ScreenType::TOP, &capture_data->status, &frontend_data.display_data, audio_data, &extra_button_shortcuts, &draw_lock, created_proper_folder); + WindowScreen *bot_screen = new WindowScreen(ScreenType::BOTTOM, &capture_data->status, &frontend_data.display_data, audio_data, &extra_button_shortcuts, &draw_lock, created_proper_folder); + WindowScreen *joint_screen = new WindowScreen(ScreenType::JOINT, &capture_data->status, &frontend_data.display_data, audio_data, &extra_button_shortcuts, &draw_lock, created_proper_folder); frontend_data.top_screen = top_screen; frontend_data.bot_screen = bot_screen; frontend_data.joint_screen = joint_screen; - load_layout_file(STARTUP_FILE_INDEX, &frontend_data, audio_data, out_text_data, &extra_button_shortcuts, &capture_data->status, skip_io, false); + load_layout_file(STARTUP_FILE_INDEX, &frontend_data, audio_data, out_text_data, &extra_button_shortcuts, &capture_data->status, skip_io, false, created_proper_folder); // Due to the risk for seizures, at the start of the program, set BFI to false! top_screen->m_info.bfi = false; bot_screen->m_info.bfi = false; @@ -453,12 +448,12 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data, if((load_index = top_screen->load_data()) || (load_index = bot_screen->load_data()) || (load_index = joint_screen->load_data())) { // This value should only be loaded when starting the program... bool previous_last_connected_ds = frontend_data.display_data.last_connected_ds; - load_layout_file(load_index, &frontend_data, audio_data, out_text_data, &extra_button_shortcuts, &capture_data->status, skip_io, true); + load_layout_file(load_index, &frontend_data, audio_data, out_text_data, &extra_button_shortcuts, &capture_data->status, skip_io, true, created_proper_folder); frontend_data.display_data.last_connected_ds = previous_last_connected_ds; } if((save_index = top_screen->save_data()) || (save_index = bot_screen->save_data()) || (save_index = joint_screen->save_data())) { - save_layout_file(save_index, &frontend_data, audio_data, out_text_data, &extra_button_shortcuts, &capture_data->status, skip_io, true); + save_layout_file(save_index, &frontend_data, audio_data, out_text_data, &extra_button_shortcuts, &capture_data->status, skip_io, true, created_proper_folder); top_screen->update_save_menu(); bot_screen->update_save_menu(); joint_screen->update_save_menu(); @@ -494,7 +489,7 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data, bot_screen->after_thread_join(); joint_screen->after_thread_join(); - save_layout_file(STARTUP_FILE_INDEX, &frontend_data, audio_data, out_text_data, &extra_button_shortcuts, &capture_data->status, skip_io, false); + save_layout_file(STARTUP_FILE_INDEX, &frontend_data, audio_data, out_text_data, &extra_button_shortcuts, &capture_data->status, skip_io, false, created_proper_folder); if(!out_text_data.consumed) { ConsoleOutText(out_text_data.full_text); @@ -505,6 +500,29 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data, return ret_val; } +static bool create_folder(const std::string path) { + try { + #if (!defined(_MSC_VER)) || (_MSC_VER > 1916) + std::filesystem::create_directories(path); + #else + std::experimental::filesystem::create_directories(path); + #endif + return true; + } + catch(...) { + std::cerr << "Error creating folder " << path << std::endl; + } + return false; +} + +static bool create_out_folder() { + bool success = create_folder(LayoutPathGenerator(STARTUP_FILE_INDEX, true)); + if(!success) + create_folder(LayoutPathGenerator(STARTUP_FILE_INDEX, false)); + create_folder(LayoutPathGenerator(1, success)); + return success; +} + static bool parse_existence_arg(int &index, char **argv, bool &target, bool existence_value, std::string to_check) { if(argv[index] != to_check) return false; @@ -534,6 +552,7 @@ int main(int argc, char **argv) { int enter_id = -1; int power_id = -1; bool use_pud_up = true; + bool created_proper_folder = create_out_folder(); for (int i = 1; i < argc; i++) { if(parse_existence_arg(i, argv, mono_app, true, "--mono_app")) continue; @@ -570,7 +589,7 @@ int main(int argc, char **argv) { std::thread capture_thread(captureCall, capture_data); std::thread audio_thread(soundCall, &audio_data, capture_data); - int ret_val = mainVideoOutputCall(&audio_data, capture_data, mono_app); + int ret_val = mainVideoOutputCall(&audio_data, capture_data, mono_app, created_proper_folder); audio_thread.join(); capture_thread.join(); delete capture_data; diff --git a/source/utils.cpp b/source/utils.cpp index 2c026fb..0839e11 100755 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -150,11 +150,12 @@ std::string LayoutNameGenerator(int index) { return "layout" + std::to_string(index) + ".cfg"; } -std::string LayoutPathGenerator(int index) { +std::string LayoutPathGenerator(int index, bool created_proper_folder) { bool success = false; std::string cfg_dir; #if !(defined(_WIN32) || defined(_WIN64)) - if(const char* env_p = std::getenv("HOME")) { + const char* env_p = std::getenv("HOME"); + if(created_proper_folder && env_p) { cfg_dir = std::string(env_p) + "/.config/" + std::string(NAME); success = true; } @@ -166,13 +167,13 @@ std::string LayoutPathGenerator(int index) { return cfg_dir + "/presets/"; } -std::string load_layout_name(int index, bool &success) { +std::string load_layout_name(int index, bool created_proper_folder, bool &success) { if(index == STARTUP_FILE_INDEX) { success = true; return "Initial"; } std::string name = LayoutNameGenerator(index); - std::string path = LayoutPathGenerator(index); + std::string path = LayoutPathGenerator(index, created_proper_folder); std::ifstream file(path + name); std::string line; @@ -425,4 +426,4 @@ bool SharedConsumerMutex::specific_try_lock(int index) { } access_mutex.unlock(); return success; -} \ No newline at end of file +}