Compare commits
	
		
			17 Commits
		
	
	
		
			30e0eee1a8
			...
			8265f075b1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						8265f075b1
	
				 | 
					
					
						|||
| 
						
						
							
						
						2f348c79b7
	
				 | 
					
					
						|||
| 
						
						
							
						
						18d16c1edb
	
				 | 
					
					
						|||
| 
						
						
							
						
						94a77a10d8
	
				 | 
					
					
						|||
| 
						
						
							
						
						d39c35e59e
	
				 | 
					
					
						|||
| 
						
						
							
						
						d47bcfb203
	
				 | 
					
					
						|||
| 
						
						
							
						
						ff08195973
	
				 | 
					
					
						|||
| 
						
						
							
						
						f7912a8ce7
	
				 | 
					
					
						|||
| 
						
						
							
						
						42d2bef93a
	
				 | 
					
					
						|||
| 
						
						
							
						
						065cd3b3e1
	
				 | 
					
					
						|||
| 
						
						
							
						
						65797ee4f1
	
				 | 
					
					
						|||
| 
						
						
							
						
						279d010e0f
	
				 | 
					
					
						|||
| 
						
						
							
						
						8c4e867760
	
				 | 
					
					
						|||
| 
						
						
							
						
						dd3f77a0aa
	
				 | 
					
					
						|||
| 
						
						
							
						
						0bfb13655c
	
				 | 
					
					
						|||
| 
						
						
							
						
						78c0cd443d
	
				 | 
					
					
						|||
| 
						
						
							
						
						6a99d97ad0
	
				 | 
					
					
						
							
								
								
									
										27
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					# clang-format is fairly limited, and these rules are approximate:
 | 
				
			||||||
 | 
					#  - array initializers can get terribly mangled with clang-format 12.0,
 | 
				
			||||||
 | 
					#  - sometimes it still aligns with space characters,
 | 
				
			||||||
 | 
					#  - struct name NL { NL ... NL } NL name; is unachievable.
 | 
				
			||||||
 | 
					BasedOnStyle: GNU
 | 
				
			||||||
 | 
					ColumnLimit: 80
 | 
				
			||||||
 | 
					IndentWidth: 4
 | 
				
			||||||
 | 
					TabWidth: 4
 | 
				
			||||||
 | 
					UseTab: ForContinuationAndIndentation
 | 
				
			||||||
 | 
					BreakBeforeBraces: Allman
 | 
				
			||||||
 | 
					SpaceAfterCStyleCast: true
 | 
				
			||||||
 | 
					AlignAfterOpenBracket: DontAlign
 | 
				
			||||||
 | 
					AlignOperands: DontAlign
 | 
				
			||||||
 | 
					AlignConsecutiveMacros: Consecutive
 | 
				
			||||||
 | 
					AllowAllArgumentsOnNextLine: false
 | 
				
			||||||
 | 
					AllowAllParametersOfDeclarationOnNextLine: false
 | 
				
			||||||
 | 
					IndentGotoLabels: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# IncludeCategories has some potential, but it may also break the build.
 | 
				
			||||||
 | 
					# Note that the documentation says the value should be "Never".
 | 
				
			||||||
 | 
					SortIncludes: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This is a compromise, it generally works out aesthetically better.
 | 
				
			||||||
 | 
					BinPackArguments: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Unfortunately, this can't be told to align to column 40 or so.
 | 
				
			||||||
 | 
					SpacesBeforeTrailingComments: 2
 | 
				
			||||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -7,3 +7,5 @@
 | 
				
			|||||||
/termo.files
 | 
					/termo.files
 | 
				
			||||||
/termo.creator*
 | 
					/termo.creator*
 | 
				
			||||||
/termo.includes
 | 
					/termo.includes
 | 
				
			||||||
 | 
					/termo.cflags
 | 
				
			||||||
 | 
					/termo.cxxflags
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										39
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -1,39 +0,0 @@
 | 
				
			|||||||
language: c
 | 
					 | 
				
			||||||
notifications:
 | 
					 | 
				
			||||||
 irc:
 | 
					 | 
				
			||||||
  channels: "irc.janouch.name#dev"
 | 
					 | 
				
			||||||
  use_notice: true
 | 
					 | 
				
			||||||
  skip_join: true
 | 
					 | 
				
			||||||
  template:
 | 
					 | 
				
			||||||
   - "%{repository_name}#%{build_number} on %{branch}: %{message}"
 | 
					 | 
				
			||||||
   - "  %{compare_url}"
 | 
					 | 
				
			||||||
   - "  %{build_url}"
 | 
					 | 
				
			||||||
  on_success: change
 | 
					 | 
				
			||||||
  on_failure: always
 | 
					 | 
				
			||||||
