From 7e68068c2501a681dbbcbce9abf60073f35687ee Mon Sep 17 00:00:00 2001 From: pavelxdd Date: Sat, 25 Nov 2017 04:26:01 +0300 Subject: [PATCH 1/5] fix compilation with boost::filesystem CMakeLists.txt: --------------------------- Until now build with boost::filesystem was completely broken, since cmake exported definitions with wrong name prefixes, and nana always defaulted to internal filesystem implementation. After fixing the boost definitions, a number of errors came up due to incompatibility of boost::filesystem with nana and std filesystems. This commit tries to fix them all. filesystem.cpp, filesystem.hpp, filebox.cpp: -------------------------------------------- boost::filesystem doesn't have a file_time_type, so declared it in the filesystem.hpp header. boost::filesystem::last_write_time has a return type std::time_t unlike the other two implementations of this function in nana and std, so added ifdef to convert the result to file_time_type. fixed build on gcc-4.9, since it doesn't have a std::put_time function, included in that case. boost::filesystem::file_type types have different names than std::experimental::filesystem::file_type types, fixed it by creating an enum class file_type with the same type names as in std::experimental::filesystem::file_type. This fix requires static_cast from functions results to internal file_type, since boost file_type and std file_type a different enum classes. changed switch to if, bacause old gcc fails on converting enum class members to int. stdc++.hpp: ----------- added ifndef guards to prevent errors on multiple includes of this header. wvl.cpp: -------- added boost/chrono.hpp include for the cases when std::thread is not available. travis: ------- added boost system, thread, chrono libs to install, they are needed for the nana-demo to compile. --- .travis.yml | 3 +++ CMakeLists.txt | 4 ++-- include/nana/filesystem/filesystem.hpp | 15 +++++++++++++++ include/nana/stdc++.hpp | 7 ++++++- source/filesystem/filesystem.cpp | 14 +++++++++++++- source/gui/filebox.cpp | 26 ++++++++++++-------------- source/gui/wvl.cpp | 7 ++++++- 7 files changed, 57 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4543e6b3..c7b02176 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,6 +35,9 @@ matrix: - libx11-dev - libxft-dev - libboost-filesystem-dev + - libboost-system-dev + - libboost-thread-dev + - libboost-chrono-dev sources: - ubuntu-toolchain-r-test diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a43b5b5..cc4622bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -238,7 +238,7 @@ elseif (NANA_CMAKE_STD_FILESYSTEM_FORCE) add_definitions(-DSTD_FILESYSTEM_FORCE) elseif (NANA_CMAKE_FIND_BOOST_FILESYSTEM OR NANA_CMAKE_BOOST_FILESYSTEM_FORCE) if (NANA_CMAKE_BOOST_FILESYSTEM_FORCE) - add_definitions(-DNANA_BOOST_FILESYSTEM_FORCE) + add_definitions(-DBOOST_FILESYSTEM_FORCE) endif(NANA_CMAKE_BOOST_FILESYSTEM_FORCE) # https://cmake.org/cmake/help/git-master/module/FindBoost.html # Implicit dependencies such as Boost::filesystem requiring Boost::system will be automatically detected and satisfied, @@ -246,7 +246,7 @@ elseif (NANA_CMAKE_FIND_BOOST_FILESYSTEM OR NANA_CMAKE_BOOST_FILESYSTEM_FORCE) # If using Boost::thread, then Thread::Thread will also be added automatically. find_package(Boost COMPONENTS filesystem) if (Boost_FOUND) - add_definitions(-DNANA_BOOST_FILESYSTEM_AVAILABLE) + add_definitions(-DBOOST_FILESYSTEM_AVAILABLE) include_directories(SYSTEM "${Boost_INCLUDE_DIR}") list(APPEND NANA_LINKS ${Boost_LIBRARIES}) ###### FIRST !!!!!!!!!!!!!!!!! add is not first endif (Boost_FOUND) diff --git a/include/nana/filesystem/filesystem.hpp b/include/nana/filesystem/filesystem.hpp index 59020d68..067586f5 100644 --- a/include/nana/filesystem/filesystem.hpp +++ b/include/nana/filesystem/filesystem.hpp @@ -53,6 +53,7 @@ #undef NANA_USING_BOOST_FILESYSTEM #define NANA_USING_BOOST_FILESYSTEM 1 +# include # include // add boost::filesystem into std::experimental::filesystem @@ -60,6 +61,20 @@ namespace std { namespace experimental { namespace filesystem { using namespace boost::filesystem; + using file_time_type = std::chrono::time_point; + + enum class file_type { + none = boost::filesystem::file_type::status_unknown, + not_found = boost::filesystem::file_type::file_not_found, + regular = boost::filesystem::file_type::regular_file, + directory = boost::filesystem::file_type::directory_file, + symlink = boost::filesystem::file_type::symlink_file, + block = boost::filesystem::file_type::block_file, + character = boost::filesystem::file_type::character_file, + fifo = boost::filesystem::file_type::fifo_file, + socket = boost::filesystem::file_type::socket_file, + unknown = boost::filesystem::file_type::type_unknown, + }; } // filesystem } // experimental } // std diff --git a/include/nana/stdc++.hpp b/include/nana/stdc++.hpp index 4d8bbef9..fc2d6568 100644 --- a/include/nana/stdc++.hpp +++ b/include/nana/stdc++.hpp @@ -12,6 +12,9 @@ * @brief Implement the lack support of standard library. */ +#ifndef NANA_STDCXX_INCLUDED +#define NANA_STDCXX_INCLUDED + #include "c++defines.hpp" //Implement workarounds for GCC/MinGW which version is below 4.8.2 @@ -153,4 +156,6 @@ namespace std return (v < lo ? lo : (hi < v ? hi : v)); } } -#endif \ No newline at end of file +#endif + +#endif // NANA_STDCXX_INCLUDED diff --git a/source/filesystem/filesystem.cpp b/source/filesystem/filesystem.cpp index 4613ca7a..fa5a8cb8 100644 --- a/source/filesystem/filesystem.cpp +++ b/source/filesystem/filesystem.cpp @@ -14,7 +14,13 @@ #include #include #include -#include //put_time + +#include +#ifdef _enable_std_put_time + #include +#else + #include +#endif #if defined(NANA_WINDOWS) #include @@ -97,7 +103,13 @@ namespace nana std::string pretty_file_date(const fs::path& path) // todo: move to .cpp { try { +#if NANA_USING_BOOST_FILESYSTEM + // The return type of boost::filesystem::last_write_time isn't + // the same as in nana and std implementations of this function + auto ftime = std::chrono::system_clock::from_time_t(fs::last_write_time(path)); +#else auto ftime = fs::last_write_time(path); +#endif // crash: VS2015 will not read the time for some files (for example: C:/hiberfil.sys) // and will return file_time_type(-1) without throwing diff --git a/source/gui/filebox.cpp b/source/gui/filebox.cpp index 96f1e1c6..b31653cc 100644 --- a/source/gui/filebox.cpp +++ b/source/gui/filebox.cpp @@ -505,21 +505,18 @@ namespace nana auto fpath = i->path().native(); auto fattr = fs::status(fpath); + auto ftype = static_cast(fattr.type()); item_fs m; m.name = name; m.directory = fs::is_directory(fattr); - switch(fattr.type()) - { - case fs::file_type::not_found: - case fs::file_type::unknown: - case fs::file_type::directory: + if (ftype == fs::file_type::not_found || + ftype == fs::file_type::unknown || + ftype == fs::file_type::directory) m.bytes = 0; - break; - default: + else m.bytes = fs::file_size(fpath); - } fs_ext::modified_file_time(fpath, m.modified_time); @@ -692,13 +689,12 @@ namespace nana return; } - using file_type = fs::file_type; - fs::path fspath(fb_.addr_.filesystem + path); - auto fst = fs::status(fspath); + auto fattr = fs::status(fspath); + auto ftype = static_cast(fattr.type()); - if(fst.type() != file_type::not_found && fst.type() != file_type::none) + if(ftype != fs::file_type::not_found && ftype != fs::file_type::none) { mb<(fattr.type()); //Check if the selected name is a directory auto is_dir = fs::is_directory(fattr); @@ -808,6 +805,7 @@ namespace nana { //Add the extension, then check if it is a directory again. fattr = fs::status(tar); + ftype = static_cast(fattr.type()); is_dir = fs::is_directory(fattr); } @@ -820,7 +818,7 @@ namespace nana if(io_read_) { - if(fs::file_type::not_found == fattr.type()) + if(fs::file_type::not_found == ftype) { msgbox mb(*this, caption()); mb.icon(msgbox::icon_information); @@ -832,7 +830,7 @@ namespace nana } else { - if(fs::file_type::not_found != fattr.type()) + if(fs::file_type::not_found != ftype) { msgbox mb(*this, caption(), msgbox::yes_no); mb.icon(msgbox::icon_question); diff --git a/source/gui/wvl.cpp b/source/gui/wvl.cpp index 820a8ba7..610484cd 100644 --- a/source/gui/wvl.cpp +++ b/source/gui/wvl.cpp @@ -15,7 +15,12 @@ #include #include #include -#include + +#ifdef STD_THREAD_NOT_SUPPORTED +# include +#else +# include +#endif //#define NANA_AUTOMATIC_GUI_TESTING namespace nana From 81018c21fd0c399e2ad8315d8f6e2ff1bac2f528 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Sun, 3 Dec 2017 13:13:12 +0800 Subject: [PATCH 2/5] add contribution info --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e9cf66b..2cdeb93d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,8 @@ # Robert Hauck - Enable support for PNG/Freetype # Qiangqiang Wu - Add biicode support # Ariel Vina-Rodriguez (qPCR4vir) -# Frostbane - Add option for compiling a shared library +# Pavel O. - fix compilation with boost::filesystem (#281) +# Frostbane - Add option for compiling a shared library (#263,#265) # # Nana uses some build systems: MS-VS solution, MAKE, bakefile, codeblock, etc. manually optimized. # In the future CMake could be the prefered, and maybe will be used to generate the others and the central nana repo From 5653bd2416bae7fe009c76de05859abdd4bed37a Mon Sep 17 00:00:00 2001 From: Jinhao Date: Wed, 13 Dec 2017 06:28:12 +0800 Subject: [PATCH 3/5] fix crash where listbox::item_proxy==str --- source/gui/widgets/listbox.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/gui/widgets/listbox.cpp b/source/gui/widgets/listbox.cpp index e473a080..54611aa1 100644 --- a/source/gui/widgets/listbox.cpp +++ b/source/gui/widgets/listbox.cpp @@ -4662,12 +4662,12 @@ namespace nana bool item_proxy::operator==(const std::string& s) const { - return (text(pos_.item) == s); + return (text(0) == s); } bool item_proxy::operator==(const std::wstring& s) const { - return (text(pos_.item) == to_utf8(s)); + return (text(0) == to_utf8(s)); } item_proxy & item_proxy::operator=(const item_proxy& rhs) From 58b7bdf2f7a3654062a07eaa69085cdab385785a Mon Sep 17 00:00:00 2001 From: Jinhao Date: Wed, 3 Jan 2018 07:32:21 +0800 Subject: [PATCH 4/5] fix a stackoverflow error --- source/gui/detail/window_layout.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/gui/detail/window_layout.cpp b/source/gui/detail/window_layout.cpp index 27357217..4add7b03 100644 --- a/source/gui/detail/window_layout.cpp +++ b/source/gui/detail/window_layout.cpp @@ -1,7 +1,7 @@ /* * Window Layout Implementation * Nana C++ Library(http://www.nanapro.org) -* Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com) +* Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -386,6 +386,13 @@ namespace nana nana::rectangle r_of_sigwd(sigwd->pos_root, sigwd->dimension); for (auto wd : data_sect.effects_bground_windows) { + //Don't notify the window if both native root windows are not same(e.g. wd and sigwd have + //a some parent). Otherwise, _m_paint_glass_window() recursively paints sigwd to make stack overflow. + //On the other hand, a nested root window is always floating on its parent's child widgets, it's unnecessary to + //notify the wd if they haven't a same native root window. + if (sigwd->root != wd->root) + continue; + if (wd == sigwd || !wd->displayed() || (false == overlapped(nana::rectangle{ wd->pos_root, wd->dimension }, r_of_sigwd))) continue; From 970872c96f92e0891625ff9463bd5ef40c7a7e3a Mon Sep 17 00:00:00 2001 From: Jinhao Date: Sun, 7 Jan 2018 04:18:23 +0800 Subject: [PATCH 5/5] fix bug that integer overflow in progress widget --- source/gui/widgets/progress.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/gui/widgets/progress.cpp b/source/gui/widgets/progress.cpp index 2c498f7c..8a679c4c 100644 --- a/source/gui/widgets/progress.cpp +++ b/source/gui/widgets/progress.cpp @@ -1,6 +1,6 @@ /* * A Progress Indicator Implementation - * Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -96,7 +96,11 @@ namespace nana { if (widget_) { - auto value_px = (widget_->size().width - border_px * 2) * value_ / max_; + auto value_px = (widget_->size().width - border_px * 2); + + //avoid overflow + if (value_ < max_) + value_px = static_cast(value_px * (double(value_) / double(max_))); if (value_px != value_px_) {