From 34aa78b7cef157fcdb020dc3b1e794f9dc7b245d Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 28 Jul 2018 09:14:18 -0400 Subject: [PATCH 1/2] Attempts to use `xdg-user-dir PICTURES` in preference to $HOME for pictures. --- OSBindings/SDL/main.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/OSBindings/SDL/main.cpp b/OSBindings/SDL/main.cpp index c08d4507c..c8092230b 100644 --- a/OSBindings/SDL/main.cpp +++ b/OSBindings/SDL/main.cpp @@ -7,11 +7,13 @@ // #include +#include #include #include #include #include #include +#include #include @@ -281,6 +283,22 @@ std::string final_path_component(const std::string &path) { return path.substr(final_slash+1, path.size() - final_slash - 1); } +/*! + Executes @c command and returns its STDOUT. +*/ +std::string system_get(const char *command) { + std::unique_ptr pipe(popen(command, "r"), pclose); + if(!pipe) return ""; + + std::string result; + while(!feof(pipe.get())) { + std::array buffer; + if (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) + result += buffer.data(); + } + return result; +} + } int main(int argc, char *argv[]) { @@ -617,12 +635,16 @@ int main(int argc, char *argv[]) { memcpy(&pixels[(window_height - 1 - y)*proportional_width*4], swap_buffer.data(), swap_buffer.size()); } + // Pick the directory for images. Try `xdg-user-dir PICTURES` first; failing that + // fall back on the HOME directory. + std::string target_directory = system_get("xdg-user-dir PICTURES"); + if(target_directory.empty()) target_directory = getenv("HOME"); + // Find the first available name of the form ~/clk-screenshot-.bmp. size_t index = 0; - const std::string home = getenv("HOME"); std::string target; while(true) { - target = home + "/clk-screenshot-" + std::to_string(index) + ".bmp"; + target = target_directory + "/clk-screenshot-" + std::to_string(index) + ".bmp"; struct stat file_stats; if(stat(target.c_str(), &file_stats)) From 99c770eab4d7af335f5aaec84532010154b8d019 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 28 Jul 2018 10:45:50 -0400 Subject: [PATCH 2/2] Ensure that the output of `xdg-user-dir` is properly filtered. --- OSBindings/SDL/main.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/OSBindings/SDL/main.cpp b/OSBindings/SDL/main.cpp index c8092230b..e1a608e97 100644 --- a/OSBindings/SDL/main.cpp +++ b/OSBindings/SDL/main.cpp @@ -236,7 +236,7 @@ ParsedArguments parse_arguments(int argc, char *argv[]) { // --flag sets a Boolean option to true. // --flag=value sets the value for a list option. // name sets the file name to load. - + // Anything starting with a dash always makes a selection; otherwise it's a file name. if(arg[0] == '-') { while(*arg == '-') arg++; @@ -268,7 +268,7 @@ std::string final_path_component(const std::string &path) { // Find the last slash... auto final_slash = path.find_last_of("/\\"); - + // If no slash was found at all, return the whole path. if(final_slash == std::string::npos) { return path; @@ -287,7 +287,7 @@ std::string final_path_component(const std::string &path) { Executes @c command and returns its STDOUT. */ std::string system_get(const char *command) { - std::unique_ptr pipe(popen(command, "r"), pclose); + std::unique_ptr pipe(popen(command, "r"), pclose); if(!pipe) return ""; std::string result; @@ -321,7 +321,7 @@ int main(int argc, char *argv[]) { std::cout << machine_options.first << ":" << std::endl; for(const auto &option: machine_options.second) { std::cout << '\t' << "--" << option->short_name; - + Configurable::ListOption *list_option = dynamic_cast(option.get()); if(list_option) { std::cout << "={"; @@ -500,7 +500,7 @@ int main(int argc, char *argv[]) { if(configurable_device) { // Establish user-friendly options by default. configurable_device->set_selections(configurable_device->get_user_friendly_selections()); - + // Consider transcoding any list selections that map to Boolean options. for(const auto &option: configurable_device->get_options()) { // Check for a corresponding selection. @@ -635,9 +635,14 @@ int main(int argc, char *argv[]) { memcpy(&pixels[(window_height - 1 - y)*proportional_width*4], swap_buffer.data(), swap_buffer.size()); } - // Pick the directory for images. Try `xdg-user-dir PICTURES` first; failing that - // fall back on the HOME directory. + // Pick the directory for images. Try `xdg-user-dir PICTURES` first. std::string target_directory = system_get("xdg-user-dir PICTURES"); + + // Make sure there are no newlines. + target_directory.erase(std::remove(target_directory.begin(), target_directory.end(), '\n'), target_directory.end()); + target_directory.erase(std::remove(target_directory.begin(), target_directory.end(), '\r'), target_directory.end()); + + // Fall back on the HOME directory if necessary. if(target_directory.empty()) target_directory = getenv("HOME"); // Find the first available name of the form ~/clk-screenshot-.bmp.