/****************************************************************************
- * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. *
+ * Copyright 2020,2023 Thomas E. Dickey *
+ * Copyright 1998-2016,2017 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
#include <curses.priv.h>
-MODULE_ID("$Id: lib_raw.c,v 1.18 2009/10/24 21:56:15 tom Exp $")
-
-#if SVR4_TERMIO && !defined(_POSIX_SOURCE)
-#define _POSIX_SOURCE
-#endif
+MODULE_ID("$Id: lib_raw.c,v 1.28 2023/08/12 15:45:07 tom Exp $")
#if HAVE_SYS_TERMIO_H
#include <sys/termio.h> /* needed for ISC */
#define _nc_setmode(mode) /* nothing */
#endif
+#if USE_KLIBC_KBD
+#define INCL_KBD
+#include <os2.h>
+#endif
+
#define COOKED_INPUT (IXON|BRKINT|PARMRK)
#ifdef TRACE
buf = termp->Nttyb;
#ifdef TERMIOS
- buf.c_lflag &= ~(ICANON | ISIG | IEXTEN);
- buf.c_iflag &= ~(COOKED_INPUT);
+ buf.c_lflag &= (unsigned) ~(ICANON | ISIG | IEXTEN);
+ buf.c_iflag &= (unsigned) ~(COOKED_INPUT);
buf.c_cc[VMIN] = 1;
buf.c_cc[VTIME] = 0;
+#elif defined(EXP_WIN32_DRIVER)
+ buf.dwFlagIn &= (unsigned long) ~CONMODE_NORAW;
#else
buf.sg_flags |= RAW;
#endif
result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
if (result == OK) {
- SP_PARM->_raw = TRUE;
- SP_PARM->_cbreak = 1;
+#if USE_KLIBC_KBD
+ KBDINFO kbdinfo;
+
+ kbdinfo.cb = sizeof(kbdinfo);
+ KbdGetStatus(&kbdinfo, 0);
+
+ kbdinfo.cb = sizeof(kbdinfo);
+ kbdinfo.fsMask &= ~KEYBOARD_ASCII_MODE;
+ kbdinfo.fsMask |= KEYBOARD_BINARY_MODE;
+ KbdSetStatus(&kbdinfo, 0);
+#endif
+ if (SP_PARM) {
+ IsRaw(SP_PARM) = TRUE;
+ IsCbreak(SP_PARM) = 1;
+ }
termp->Nttyb = buf;
}
AFTER("raw");
buf = termp->Nttyb;
#ifdef TERMIOS
- buf.c_lflag &= ~ICANON;
- buf.c_iflag &= ~ICRNL;
+ buf.c_lflag &= (unsigned) ~ICANON;
+ buf.c_iflag &= (unsigned) ~ICRNL;
buf.c_lflag |= ISIG;
buf.c_cc[VMIN] = 1;
buf.c_cc[VTIME] = 0;
+#elif defined(EXP_WIN32_DRIVER)
+ buf.dwFlagIn |= CONMODE_NORAW;
+ buf.dwFlagIn &= (unsigned long) ~CONMODE_NOCBREAK;
#else
buf.sg_flags |= CBREAK;
#endif
result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
if (result == OK) {
- SP_PARM->_cbreak = 1;
+ if (SP_PARM) {
+ IsCbreak(SP_PARM) = 1;
+ }
termp->Nttyb = buf;
}
AFTER("cbreak");
NCURSES_EXPORT(void)
NCURSES_SP_NAME(qiflush) (NCURSES_SP_DCL0)
{
- int result = ERR;
TERMINAL *termp;
T((T_CALLED("qiflush(%p)"), (void *) SP_PARM));
if ((termp = TerminalOf(SP_PARM)) != 0) {
TTY buf;
+ int result;
BEFORE("qiflush");
buf = termp->Nttyb;
#ifdef TERMIOS
- buf.c_lflag &= ~(NOFLSH);
+ buf.c_lflag &= (unsigned) ~(NOFLSH);
result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
#else
+ result = ERR;
/* FIXME */
#endif
if (result == OK)
buf.c_lflag |= ISIG | ICANON |
(termp->Ottyb.c_lflag & IEXTEN);
buf.c_iflag |= COOKED_INPUT;
+#elif defined(EXP_WIN32_DRIVER)
+ buf.dwFlagIn |= CONMODE_NORAW;
#else
buf.sg_flags &= ~(RAW | CBREAK);
#endif
result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
if (result == OK) {
- SP_PARM->_raw = FALSE;
- SP_PARM->_cbreak = 0;
+#if USE_KLIBC_KBD
+ KBDINFO kbdinfo;
+
+ kbdinfo.cb = sizeof(kbdinfo);
+ KbdGetStatus(&kbdinfo, 0);
+
+ kbdinfo.cb = sizeof(kbdinfo);
+ kbdinfo.fsMask &= ~KEYBOARD_BINARY_MODE;
+ kbdinfo.fsMask |= KEYBOARD_ASCII_MODE;
+ KbdSetStatus(&kbdinfo, 0);
+#endif
+ if (SP_PARM) {
+ IsRaw(SP_PARM) = FALSE;
+ IsCbreak(SP_PARM) = 0;
+ }
termp->Nttyb = buf;
}
AFTER("noraw");
#ifdef TERMIOS
buf.c_lflag |= ICANON;
buf.c_iflag |= ICRNL;
+#elif defined(EXP_WIN32_DRIVER)
+ buf.dwFlagIn |= (CONMODE_NOCBREAK | CONMODE_NORAW);
#else
buf.sg_flags &= ~CBREAK;
#endif
result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
if (result == OK) {
- SP_PARM->_cbreak = 0;
+ if (SP_PARM) {
+ IsCbreak(SP_PARM) = 0;
+ }
termp->Nttyb = buf;
}
AFTER("nocbreak");
NCURSES_EXPORT(void)
NCURSES_SP_NAME(noqiflush) (NCURSES_SP_DCL0)
{
- int result = ERR;
TERMINAL *termp;
T((T_CALLED("noqiflush(%p)"), (void *) SP_PARM));
if ((termp = TerminalOf(SP_PARM)) != 0) {
TTY buf;
+ int result;
BEFORE("noqiflush");
buf = termp->Nttyb;
result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
#else
/* FIXME */
+ result = ERR;
#endif
if (result == OK)
termp->Nttyb = buf;
buf = termp->Nttyb;
#ifdef TERMIOS
if (flag)
- buf.c_lflag &= ~(NOFLSH);
+ buf.c_lflag &= (unsigned) ~(NOFLSH);
else
buf.c_lflag |= (NOFLSH);
result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
return NCURSES_SP_NAME(intrflush) (CURRENT_SCREEN, win, flag);
}
#endif
+
+#if NCURSES_EXT_FUNCS
+
+/*
+ * SCREEN is always opaque, but nl/raw/cbreak/echo set properties in it.
+ * As an extension, provide a way to query the properties.
+ *
+ * There are other properties which could be queried, e.g., filter, keypad,
+ * use_env, use_meta, but these particular properties are saved/restored within
+ * the wgetnstr() and wgetn_wstr() functions, which requires that the higher
+ * level curses library knows about the internal state of the lower level
+ * terminfo library.
+ */
+
+#define is_TEST(show,what) \
+ NCURSES_EXPORT(int) \
+ NCURSES_SP_NAME(show) (NCURSES_SP_DCL0) \
+ { \
+ return ((SP_PARM != NULL) ? (what(SP_PARM) ? 1 : 0) : -1); \
+ }
+
+is_TEST(is_nl, IsNl);
+is_TEST(is_raw, IsRaw);
+is_TEST(is_cbreak, IsCbreak);
+is_TEST(is_echo, IsEcho);
+
+#if NCURSES_SP_FUNCS
+#undef is_TEST
+#define is_TEST(show) \
+ NCURSES_EXPORT(int) \
+ show(void) \
+ { \
+ return NCURSES_SP_NAME(show) (CURRENT_SCREEN); \
+ }
+is_TEST(is_nl);
+is_TEST(is_raw);
+is_TEST(is_cbreak);
+is_TEST(is_echo);
+#endif
+
+#endif /* extensions */