Skip to content

Commit 29a3a79

Browse files
committed
fix
1 parent 5ea2761 commit 29a3a79

File tree

9 files changed

+57
-109
lines changed

9 files changed

+57
-109
lines changed

CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ if(NOT CMAKE_CXX_STANDARD)
3131
endif()
3232
set(CMAKE_CXX_STANDARD_REQUIRED TRUE CACHE STRING "C++ standard required" FORCE)
3333
set(CMAKE_CXX_EXTENSIONS FALSE CACHE STRING "C++ extensions" FORCE)
34+
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
3435

3536
option(CPPTERMINAL_BUILD_EXAMPLES "Set to ON to build examples" ON)
3637
option(CPPTERMINAL_ENABLE_INSTALL "Set to ON to enable install" ON)
@@ -39,13 +40,13 @@ option(CPPTERMINAL_ENABLE_DOCS "Set to ON to generate documentation" ON)
3940

4041
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
4142

42-
add_subdirectory(cpp-terminal)
43-
4443
if(CPPTERMINAL_ENABLE_TESTING)
4544
enable_testing()
4645
add_subdirectory(tests)
4746
endif()
4847

48+
add_subdirectory(cpp-terminal)
49+
4950
if(CPPTERMINAL_BUILD_EXAMPLES)
5051
add_subdirectory(examples)
5152
endif()

cpp-terminal/CMakeLists.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
include(GNUInstallDirs)
2+
13
add_subdirectory(private)
24

