Compare commits

...

5 Commits

Author SHA1 Message Date
f7912a8ce7 CMakeLists.txt: make this build in OpenBSD 2020-10-29 15:53:04 +01:00
42d2bef93a CMakeLists.txt: omit end{if,foreach} expressions
Their usefulness was almost negative.
2020-10-29 15:46:27 +01:00
065cd3b3e1 README.adoc: update to reflect the current state 2020-10-26 14:09:53 +01:00
65797ee4f1 Bump minimum CMake version to 3.0
A nice, round number.  This allows us to remove some boilerplate.
2020-10-26 13:52:55 +01:00
279d010e0f Fix a spurious "implicit fallthrough" warning 2020-10-26 13:37:51 +01:00
4 changed files with 37 additions and 42 deletions

View File

@@ -1,21 +1,13 @@
project (termo C)
cmake_minimum_required (VERSION 2.8.5)
cmake_minimum_required (VERSION 3.0)
project (termo VERSION 0.1.0 LANGUAGES C)
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wextra")
endif ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
endif ()
# Version
set (project_VERSION_MAJOR 0)
set (project_VERSION_MINOR 1)
set (project_VERSION_PATCH 0)
set (project_VERSION ${project_VERSION_MAJOR})
set (project_VERSION ${project_VERSION}.${project_VERSION_MINOR})
set (project_VERSION ${project_VERSION}.${project_VERSION_PATCH})
set (project_API_VERSION ${project_VERSION_MAJOR})
set (project_API_VERSION ${PROJECT_VERSION_MAJOR})
# Names
set (project_LIB_NAME "termo-${project_API_VERSION}")
@@ -55,7 +47,7 @@ if (Ncursesw_FOUND)
elseif (CURSES_FOUND)
include_directories (${CURSES_INCLUDE_DIR})
set (curses_libraries ${CURSES_LIBRARY})
endif (Ncursesw_FOUND)
endif ()
if (unibilium_FOUND)
include_directories (${unibilium_INCLUDE_DIRS})
@@ -64,23 +56,29 @@ if (unibilium_FOUND)
elseif (curses_libraries)
include_directories (${Ncursesw_INCLUDE_DIRS})
set (lib_libraries ${curses_libraries})
else (CURSES_FOUND)
else ()
message (SEND_ERROR "Unibilium not found, Curses not found")
endif (unibilium_FOUND)
endif ()
# -liconv may or may not be a part of libc
find_library (iconv_LIBRARIES iconv)
if (iconv_LIBRARIES)
list (APPEND lib_libraries ${iconv_LIBRARIES})
endif ()
# Create the library targets
add_library (termo SHARED ${lib_sources} ${lib_headers})
target_link_libraries (termo ${lib_libraries})
set_target_properties (termo PROPERTIES
OUTPUT_NAME ${project_LIB_NAME}
VERSION ${project_VERSION}
VERSION ${PROJECT_VERSION}
SOVERSION ${project_API_VERSION})
add_library (termo-static STATIC ${lib_sources} ${lib_headers})
target_link_libraries (termo-static ${lib_libraries})
set_target_properties (termo-static PROPERTIES
OUTPUT_NAME ${project_LIB_NAME}
VERSION ${project_VERSION}
VERSION ${PROJECT_VERSION}
SOVERSION ${project_API_VERSION})
# A fix for: relocation R_X86_64_32 against `a local symbol' can not be
@@ -89,7 +87,7 @@ set_target_properties (termo-static PROPERTIES
# This should enable linking the static library into a shared one.
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
set_target_properties (termo-static PROPERTIES COMPILE_FLAGS "-fPIC")
endif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
endif ()
# Demos
add_executable (demo-async EXCLUDE_FROM_ALL demo-async.c)
@@ -108,7 +106,7 @@ if (glib_FOUND)
target_link_libraries (demo-glib
termo-static ${lib_libraries} ${glib_LIBRARIES})
list (APPEND demos demo-glib)
endif (glib_FOUND)
endif ()
add_custom_target (demos DEPENDS ${demos})
@@ -127,7 +125,7 @@ configure_file (config-version.cmake.in
install (FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${project_VERSION})
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${PROJECT_VERSION})
# Do some unit tests
option (BUILD_TESTING "Build tests" OFF)
@@ -158,14 +156,14 @@ if (BUILD_TESTING)
add_executable (test-${name} tests/${name}.c ${test_common_sources})
target_link_libraries (test-${name} termo-static ${lib_libraries})
add_test (NAME ${PROJECT_NAME}.${name} COMMAND test-${name})
endforeach (name)
endif (BUILD_TESTING)
endforeach ()
endif ()
# pkg-config
file (WRITE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.pc"
"Name: ${PROJECT_NAME}\n"
"Description: Terminal key input library\n"
"Version: ${project_VERSION}\n"
"Version: ${PROJECT_VERSION}\n"
"Libs: -L${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} -l${project_LIB_NAME}\n"
"Libs.private: ${lib_libraries}\n"
"Cflags: -I${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/${project_INCLUDE_NAME}\n")
@@ -177,15 +175,12 @@ set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Terminal key input library")
set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch")
set (CPACK_PACKAGE_CONTACT "Přemysl Eric Janouch <p@janouch.name>")
set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set (CPACK_PACKAGE_VERSION_MAJOR ${project_VERSION_MAJOR})
set (CPACK_PACKAGE_VERSION_MINOR ${project_VERSION_MINOR})
set (CPACK_PACKAGE_VERSION_PATCH ${project_VERSION_PATCH})
set (CPACK_GENERATOR "TGZ;ZIP")
set (CPACK_PACKAGE_FILE_NAME
"${CMAKE_PROJECT_NAME}-${project_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}-${project_VERSION}")
"${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}")
set (CPACK_SOURCE_GENERATOR "TGZ;ZIP")
set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git;/build;/CMakeLists.txt.user")
set (CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${project_VERSION}")
set (CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}")
include (CPack)

View File

@@ -2,20 +2,21 @@ termo
=====
'termo' is a library providing an alternative to ncurses' handling of terminal
input. ncurses does a really terrible job at that, mainly wrt. mouse support
which seems to be utterly broken. If you can drag things in a terminal
application, such as in VIM, I can assure you it's not using ncurses for that.
(At least not with ncurses older than 6.0.)
input. ncurses does a terrible job at that, mainly wrt. mouse support which was
even completely broken for a few years, making it impossible to drag things
around in applications. While that one bit has been fixed, it continues to lack
support for rxvt-unicode's 1015 mode and it's generally incapable of relaying
certain key combinations.
Since terminal I/O is really complicated and full of special cases, this project
doesn't aspire to also replace the output part of ncurses, but is rather
complementary to it. In the end it makes use of its terminfo library.
The API isn't stable yet. Tell me what needs to be done so I can fix it first.
The API can be considered stable. This project is in maintenance mode.
Building and Installing
-----------------------
Build dependencies: cmake >= 2.8.5, pkg-config +
Build dependencies: cmake >= 3.0, pkg-config +
Optional dependencies: Unibilium (alternative for curses), GLib (for the demos)
$ git clone https://git.janouch.name/p/termo.git
@@ -55,7 +56,7 @@ CMake-based projects and simply import the target. No package maintainer action
is needed for you to enjoy the benefits of proper terminal input.
The rest is just me going silly over formatting and various unimportant stuff.
Oh, and I've deleted the manpages. It needs more Doxygen. :) TBD
Oh, and I've deleted the manpages.
Contributing and Support
------------------------

View File

@@ -1,8 +1,8 @@
#ifndef TERMO_CONFIG_H
#define TERMO_CONFIG_H
#define TERMO_VERSION_MAJOR @project_VERSION_MAJOR@
#define TERMO_VERSION_MINOR @project_VERSION_MINOR@
#define TERMO_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define TERMO_VERSION_MINOR @PROJECT_VERSION_MINOR@
#endif // ! TERMO_CONFIG_H

View File

@@ -906,21 +906,20 @@ peekkey (termo_t *tk, termo_key_t *key, int flags, size_t *nbytep)
switch (ret)
{
size_t halfsize;
case TERMO_RES_KEY:
{
#ifdef DEBUG
print_key (tk, key); fprintf (stderr, "\n");
#endif
// Slide the data down to stop it running away
size_t halfsize = tk->buffsize / 2;
halfsize = tk->buffsize / 2;
if (tk->buffstart > halfsize)
{
memcpy (tk->buffer, tk->buffer + halfsize, halfsize);
tk->buffstart -= halfsize;
}
// Fallthrough
}
// Fall-through
case TERMO_RES_EOF:
case TERMO_RES_ERROR:
return ret;