]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tinfo/lib_raw.c
ncurses 6.4 - patch 20230812
[ncurses.git] / ncurses / tinfo / lib_raw.c
index 7f67a7525e7da4b372d71f2ca6671e62e28ccf3b..5f9c645bf1fa349490c9c09d0df7c9a470b2520d 100644 (file)
@@ -1,5 +1,6 @@
 /****************************************************************************
- * 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 */
@@ -66,6 +63,11 @@ MODULE_ID("$Id: lib_raw.c,v 1.18 2009/10/24 21:56:15 tom Exp $")
 #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
@@ -91,17 +93,32 @@ NCURSES_SP_NAME(raw) (NCURSES_SP_DCL0)
 
        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");
@@ -132,17 +149,22 @@ NCURSES_SP_NAME(cbreak) (NCURSES_SP_DCL0)
 
        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");
@@ -165,19 +187,20 @@ cbreak(void)
 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)
@@ -213,13 +236,28 @@ NCURSES_SP_NAME(noraw) (NCURSES_SP_DCL0)
        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");
@@ -252,12 +290,16 @@ NCURSES_SP_NAME(nocbreak) (NCURSES_SP_DCL0)
 #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");
@@ -276,12 +318,12 @@ nocbreak(void)
 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;
@@ -290,6 +332,7 @@ NCURSES_SP_NAME(noqiflush) (NCURSES_SP_DCL0)
        result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
 #else
        /* FIXME */
+       result = ERR;
 #endif
        if (result == OK)
            termp->Nttyb = buf;
@@ -330,7 +373,7 @@ NCURSES_SP_NAME(intrflush) (NCURSES_SP_DCLx WINDOW *win GCC_UNUSED, bool flag)
        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);
@@ -352,3 +395,44 @@ intrflush(WINDOW *win GCC_UNUSED, bool flag)
     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 */