35
set(CPP_TERMINAL_PUBLIC_HEADERS
@@ -49,20 +51,18 @@ set(CPP_TERMINAL_SRC
4951

5052
# create and configure library target
5153
add_library(cpp-terminal "${CPP_TERMINAL_SRC}")
52-
target_link_libraries(cpp-terminal PRIVATE Warnings::Warnings cpp-terminal::cpp-terminal-private)
53-
target_compile_options(cpp-terminal PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8>)
54-
target_include_directories(cpp-terminal PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> $<INSTALL_INTERFACE:include>)
54+
target_link_libraries(cpp-terminal PRIVATE cpp-terminal::cpp-terminal-private)
55+
target_include_directories(cpp-terminal PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
5556
set_target_properties(cpp-terminal PROPERTIES PUBLIC_HEADER "${CPP_TERMINAL_PUBLIC_HEADERS}")
5657

5758
add_library(cpp-terminal::cpp-terminal ALIAS cpp-terminal)
5859

5960
# Install
6061
if (CPPTERMINAL_ENABLE_INSTALL)
61-
include(GNUInstallDirs)
6262
include(CMakePackageConfigHelpers)
6363
configure_package_config_file("${PROJECT_SOURCE_DIR}/cmake/cpp-terminalConfig.cmake.in" "${PROJECT_BINARY_DIR}/cmake/cpp-terminalConfig.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/cpp-terminal")
6464
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/cpp-terminalConfigVersion.cmake" COMPATIBILITY AnyNewerVersion)
65-
install(TARGETS cpp-terminal cpp-terminal-private cpp-terminalWarnings EXPORT cpp-terminalTargets
65+
install(TARGETS cpp-terminal cpp-terminalWarnings cpp-terminal-private EXPORT cpp-terminalTargets
6666
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
6767
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
6868
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"

cpp-terminal/private/CMakeLists.txt

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,27 @@ find_package(Threads)
33

44
# configure version information
55
configure_file(version.cpp.in version.cpp)
6-
7-
add_library(cpp-terminal-private STATIC "${CMAKE_CURRENT_BINARY_DIR}/version.cpp" return_code.cpp file_initializer.cpp exception.cpp unicode.cpp conversion.cpp args.cpp terminal_impl.cpp tty.cpp terminfo.cpp input.cpp screen.cpp cursor.cpp file.cpp env.cpp blocking_queue.cpp sigwinch.cpp)
8-
target_link_libraries(cpp-terminal-private PRIVATE Warnings::Warnings cpp-terminal::cpp-terminal PUBLIC Threads::Threads)
9-
target_compile_options(cpp-terminal-private PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8 /wd4668 /wd4514>)
10-
target_include_directories(cpp-terminal-private PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> $<INSTALL_INTERFACE:include>)
6+
add_library(cpp-terminal-private INTERFACE)
7+
target_sources(cpp-terminal-private INTERFACE
8+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/version.cpp>
9+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/return_code.cpp>
10+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/file_initializer.cpp>
11+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/exception.cpp>
12+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/unicode.cpp>
13+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/conversion.cpp>
14+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/args.cpp>
15+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/terminal_impl.cpp>
16+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/tty.cpp>
17+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/terminfo.cpp>
18+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/input.cpp>
19+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/screen.cpp>
20+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/cursor.cpp>
21+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/file.cpp>
22+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/env.cpp>
23+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/blocking_queue.cpp>
24+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/sigwinch.cpp>
25+
)
26+
target_link_libraries(cpp-terminal-private INTERFACE Warnings::Warnings Threads::Threads)
27+
target_compile_options(cpp-terminal-private INTERFACE $<$<CXX_COMPILER_ID:MSVC>:/utf-8>)
28+
target_include_directories(cpp-terminal-private INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
1129
add_library(cpp-terminal::cpp-terminal-private ALIAS cpp-terminal-private)

cpp-terminal/private/input.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
*
77
* SPDX-License-Identifier: MIT
88
*/
9-
109
#if defined(_WIN32)
1110
#include "cpp-terminal/private/unicode.hpp"
1211

@@ -75,14 +74,22 @@ void sendString(Term::Private::BlockingQueue& events, std::wstring& str)
7574

7675
#endif
7776

78-
std::thread Term::Private::Input::m_thread = std::thread(Term::Private::Input::read_event);
77+
Term::Private::Input::~Input()
78+
{
79+
if(m_thread.joinable()) m_thread.join();
80+
}
81+
82+
std::thread Term::Private::Input::m_thread{};
7983

8084
Term::Private::BlockingQueue Term::Private::Input::m_events;
8185

8286
int Term::Private::Input::m_poll{-1};
8387

8488
void Term::Private::Input::init_thread()
8589
{
90+
if(m_thread.joinable()) m_thread.join();
91+
std::thread thread(Term::Private::Input::read_event);
92+
m_thread.swap(thread);
8693
Term::Private::Sigwinch::unblockSigwinch();
8794
#if defined(__linux__)
8895
m_poll = {::epoll_create1(EPOLL_CLOEXEC)};
@@ -99,7 +106,6 @@ void Term::Private::Input::init_thread()
99106

100107
void Term::Private::Input::read_event()
101108
{
102-
init_thread();
103109
while(true)
104110
{
105111
#if defined(_WIN32)
@@ -309,6 +315,7 @@ void Term::Private::Input::startReading()
309315
static bool activated{false};
310316
if(!activated)
311317
{
318+
init_thread();
312319
m_thread.detach();
313320
activated = true;
314321
}

cpp-terminal/private/input.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ namespace Private
2222

2323
class BlockingQueue;
2424

25-
class Input
25+
class Input final
2626
{
2727
public:
2828
Input();
29+
~Input();
2930
static void startReading();
3031
static Term::Event getEvent();
3132
static Term::Event getEventBlocking();

examples/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ cppterminal_example(SOURCE prompt_multiline)
3838
cppterminal_example(SOURCE prompt_not_immediate)
3939
cppterminal_example(SOURCE prompt_simple)
4040
cppterminal_example(SOURCE styles)
41-
cppterminal_example(SOURCE slow_events)
4241
cppterminal_example(SOURCE utf8)
4342
cppterminal_example(SOURCE attach_console WIN32)
4443
cppterminal_example(SOURCE attach_console_minimal WIN32)

examples/events.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ class Loop
2525
void stop() { m_stop = true; }
2626
void print_message() const
2727
{
28-
while(m_stop)
28+
while(!m_stop)
2929
{
30-
std::this_thread::sleep_for(std::chrono::duration<double, std::milli>(2000));
30+
std::this_thread::sleep_for(std::chrono::duration<double, std::milli>(200));
3131
std::cout << "\tNot waiting..." << std::endl;
3232
}
3333
}

examples/slow_events.cpp

Lines changed: 0 additions & 81 deletions
This file was deleted.

tests/CMakeLists.txt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@ endif()
44

55
if(CMAKE_VERSION GREATER_EQUAL 3.11)
66
include(FetchContent)
7-
FetchContent_Declare(doctest GIT_REPOSITORY https://github.com/doctest/doctest.git GIT_TAG v2.4.11)
8-
FetchContent_GetProperties(doctest)
9-
if(NOT doctest_POPULATED)
10-
set(DOCTEST_NO_INSTALL TRUE)
11-
FetchContent_Populate(doctest)
12-
add_subdirectory("${doctest_SOURCE_DIR}" "${doctest_BINARY_DIR}")
7+
FetchContent_Declare(doctest GIT_REPOSITORY https://github.com/doctest/doctest.git GIT_TAG dev GIT_PROGRESS TRUE CMAKE_ARGS DOCTEST_NO_INSTALL=TRUE)
8+
if(CMAKE_VERSION GREATER_EQUAL 3.14)
9+
FetchContent_MakeAvailable(doctest)
1310
include("${doctest_SOURCE_DIR}/scripts/cmake/doctest.cmake")
14-
unset(DOCTEST_NO_INSTALL)
11+
else()
12+
FetchContent_GetProperties(doctest)
13+
if(NOT doctest_POPULATED)
14+
FetchContent_Populate(doctest)
15+
add_subdirectory("${doctest_SOURCE_DIR}" "${doctest_BINARY_DIR}")
16+
include("${doctest_SOURCE_DIR}/scripts/cmake/doctest.cmake")
17+
endif()
1518
endif()
1619
else()
1720
find_package(doctest QUIET)
@@ -26,7 +29,7 @@ endif()
2629
function(cppterminal_test )
2730
cmake_parse_arguments(ARG "" "SOURCE" "" ${ARGN})
2831
add_executable("${ARG_SOURCE}.test" "${ARG_SOURCE}.test.cpp")
29-
target_link_libraries("${ARG_SOURCE}.test" PRIVATE doctest::doctest cpp-terminal::cpp-terminal)
32+
target_link_libraries("${ARG_SOURCE}.test" PRIVATE cpp-terminal::cpp-terminal doctest::doctest)
3033
doctest_discover_tests("${ARG_SOURCE}.test")
3134
endfunction()
3235

@@ -42,5 +45,5 @@ cppterminal_test(SOURCE version)
4245
if (NOT MINGW AND NOT MSYS)
4346
add_executable(Args args.test.cpp)
4447
target_link_libraries(Args PRIVATE doctest::doctest cpp-terminal::cpp-terminal)
45-
doctest_discover_tests(Args EXTRA_ARGS Bonjour Hello 你好)
48+
doctest_discover_tests(Args EXTRA_ARGS Bonjour Hello 大家好)
4649
endif()

0 commit comments

Comments
 (0)