tighten up include paths, libgpm connect #1986

This commit is contained in:
nick black 2021-08-24 01:30:22 -04:00 committed by nick black
parent 0b67d67c8f
commit b8c01eacc8
31 changed files with 136 additions and 46 deletions

View File

@ -202,6 +202,7 @@ set_target_properties(notcurses-core-static PROPERTIES
OUTPUT_NAME notcurses-core OUTPUT_NAME notcurses-core
) )
target_include_directories(notcurses-core target_include_directories(notcurses-core
BEFORE
PRIVATE PRIVATE
include include
src src
@ -211,6 +212,7 @@ target_include_directories(notcurses-core
"${ZLIB_INCLUDE_DIRS}" "${ZLIB_INCLUDE_DIRS}"
) )
target_include_directories(notcurses-core-static target_include_directories(notcurses-core-static
BEFORE
PRIVATE PRIVATE
include include
src src
@ -225,6 +227,7 @@ target_link_libraries(notcurses-core
"${TERMINFO_LIBRARIES}" "${TERMINFO_LIBRARIES}"
"${LIBM}" "${LIBM}"
"${unistring}" "${unistring}"
"${gpm}"
PUBLIC PUBLIC
Threads::Threads Threads::Threads
"${LIBRT_LIBRARIES}" "${LIBRT_LIBRARIES}"
@ -235,6 +238,7 @@ target_link_libraries(notcurses-core-static
"${TERMINFO_STATIC_LIBRARIES}" "${TERMINFO_STATIC_LIBRARIES}"
"${LIBM}" "${LIBM}"
"${unistring}" "${unistring}"
"${gpm}"
PUBLIC PUBLIC
Threads::Threads Threads::Threads
"${LIBRT_LIBRARIES}" "${LIBRT_LIBRARIES}"
@ -272,19 +276,19 @@ set_target_properties(notcurses-static PROPERTIES
OUTPUT_NAME notcurses OUTPUT_NAME notcurses
) )
target_include_directories(notcurses target_include_directories(notcurses
BEFORE
PRIVATE PRIVATE
include include
src src
src/lib
"${CMAKE_REQUIRED_INCLUDES}" "${CMAKE_REQUIRED_INCLUDES}"
"${PROJECT_BINARY_DIR}/include" "${PROJECT_BINARY_DIR}/include"
"${TERMINFO_INCLUDE_DIRS}" "${TERMINFO_INCLUDE_DIRS}"
) )
target_include_directories(notcurses-static target_include_directories(notcurses-static
BEFORE
PRIVATE PRIVATE
include include
src src
src/lib
"${CMAKE_REQUIRED_INCLUDES}" "${CMAKE_REQUIRED_INCLUDES}"
"${PROJECT_BINARY_DIR}/include" "${PROJECT_BINARY_DIR}/include"
"${TERMINFO_INCLUDE_DIRS}" "${TERMINFO_INCLUDE_DIRS}"
@ -410,16 +414,19 @@ set_target_properties(
OUTPUT_NAME "notcurses++") OUTPUT_NAME "notcurses++")
set(NCPP_INCLUDE_DIRS set(NCPP_INCLUDE_DIRS
include "include"
"src"
"${PROJECT_BINARY_DIR}/include" "${PROJECT_BINARY_DIR}/include"
"${TERMINFO_INCLUDE_DIRS}" "${TERMINFO_INCLUDE_DIRS}"
) )
target_include_directories(notcurses++ target_include_directories(notcurses++
BEFORE
PRIVATE ${NCPP_INCLUDE_DIRS} PRIVATE ${NCPP_INCLUDE_DIRS}
) )
target_include_directories(notcurses++-static target_include_directories(notcurses++-static
BEFORE
PRIVATE ${NCPP_INCLUDE_DIRS} PRIVATE ${NCPP_INCLUDE_DIRS}
) )
@ -552,7 +559,6 @@ target_compile_definitions(notcurses-info
target_include_directories(notcurses-info target_include_directories(notcurses-info
PRIVATE PRIVATE
src src
src/lib
include include
"${CMAKE_REQUIRED_INCLUDES}" "${CMAKE_REQUIRED_INCLUDES}"
"${PROJECT_BINARY_DIR}/include" "${PROJECT_BINARY_DIR}/include"
@ -661,12 +667,12 @@ if(${USE_DOCTEST})
file(GLOB TESTSRCS CONFIGURE_DEPENDS src/tests/*.cpp) file(GLOB TESTSRCS CONFIGURE_DEPENDS src/tests/*.cpp)
add_executable(notcurses-tester ${TESTSRCS}) add_executable(notcurses-tester ${TESTSRCS})
target_include_directories(notcurses-tester target_include_directories(notcurses-tester
BEFORE
PRIVATE PRIVATE
include include
src src
"${CMAKE_REQUIRED_INCLUDES}" "${CMAKE_REQUIRED_INCLUDES}"
"${PROJECT_BINARY_DIR}/include" "${PROJECT_BINARY_DIR}/include"
src/lib
"${TERMINFO_INCLUDE_DIRS}" "${TERMINFO_INCLUDE_DIRS}"
) )
target_link_libraries(notcurses-tester target_link_libraries(notcurses-tester

View File

@ -2,7 +2,7 @@
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <notcurses/notcurses.h> #include <notcurses/notcurses.h>
#include "internal.h" // internal headers #include "lib/internal.h" // internal headers
static inline wchar_t static inline wchar_t
capboolbool(unsigned utf8, bool cap){ capboolbool(unsigned utf8, bool cap){

52
src/lib/gpm.c Normal file
View File

@ -0,0 +1,52 @@
#include "internal.h"
#ifdef USE_GPM
#undef buttons // defined by both term.h and gpm.h, ugh
#include <lib/gpm.h>
#include <gpm.h>
static Gpm_Connect gpmconn; // gpm server handle
int gpm_connect(tinfo* ti){
(void)ti;
gpm_zerobased = 1;
gpmconn.eventMask = ~0;
gpmconn.defaultMask = 0;
gpmconn.minMod = 0;
gpmconn.maxMod = ~0;
if(Gpm_Open(&gpmconn, 0) == -1){
logerror("couldn't connect to gpm");
return -1;
}
loginfo("connected to gpm on %d\n", gpm_fd);
return gpm_fd;
}
int gpm_read(tinfo* ti, ncinput* ni){
(void)ti;
(void)ni;
return -1;
}
int gpm_close(tinfo* ti){
(void)ti;
Gpm_Close();
memset(&gpmconn, 0, sizeof(gpmconn));
return 0;
}
#else
int gpm_connect(tinfo* ti){
(void)ti;
return -1;
}
int gpm_read(tinfo* ti, ncinput* ni){
(void)ti;
(void)ni;
return -1;
}
int gpm_close(tinfo* ti){
(void)ti;
return -1;
}
#endif

30
src/lib/gpm.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef NOTCURSES_GPM
#define NOTCURSES_GPM
#ifdef __cplusplus
extern "C" {
#endif
// internal header, not installed
struct tinfo;
struct ncinput;
// GPM ("General Purpose Mouse") provides an interface to mice in the Linux
// and FreeBSD consoles. The gpm server must be running; we do not attempt to
// start it. We must have been built with -DUSE_GPM.
// Returns the poll()able file descriptor associated with gpm, or -1 on failure.
int gpm_connect(struct tinfo* ti);
// Read from the gpm connection, which ought have been poll()ed. Translates
// the libgpm input to an ncinput.
int gpm_read(struct tinfo* ti, struct ncinput* ni);
int gpm_close(struct tinfo* ti);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -32,10 +32,11 @@ extern "C" {
#ifndef __MINGW64__ #ifndef __MINGW64__
#include <langinfo.h> #include <langinfo.h>
#endif #endif
#include "termdesc.h" #include "lib/termdesc.h"
#include "egcpool.h" #include "lib/egcpool.h"
#include "sprite.h" #include "lib/sprite.h"
#include "fbuf.h" #include "lib/fbuf.h"
#include "lib/gpm.h"
#define API __attribute__((visibility("default"))) #define API __attribute__((visibility("default")))
#define ALLOC __attribute__((malloc)) __attribute__((warn_unused_result)) #define ALLOC __attribute__((malloc)) __attribute__((warn_unused_result))
@ -1142,7 +1143,10 @@ coerce_styles(fbuf* f, const tinfo* ti, uint16_t* curstyle,
#define SET_SGR_MODE_MOUSE "1006" #define SET_SGR_MODE_MOUSE "1006"
static inline int static inline int
mouse_enable(FILE* out){ mouse_enable(tinfo* ti, FILE* out){
if(ti->qterm == TERMINAL_LINUX){
return gpm_connect(ti);
}
// Sets the shift-escape option, allowing shift+mouse to override the standard // Sets the shift-escape option, allowing shift+mouse to override the standard
// mouse protocol (mainly so copy-and-paste can still be performed). // mouse protocol (mainly so copy-and-paste can still be performed).
#define XTSHIFTESCAPE "\x1b[>1s" #define XTSHIFTESCAPE "\x1b[>1s"
@ -1153,7 +1157,10 @@ mouse_enable(FILE* out){
} }
static inline int static inline int
mouse_disable(fbuf* f){ mouse_disable(tinfo* ti, fbuf* f){
if(ti->qterm == TERMINAL_LINUX){
return gpm_close(ti);
}
return fbuf_emit(f, "\x1b[?" SET_BTN_EVENT_MOUSE ";" return fbuf_emit(f, "\x1b[?" SET_BTN_EVENT_MOUSE ";"
/*SET_FOCUS_EVENT_MOUSE ";" */SET_SGR_MODE_MOUSE "l"); /*SET_FOCUS_EVENT_MOUSE ";" */SET_SGR_MODE_MOUSE "l");
} }

View File

@ -90,7 +90,7 @@ notcurses_stop_minimal(void* vnc){
if(nc->tcache.pixel_shutdown){ if(nc->tcache.pixel_shutdown){
ret |= nc->tcache.pixel_shutdown(f); ret |= nc->tcache.pixel_shutdown(f);
} }
ret |= mouse_disable(f); ret |= mouse_disable(&nc->tcache, f);
ret |= reset_term_attributes(&nc->tcache, f); ret |= reset_term_attributes(&nc->tcache, f);
if(nc->tcache.ttyfd >= 0){ if(nc->tcache.ttyfd >= 0){
if((esc = get_escape(&nc->tcache, ESCAPE_RMCUP))){ if((esc = get_escape(&nc->tcache, ESCAPE_RMCUP))){
@ -2262,7 +2262,7 @@ ncplane* ncplane_above(ncplane* n){
} }
int notcurses_mouse_enable(notcurses* n){ int notcurses_mouse_enable(notcurses* n){
if(mouse_enable(n->ttyfp)){ if(mouse_enable(&n->tcache, n->ttyfp)){
return -1; return -1;
} }
return 0; return 0;
@ -2275,7 +2275,7 @@ int notcurses_mouse_disable(notcurses* n){
if(fbuf_init_small(&f)){ if(fbuf_init_small(&f)){
return -1; return -1;
} }
if(mouse_disable(&f)){ if(mouse_disable(&n->tcache, &f)){
fbuf_free(&f); fbuf_free(&f);
return -1; return -1;
} }

View File

@ -664,7 +664,7 @@ macos_early_matches(void){
int interrogate_terminfo(tinfo* ti, const char* termtype, FILE* out, unsigned utf8, int interrogate_terminfo(tinfo* ti, const char* termtype, FILE* out, unsigned utf8,
unsigned noaltscreen, unsigned nocbreak, unsigned nonewfonts, unsigned noaltscreen, unsigned nocbreak, unsigned nonewfonts,
int* cursor_y, int* cursor_x, ncsharedstats* stats){ int* cursor_y, int* cursor_x, ncsharedstats* stats){
queried_terminals_e qterm = TERMINAL_UNKNOWN; ti->qterm = TERMINAL_UNKNOWN;
memset(ti, 0, sizeof(*ti)); memset(ti, 0, sizeof(*ti));
// we don't need a controlling tty for everything we do; allow a failure here // we don't need a controlling tty for everything we do; allow a failure here
ti->ttyfd = get_tty_fd(out); ti->ttyfd = get_tty_fd(out);
@ -672,19 +672,19 @@ int interrogate_terminfo(tinfo* ti, const char* termtype, FILE* out, unsigned ut
size_t tableused = 0; size_t tableused = 0;
const char* tname = NULL; const char* tname = NULL;
#ifdef __APPLE__ #ifdef __APPLE__
qterm = macos_early_matches(); ti->qterm = macos_early_matches();
#elif defined(__MINGW64__) #elif defined(__MINGW64__)
if(prepare_windows_terminal(ti, &tablelen, &tableused)){ if(prepare_windows_terminal(ti, &tablelen, &tableused)){
return -1; return -1;
} }
qterm = TERMINAL_MSTERMINAL; ti->qterm = TERMINAL_MSTERMINAL;
(void)termtype; (void)termtype;
#elif defined(__linux__) #elif defined(__linux__)
ti->linux_fb_fd = -1; ti->linux_fb_fd = -1;
ti->linux_fbuffer = MAP_FAILED; ti->linux_fbuffer = MAP_FAILED;
// we might or might not program quadrants into the console font // we might or might not program quadrants into the console font
if(is_linux_console(ti->ttyfd)){ if(is_linux_console(ti->ttyfd)){
qterm = TERMINAL_LINUX; ti->qterm = TERMINAL_LINUX;
} }
#endif #endif
#ifndef __MINGW64__ #ifndef __MINGW64__
@ -700,7 +700,7 @@ int interrogate_terminfo(tinfo* ti, const char* termtype, FILE* out, unsigned ut
} }
// if we already know our terminal (e.g. on the linux console), there's no // if we already know our terminal (e.g. on the linux console), there's no
// need to send the identification queries. the controls are sufficient. // need to send the identification queries. the controls are sufficient.
bool minimal = (qterm != TERMINAL_UNKNOWN); bool minimal = (ti->qterm != TERMINAL_UNKNOWN);
if(send_initial_queries(ti->ttyfd, minimal)){ if(send_initial_queries(ti->ttyfd, minimal)){
return -1; return -1;
} }
@ -840,7 +840,7 @@ int interrogate_terminfo(tinfo* ti, const char* termtype, FILE* out, unsigned ut
} }
*cursor_x = *cursor_y = -1; *cursor_x = *cursor_y = -1;
unsigned kittygraphs = 0; unsigned kittygraphs = 0;
if(ncinputlayer_init(ti, stdin, &qterm, &appsync_advertised, if(ncinputlayer_init(ti, stdin, &ti->qterm, &appsync_advertised,
cursor_y, cursor_x, stats, &kittygraphs)){ cursor_y, cursor_x, stats, &kittygraphs)){
goto err; goto err;
} }
@ -863,7 +863,7 @@ int interrogate_terminfo(tinfo* ti, const char* termtype, FILE* out, unsigned ut
} }
} }
bool invertsixel = false; bool invertsixel = false;
if(apply_term_heuristics(ti, tname, qterm, &tablelen, &tableused, if(apply_term_heuristics(ti, tname, ti->qterm, &tablelen, &tableused,
&invertsixel, nonewfonts)){ &invertsixel, nonewfonts)){
ncinputlayer_stop(&ti->input); ncinputlayer_stop(&ti->input);
goto err; goto err;

View File

@ -7,6 +7,8 @@ extern "C" {
// internal header, not installed // internal header, not installed
#include "version.h"
#include "builddef.h"
#include "input.h" #include "input.h"
#include <stdint.h> #include <stdint.h>
#include <pthread.h> #include <pthread.h>
@ -185,6 +187,7 @@ typedef struct tinfo {
int sprixel_scale_height; // sprixel must be a multiple of this many rows int sprixel_scale_height; // sprixel must be a multiple of this many rows
const char* termname; // terminal name from environment variables/init const char* termname; // terminal name from environment variables/init
char* termversion; // terminal version (freeform) from query responses char* termversion; // terminal version (freeform) from query responses
queried_terminals_e qterm;// detected terminal class
#ifndef __MINGW64__ #ifndef __MINGW64__
struct termios tpreserved;// terminal state upon entry struct termios tpreserved;// terminal state upon entry
#endif #endif

View File

@ -11,8 +11,8 @@
#include <libswscale/version.h> #include <libswscale/version.h>
#include <libavformat/version.h> #include <libavformat/version.h>
#include <libavformat/avformat.h> #include <libavformat/avformat.h>
#include "visual-details.h" #include "lib/visual-details.h"
#include "internal.h" #include "lib/internal.h"
struct AVFormatContext; struct AVFormatContext;
struct AVCodecContext; struct AVCodecContext;

View File

@ -1,7 +1,7 @@
#include "builddef.h" #include "builddef.h"
#ifdef USE_OIIO #ifdef USE_OIIO
#include "visual-details.h" #include "lib/visual-details.h"
#include "internal.h" #include "lib/internal.h"
#include "oiio.h" #include "oiio.h"
int oiio_blit_dispatch(struct ncplane* nc, const struct blitset* bset, int oiio_blit_dispatch(struct ncplane* nc, const struct blitset* bset,

View File

@ -5,7 +5,7 @@
#include <OpenImageIO/imageio.h> #include <OpenImageIO/imageio.h>
#include <OpenImageIO/imagebuf.h> #include <OpenImageIO/imagebuf.h>
#include <OpenImageIO/imagebufalgo.h> #include <OpenImageIO/imagebufalgo.h>
#include "visual-details.h" #include "lib/visual-details.h"
#include "oiio.h" #include "oiio.h"
typedef struct ncvisual_details { typedef struct ncvisual_details {

View File

@ -5,7 +5,7 @@
extern "C" { extern "C" {
#endif #endif
#include "internal.h" #include "lib/internal.h"
int oiio_decode(ncvisual* nc); int oiio_decode(ncvisual* nc);
struct ncvisual_details* oiio_details_init(void); struct ncvisual_details* oiio_details_init(void);

View File

@ -1,5 +1,5 @@
#include "notcurses/direct.h" #include "notcurses/direct.h"
#include "internal.h" #include "lib/internal.h"
extern const ncvisual_implementation local_visual_implementation; extern const ncvisual_implementation local_visual_implementation;

View File

@ -1,5 +1,5 @@
#include "main.h" #include "main.h"
#include "visual-details.h" #include "lib/visual-details.h"
#include <vector> #include <vector>
TEST_CASE("Bitmaps") { TEST_CASE("Bitmaps") {

View File

@ -1,5 +1,5 @@
#include "main.h" #include "main.h"
#include "egcpool.h" #include "lib/egcpool.h"
TEST_CASE("Cell") { TEST_CASE("Cell") {
auto nc_ = testing_notcurses(); auto nc_ = testing_notcurses();

View File

@ -1,6 +1,6 @@
#include <vector> #include <vector>
#include "main.h" #include "main.h"
#include "egcpool.h" #include "lib/egcpool.h"
TEST_CASE("EGCpool") { TEST_CASE("EGCpool") {
egcpool pool_{}; egcpool pool_{};

View File

@ -1,7 +1,6 @@
#include "main.h" #include "main.h"
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#include "internal.h"
auto pulser(struct notcurses* nc, struct ncplane* ncp __attribute__ ((unused)), auto pulser(struct notcurses* nc, struct ncplane* ncp __attribute__ ((unused)),
const struct timespec* ts __attribute__ ((unused)), void* curry) -> int { const struct timespec* ts __attribute__ ((unused)), void* curry) -> int {

View File

@ -1,5 +1,5 @@
#include "main.h" #include "main.h"
#include "fbuf.h" #include "lib/fbuf.h"
TEST_CASE("Fbuf") { TEST_CASE("Fbuf") {
auto nc_ = testing_notcurses(); auto nc_ = testing_notcurses();

View File

@ -4,7 +4,6 @@
#include <cstring> #include <cstring>
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include "internal.h"
#include <condition_variable> #include <condition_variable>
static pthread_cond_t cond; static pthread_cond_t cond;

View File

@ -1,5 +1,4 @@
#include "main.h" #include "main.h"
#include "internal.h"
TEST_CASE("Geometry") { TEST_CASE("Geometry") {
auto nc_ = testing_notcurses(); auto nc_ = testing_notcurses();

View File

@ -1,5 +1,4 @@
#include "main.h" #include "main.h"
#include "internal.h"
// some simple tests to ensure the libunistring we've compiled/linked against // some simple tests to ensure the libunistring we've compiled/linked against
// behaves as expected. // behaves as expected.

View File

@ -9,7 +9,7 @@
#include <notcurses/notcurses.h> #include <notcurses/notcurses.h>
#include <ncpp/NotCurses.hh> #include <ncpp/NotCurses.hh>
#include <ncpp/_exceptions.hh> #include <ncpp/_exceptions.hh>
#include "internal.h" #include "lib/internal.h"
struct free_deleter{ struct free_deleter{
template <typename T> template <typename T>

View File

@ -1,5 +1,5 @@
#include "main.h" #include "main.h"
#include "visual-details.h" #include "lib/visual-details.h"
#include <vector> #include <vector>
#include <cmath> #include <cmath>

View File

@ -2,7 +2,6 @@
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#include "main.h" #include "main.h"
#include "internal.h"
TEST_CASE("NotcursesBase") { TEST_CASE("NotcursesBase") {
auto nc_ = testing_notcurses(); auto nc_ = testing_notcurses();

View File

@ -1,6 +1,5 @@
#include <cstdlib> #include <cstdlib>
#include "main.h" #include "main.h"
#include "internal.h"
void BoxPermutationsRounded(struct notcurses* nc, struct ncplane* n, unsigned edges) { void BoxPermutationsRounded(struct notcurses* nc, struct ncplane* n, unsigned edges) {
int dimx, dimy; int dimx, dimy;

View File

@ -1,7 +1,6 @@
#include "main.h" #include "main.h"
#include <array> #include <array>
#include <cstdlib> #include <cstdlib>
#include "internal.h"
TEST_CASE("Scrolling") { TEST_CASE("Scrolling") {
auto nc_ = testing_notcurses(); auto nc_ = testing_notcurses();

View File

@ -1,5 +1,5 @@
#include "main.h" #include "main.h"
#include "visual-details.h" #include "lib/visual-details.h"
#include <vector> #include <vector>
#include <iostream> #include <iostream>

View File

@ -1,5 +1,4 @@
#include "main.h" #include "main.h"
#include "internal.h"
TEST_CASE("TextLayout") { TEST_CASE("TextLayout") {
auto nc_ = testing_notcurses(); auto nc_ = testing_notcurses();

View File

@ -1,5 +1,5 @@
#include "main.h" #include "main.h"
#include "visual-details.h" #include "lib/visual-details.h"
#include <vector> #include <vector>
#include <cmath> #include <cmath>

View File

@ -1,7 +1,6 @@
#include <array> #include <array>
#include <cstdlib> #include <cstdlib>
#include "main.h" #include "main.h"
#include "internal.h"
const char SNAKE[] = "\xf0\x9f\x90\x8d"; // U+1F40D SNAKE const char SNAKE[] = "\xf0\x9f\x90\x8d"; // U+1F40D SNAKE
const char SCORPION[] = "\xf0\x9f\xa6\x82"; // U+1F982 SCORPION const char SCORPION[] = "\xf0\x9f\xa6\x82"; // U+1F982 SCORPION

View File

@ -1,5 +1,6 @@
// Populated by CMake; not installed // Populated by CMake; not installed
#cmakedefine DFSG_BUILD #cmakedefine DFSG_BUILD
#cmakedefine USE_GPM
#cmakedefine USE_QRCODEGEN #cmakedefine USE_QRCODEGEN
#cmakedefine USE_READLINE #cmakedefine USE_READLINE
// exclusive with USE_OIIO // exclusive with USE_OIIO