env:
 | 
					 | 
				
			||||||
 global:
 | 
					 | 
				
			||||||
  - secure: "rzavv9NhQeZ3Zn6g9WgabUuTsXG1ncc+dWyXw3ytN15uWa4UelVzjAYvr31XeyXwsqZi3rDRHuz8ooIi1NLeLewozpEdkyakLjZOAnggqCnkF/yw/secuRo8MzweGXAefF+7cR2JYyH/E/PfMfAY8Qb0NnfEV1j7X9GCN2sJcxA="
 | 
					 | 
				
			||||||
addons:
 | 
					 | 
				
			||||||
 coverity_scan:
 | 
					 | 
				
			||||||
  project:
 | 
					 | 
				
			||||||
   name: "pjanouch/termo"
 | 
					 | 
				
			||||||
   description: "Terminal key input library"
 | 
					 | 
				
			||||||
  notification_email: p.janouch@gmail.com
 | 
					 | 
				
			||||||
  build_command_prepend: "cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON"
 | 
					 | 
				
			||||||
  build_command: "make all demos"
 | 
					 | 
				
			||||||
  branch_pattern: coverity_scan
 | 
					 | 
				
			||||||
compiler:
 | 
					 | 
				
			||||||
 - clang
 | 
					 | 
				
			||||||
 - gcc
 | 
					 | 
				
			||||||
before_install:
 | 
					 | 
				
			||||||
 - sudo apt-get update -qq
 | 
					 | 
				
			||||||
install:
 | 
					 | 
				
			||||||
 - sudo apt-get install -y libncursesw5-dev libglib2.0-dev
 | 
					 | 
				
			||||||
before_script:
 | 
					 | 
				
			||||||
 - mkdir build
 | 
					 | 
				
			||||||
 - cd build
 | 
					 | 
				
			||||||
script:
 | 
					 | 
				
			||||||
 - cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_TESTING=ON
 | 
					 | 
				
			||||||
 - make all demos
 | 
					 | 
				
			||||||
 - ctest -V
 | 
					 | 
				
			||||||
 - cpack -G DEB
 | 
					 | 
				
			||||||
@@ -1,21 +1,13 @@
 | 
				
			|||||||
project (termo C)
 | 
					cmake_minimum_required (VERSION 3.0)
 | 
				
			||||||
cmake_minimum_required (VERSION 2.8.5)
 | 
					project (termo VERSION 0.1.0 LANGUAGES C)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
 | 
					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 "${CMAKE_C_FLAGS} -std=c99")
 | 
				
			||||||
	set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wextra")
 | 
						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
 | 
					# Version
 | 
				
			||||||
set (project_VERSION_MAJOR 0)
 | 
					set (project_API_VERSION ${PROJECT_VERSION_MAJOR})
 | 
				
			||||||
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})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Names
 | 
					# Names
 | 
				
			||||||
set (project_LIB_NAME "termo-${project_API_VERSION}")
 | 
					set (project_LIB_NAME "termo-${project_API_VERSION}")
 | 
				
			||||||
