Compare commits
9 Commits
065cd3b3e1
...
8265f075b1
| Author | SHA1 | Date | |
|---|---|---|---|
|
8265f075b1
|
|||
|
2f348c79b7
|
|||
|
18d16c1edb
|
|||
|
94a77a10d8
|
|||
|
d39c35e59e
|
|||
|
d47bcfb203
|
|||
|
ff08195973
|
|||
|
f7912a8ce7
|
|||
|
42d2bef93a
|
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
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ 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_API_VERSION ${PROJECT_VERSION_MAJOR})
|
set (project_API_VERSION ${PROJECT_VERSION_MAJOR})
|
||||||
@@ -47,7 +47,7 @@ if (Ncursesw_FOUND)
|
|||||||
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})
|
||||||
@@ -56,9 +56,15 @@ if (unibilium_FOUND)
|
|||||||
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})
|
||||||
@@ -81,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)
|
||||||
@@ -100,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})
|
||||||
|
|
||||||
@@ -150,8 +156,8 @@ 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"
|
||||||
|
|||||||
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-2020 Přemysl Eric 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
|
||||||
|
|||||||
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
termo.c
1
termo.c
@@ -1856,4 +1856,3 @@ termo_keycmp (termo_t *tk,
|
|||||||
}
|
}
|
||||||
return key1.modifiers - key2.modifiers;
|
return key1.modifiers - key2.modifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user