aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2021-06-07 23:24:20 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2021-06-08 19:10:03 +0200
commit58dee5546e38a17f597bbd2da76d527eaa729282 (patch)
treeb4f381d94a32158eb797fa0e16875f7685f6f3c1
parentbb08565b91c21e1ffaf0b4b4f0750a52dbb87af2 (diff)
downloadsciteco-58dee5546e38a17f597bbd2da76d527eaa729282.tar.gz
improved PDCurses detection
* follow the current terminology: * PDCurses/Win32a is now called PDCursesMod and includes all other PDCurses ports as well. The Win32 GUI port is now called PDCurses/WinGUI. * PDCurses/Win32 is now called PDCurses/WinCon. * Since PDCursesMod supports WinCon as well, we use the PDCURSES_MOD macro only to detect PDCursesMod API extensions. GUIs (detached from system console) might be available both in classic PDCurses as well as in PDCursesMod. Only PDCursesMod allows detection of the port used *at runtime* using PDC_get_version(). We therefore introduced a --with-interface=pdcurses-gui that must be given whenever compiling for any kind of GUI port (including SDL on "classic" PDCurses). * The PDCURSES macro is used to detect all PDCurses (whether classic or PDCursesMod) API extensions. * __PDCURSES__ is used to detect PDCurses whenever API extensions are not required. * Assume that A_UNDERLINE now works even on WinCon.
-rw-r--r--.github/workflows/ci.yml2
-rw-r--r--.github/workflows/nightly.yml4
-rw-r--r--README4
-rw-r--r--configure.ac17
-rw-r--r--distribute.mk.in5
-rw-r--r--src/interface-curses/interface.c83
6 files changed, 43 insertions, 72 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 8e8c945..6b5f329 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -124,7 +124,7 @@ jobs:
# PDCURSES_CFLAGS: -I/mingw32/include/pdcurses/
# run: |
# autoreconf -i
-# ./configure --with-interface=pdcurses --enable-html-manual
+# ./configure --with-interface=pdcurses-gui --enable-html-manual
#
# - run: make
# - run: make install
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index d17016a..bbbbda2 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -84,7 +84,7 @@ jobs:
- name: Configure Build
env:
PDCURSES_CFLAGS: -I/mingw32/include/pdcurses/
- # The additional Windows libraries are for Win32a:
+ # The additional Windows libraries are for PDCursesMod/WinGUI:
PDCURSES_LIBS: -lpdcurses -lgdi32 -lcomdlg32
LIBGLIB_LIBS: -lglib-2.0 -lintl -liconv -lpcre -lole32 -lws2_32
# FIXME: Once there is an --enable-lto, we should use that.
@@ -93,7 +93,7 @@ jobs:
LDFLAGS: -flto
run: |
autoreconf -i
- ./configure --with-interface=pdcurses --enable-html-manual --enable-static-executables
+ ./configure --with-interface=pdcurses-gui --enable-html-manual --enable-static-executables
- name: make
run: make -j 2
diff --git a/README b/README
index 7c2d2e8..a4ed013 100644
--- a/README
+++ b/README
@@ -21,8 +21,8 @@ GTK+ 3 as well as Curses frontends (using [Scinterm](http://foicica.com/scinterm
The Curses frontend is verified to work with [ncurses](https://www.gnu.org/software/ncurses/),
[NetBSD Curses](https://github.com/sabotage-linux/netbsd-curses),
-[PDCurses/XCurses](http://pdcurses.sourceforge.net/), the
-[PDCurses win32a port](http://www.projectpluto.com/win32a.htm) and
+[PDCurses/XCurses](https://github.com/wmcbrine/PDCurses),
+[PDCursesMod](https://github.com/Bill-Gray/PDCursesMod) and
[EMCurses](https://github.com/rhaberkorn/emcurses).
Others might work as well.
diff --git a/configure.ac b/configure.ac
index c16acf1..b2e6b2e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -191,12 +191,12 @@ SCINTERM_PATH=`canonicalize $SCINTERM_PATH`
AC_SUBST(SCINTERM_PATH)
AC_ARG_WITH(interface,
- AS_HELP_STRING([--with-interface=ncurses|netbsd-curses|xcurses|pdcurses|gtk],
+ AS_HELP_STRING([--with-interface=ncurses|netbsd-curses|xcurses|pdcurses|pdcurses-gui|gtk],
[Specify user interface [default=ncurses]]),
[INTERFACE=$withval], [INTERFACE=ncurses])
case $INTERFACE in
-*curses)
+*curses*)
case $INTERFACE in
ncurses | netbsd-curses)
PKG_CHECK_MODULES(NCURSES, [ncurses], [
@@ -249,9 +249,11 @@ case $INTERFACE in
# This is also used by the curses.h itself:
AC_DEFINE(XCURSES, 1, [Enable PDCurses/XCurses extensions])
+
+ AC_DEFINE(PDCURSES_GUI, 1, [PDCurses with GUI window])
;;
- pdcurses)
+ pdcurses*)
AC_ARG_VAR(PDCURSES_CFLAGS, [
C compiler flags for PDCurses,
overriding the autoconf check
@@ -275,8 +277,15 @@ case $INTERFACE in
fi
AC_CHECK_FUNC([PDC_set_resize_limits], [
- AC_DEFINE(PDCURSES_WIN32A, 1, [PDCurses supports Win32a extensions])
+ AC_DEFINE(PDCURSES_MOD, 1, [PDCursesMod extensions])
])
+
+ # This is detectable at runtime on PDCursesMod using PDC_get_version().
+ # "Classic" PDCurses does not allow runtime or compile-time checks for
+ # discerning eg. WinCon from SDL.
+ if [[ $INTERFACE = pdcurses-gui ]]; then
+ AC_DEFINE(PDCURSES_GUI, 1, [PDCurses with GUI window])
+ fi
;;
esac
diff --git a/distribute.mk.in b/distribute.mk.in
index 18e0fe6..e5dc0ac 100644
--- a/distribute.mk.in
+++ b/distribute.mk.in
@@ -96,9 +96,10 @@ ppa : debian-source
# If we ever build a non-console version on Windows,
# we should include gspawn-win32-helper.exe instead.
#
-# When linking in PDCurses/win32a statically, the
+# When linking in PDCursesMod/WinGUI statically, the
# environment variable PDCURSES_LIBS should be set to
-# "-lpdcurses -lgdi32 -lcomdlg32"
+# "-lpdcurses -lgdi32 -lcomdlg32 -lwinmm"
+# Also, don't forget to set MINGW_UI=pdcurses-gui.
MINGW_UI=pdcurses
mingw-binary : @PACKAGE@-@PACKAGE_VERSION@-win32.zip
diff --git a/src/interface-curses/interface.c b/src/interface-curses/interface.c
index 0c059ba..5470264 100644
--- a/src/interface-curses/interface.c
+++ b/src/interface-curses/interface.c
@@ -71,27 +71,9 @@
#include "memory.h"
#include "interface.h"
-/**
- * Whether we have PDCurses-only routines:
- * Could be 0, even on PDCurses
- */
-#ifndef PDCURSES
-#define PDCURSES 0
-#endif
-
-/**
- * Whether we're on PDCurses/win32
- */
#if defined(__PDCURSES__) && defined(G_OS_WIN32) && \
- !defined(PDCURSES_WIN32A)
-#define PDCURSES_WIN32
-
-/*
- * A_UNDERLINE is not supported by PDCurses/win32
- * and causes weird colors, so we simply disable it globally.
- */
-#undef A_UNDERLINE
-#define A_UNDERLINE 0
+ !defined(PDCURSES_GUI)
+#define PDCURSES_WINCON
#endif
/**
@@ -121,27 +103,7 @@
#define CURSES_TTY
#endif
-/*
- * PDCurses/win32a by default assigns functions to certain
- * keys like CTRL+V, CTRL++, CTRL+- and CTRL+=.
- * This conflicts with SciTECO that must remain in control
- * of keyboard processing.
- * Unfortunately, the default mapping can only be disabled
- * or changed via the internal PDC_set_function_key() in
- * pdcwin.h. Therefore we declare it manually here.
- */
-#ifdef PDCURSES_WIN32A
-int PDC_set_function_key(const unsigned function, const int new_key);
-
-#define N_FUNCTION_KEYS 5
-#define FUNCTION_KEY_SHUT_DOWN 0
-#define FUNCTION_KEY_PASTE 1
-#define FUNCTION_KEY_ENLARGE_FONT 2
-#define FUNCTION_KEY_SHRINK_FONT 3
-#define FUNCTION_KEY_CHOOSE_FONT 4
-#endif
-
-#if defined(PDCURSES_WIN32) || defined(NCURSES_WIN32)
+#if defined(PDCURSES_WINCON) || defined(NCURSES_WIN32)
/**
* This handler is the Windows-analogue of a signal
@@ -414,7 +376,7 @@ teco_interface_init(void)
* reliably. The signal handler we already
* have won't do.
*/
-#if defined(PDCURSES_WIN32) || defined(NCURSES_WIN32)
+#if defined(PDCURSES_WINCON) || defined(NCURSES_WIN32)
SetConsoleCtrlHandler(teco_console_ctrl_handler, TRUE);
#endif
@@ -442,7 +404,7 @@ teco_interface_get_options(void)
static void
teco_interface_init_color_safe(guint color, guint32 rgb)
{
-#ifdef PDCURSES_WIN32
+#if defined(__PDCURSES__) && !defined(PDCURSES_GUI)
if (teco_interface.orig_color_table[color].r < 0) {
color_content((short)color,
&teco_interface.orig_color_table[color].r,
@@ -456,10 +418,10 @@ teco_interface_init_color_safe(guint color, guint32 rgb)
init_color((short)color, r, g, b);
}
-#ifdef PDCURSES_WIN32
+#if defined(__PDCURSES__) && !defined(PDCURSES_GUI)
/*
- * On PDCurses/win32, color_content() will actually return
+ * On PDCurses/WinCon, color_content() will actually return
* the real console color palette - or at least the default
* palette when the console started.
*/
@@ -519,7 +481,7 @@ teco_interface_restore_colors(void)
fflush(teco_interface.screen_tty);
}
-#else /* !PDCURSES_WIN32 && !CURSES_TTY */
+#else /* (!__PDCURSES__ || PDCURSES_GUI) && !CURSES_TTY */
static void
teco_interface_restore_colors(void)
@@ -683,16 +645,16 @@ teco_interface_init_interactive(GError **error)
g_setenv("TERM", "#win32con", TRUE);
#endif
-#ifdef PDCURSES_WIN32A
+#ifdef PDCURSES_MOD
/*
- * Necessary to enable window resizing in Win32a port
+ * Necessary to enable window resizing in WinGUI port
*/
PDC_set_resize_limits(25, 0xFFFF, 80, 0xFFFF);
/*
* Disable all magic function keys.
*/
- for (int i = 0; i < N_FUNCTION_KEYS; i++)
+ for (int i = 0; i < PDC_MAX_FUNCTION_KEYS; i++)
PDC_set_function_key(i, 0);
/*
@@ -836,8 +798,7 @@ teco_interface_vmsg(teco_msg_t type, const gchar *fmt, va_list ap)
* On most platforms we can write to stdout/stderr
* even in interactive mode.
*/
-#if defined(XCURSES) || defined(PDCURSES_WIN32A) || \
- defined(CURSES_TTY) || defined(NCURSES_WIN32)
+#if defined(PDCURSES_GUI) || defined(CURSES_TTY) || defined(NCURSES_WIN32)
va_list aq;
va_copy(aq, ap);
teco_interface_stdio_vmsg(type, fmt, aq);
@@ -967,7 +928,7 @@ teco_interface_set_window_title(const gchar *title)
fflush(teco_interface.screen_tty);
}
-#else
+#else /* !PDCURSES && (!CURSES_TTY || !HAVE_TIGETSTR) */
static void
teco_interface_set_window_title(const gchar *title)
@@ -1149,7 +1110,7 @@ teco_interface_draw_cmdline(void)
0, disp_offset, 0, 1, 0, disp_len, FALSE);
}
-#ifdef __PDCURSES__
+#if PDCURSES
/*
* At least on PDCurses, a single clipboard
@@ -1396,7 +1357,7 @@ teco_interface_get_clipboard(const gchar *name, gchar **str, gsize *len, GError
return TRUE;
}
-#else
+#else /* !PDCURSES && !CURSES_TTY */
static void
teco_interface_init_clipboard(void)
@@ -1424,7 +1385,7 @@ teco_interface_get_clipboard(const gchar *name, gchar **str, gsize *len, GError
return FALSE;
}
-#endif /* !__PDCURSES__ && !CURSES_TTY */
+#endif
void
teco_interface_popup_add(teco_popup_entry_type_t type, const gchar *name, gsize name_len,
@@ -1497,14 +1458,14 @@ void
teco_interface_event_loop_iter(void)
{
/*
- * On PDCurses/win32, raw() and cbreak() does
+ * On PDCurses/WinCon, raw() and cbreak() does
* not disable and enable CTRL+C handling properly.
* Since I don't want to patch PDCurses/win32,
* we do this manually here.
* NOTE: This exploits the fact that PDCurses uses
* STD_INPUT_HANDLE internally!
*/
-#ifdef PDCURSES_WIN32
+#ifdef PDCURSES_WINCON
HANDLE console_hnd = GetStdHandle(STD_INPUT_HANDLE);
DWORD console_mode;
GetConsoleMode(console_hnd, &console_mode);
@@ -1528,7 +1489,7 @@ teco_interface_event_loop_iter(void)
/* no special <CTRL/C> handling */
raw();
-#ifdef PDCURSES_WIN32
+#ifdef PDCURSES_WINCON
SetConsoleMode(console_hnd, console_mode & ~ENABLE_PROCESSED_INPUT);
#endif
/*
@@ -1542,7 +1503,7 @@ teco_interface_event_loop_iter(void)
teco_sigint_occurred = FALSE;
noraw(); /* FIXME: necessary because of NCURSES_WIN32 bug */
cbreak();
-#ifdef PDCURSES_WIN32
+#ifdef PDCURSES_WINCON
SetConsoleMode(console_hnd, console_mode | ENABLE_PROCESSED_INPUT);
#endif
if (key == ERR)
@@ -1551,7 +1512,7 @@ teco_interface_event_loop_iter(void)
switch (key) {
#ifdef KEY_RESIZE
case KEY_RESIZE:
-#if PDCURSES
+#ifdef __PDCURSES__
resize_term(0, 0);
#endif
teco_interface_resize_all_windows();
@@ -1707,7 +1668,7 @@ teco_interface_cleanup(void)
delwin(teco_interface.msg_window);
/*
- * PDCurses (win32) crashes if initscr() wasn't called.
+ * PDCurses/WinCon crashes if initscr() wasn't called.
* Others (XCurses) crash if we try to use isendwin() here.
* Perhaps Curses cleanup should be in restore_batch()
* instead.