@@ -49,38 +41,44 @@ set (lib_headers
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Project libraries
 | 
					# Project libraries
 | 
				
			||||||
# We need ncurses for one of the demos, so we're always looking
 | 
					# We need ncurses for one of the demos, so we're always looking
 | 
				
			||||||
if (NCURSESW_FOUND)
 | 
					if (Ncursesw_FOUND)
 | 
				
			||||||
	include_directories (${NCURSESW_INCLUDE_DIRS})
 | 
						include_directories (${Ncursesw_INCLUDE_DIRS})
 | 
				
			||||||
	set (curses_libraries ${NCURSESW_LIBRARIES})
 | 
						set (curses_libraries ${Ncursesw_LIBRARIES})
 | 
				
			||||||
elseif (CURSES_FOUND)
 | 
					elseif (CURSES_FOUND)
 | 
				
			||||||
	include_directories (${CURSES_INCLUDE_DIR})
 | 
						include_directories (${CURSES_INCLUDE_DIR})
 | 
				
			||||||
	set (curses_libraries ${CURSES_LIBRARY})
 | 
						set (curses_libraries ${CURSES_LIBRARY})
 | 
				
			||||||
endif (NCURSESW_FOUND)
 | 
					endif ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (unibilium_FOUND)
 | 
					if (unibilium_FOUND)
 | 
				
			||||||
	include_directories (${unibilium_INCLUDE_DIRS})
 | 
						include_directories (${unibilium_INCLUDE_DIRS})
 | 
				
			||||||
	set (lib_libraries ${unibilium_LIBRARIES})
 | 
						set (lib_libraries ${unibilium_LIBRARIES})
 | 
				
			||||||
	add_definitions (-DHAVE_UNIBILIUM)
 | 
						add_definitions (-DHAVE_UNIBILIUM)
 | 
				
			||||||
elseif (curses_libraries)
 | 
					elseif (curses_libraries)
 | 
				
			||||||
	include_directories (${NCURSESW_INCLUDE_DIRS})
 | 
						include_directories (${Ncursesw_INCLUDE_DIRS})
 | 
				
			||||||
	set (lib_libraries ${curses_libraries})
 | 
						set (lib_libraries ${curses_libraries})
 | 
				
			||||||
else (CURSES_FOUND)
 | 
					else ()
 | 
				
			||||||
	message (SEND_ERROR "Unibilium not found, Curses not found")
 | 
						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
 | 
					# Create the library targets
 | 
				
			||||||
add_library (termo SHARED ${lib_sources} ${lib_headers})
 | 
					add_library (termo SHARED ${lib_sources} ${lib_headers})
 | 
				
			||||||
target_link_libraries (termo ${lib_libraries})
 | 
					target_link_libraries (termo ${lib_libraries})
 | 
				
			||||||
set_target_properties (termo PROPERTIES
 | 
					set_target_properties (termo PROPERTIES
 | 
				
			||||||
	OUTPUT_NAME ${project_LIB_NAME}
 | 
						OUTPUT_NAME ${project_LIB_NAME}
 | 
				
			||||||
	VERSION ${project_VERSION}
 | 
						VERSION ${PROJECT_VERSION}
 | 
				
			||||||
	SOVERSION ${project_API_VERSION})
 | 
						SOVERSION ${project_API_VERSION})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_library (termo-static STATIC ${lib_sources} ${lib_headers})
 | 
					add_library (termo-static STATIC ${lib_sources} ${lib_headers})
 | 
				
			||||||
target_link_libraries (termo-static ${lib_libraries})
 | 
					target_link_libraries (termo-static ${lib_libraries})
 | 
				
			||||||
set_target_properties (termo-static PROPERTIES
 | 
					set_target_properties (termo-static PROPERTIES
 | 
				
			||||||
	OUTPUT_NAME ${project_LIB_NAME}
 | 
						OUTPUT_NAME ${project_LIB_NAME}
 | 
				
			||||||
	VERSION ${project_VERSION}
 | 
						VERSION ${PROJECT_VERSION}
 | 
				
			||||||
	SOVERSION ${project_API_VERSION})
 | 
						SOVERSION ${project_API_VERSION})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# A fix for: relocation R_X86_64_32 against `a local symbol' can not be
 | 
					# 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.
 | 
					# This should enable linking the static library into a shared one.
 | 
				
			||||||
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
 | 
					if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
 | 
				
			||||||
	set_target_properties (termo-static PROPERTIES COMPILE_FLAGS "-fPIC")
 | 
						set_target_properties (termo-static PROPERTIES COMPILE_FLAGS "-fPIC")
 | 
				
			||||||
endif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
 | 
					endif ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Demos
 | 
					# Demos
 | 
				
			||||||
add_executable (demo-async EXCLUDE_FROM_ALL demo-async.c)
 | 
					add_executable (demo-async EXCLUDE_FROM_ALL demo-async.c)
 | 
				
			||||||
@@ -108,7 +106,7 @@ if (glib_FOUND)
 | 
				
			|||||||
	target_link_libraries (demo-glib
 | 
						target_link_libraries (demo-glib
 | 
				
			||||||
		termo-static ${lib_libraries} ${glib_LIBRARIES})
 | 
							termo-static ${lib_libraries} ${glib_LIBRARIES})
 | 
				
			||||||
	list (APPEND demos demo-glib)
 | 
						list (APPEND demos demo-glib)
 | 
				
			||||||
endif (glib_FOUND)
 | 
					endif ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_custom_target (demos DEPENDS ${demos})
 | 
					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 
 | 
					install (FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake 
 | 
				
			||||||
	${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.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
 | 
					# Do some unit tests
 | 
				
			||||||
option (BUILD_TESTING "Build tests" OFF)
 | 
					option (BUILD_TESTING "Build tests" OFF)
 | 
				
			||||||
@@ -147,6 +145,7 @@ set (project_tests
 | 
				
			|||||||
	30mouse
 | 
						30mouse
 | 
				
			||||||
	31position
 | 
						31position
 | 
				
			||||||
	32modereport
 | 
						32modereport
 | 
				
			||||||
 | 
						33focus
 | 
				
			||||||
	39csi)
 | 
						39csi)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (BUILD_TESTING)
 | 
					if (BUILD_TESTING)
 | 
				
			||||||
@@ -157,14 +156,14 @@ if (BUILD_TESTING)
 | 
				
			|||||||
		add_executable (test-${name} tests/${name}.c ${test_common_sources})
 | 
							add_executable (test-${name} tests/${name}.c ${test_common_sources})
 | 
				
			||||||
		target_link_libraries (test-${name} termo-static ${lib_libraries})
 | 
							target_link_libraries (test-${name} termo-static ${lib_libraries})
 | 
				
			||||||
		add_test (NAME ${PROJECT_NAME}.${name} COMMAND test-${name})
 | 
							add_test (NAME ${PROJECT_NAME}.${name} COMMAND test-${name})
 | 
				
			||||||
	endforeach (name)
 | 
						endforeach ()
 | 
				
			||||||
endif (BUILD_TESTING)
 | 
					endif ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# pkg-config
 | 
					# pkg-config
 | 
				
			||||||
file (WRITE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.pc"
 | 
					file (WRITE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.pc"
 | 
				
			||||||
	"Name: ${PROJECT_NAME}\n"
 | 
						"Name: ${PROJECT_NAME}\n"
 | 
				
			||||||
	"Description: Terminal key input library\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: -L${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} -l${project_LIB_NAME}\n"
 | 
				
			||||||
	"Libs.private: ${lib_libraries}\n"
 | 
						"Libs.private: ${lib_libraries}\n"
 | 
				
			||||||
	"Cflags: -I${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/${project_INCLUDE_NAME}\n")
 | 
						"Cflags: -I${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/${project_INCLUDE_NAME}\n")
 | 
				
			||||||
@@ -173,18 +172,15 @@ install (FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.pc"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# CPack
 | 
					# CPack
 | 
				
			||||||
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Terminal key input library")
 | 
					set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Terminal key input library")
 | 
				
			||||||
set (CPACK_PACKAGE_VENDOR "Premysl Janouch")
 | 
					set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch")
 | 
				
			||||||
set (CPACK_PACKAGE_CONTACT "Přemysl Janouch <p@janouch.name>")
 | 
					set (CPACK_PACKAGE_CONTACT "Přemysl Eric Janouch <p@janouch.name>")
 | 
				
			||||||
set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
 | 
					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_GENERATOR "TGZ;ZIP")
 | 
				
			||||||
set (CPACK_PACKAGE_FILE_NAME
 | 
					set (CPACK_PACKAGE_FILE_NAME
 | 
				
			||||||
	"${CMAKE_PROJECT_NAME}-${project_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
 | 
						"${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
 | 
				
			||||||
set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}-${project_VERSION}")
 | 
					set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}")
 | 
				
			||||||
set (CPACK_SOURCE_GENERATOR "TGZ;ZIP")
 | 
					set (CPACK_SOURCE_GENERATOR "TGZ;ZIP")
 | 
				
			||||||
set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git;/build;/CMakeLists.txt.user")
 | 
					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)
 | 
					include (CPack)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							@@ -1,5 +1,5 @@
 | 
				
			|||||||
Copyright (c) 2007-2014 Paul Evans <leonerd@leonerd.org.uk>
 | 
					Copyright (c) 2007-2014 Paul Evans <leonerd@leonerd.org.uk>
 | 
				
			||||||
Copyright (c) 2014 Přemysl Janouch <p@janouch.name>
 | 
					Copyright (c) 2014-2021 Přemysl Eric Janouch <p@janouch.name>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
of this software and associated documentation files (the "Software"), to deal
 | 
					of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								README.adoc
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								README.adoc
									
									
									
									
									
								
							@@ -2,20 +2,21 @@ termo
 | 
				
			|||||||
=====
 | 
					=====
 | 
				
			||||||
 | 
					
 | 
				
			||||||
'termo' is a library providing an alternative to ncurses' handling of terminal
 | 
					'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
 | 
					input.  ncurses does a terrible job at that, mainly wrt. mouse support which was
 | 
				
			||||||
which seems to be utterly broken.  If you can drag things in a terminal
 | 
					even completely broken for a few years, making it impossible to drag things
 | 
				
			||||||
application, such as in VIM, I can assure you it's not using ncurses for that.
 | 
					around in applications.  While that one bit has been fixed, it continues to lack
 | 
				
			||||||
(At least not with ncurses older than 6.0.)
 | 
					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
 | 
					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
 | 
					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.
 | 
					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
 | 
					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)
 | 
					Optional dependencies: Unibilium (alternative for curses), GLib (for the demos)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 $ git clone https://git.janouch.name/p/termo.git
 | 
					 $ 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.
 | 
					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.
 | 
					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
 | 
					Contributing and Support
 | 
				
			||||||
------------------------
 | 
					------------------------
 | 
				
			||||||
@@ -68,7 +69,7 @@ Bitcoin donations are accepted at: 12r5uEWEgcHC46xd64tt3hHt9EUvYYDHe9
 | 
				
			|||||||
License
 | 
					License
 | 
				
			||||||
-------
 | 
					-------
 | 
				
			||||||
'termo' is based on the 'termkey' library, originally written by Paul Evans
 | 
					'termo' is based on the 'termkey' library, originally written by Paul Evans
 | 
				
			||||||
<leonerd@leonerd.org.uk>, with additional changes made by Přemysl Janouch
 | 
					<leonerd@leonerd.org.uk>, with additional changes made by Přemysl Eric Janouch
 | 
				
			||||||
<p@janouch.name>.
 | 
					<p@janouch.name>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You may use the software under the terms of the MIT license, the text of which
 | 
					You may use the software under the terms of the MIT license, the text of which
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,17 +1,17 @@
 | 
				
			|||||||
# Public Domain
 | 
					# Public Domain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
find_package (PkgConfig REQUIRED)
 | 
					find_package (PkgConfig REQUIRED)
 | 
				
			||||||
pkg_check_modules (NCURSESW QUIET ncursesw)
 | 
					pkg_check_modules (Ncursesw QUIET ncursesw)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# OpenBSD doesn't provide a pkg-config file
 | 
					# OpenBSD doesn't provide a pkg-config file
 | 
				
			||||||
set (required_vars NCURSESW_LIBRARIES)
 | 
					set (required_vars Ncursesw_LIBRARIES)
 | 
				
			||||||
if (NOT NCURSESW_FOUND)
 | 
					if (NOT Ncursesw_FOUND)
 | 
				
			||||||
	find_library (NCURSESW_LIBRARIES NAMES ncursesw)
 | 
						find_library (Ncursesw_LIBRARIES NAMES ncursesw)
 | 
				
			||||||
	find_path (NCURSESW_INCLUDE_DIRS ncurses.h)
 | 
						find_path (Ncursesw_INCLUDE_DIRS ncurses.h)
 | 
				
			||||||
	list (APPEND required_vars NCURSESW_INCLUDE_DIRS)
 | 
						list (APPEND required_vars Ncursesw_INCLUDE_DIRS)
 | 
				
			||||||
endif (NOT NCURSESW_FOUND)
 | 
					endif (NOT Ncursesw_FOUND)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include (FindPackageHandleStandardArgs)
 | 
					include (FindPackageHandleStandardArgs)
 | 
				
			||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS (NCURSESW DEFAULT_MSG ${required_vars})
 | 
					FIND_PACKAGE_HANDLE_STANDARD_ARGS (Ncursesw DEFAULT_MSG ${required_vars})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mark_as_advanced (NCURSESW_LIBRARIES NCURSESW_INCLUDE_DIRS)
 | 
					mark_as_advanced (Ncursesw_LIBRARIES Ncursesw_INCLUDE_DIRS)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								demo.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								demo.c
									
									
									
									
									
								
							@@ -10,7 +10,7 @@
 | 
				
			|||||||
#include "termo.h"
 | 
					#include "termo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
main(int argc, char *argv[])
 | 
					main (int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	TERMO_CHECK_VERSION;
 | 
						TERMO_CHECK_VERSION;
 | 
				
			||||||
	setlocale (LC_CTYPE, "");
 | 
						setlocale (LC_CTYPE, "");
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										30
									
								
								driver-csi.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								driver-csi.c
									
									
									
									
									
								
							@@ -331,6 +331,33 @@ handle_csi_m (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
 | 
				
			|||||||
	return TERMO_RES_NONE;
 | 
						return TERMO_RES_NONE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Handler for CSI I / CSI O focus events
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static termo_result_t
 | 
				
			||||||
 | 
					handle_csi_IO (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						(void) tk;
 | 
				
			||||||
 | 
						(void) arg;
 | 
				
			||||||
 | 
						(void) args;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (cmd &= 0xff)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						case 'I':
 | 
				
			||||||
 | 
							key->type = TERMO_TYPE_FOCUS;
 | 
				
			||||||
 | 
							key->code.focused = true;
 | 
				
			||||||
 | 
							return TERMO_RES_KEY;
 | 
				
			||||||
 | 
						case 'O':
 | 
				
			||||||
 | 
							key->type = TERMO_TYPE_FOCUS;
 | 
				
			||||||
 | 
							key->code.focused = false;
 | 
				
			||||||
 | 
							return TERMO_RES_KEY;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return TERMO_RES_NONE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return TERMO_RES_NONE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
termo_result_t
 | 
					termo_result_t
 | 
				
			||||||
termo_interpret_mouse (termo_t *tk, const termo_key_t *key,
 | 
					termo_interpret_mouse (termo_t *tk, const termo_key_t *key,
 | 
				
			||||||
	termo_mouse_event_t *event, int *button, int *line, int *col)
 | 
						termo_mouse_event_t *event, int *button, int *line, int *col)
 | 
				
			||||||
@@ -671,6 +698,9 @@ register_keys (void)
 | 
				
			|||||||
	csi_handlers['M' - 0x20] = &handle_csi_m;
 | 
						csi_handlers['M' - 0x20] = &handle_csi_m;
 | 
				
			||||||
	csi_handlers['m' - 0x20] = &handle_csi_m;
 | 
						csi_handlers['m' - 0x20] = &handle_csi_m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						csi_handlers['I' - 0x20] = &handle_csi_IO;
 | 
				
			||||||
 | 
						csi_handlers['O' - 0x20] = &handle_csi_IO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	csi_handlers['R' - 0x20] = &handle_csi_R;
 | 
						csi_handlers['R' - 0x20] = &handle_csi_R;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	csi_handlers['y' - 0x20] = &handle_csi_y;
 | 
						csi_handlers['y' - 0x20] = &handle_csi_y;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										26
									
								
								driver-ti.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								driver-ti.c
									
									
									
									
									
								
							@@ -250,29 +250,28 @@ load_terminfo (termo_ti_t *ti, const char *term)
 | 
				
			|||||||
	else
 | 
						else
 | 
				
			||||||
		ti->set_mouse_string = strdup (set_mouse_string);
 | 
							ti->set_mouse_string = strdup (set_mouse_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool have_mouse = false;
 | 
						// We handle 1006 and 1015 unconditionally in driver-csi.c,
 | 
				
			||||||
	if (!mouse_report_string && strstr (term, "xterm"))
 | 
						// and don't want to have the handling diverted by recent terminfo;
 | 
				
			||||||
		mouse_report_string = "\x1b[M";
 | 
						// let's hardcode the ancient 1000 sequence locally
 | 
				
			||||||
	if (mouse_report_string)
 | 
						if (mouse_report_string)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		have_mouse = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		trie_node_t *node = malloc (sizeof *node);
 | 
							trie_node_t *node = malloc (sizeof *node);
 | 
				
			||||||
		if (!node)
 | 
							if (!node)
 | 
				
			||||||
			goto fail;
 | 
								goto fail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		node->type = TYPE_MOUSE;
 | 
							node->type = TYPE_MOUSE;
 | 
				
			||||||
		if (!insert_seq (ti, mouse_report_string, node))
 | 
							if (!insert_seq (ti, "\x1b[M", node))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			free (node);
 | 
								free (node);
 | 
				
			||||||
			goto fail;
 | 
								goto fail;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!have_mouse)
 | 
						if (!mouse_report_string && strstr (term, "xterm") != term)
 | 
				
			||||||
		ti->tk->guessed_mouse_proto = TERMO_MOUSE_PROTO_NONE;
 | 
							ti->tk->guessed_mouse_proto = TERMO_MOUSE_PROTO_NONE;
 | 
				
			||||||
	else if (strstr (term, "rxvt") == term)
 | 
						else if (strstr (term, "rxvt") == term)
 | 
				
			||||||
		// urxvt generally doesn't understand the SGR protocol.
 | 
							// urxvt didn't understand the SGR protocol until version 9.25,
 | 
				
			||||||
 | 
							// it's safest to keep using 1015.
 | 
				
			||||||
		ti->tk->guessed_mouse_proto = TERMO_MOUSE_PROTO_RXVT;
 | 
							ti->tk->guessed_mouse_proto = TERMO_MOUSE_PROTO_RXVT;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		// SGR (1006) is the superior protocol.  If it's not supported by the
 | 
							// SGR (1006) is the superior protocol.  If it's not supported by the
 | 
				
			||||||
@@ -363,6 +362,8 @@ mouse_reset (termo_ti_t *ti)
 | 
				
			|||||||
		&& write_string (ti->tk, "\x1b[?1002l")
 | 
							&& write_string (ti->tk, "\x1b[?1002l")
 | 
				
			||||||
		&& write_string (ti->tk, "\x1b[?1003l")
 | 
							&& write_string (ti->tk, "\x1b[?1003l")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&& write_string (ti->tk, "\x1b[?1004l")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&& write_string (ti->tk, "\x1b[?1005l")
 | 
							&& write_string (ti->tk, "\x1b[?1005l")
 | 
				
			||||||
		&& write_string (ti->tk, "\x1b[?1006l")
 | 
							&& write_string (ti->tk, "\x1b[?1006l")
 | 
				
			||||||
		&& write_string (ti->tk, "\x1b[?1015l");
 | 
							&& write_string (ti->tk, "\x1b[?1015l");
 | 
				
			||||||
@@ -410,8 +411,12 @@ start_driver (termo_t *tk, void *info)
 | 
				
			|||||||
	// Disable everything mouse-related first
 | 
						// Disable everything mouse-related first
 | 
				
			||||||
	if (!mouse_reset (ti))
 | 
						if (!mouse_reset (ti))
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Enable focus tracking opportunistically and automatically,
 | 
				
			||||||
 | 
						// as it basically doesn't have any negative consequences at all
 | 
				
			||||||
	return mouse_set_proto (ti, tk->mouse_proto, true)
 | 
						return mouse_set_proto (ti, tk->mouse_proto, true)
 | 
				
			||||||
		&& mouse_set_tracking_mode (ti, tk->mouse_tracking, true);
 | 
							&& mouse_set_tracking_mode (ti, tk->mouse_tracking, true)
 | 
				
			||||||
 | 
							&& write_string (ti->tk, "\x1b[?1004h");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
@@ -425,7 +430,8 @@ stop_driver (termo_t *tk, void *info)
 | 
				
			|||||||
	if (tk->mouse_proto == TERMO_MOUSE_PROTO_NONE)
 | 
						if (tk->mouse_proto == TERMO_MOUSE_PROTO_NONE)
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	return mouse_set_proto (ti, tk->mouse_proto, false)
 | 
						return mouse_set_proto (ti, tk->mouse_proto, false)
 | 
				
			||||||
		&& mouse_set_tracking_mode (ti, tk->mouse_tracking, false);
 | 
							&& mouse_set_tracking_mode (ti, tk->mouse_tracking, false)
 | 
				
			||||||
 | 
							&& write_string (ti->tk, "\x1b[?1004l");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void *
 | 
					static void *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
#ifndef TERMO_CONFIG_H
 | 
					#ifndef TERMO_CONFIG_H
 | 
				
			||||||
#define TERMO_CONFIG_H
 | 
					#define TERMO_CONFIG_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TERMO_VERSION_MAJOR @project_VERSION_MAJOR@
 | 
					#define TERMO_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
 | 
				
			||||||
#define TERMO_VERSION_MINOR @project_VERSION_MINOR@
 | 
					#define TERMO_VERSION_MINOR @PROJECT_VERSION_MINOR@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  // ! TERMO_CONFIG_H
 | 
					#endif  // ! TERMO_CONFIG_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								termo.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								termo.c
									
									
									
									
									
								
							@@ -156,6 +156,9 @@ print_key (termo_t *tk, termo_key_t *key)
 | 
				
			|||||||
			ev, button, line, col);
 | 
								ev, button, line, col);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						case TERMO_TYPE_FOCUS:
 | 
				
			||||||
 | 
							fprintf (stderr, "%s\n", key->code.focused ? "Focused" : "Defocused");
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	case TERMO_TYPE_POSITION:
 | 
						case TERMO_TYPE_POSITION:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int line, col;
 | 
							int line, col;
 | 
				
			||||||
@@ -903,21 +906,20 @@ peekkey (termo_t *tk, termo_key_t *key, int flags, size_t *nbytep)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		switch (ret)
 | 
							switch (ret)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
								size_t halfsize;
 | 
				
			||||||
		case TERMO_RES_KEY:
 | 
							case TERMO_RES_KEY:
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
			print_key (tk, key); fprintf (stderr, "\n");
 | 
								print_key (tk, key); fprintf (stderr, "\n");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
			// Slide the data down to stop it running away
 | 
								// Slide the data down to stop it running away
 | 
				
			||||||
			size_t halfsize = tk->buffsize / 2;
 | 
								halfsize = tk->buffsize / 2;
 | 
				
			||||||
			if (tk->buffstart > halfsize)
 | 
								if (tk->buffstart > halfsize)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				memcpy (tk->buffer, tk->buffer + halfsize, halfsize);
 | 
									memcpy (tk->buffer, tk->buffer + halfsize, halfsize);
 | 
				
			||||||
				tk->buffstart -= halfsize;
 | 
									tk->buffstart -= halfsize;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Fallthrough
 | 
								// Fall-through
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		case TERMO_RES_EOF:
 | 
							case TERMO_RES_EOF:
 | 
				
			||||||
		case TERMO_RES_ERROR:
 | 
							case TERMO_RES_ERROR:
 | 
				
			||||||
			return ret;
 | 
								return ret;
 | 
				
			||||||
@@ -1572,6 +1574,9 @@ termo_strfkey_generic (termo_t *tk, char *buffer, size_t len,
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						case TERMO_TYPE_FOCUS:
 | 
				
			||||||
 | 
							l = snprintf (buffer + pos, len - pos, "Focus(%d)", key->code.focused);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	case TERMO_TYPE_POSITION:
 | 
						case TERMO_TYPE_POSITION:
 | 
				
			||||||
		l = snprintf (buffer + pos, len - pos, "Position");
 | 
							l = snprintf (buffer + pos, len - pos, "Position");
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
@@ -1690,9 +1695,9 @@ termo_strpkey_generic (termo_t *tk, const char *str, termo_key_t *key,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if (!str
 | 
							if (!str
 | 
				
			||||||
		 || key->type != TERMO_TYPE_KEY
 | 
							 || key->type != TERMO_TYPE_KEY
 | 
				
			||||||
 		 || key->code.codepoint < '@'
 | 
							 || key->code.codepoint < '@'
 | 
				
			||||||
		 || key->code.codepoint > '_'
 | 
							 || key->code.codepoint > '_'
 | 
				
			||||||
 		 || key->modifiers != 0)
 | 
							 || key->modifiers != 0)
 | 
				
			||||||
			return NULL;
 | 
								return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (key->code.codepoint >= 'A'
 | 
							if (key->code.codepoint >= 'A'
 | 
				
			||||||
@@ -1826,6 +1831,8 @@ termo_keycmp (termo_t *tk,
 | 
				
			|||||||
			return cmp;
 | 
								return cmp;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						case TERMO_TYPE_FOCUS:
 | 
				
			||||||
 | 
							return key1.code.focused - key2.code.focused;
 | 
				
			||||||
	case TERMO_TYPE_POSITION:
 | 
						case TERMO_TYPE_POSITION:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int line1, col1, line2, col2;
 | 
							int line1, col1, line2, col2;
 | 
				
			||||||
@@ -1849,4 +1856,3 @@ termo_keycmp (termo_t *tk,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return key1.modifiers - key2.modifiers;
 | 
						return key1.modifiers - key2.modifiers;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								termo.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								termo.h
									
									
									
									
									
								
							@@ -97,6 +97,7 @@ enum termo_type
 | 
				
			|||||||
	TERMO_TYPE_MOUSE,
 | 
						TERMO_TYPE_MOUSE,
 | 
				
			||||||
	TERMO_TYPE_POSITION,
 | 
						TERMO_TYPE_POSITION,
 | 
				
			||||||
	TERMO_TYPE_MODEREPORT,
 | 
						TERMO_TYPE_MODEREPORT,
 | 
				
			||||||
 | 
						TERMO_TYPE_FOCUS,
 | 
				
			||||||
	// add other recognised types here
 | 
						// add other recognised types here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TERMO_TYPE_UNKNOWN_CSI = -1
 | 
						TERMO_TYPE_UNKNOWN_CSI = -1
 | 
				
			||||||
@@ -159,6 +160,7 @@ struct termo_key
 | 
				
			|||||||
		uint32_t    codepoint; // TERMO_TYPE_KEY
 | 
							uint32_t    codepoint; // TERMO_TYPE_KEY
 | 
				
			||||||
		int         number;    // TERMO_TYPE_FUNCTION
 | 
							int         number;    // TERMO_TYPE_FUNCTION
 | 
				
			||||||
		termo_sym_t sym;       // TERMO_TYPE_KEYSYM
 | 
							termo_sym_t sym;       // TERMO_TYPE_KEYSYM
 | 
				
			||||||
 | 
							int         focused;   // TERMO_TYPE_FOCUS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// TERMO_TYPE_MODEREPORT
 | 
							// TERMO_TYPE_MODEREPORT
 | 
				
			||||||
		// opaque, see termo_interpret_modereport()
 | 
							// opaque, see termo_interpret_modereport()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,8 @@
 | 
				
			|||||||
#include "../termo.h"
 | 
					#include "../termo.h"
 | 
				
			||||||
#include "taplib.h"
 | 
					#include "taplib.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main (int argc, char *argv[])
 | 
					int
 | 
				
			||||||
 | 
					main (int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	termo_t *tk;
 | 
						termo_t *tk;
 | 
				
			||||||
	termo_key_t key;
 | 
						termo_key_t key;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,8 @@
 | 
				
			|||||||
#include "../termo.h"
 | 
					#include "../termo.h"
 | 
				
			||||||
#include "taplib.h"
 | 
					#include "taplib.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main (int argc, char *argv[])
 | 
					int
 | 
				
			||||||
 | 
					main (int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	termo_t *tk;
 | 
						termo_t *tk;
 | 
				
			||||||
	termo_key_t key;
 | 
						termo_key_t key;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								tests/33focus.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								tests/33focus.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					#include "../termo.h"
 | 
				
			||||||
 | 
					#include "taplib.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					main (int argc, char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						termo_t *tk;
 | 
				
			||||||
 | 
						termo_key_t key;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						plan_tests (6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tk = termo_new_abstract ("vt100", NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						termo_push_bytes (tk, "\e[I", 3);
 | 
				
			||||||
 | 
						is_int (termo_getkey (tk, &key), TERMO_RES_KEY,
 | 
				
			||||||
 | 
							"getkey yields RES_KEY for focus in");
 | 
				
			||||||
 | 
						is_int (key.type, TERMO_TYPE_FOCUS, "key.type for focus in");
 | 
				
			||||||
 | 
						is_int (key.code.focused, 1, "focused indicator for focus in");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						termo_push_bytes (tk, "\e[O", 3);
 | 
				
			||||||
 | 
						is_int (termo_getkey (tk, &key), TERMO_RES_KEY,
 | 
				
			||||||
 | 
							"getkey yields RES_KEY for focus out");
 | 
				
			||||||
 | 
						is_int (key.type, TERMO_TYPE_FOCUS, "key.type for focus out");
 | 
				
			||||||
 | 
						is_int (key.code.focused, 0, "focused indicator for focus out");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						termo_destroy (tk);
 | 
				
			||||||
 | 
						return exit_status ();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -73,7 +73,7 @@ is_str (const char *got, const char *expect, char *name)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
exit_status(void)
 | 
					exit_status (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return g_exit_status;
 | 
						return g_exit_status;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user