curses 1.3.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/macos.yml +19 -0
- data/.github/workflows/ubuntu.yml +26 -0
- data/.github/workflows/windows.yml +25 -0
- data/History.md +34 -0
- data/README.md +14 -46
- data/Rakefile +0 -86
- data/curses.gemspec +2 -3
- data/ext/curses/curses.c +70 -58
- data/ext/curses/extconf.rb +134 -21
- data/lib/curses.rb +5 -12
- data/sample/addch.rb +16 -0
- data/sample/attr_demo.rb +32 -0
- data/sample/colors.rb +26 -0
- data/sample/menu.rb +3 -3
- data/sample/mouse_move.rb +75 -0
- data/vendor/PDCurses/.gitignore +47 -0
- data/vendor/PDCurses/.travis.yml +49 -0
- data/vendor/PDCurses/CMakeLists.txt +68 -0
- data/vendor/PDCurses/HISTORY.md +2036 -0
- data/vendor/PDCurses/IMPLEMNT.md +327 -0
- data/vendor/PDCurses/README.md +77 -0
- data/vendor/PDCurses/acs_defs.h +265 -0
- data/vendor/PDCurses/appveyor.yml +218 -0
- data/vendor/PDCurses/cmake/README.md +71 -0
- data/vendor/PDCurses/cmake/build_dependencies.cmake +178 -0
- data/vendor/PDCurses/cmake/build_options.cmake +25 -0
- data/vendor/PDCurses/cmake/dll_version.cmake +26 -0
- data/vendor/PDCurses/cmake/gen_config_header.cmake +43 -0
- data/vendor/PDCurses/cmake/get_version.cmake +17 -0
- data/vendor/PDCurses/cmake/make_uninstall.cmake +19 -0
- data/vendor/PDCurses/cmake/project_common.cmake +121 -0
- data/vendor/PDCurses/cmake/resource.in.cmake +52 -0
- data/vendor/PDCurses/cmake/sdl2_ttf/CMakeLists.txt +83 -0
- data/vendor/PDCurses/cmake/target_arch.cmake +36 -0
- data/vendor/PDCurses/cmake/version.in.cmake +73 -0
- data/vendor/PDCurses/cmake/watcom_open_dos16_toolchain.cmake +96 -0
- data/vendor/PDCurses/cmake/watcom_open_dos32_toolchain.cmake +106 -0
- data/vendor/PDCurses/cmake/watcom_open_os2v2_toolchain.cmake +105 -0
- data/vendor/PDCurses/curses.h +1846 -0
- data/vendor/PDCurses/curspriv.h +134 -0
- data/vendor/PDCurses/demos/README.md +25 -0
- data/vendor/PDCurses/demos/firework.c +144 -0
- data/vendor/PDCurses/demos/newtest.c +581 -0
- data/vendor/PDCurses/demos/ozdemo.c +447 -0
- data/vendor/PDCurses/demos/ptest.c +283 -0
- data/vendor/PDCurses/demos/rain.c +157 -0
- data/vendor/PDCurses/demos/testcurs.c +1607 -0
- data/vendor/PDCurses/demos/tui.c +1048 -0
- data/vendor/PDCurses/demos/tui.h +65 -0
- data/vendor/PDCurses/demos/tuidemo.c +233 -0
- data/vendor/PDCurses/demos/version.c +61 -0
- data/vendor/PDCurses/demos/worm.c +432 -0
- data/vendor/PDCurses/demos/xmas.c +955 -0
- data/vendor/PDCurses/dos/CMakeLists.txt +47 -0
- data/vendor/PDCurses/dos/Makefile.bcc +83 -0
- data/vendor/PDCurses/dos/Makefile.dmc +257 -0
- data/vendor/PDCurses/dos/Makefile.msc +113 -0
- data/vendor/PDCurses/dos/Makefile.wcc +107 -0
- data/vendor/PDCurses/dos/README.md +51 -0
- data/vendor/PDCurses/dos/bccdos.lrf +9 -0
- data/vendor/PDCurses/dos/mscdos.lrf +50 -0
- data/vendor/PDCurses/dos/pdcclip.c +132 -0
- data/vendor/PDCurses/dos/pdcdisp.c +135 -0
- data/vendor/PDCurses/dos/pdcdos.h +194 -0
- data/vendor/PDCurses/dos/pdcgetsc.c +98 -0
- data/vendor/PDCurses/dos/pdckbd.c +513 -0
- data/vendor/PDCurses/dos/pdcscrn.c +785 -0
- data/vendor/PDCurses/dos/pdcsetsc.c +101 -0
- data/vendor/PDCurses/dos/pdcutil.c +212 -0
- data/vendor/PDCurses/libobjs.mif +26 -0
- data/vendor/PDCurses/makedist.mif +20 -0
- data/vendor/PDCurses/man/README.md +21 -0
- data/vendor/PDCurses/man/intro.md +361 -0
- data/vendor/PDCurses/man/manext.c +119 -0
- data/vendor/PDCurses/man/sdl.md +152 -0
- data/vendor/PDCurses/man/sdl2.md +58 -0
- data/vendor/PDCurses/man/x11.md +407 -0
- data/vendor/PDCurses/ncurses/CMakeLists.txt +66 -0
- data/vendor/PDCurses/ncurses/README.md +26 -0
- data/vendor/PDCurses/ncurses/makefile +29 -0
- data/vendor/PDCurses/os2/CMakeLists.txt +41 -0
- data/vendor/PDCurses/os2/Makefile.bcc +90 -0
- data/vendor/PDCurses/os2/Makefile.wcc +43 -0
- data/vendor/PDCurses/os2/README.md +43 -0
- data/vendor/PDCurses/os2/iccos2.lrf +50 -0
- data/vendor/PDCurses/os2/iccos2.mak +256 -0
- data/vendor/PDCurses/os2/pdcclip.c +188 -0
- data/vendor/PDCurses/os2/pdcdisp.c +93 -0
- data/vendor/PDCurses/os2/pdcgetsc.c +89 -0
- data/vendor/PDCurses/os2/pdckbd.c +521 -0
- data/vendor/PDCurses/os2/pdcos2.h +55 -0
- data/vendor/PDCurses/os2/pdcscrn.c +449 -0
- data/vendor/PDCurses/os2/pdcsetsc.c +112 -0
- data/vendor/PDCurses/os2/pdcutil.c +52 -0
- data/vendor/PDCurses/panel.h +56 -0
- data/vendor/PDCurses/pdcurses/README.md +25 -0
- data/vendor/PDCurses/pdcurses/addch.c +693 -0
- data/vendor/PDCurses/pdcurses/addchstr.c +245 -0
- data/vendor/PDCurses/pdcurses/addstr.c +240 -0
- data/vendor/PDCurses/pdcurses/attr.c +359 -0
- data/vendor/PDCurses/pdcurses/beep.c +68 -0
- data/vendor/PDCurses/pdcurses/bkgd.c +223 -0
- data/vendor/PDCurses/pdcurses/border.c +411 -0
- data/vendor/PDCurses/pdcurses/clear.c +159 -0
- data/vendor/PDCurses/pdcurses/color.c +298 -0
- data/vendor/PDCurses/pdcurses/debug.c +109 -0
- data/vendor/PDCurses/pdcurses/delch.c +96 -0
- data/vendor/PDCurses/pdcurses/deleteln.c +211 -0
- data/vendor/PDCurses/pdcurses/deprec.c +27 -0
- data/vendor/PDCurses/pdcurses/getch.c +417 -0
- data/vendor/PDCurses/pdcurses/getstr.c +474 -0
- data/vendor/PDCurses/pdcurses/getyx.c +139 -0
- data/vendor/PDCurses/pdcurses/inch.c +127 -0
- data/vendor/PDCurses/pdcurses/inchstr.c +214 -0
- data/vendor/PDCurses/pdcurses/initscr.c +367 -0
- data/vendor/PDCurses/pdcurses/inopts.c +324 -0
- data/vendor/PDCurses/pdcurses/insch.c +271 -0
- data/vendor/PDCurses/pdcurses/insstr.c +264 -0
- data/vendor/PDCurses/pdcurses/instr.c +246 -0
- data/vendor/PDCurses/pdcurses/kernel.c +259 -0
- data/vendor/PDCurses/pdcurses/keyname.c +157 -0
- data/vendor/PDCurses/pdcurses/mouse.c +438 -0
- data/vendor/PDCurses/pdcurses/move.c +57 -0
- data/vendor/PDCurses/pdcurses/outopts.c +159 -0
- data/vendor/PDCurses/pdcurses/overlay.c +214 -0
- data/vendor/PDCurses/pdcurses/pad.c +260 -0
- data/vendor/PDCurses/pdcurses/panel.c +633 -0
- data/vendor/PDCurses/pdcurses/printw.c +126 -0
- data/vendor/PDCurses/pdcurses/refresh.c +279 -0
- data/vendor/PDCurses/pdcurses/scanw.c +578 -0
- data/vendor/PDCurses/pdcurses/scr_dump.c +213 -0
- data/vendor/PDCurses/pdcurses/scroll.c +101 -0
- data/vendor/PDCurses/pdcurses/slk.c +591 -0
- data/vendor/PDCurses/pdcurses/termattr.c +182 -0
- data/vendor/PDCurses/pdcurses/terminfo.c +217 -0
- data/vendor/PDCurses/pdcurses/touch.c +163 -0
- data/vendor/PDCurses/pdcurses/util.c +312 -0
- data/vendor/PDCurses/pdcurses/window.c +569 -0
- data/vendor/PDCurses/sdl1/Makefile.mng +110 -0
- data/vendor/PDCurses/sdl1/README.md +31 -0
- data/vendor/PDCurses/sdl1/deffont.h +385 -0
- data/vendor/PDCurses/sdl1/deficon.h +23 -0
- data/vendor/PDCurses/sdl1/pdcclip.c +131 -0
- data/vendor/PDCurses/sdl1/pdcdisp.c +373 -0
- data/vendor/PDCurses/sdl1/pdcgetsc.c +30 -0
- data/vendor/PDCurses/sdl1/pdckbd.c +405 -0
- data/vendor/PDCurses/sdl1/pdcscrn.c +414 -0
- data/vendor/PDCurses/sdl1/pdcsdl.h +31 -0
- data/vendor/PDCurses/sdl1/pdcsetsc.c +64 -0
- data/vendor/PDCurses/sdl1/pdcutil.c +40 -0
- data/vendor/PDCurses/sdl1/sdltest.c +79 -0
- data/vendor/PDCurses/sdl2/CMakeLists.txt +76 -0
- data/vendor/PDCurses/sdl2/Makefile.vc +164 -0
- data/vendor/PDCurses/sdl2/README.md +34 -0
- data/vendor/PDCurses/sdl2/deffont.h +385 -0
- data/vendor/PDCurses/sdl2/deficon.h +23 -0
- data/vendor/PDCurses/sdl2/pdcclip.c +93 -0
- data/vendor/PDCurses/sdl2/pdcdisp.c +534 -0
- data/vendor/PDCurses/sdl2/pdcgetsc.c +30 -0
- data/vendor/PDCurses/sdl2/pdckbd.c +480 -0
- data/vendor/PDCurses/sdl2/pdcscrn.c +443 -0
- data/vendor/PDCurses/sdl2/pdcsdl.h +33 -0
- data/vendor/PDCurses/sdl2/pdcsetsc.c +67 -0
- data/vendor/PDCurses/sdl2/pdcutil.c +39 -0
- data/vendor/PDCurses/sdl2/sdltest.c +81 -0
- data/vendor/PDCurses/term.h +48 -0
- data/vendor/PDCurses/version.mif +7 -0
- data/vendor/PDCurses/vt/CMakeLists.txt +28 -0
- data/vendor/PDCurses/vt/Makefile.bcc +111 -0
- data/vendor/PDCurses/vt/Makefile.dmc +258 -0
- data/vendor/PDCurses/vt/Makefile.vc +144 -0
- data/vendor/PDCurses/vt/Makefile.wcc +107 -0
- data/vendor/PDCurses/vt/README.md +64 -0
- data/vendor/PDCurses/vt/pdcclip.c +20 -0
- data/vendor/PDCurses/vt/pdcdisp.c +284 -0
- data/vendor/PDCurses/vt/pdcgetsc.c +27 -0
- data/vendor/PDCurses/vt/pdckbd.c +394 -0
- data/vendor/PDCurses/vt/pdcscrn.c +434 -0
- data/vendor/PDCurses/vt/pdcsetsc.c +45 -0
- data/vendor/PDCurses/vt/pdcutil.c +43 -0
- data/vendor/PDCurses/vt/pdcvt.h +16 -0
- data/vendor/PDCurses/watcom.mif +68 -0
- data/vendor/PDCurses/wincon/CMakeLists.txt +27 -0
- data/vendor/PDCurses/wincon/Makefile.bcc +88 -0
- data/vendor/PDCurses/wincon/Makefile.dmc +256 -0
- data/vendor/PDCurses/wincon/Makefile.lcc +273 -0
- data/vendor/PDCurses/wincon/Makefile.mng +176 -0
- data/vendor/PDCurses/wincon/Makefile.vc +144 -0
- data/vendor/PDCurses/wincon/Makefile.wcc +51 -0
- data/vendor/PDCurses/wincon/README.md +85 -0
- data/vendor/PDCurses/wincon/pdcclip.c +174 -0
- data/vendor/PDCurses/wincon/pdcdisp.c +143 -0
- data/vendor/PDCurses/wincon/pdcgetsc.c +55 -0
- data/vendor/PDCurses/wincon/pdckbd.c +786 -0
- data/vendor/PDCurses/wincon/pdcscrn.c +717 -0
- data/vendor/PDCurses/wincon/pdcsetsc.c +91 -0
- data/vendor/PDCurses/wincon/pdcurses.ico +0 -0
- data/vendor/PDCurses/wincon/pdcurses.rc +28 -0
- data/vendor/PDCurses/wincon/pdcutil.c +41 -0
- data/vendor/PDCurses/wincon/pdcwin.h +31 -0
- data/vendor/PDCurses/wingui/CMakeLists.txt +27 -0
- data/vendor/PDCurses/wingui/Makefile.bcc +85 -0
- data/vendor/PDCurses/wingui/Makefile.dmc +259 -0
- data/vendor/PDCurses/wingui/Makefile.lcc +273 -0
- data/vendor/PDCurses/wingui/Makefile.mng +171 -0
- data/vendor/PDCurses/wingui/Makefile.vc +144 -0
- data/vendor/PDCurses/wingui/Makefile.wcc +51 -0
- data/vendor/PDCurses/wingui/README.md +93 -0
- data/vendor/PDCurses/wingui/pdcclip.c +174 -0
- data/vendor/PDCurses/wingui/pdcdisp.c +718 -0
- data/vendor/PDCurses/wingui/pdcgetsc.c +30 -0
- data/vendor/PDCurses/wingui/pdckbd.c +143 -0
- data/vendor/PDCurses/wingui/pdcscrn.c +2797 -0
- data/vendor/PDCurses/wingui/pdcsetsc.c +89 -0
- data/vendor/PDCurses/wingui/pdcurses.ico +0 -0
- data/vendor/PDCurses/wingui/pdcurses.rc +28 -0
- data/vendor/PDCurses/wingui/pdcutil.c +61 -0
- data/vendor/PDCurses/wingui/pdcwin.h +122 -0
- data/vendor/PDCurses/x11/Makefile.in +754 -0
- data/vendor/PDCurses/x11/PDCurses.spec +82 -0
- data/vendor/PDCurses/x11/README.md +62 -0
- data/vendor/PDCurses/x11/ScrollBox.c +319 -0
- data/vendor/PDCurses/x11/ScrollBox.h +51 -0
- data/vendor/PDCurses/x11/ScrollBoxP.h +70 -0
- data/vendor/PDCurses/x11/aclocal.m4 +994 -0
- data/vendor/PDCurses/x11/big_icon.xbm +46 -0
- data/vendor/PDCurses/x11/compose.h +201 -0
- data/vendor/PDCurses/x11/config.guess +1500 -0
- data/vendor/PDCurses/x11/config.h.in +100 -0
- data/vendor/PDCurses/x11/config.sub +1616 -0
- data/vendor/PDCurses/x11/configure +6700 -0
- data/vendor/PDCurses/x11/configure.ac +295 -0
- data/vendor/PDCurses/x11/debian/changelog +6 -0
- data/vendor/PDCurses/x11/debian/compat +1 -0
- data/vendor/PDCurses/x11/debian/control +11 -0
- data/vendor/PDCurses/x11/debian/copyright +27 -0
- data/vendor/PDCurses/x11/debian/rules +98 -0
- data/vendor/PDCurses/x11/install-sh +253 -0
- data/vendor/PDCurses/x11/little_icon.xbm +14 -0
- data/vendor/PDCurses/x11/ncurses_cfg.h +45 -0
- data/vendor/PDCurses/x11/pdcclip.c +173 -0
- data/vendor/PDCurses/x11/pdcdisp.c +85 -0
- data/vendor/PDCurses/x11/pdcgetsc.c +28 -0
- data/vendor/PDCurses/x11/pdckbd.c +104 -0
- data/vendor/PDCurses/x11/pdcscrn.c +258 -0
- data/vendor/PDCurses/x11/pdcsetsc.c +95 -0
- data/vendor/PDCurses/x11/pdcutil.c +52 -0
- data/vendor/PDCurses/x11/pdcx11.c +316 -0
- data/vendor/PDCurses/x11/pdcx11.h +191 -0
- data/vendor/PDCurses/x11/sb.c +155 -0
- data/vendor/PDCurses/x11/x11.c +3686 -0
- data/vendor/PDCurses/x11/xcurses-config.in +81 -0
- metadata +258 -24
- data/.travis.yml +0 -16
- data/appveyor.yml +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1dbe3f75b839ed01f58ee7743d9d2e147491255aabc4292d04ddcf00a2eaec25
|
4
|
+
data.tar.gz: 057d072c126f7d00f8f23cd6fdb246255f94545af1bdb836648b68903a1f959f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4bd61ea426ca6a68141099c8f6b734cd9094ade75fb5cb11525f285c41e6bec346e3b163bc0f37e1a29b96857ac1d2430f751f056e28641da7116c46ba458a19
|
7
|
+
data.tar.gz: bd3f77e5ff14b8c9aeb86d2e498a66f53d66999f55eb81848cf953946a10f242d906b2047eb8e342f0149a436766c810d53c3c06ee942e69d3ae20068e3c8e14
|
@@ -0,0 +1,19 @@
|
|
1
|
+
name: macos
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: macos-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v2
|
10
|
+
- name: Install dependencies
|
11
|
+
run: |
|
12
|
+
gem install bundler --no-document
|
13
|
+
bundle install
|
14
|
+
- name: Build package
|
15
|
+
run: bundle exec rake build
|
16
|
+
- name: Install package
|
17
|
+
run: |
|
18
|
+
gem install pkg/curses-*.gem
|
19
|
+
ruby -r curses -e 'puts Curses::VERSION'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
name: ubuntu
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
strategy:
|
8
|
+
matrix:
|
9
|
+
ruby: [ head, 2.7, 2.6, 2.5 ]
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
steps:
|
12
|
+
- uses: actions/checkout@v2
|
13
|
+
- uses: ruby/setup-ruby@v1
|
14
|
+
with:
|
15
|
+
ruby-version: ${{ matrix.ruby }}
|
16
|
+
- name: Install dependencies
|
17
|
+
run: |
|
18
|
+
sudo apt install libncursesw5-dev
|
19
|
+
gem install bundler --no-document
|
20
|
+
bundle install
|
21
|
+
- name: Build package
|
22
|
+
run: bundle exec rake build
|
23
|
+
- name: Install package
|
24
|
+
run: |
|
25
|
+
gem install pkg/curses-*.gem
|
26
|
+
ruby -r curses -e 'puts Curses::VERSION'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
name: windows
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: windows-latest
|
8
|
+
strategy:
|
9
|
+
matrix:
|
10
|
+
ruby: [ 'mingw', 'mswin', '2.7', '2.6', '2.5' ]
|
11
|
+
steps:
|
12
|
+
- uses: actions/checkout@v2
|
13
|
+
with:
|
14
|
+
submodules: true
|
15
|
+
- name: Set up Ruby
|
16
|
+
uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: ${{ matrix.ruby }}
|
19
|
+
bundler-cache: true
|
20
|
+
- name: Build package
|
21
|
+
run: bundle exec rake build
|
22
|
+
- name: Install package
|
23
|
+
run: |
|
24
|
+
gem install pkg/curses-*.gem
|
25
|
+
ruby -r curses -e 'puts Curses::VERSION'
|
data/History.md
CHANGED
@@ -1,3 +1,37 @@
|
|
1
|
+
### 1.4.2 / 2021-06-14
|
2
|
+
|
3
|
+
New features:
|
4
|
+
|
5
|
+
* Added samples for addch, attron, mouse tracking and colors.
|
6
|
+
Pull request #62 by coezbek.
|
7
|
+
|
8
|
+
### 1.4.1 / 2021-05-22
|
9
|
+
|
10
|
+
Bug fixes:
|
11
|
+
|
12
|
+
* Use chtype instead of char to support attributes
|
13
|
+
* Fixes for Ruby 3.1.
|
14
|
+
|
15
|
+
### 1.4.0 / 2020-12-10
|
16
|
+
|
17
|
+
New features:
|
18
|
+
|
19
|
+
* Remove fat binary support for newer versions of Ruby
|
20
|
+
|
21
|
+
### 1.3.2 / 2019-12-20
|
22
|
+
|
23
|
+
Bug fixes:
|
24
|
+
|
25
|
+
* Drop rb_safe_level check for Ruby 2.7 by Eric Wong.
|
26
|
+
* Try libtinfow first. Issue #52 by Marco Sirabella.
|
27
|
+
|
28
|
+
### 1.3.1 / 2019-04-21
|
29
|
+
|
30
|
+
Bug fixes:
|
31
|
+
|
32
|
+
* Check whether sizeof(WINDOW) is available to avoid build failures on macOS.
|
33
|
+
Issue #48 reported by chdiza.
|
34
|
+
|
1
35
|
### 1.3.0 / 2019-04-16
|
2
36
|
|
3
37
|
New features:
|
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# curses
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/curses)
|
4
|
-
[](https://github.com/ruby/curses/actions?query=workflow%3Aubuntu)
|
5
|
+
[](https://github.com/ruby/curses/actions?query=workflow%3Awindows)
|
6
|
+
[](https://github.com/ruby/curses/actions?query=workflow%3Amacos)
|
6
7
|
|
7
8
|
* https://github.com/ruby/curses
|
8
9
|
* https://github.com/ruby/curses/issues
|
@@ -18,7 +19,7 @@ with the release of Ruby 2.1.0. (see [ruby/ruby@9c5b2fd][2])
|
|
18
19
|
## Install
|
19
20
|
|
20
21
|
$ gem install curses
|
21
|
-
|
22
|
+
|
22
23
|
Requires ncurses or ncursesw (with wide character support).
|
23
24
|
On Debian based distributions, you can install it with apt:
|
24
25
|
|
@@ -28,6 +29,14 @@ Or
|
|
28
29
|
|
29
30
|
$ apt install libncursesw5-dev
|
30
31
|
|
32
|
+
On Windows, `gem install curses` will build bundled PDCurses, so you
|
33
|
+
don't need to install extra libraries.
|
34
|
+
However, if you prefer ncurses to PDCurses, specify the following option:
|
35
|
+
|
36
|
+
> gem install curses -- --use-system-libraries
|
37
|
+
|
38
|
+
On mingw, you need DevKit to compile the extension library.
|
39
|
+
|
31
40
|
## Documentation
|
32
41
|
|
33
42
|
See [https://www.rubydoc.info/gems/curses](https://www.rubydoc.info/gems/curses).
|
@@ -39,57 +48,16 @@ After checking out the repo, run `bundle install` to install dependencies.
|
|
39
48
|
To compile the extension library, run `bundle exec rake compile`.
|
40
49
|
|
41
50
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `curses.gemspec`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
42
|
-
|
43
|
-
### Cross compilation for Windows on Debian GNU/Linux based platforms
|
44
|
-
|
45
|
-
1. Install development environment fo 32- and 64-bit Windows.
|
46
|
-
|
47
|
-
```
|
48
|
-
$ sudo apt-get install mingw-w64
|
49
|
-
```
|
50
|
-
|
51
|
-
2. Install rake-compiler.
|
52
|
-
|
53
|
-
```
|
54
|
-
$ gem install rake-compiler
|
55
|
-
```
|
56
|
-
|
57
|
-
3. Compile multiple versions of Ruby.
|
58
|
-
|
59
|
-
```
|
60
|
-
$ rake-compiler cross-ruby HOST=i686-w64-mingw32 VERSION=2.2.6
|
61
|
-
$ rake-compiler cross-ruby HOST=i686-w64-mingw32 VERSION=2.3.3
|
62
|
-
$ rake-compiler cross-ruby HOST=i686-w64-mingw32 VERSION=2.4.0
|
63
|
-
$ rake-compiler cross-ruby HOST=x86_64-w64-mingw32 VERSION=2.2.6
|
64
|
-
$ rake-compiler cross-ruby HOST=x86_64-w64-mingw32 VERSION=2.3.3
|
65
|
-
$ rake-compiler cross-ruby HOST=x86_64-w64-mingw32 VERSION=2.4.0
|
66
|
-
```
|
67
|
-
|
68
|
-
3. Compile PDCurses.
|
69
|
-
|
70
|
-
```
|
71
|
-
$ rake build:pdcurses
|
72
|
-
```
|
73
|
-
|
74
|
-
5. Compile curses.gem.
|
75
|
-
|
76
|
-
```
|
77
|
-
$ rake RUBY_CC_VERSION=2.3.3:2.4.0 cross clean compile native gem
|
78
|
-
```
|
79
|
-
|
80
|
-
Binary gems are generated in pkg/.
|
81
|
-
|
82
51
|
## License
|
83
52
|
|
84
53
|
curses is released under the Ruby and 2-clause BSD licenses. See COPYING for
|
85
54
|
details.
|
86
55
|
|
87
|
-
|
88
|
-
the public domain:
|
56
|
+
It includes a forked version of PDCurses, which is in the public domain:
|
89
57
|
|
90
58
|
https://github.com/Bill-Gray/PDCurses
|
91
59
|
|
92
|
-
The version for Win32 console mode in the
|
60
|
+
The version for Win32 console mode in the wincon subdirectory is used.
|
93
61
|
|
94
62
|
[1]: https://bugs.ruby-lang.org/issues/8584
|
95
63
|
[2]: https://github.com/ruby/ruby/commit/9c5b2fd8aa0fd343ad094d47a638cfd3f6ae0a81
|
data/Rakefile
CHANGED
@@ -1,89 +1,3 @@
|
|
1
1
|
require "bundler"
|
2
2
|
|
3
3
|
Bundler::GemHelper.install_tasks
|
4
|
-
|
5
|
-
begin
|
6
|
-
require 'rake/extensiontask'
|
7
|
-
rescue LoadError => e
|
8
|
-
warn "\nmissing #{e.path} (for rake-compiler)" if e.respond_to? :path
|
9
|
-
warn "run: bundle install\n\n"
|
10
|
-
end
|
11
|
-
|
12
|
-
$mswin = /mswin/ =~ RUBY_PLATFORM
|
13
|
-
|
14
|
-
CLOBBER.include("vendor/#{RUBY_PLATFORM}") if $mswin
|
15
|
-
CLOBBER.include("vendor/x86-mingw32")
|
16
|
-
CLOBBER.include("vendor/x64-mingw32")
|
17
|
-
CLOBBER.include("lib/2.*")
|
18
|
-
CLOBBER.include("pkg")
|
19
|
-
|
20
|
-
namespace :build do
|
21
|
-
desc "Build PDCurses"
|
22
|
-
task :pdcurses do
|
23
|
-
mkdir_p "vendor/#{RUBY_PLATFORM}/PDCurses" if $mswin
|
24
|
-
mkdir_p "vendor/x86-mingw32/PDCurses"
|
25
|
-
mkdir_p "vendor/x64-mingw32/PDCurses"
|
26
|
-
chdir "vendor/PDCurses/wincon" do
|
27
|
-
if $mswin
|
28
|
-
sh "nmake -f Makefile.vc clean all WIDE=Y DLL=Y"
|
29
|
-
cp %w[pdcurses.dll pdcurses.lib], "../../#{RUBY_PLATFORM}/PDCurses"
|
30
|
-
else
|
31
|
-
sh "make -f Makefile.mng clean all WIDE=Y DLL=N"
|
32
|
-
cp "pdcurses.a", "../../x86-mingw32/PDCurses/libpdcurses.a"
|
33
|
-
|
34
|
-
sh "make -f Makefile.mng clean all _w64=1 WIDE=Y DLL=N"
|
35
|
-
cp "pdcurses.a", "../../x64-mingw32/PDCurses/libpdcurses.a"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
namespace :clean do
|
42
|
-
desc "Clean PDCurses"
|
43
|
-
task :pdcurses do
|
44
|
-
chdir "vendor/PDCurses/wincon" do
|
45
|
-
if $mswin
|
46
|
-
sh "nmake -f Makefile.vc clean"
|
47
|
-
else
|
48
|
-
sh "make -f Makefile.mng clean _linux_w64=1"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
spec = eval(File.read(File.expand_path("curses.gemspec", __dir__)))
|
55
|
-
Rake::ExtensionTask.new(spec.name, spec) do |ext|
|
56
|
-
if $mswin
|
57
|
-
ext.config_options << '--with-curses-include=' +
|
58
|
-
File.expand_path("vendor/PDCurses", __dir__) +
|
59
|
-
' --with-curses-version=function --enable-pdcurses-wide' +
|
60
|
-
' --enable-pdcurses-dll' +
|
61
|
-
' --with-curses-lib=' +
|
62
|
-
File.expand_path("vendor/#{RUBY_PLATFORM}/PDCurses", __dir__)
|
63
|
-
spec.files += ["vendor/#{RUBY_PLATFORM}/PDCurses/pdcurses.dll"]
|
64
|
-
end
|
65
|
-
|
66
|
-
ext.cross_compile = true
|
67
|
-
ext.cross_platform = ["x86-mingw32", "x64-mingw32"]
|
68
|
-
ext.cross_config_options << '--with-curses-include=' +
|
69
|
-
File.expand_path("vendor/PDCurses", __dir__) +
|
70
|
-
' --with-curses-version=function --enable-pdcurses-wide'
|
71
|
-
ext.cross_config_options << {
|
72
|
-
'x86-mingw32' => '--with-curses-lib=' +
|
73
|
-
File.expand_path("vendor/x86-mingw32/PDCurses", __dir__),
|
74
|
-
'x64-mingw32' => '--with-curses-lib=' +
|
75
|
-
File.expand_path("vendor/x64-mingw32/PDCurses", __dir__)
|
76
|
-
}
|
77
|
-
if $mswin
|
78
|
-
ext.cross_compiling do |_spec|
|
79
|
-
bin_file = "vendor/#{_spec.platform}/PDCurses/pdcurses.dll"
|
80
|
-
_spec.files += [bin_file]
|
81
|
-
stage_file = "#{ext.tmp_dir}/#{_spec.platform}/stage/#{bin_file}"
|
82
|
-
stage_dir = File.dirname(stage_file)
|
83
|
-
directory stage_dir
|
84
|
-
file stage_file => [stage_dir, bin_file] do
|
85
|
-
cp bin_file, stage_file
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
data/curses.gemspec
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
Gem::Specification.new { |s|
|
2
2
|
s.name = "curses"
|
3
|
-
s.version = "1.
|
3
|
+
s.version = "1.4.2"
|
4
4
|
s.author = ["Shugo Maeda", 'Eric Hodel']
|
5
5
|
s.email = ["shugo@ruby-lang.org", 'drbrain@segment7.net']
|
6
6
|
s.homepage = "https://github.com/ruby/curses"
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.summary = "A Ruby binding for curses, ncurses, and PDCurses. curses is an extension library for text UI applications. Formerly part of the Ruby standard library, [curses was removed and placed in this gem][1] with the release of Ruby 2.1.0. (see [ruby/ruby@9c5b2fd][2])"
|
9
|
-
s.files = `git ls-files -z`.split("\x0")
|
9
|
+
s.files = `git ls-files --recurse-submodules -z`.split("\x0")
|
10
10
|
s.extensions = ["ext/curses/extconf.rb"]
|
11
11
|
s.require_path = "lib"
|
12
12
|
s.required_ruby_version = Gem::Requirement.new('>= 2.1.0')
|
13
13
|
s.licenses = ['Ruby', 'BSD-2-Clause']
|
14
14
|
s.add_development_dependency 'bundler'
|
15
15
|
s.add_development_dependency 'rake'
|
16
|
-
s.add_development_dependency 'rake-compiler'
|
17
16
|
}
|
data/ext/curses/curses.c
CHANGED
@@ -20,7 +20,9 @@
|
|
20
20
|
#include "ruby/io.h"
|
21
21
|
#include "ruby/thread.h"
|
22
22
|
|
23
|
-
#if defined(
|
23
|
+
#if defined(HAVE_PDCURSES_H)
|
24
|
+
# include <pdcurses.h>
|
25
|
+
#elif defined(HAVE_NCURSESW_CURSES_H)
|
24
26
|
# include <ncursesw/curses.h>
|
25
27
|
#elif defined(HAVE_NCURSES_CURSES_H)
|
26
28
|
# include <ncurses/curses.h>
|
@@ -80,8 +82,19 @@
|
|
80
82
|
# define USE_MOUSE 1
|
81
83
|
#endif
|
82
84
|
|
83
|
-
#define
|
84
|
-
|
85
|
+
#define OBJ2CHTYPE rb_obj2chtype_inline
|
86
|
+
|
87
|
+
static inline chtype
|
88
|
+
rb_obj2chtype_inline(VALUE x)
|
89
|
+
{
|
90
|
+
if (RB_TYPE_P(x, RUBY_T_STRING)) {
|
91
|
+
ID id_ord;
|
92
|
+
|
93
|
+
CONST_ID(id_ord, "ord");
|
94
|
+
x = rb_funcall(x, id_ord, 0);
|
95
|
+
}
|
96
|
+
return NUM2CHTYPE(x);
|
97
|
+
}
|
85
98
|
|
86
99
|
static VALUE mCurses;
|
87
100
|
static VALUE mKey;
|
@@ -213,6 +226,7 @@ static VALUE window_attroff(VALUE obj, VALUE attrs);
|
|
213
226
|
static VALUE window_attron(VALUE obj, VALUE attrs);
|
214
227
|
static VALUE window_attrset(VALUE obj, VALUE attrs);
|
215
228
|
|
229
|
+
NORETURN(static void no_window(void));
|
216
230
|
static void
|
217
231
|
no_window(void)
|
218
232
|
{
|
@@ -220,8 +234,6 @@ no_window(void)
|
|
220
234
|
}
|
221
235
|
|
222
236
|
#define GetWINDOW(obj, winp) do {\
|
223
|
-
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)\
|
224
|
-
rb_raise(rb_eSecurityError, "Insecure: operation on untainted window");\
|
225
237
|
TypedData_Get_Struct((obj), struct windata, &windata_type, (winp));\
|
226
238
|
if ((winp)->window == 0) no_window();\
|
227
239
|
} while (0)
|
@@ -241,7 +253,7 @@ window_memsize(const void *p)
|
|
241
253
|
const struct windata *winp = p;
|
242
254
|
size_t size = sizeof(*winp);
|
243
255
|
if (!winp) return 0;
|
244
|
-
if (winp->window && winp->window != stdscr) size +=
|
256
|
+
if (winp->window && winp->window != stdscr) size += CURSES_SIZEOF_WINDOW;
|
245
257
|
return size;
|
246
258
|
}
|
247
259
|
|
@@ -290,7 +302,7 @@ static void curses_finalize(VALUE);
|
|
290
302
|
* see also Curses.stdscr
|
291
303
|
*/
|
292
304
|
static VALUE
|
293
|
-
curses_init_screen(
|
305
|
+
curses_init_screen(VALUE self)
|
294
306
|
{
|
295
307
|
if (rb_stdscr) return rb_stdscr;
|
296
308
|
initscr();
|
@@ -313,7 +325,7 @@ curses_init_screen(void)
|
|
313
325
|
*
|
314
326
|
* Many curses functions use this window.
|
315
327
|
*/
|
316
|
-
#define curses_stdscr curses_init_screen
|
328
|
+
#define curses_stdscr() curses_init_screen(Qnil)
|
317
329
|
|
318
330
|
/*
|
319
331
|
* Document-method: Curses.close_screen
|
@@ -329,7 +341,7 @@ curses_init_screen(void)
|
|
329
341
|
*
|
330
342
|
*/
|
331
343
|
static VALUE
|
332
|
-
curses_close_screen(
|
344
|
+
curses_close_screen(VALUE self)
|
333
345
|
{
|
334
346
|
curses_stdscr();
|
335
347
|
#ifdef HAVE_ISENDWIN
|
@@ -369,7 +381,7 @@ curses_finalize(VALUE dummy)
|
|
369
381
|
* returns +false+ otherwise.
|
370
382
|
*/
|
371
383
|
static VALUE
|
372
|
-
curses_closed(
|
384
|
+
curses_closed(VALUE self)
|
373
385
|
{
|
374
386
|
curses_stdscr();
|
375
387
|
if (isendwin()) {
|
@@ -419,7 +431,7 @@ curses_erase(VALUE obj)
|
|
419
431
|
* Clears to the end of line, that the cursor is currently on.
|
420
432
|
*/
|
421
433
|
static VALUE
|
422
|
-
curses_clrtoeol(
|
434
|
+
curses_clrtoeol(VALUE self)
|
423
435
|
{
|
424
436
|
curses_stdscr();
|
425
437
|
clrtoeol();
|
@@ -746,7 +758,7 @@ static VALUE
|
|
746
758
|
curses_inch(VALUE obj)
|
747
759
|
{
|
748
760
|
curses_stdscr();
|
749
|
-
return
|
761
|
+
return CHTYPE2NUM(inch());
|
750
762
|
}
|
751
763
|
|
752
764
|
/*
|
@@ -761,7 +773,7 @@ static VALUE
|
|
761
773
|
curses_addch(VALUE obj, VALUE ch)
|
762
774
|
{
|
763
775
|
curses_stdscr();
|
764
|
-
addch(
|
776
|
+
addch(OBJ2CHTYPE(ch));
|
765
777
|
return Qnil;
|
766
778
|
}
|
767
779
|
|
@@ -776,7 +788,7 @@ static VALUE
|
|
776
788
|
curses_insch(VALUE obj, VALUE ch)
|
777
789
|
{
|
778
790
|
curses_stdscr();
|
779
|
-
insch(
|
791
|
+
insch(OBJ2CHTYPE(ch));
|
780
792
|
return Qnil;
|
781
793
|
}
|
782
794
|
|
@@ -857,7 +869,7 @@ getstr_func(void *arg)
|
|
857
869
|
/*
|
858
870
|
* Document-method: Curses.getstr
|
859
871
|
*
|
860
|
-
* This is equivalent to a series
|
872
|
+
* This is equivalent to a series of Curses::Window.getch calls
|
861
873
|
*
|
862
874
|
*/
|
863
875
|
static VALUE
|
@@ -948,7 +960,7 @@ curses_keyname(VALUE obj, VALUE c)
|
|
948
960
|
* Returns the number of lines on the screen
|
949
961
|
*/
|
950
962
|
static VALUE
|
951
|
-
curses_lines(
|
963
|
+
curses_lines(VALUE self)
|
952
964
|
{
|
953
965
|
return INT2FIX(LINES);
|
954
966
|
}
|
@@ -959,7 +971,7 @@ curses_lines(void)
|
|
959
971
|
* Returns the number of columns on the screen
|
960
972
|
*/
|
961
973
|
static VALUE
|
962
|
-
curses_cols(
|
974
|
+
curses_cols(VALUE self)
|
963
975
|
{
|
964
976
|
return INT2FIX(COLS);
|
965
977
|
}
|
@@ -1105,7 +1117,7 @@ curses_bkgdset(VALUE obj, VALUE ch)
|
|
1105
1117
|
{
|
1106
1118
|
#ifdef HAVE_BKGDSET
|
1107
1119
|
curses_stdscr();
|
1108
|
-
bkgdset(
|
1120
|
+
bkgdset(OBJ2CHTYPE(ch));
|
1109
1121
|
#endif
|
1110
1122
|
return Qnil;
|
1111
1123
|
}
|
@@ -1126,7 +1138,7 @@ curses_bkgd(VALUE obj, VALUE ch)
|
|
1126
1138
|
{
|
1127
1139
|
#ifdef HAVE_BKGD
|
1128
1140
|
curses_stdscr();
|
1129
|
-
return (bkgd(
|
1141
|
+
return (bkgd(OBJ2CHTYPE(ch)) == OK) ? Qtrue : Qfalse;
|
1130
1142
|
#else
|
1131
1143
|
return Qfalse;
|
1132
1144
|
#endif
|
@@ -1439,6 +1451,7 @@ struct mousedata {
|
|
1439
1451
|
MEVENT *mevent;
|
1440
1452
|
};
|
1441
1453
|
|
1454
|
+
NORETURN(static void no_mevent(void));
|
1442
1455
|
static void
|
1443
1456
|
no_mevent(void)
|
1444
1457
|
{
|
@@ -1446,8 +1459,6 @@ no_mevent(void)
|
|
1446
1459
|
}
|
1447
1460
|
|
1448
1461
|
#define GetMOUSE(obj, data) do {\
|
1449
|
-
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)\
|
1450
|
-
rb_raise(rb_eSecurityError, "Insecure: operation on untainted mouse");\
|
1451
1462
|
TypedData_Get_Struct((obj), struct mousedata, &mousedata_type, (data));\
|
1452
1463
|
if ((data)->mevent == 0) no_mevent();\
|
1453
1464
|
} while (0)
|
@@ -1466,7 +1477,7 @@ curses_mousedata_memsize(const void *p)
|
|
1466
1477
|
const struct mousedata *mdata = p;
|
1467
1478
|
size_t size = sizeof(*mdata);
|
1468
1479
|
if (!mdata) return 0;
|
1469
|
-
if (mdata->mevent) size +=
|
1480
|
+
if (mdata->mevent) size += CURSES_SIZEOF_MEVENT;
|
1470
1481
|
return size;
|
1471
1482
|
}
|
1472
1483
|
|
@@ -1548,7 +1559,7 @@ static VALUE
|
|
1548
1559
|
curses_mousemask(VALUE obj, VALUE mask)
|
1549
1560
|
{
|
1550
1561
|
curses_stdscr();
|
1551
|
-
return
|
1562
|
+
return ULONG2NUM(mousemask(NUM2UINT(mask),NULL));
|
1552
1563
|
}
|
1553
1564
|
|
1554
1565
|
#define DEFINE_MOUSE_GET_MEMBER(func_name,mem) \
|
@@ -1589,7 +1600,12 @@ DEFINE_MOUSE_GET_MEMBER(curs_mouse_z, z)
|
|
1589
1600
|
* Returns the current mouse's button state. Use this with the button state
|
1590
1601
|
* constants to determine which buttons were pressed.
|
1591
1602
|
*/
|
1592
|
-
|
1603
|
+
static VALUE curs_mouse_bstate(VALUE mouse)
|
1604
|
+
{
|
1605
|
+
struct mousedata *mdata;
|
1606
|
+
GetMOUSE(mouse, mdata);
|
1607
|
+
return ULONG2NUM(mdata->mevent->bstate);
|
1608
|
+
}
|
1593
1609
|
#undef define_curs_mouse_member
|
1594
1610
|
#endif /* USE_MOUSE */
|
1595
1611
|
|
@@ -1681,7 +1697,7 @@ window_initialize(VALUE obj, VALUE h, VALUE w, VALUE top, VALUE left)
|
|
1681
1697
|
struct windata *winp;
|
1682
1698
|
WINDOW *window;
|
1683
1699
|
|
1684
|
-
curses_init_screen();
|
1700
|
+
curses_init_screen(Qnil);
|
1685
1701
|
TypedData_Get_Struct(obj, struct windata, &windata_type, winp);
|
1686
1702
|
if (winp->window) delwin(winp->window);
|
1687
1703
|
window = newwin(NUM2INT(h), NUM2INT(w), NUM2INT(top), NUM2INT(left));
|
@@ -2178,7 +2194,7 @@ window_begx(VALUE obj)
|
|
2178
2194
|
|
2179
2195
|
/*
|
2180
2196
|
* Document-method: Curses::Window.box
|
2181
|
-
* call-seq: box(vert, hor)
|
2197
|
+
* call-seq: box(vert = nil, hor = nil, corn = nil)
|
2182
2198
|
*
|
2183
2199
|
* set the characters to frame the window in.
|
2184
2200
|
* The vertical +vert+ and horizontal +hor+ character.
|
@@ -2193,16 +2209,18 @@ window_box(int argc, VALUE *argv, VALUE self)
|
|
2193
2209
|
struct windata *winp;
|
2194
2210
|
VALUE vert, hor, corn;
|
2195
2211
|
|
2196
|
-
rb_scan_args(argc, argv, "
|
2212
|
+
rb_scan_args(argc, argv, "03", &vert, &hor, &corn);
|
2197
2213
|
|
2198
2214
|
GetWINDOW(self, winp);
|
2199
|
-
box(winp->window,
|
2215
|
+
box(winp->window,
|
2216
|
+
NIL_P(vert) ? 0 : OBJ2CHTYPE(vert),
|
2217
|
+
NIL_P(hor) ? 0 : OBJ2CHTYPE(hor));
|
2200
2218
|
|
2201
2219
|
if (!NIL_P(corn)) {
|
2202
2220
|
int cur_x, cur_y, x, y;
|
2203
2221
|
chtype c;
|
2204
2222
|
|
2205
|
-
c =
|
2223
|
+
c = OBJ2CHTYPE(corn);
|
2206
2224
|
getyx(winp->window, cur_y, cur_x);
|
2207
2225
|
x = NUM2INT(window_maxx(self)) - 1;
|
2208
2226
|
y = NUM2INT(window_maxy(self)) - 1;
|
@@ -2269,7 +2287,7 @@ window_inch(VALUE obj)
|
|
2269
2287
|
struct windata *winp;
|
2270
2288
|
|
2271
2289
|
GetWINDOW(obj, winp);
|
2272
|
-
return
|
2290
|
+
return CHTYPE2NUM(winch(winp->window));
|
2273
2291
|
}
|
2274
2292
|
|
2275
2293
|
/*
|
@@ -2286,7 +2304,7 @@ window_addch(VALUE obj, VALUE ch)
|
|
2286
2304
|
struct windata *winp;
|
2287
2305
|
|
2288
2306
|
GetWINDOW(obj, winp);
|
2289
|
-
waddch(winp->window,
|
2307
|
+
waddch(winp->window, OBJ2CHTYPE(ch));
|
2290
2308
|
|
2291
2309
|
return Qnil;
|
2292
2310
|
}
|
@@ -2304,7 +2322,7 @@ window_insch(VALUE obj, VALUE ch)
|
|
2304
2322
|
struct windata *winp;
|
2305
2323
|
|
2306
2324
|
GetWINDOW(obj, winp);
|
2307
|
-
winsch(winp->window,
|
2325
|
+
winsch(winp->window, OBJ2CHTYPE(ch));
|
2308
2326
|
|
2309
2327
|
return Qnil;
|
2310
2328
|
}
|
@@ -2414,7 +2432,7 @@ wgetstr_func(void *_arg)
|
|
2414
2432
|
/*
|
2415
2433
|
* Document-method: Curses::Window.getstr
|
2416
2434
|
*
|
2417
|
-
* This is equivalent to a series
|
2435
|
+
* This is equivalent to a series of Curses::Window.getch calls
|
2418
2436
|
*
|
2419
2437
|
*/
|
2420
2438
|
static VALUE
|
@@ -2732,7 +2750,7 @@ window_bkgdset(VALUE obj, VALUE ch)
|
|
2732
2750
|
struct windata *winp;
|
2733
2751
|
|
2734
2752
|
GetWINDOW(obj,winp);
|
2735
|
-
wbkgdset(winp->window,
|
2753
|
+
wbkgdset(winp->window, OBJ2CHTYPE(ch));
|
2736
2754
|
#endif
|
2737
2755
|
return Qnil;
|
2738
2756
|
}
|
@@ -2753,7 +2771,7 @@ window_bkgd(VALUE obj, VALUE ch)
|
|
2753
2771
|
struct windata *winp;
|
2754
2772
|
|
2755
2773
|
GetWINDOW(obj,winp);
|
2756
|
-
return (wbkgd(winp->window,
|
2774
|
+
return (wbkgd(winp->window, OBJ2CHTYPE(ch)) == OK) ? Qtrue : Qfalse;
|
2757
2775
|
#else
|
2758
2776
|
return Qfalse;
|
2759
2777
|
#endif
|
@@ -2921,7 +2939,7 @@ pad_initialize(VALUE obj, VALUE h, VALUE w)
|
|
2921
2939
|
struct windata *padp;
|
2922
2940
|
WINDOW *window;
|
2923
2941
|
|
2924
|
-
curses_init_screen();
|
2942
|
+
curses_init_screen(Qnil);
|
2925
2943
|
TypedData_Get_Struct(obj, struct windata, &windata_type, padp);
|
2926
2944
|
if (padp->window) delwin(padp->window);
|
2927
2945
|
window = newpad(NUM2INT(h), NUM2INT(w));
|
@@ -3042,8 +3060,6 @@ no_item(void)
|
|
3042
3060
|
}
|
3043
3061
|
|
3044
3062
|
#define GetITEM(obj, itemp) do {\
|
3045
|
-
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)\
|
3046
|
-
rb_raise(rb_eSecurityError, "Insecure: operation on untainted item");\
|
3047
3063
|
TypedData_Get_Struct((obj), struct itemdata, &itemdata_type, (itemp));\
|
3048
3064
|
if ((itemp)->item == 0) no_item();\
|
3049
3065
|
} while (0)
|
@@ -3063,7 +3079,7 @@ item_memsize(const void *p)
|
|
3063
3079
|
const struct itemdata *itemp = p;
|
3064
3080
|
size_t size = sizeof(*itemp);
|
3065
3081
|
if (!itemp) return 0;
|
3066
|
-
if (itemp->item) size +=
|
3082
|
+
if (itemp->item) size += CURSES_SIZEOF_ITEM;
|
3067
3083
|
return size;
|
3068
3084
|
}
|
3069
3085
|
|
@@ -3094,7 +3110,7 @@ item_initialize(VALUE obj, VALUE name, VALUE description)
|
|
3094
3110
|
{
|
3095
3111
|
struct itemdata *itemp;
|
3096
3112
|
|
3097
|
-
curses_init_screen();
|
3113
|
+
curses_init_screen(Qnil);
|
3098
3114
|
TypedData_Get_Struct(obj, struct itemdata, &itemdata_type, itemp);
|
3099
3115
|
if (itemp->item) {
|
3100
3116
|
rb_raise(rb_eRuntimeError, "already initialized item");
|
@@ -3242,8 +3258,6 @@ no_menu(void)
|
|
3242
3258
|
}
|
3243
3259
|
|
3244
3260
|
#define GetMENU(obj, menup) do {\
|
3245
|
-
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)\
|
3246
|
-
rb_raise(rb_eSecurityError, "Insecure: operation on untainted menu");\
|
3247
3261
|
TypedData_Get_Struct((obj), struct menudata, &menudata_type, (menup));\
|
3248
3262
|
if ((menup)->menu == 0) no_menu();\
|
3249
3263
|
} while (0)
|
@@ -3274,7 +3288,7 @@ menu_memsize(const void *p)
|
|
3274
3288
|
const struct menudata *menup = p;
|
3275
3289
|
size_t size = sizeof(*menup);
|
3276
3290
|
if (!menup) return 0;
|
3277
|
-
if (menup->menu) size +=
|
3291
|
+
if (menup->menu) size += CURSES_SIZEOF_MENU;
|
3278
3292
|
return size;
|
3279
3293
|
}
|
3280
3294
|
|
@@ -3309,7 +3323,7 @@ menu_initialize(VALUE obj, VALUE items)
|
|
3309
3323
|
ID id_new;
|
3310
3324
|
|
3311
3325
|
Check_Type(items, T_ARRAY);
|
3312
|
-
curses_init_screen();
|
3326
|
+
curses_init_screen(Qnil);
|
3313
3327
|
TypedData_Get_Struct(obj, struct menudata, &menudata_type, menup);
|
3314
3328
|
if (menup->menu) {
|
3315
3329
|
rb_raise(rb_eRuntimeError, "already initialized menu");
|
@@ -3706,6 +3720,7 @@ struct fielddata {
|
|
3706
3720
|
FIELD *field;
|
3707
3721
|
};
|
3708
3722
|
|
3723
|
+
NORETURN(static void no_field(void));
|
3709
3724
|
static void
|
3710
3725
|
no_field(void)
|
3711
3726
|
{
|
@@ -3713,8 +3728,6 @@ no_field(void)
|
|
3713
3728
|
}
|
3714
3729
|
|
3715
3730
|
#define GetFIELD(obj, fieldp) do {\
|
3716
|
-
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)\
|
3717
|
-
rb_raise(rb_eSecurityError, "Insecure: operation on untainted field");\
|
3718
3731
|
TypedData_Get_Struct((obj), struct fielddata, &fielddata_type, (fieldp));\
|
3719
3732
|
if ((fieldp)->field == 0) no_field();\
|
3720
3733
|
} while (0)
|
@@ -3734,7 +3747,7 @@ field_memsize(const void *p)
|
|
3734
3747
|
const struct fielddata *fieldp = p;
|
3735
3748
|
size_t size = sizeof(*fieldp);
|
3736
3749
|
if (!fieldp) return 0;
|
3737
|
-
if (fieldp->field) size +=
|
3750
|
+
if (fieldp->field) size += CURSES_SIZEOF_FIELD;
|
3738
3751
|
return size;
|
3739
3752
|
}
|
3740
3753
|
|
@@ -3766,7 +3779,7 @@ field_initialize(VALUE obj, VALUE height, VALUE width,
|
|
3766
3779
|
{
|
3767
3780
|
struct fielddata *fieldp;
|
3768
3781
|
|
3769
|
-
curses_init_screen();
|
3782
|
+
curses_init_screen(Qnil);
|
3770
3783
|
TypedData_Get_Struct(obj, struct fielddata, &fielddata_type, fieldp);
|
3771
3784
|
if (fieldp->field) {
|
3772
3785
|
rb_raise(rb_eRuntimeError, "already initialized field");
|
@@ -4152,6 +4165,7 @@ struct formdata {
|
|
4152
4165
|
VALUE fields;
|
4153
4166
|
};
|
4154
4167
|
|
4168
|
+
NORETURN(static void no_form(void));
|
4155
4169
|
static void
|
4156
4170
|
no_form(void)
|
4157
4171
|
{
|
@@ -4159,8 +4173,6 @@ no_form(void)
|
|
4159
4173
|
}
|
4160
4174
|
|
4161
4175
|
#define GetFORM(obj, formp) do {\
|
4162
|
-
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)\
|
4163
|
-
rb_raise(rb_eSecurityError, "Insecure: operation on untainted form");\
|
4164
4176
|
TypedData_Get_Struct((obj), struct formdata, &formdata_type, (formp));\
|
4165
4177
|
if ((formp)->form == 0) no_form();\
|
4166
4178
|
} while (0)
|
@@ -4191,7 +4203,7 @@ form_memsize(const void *p)
|
|
4191
4203
|
const struct formdata *formp = p;
|
4192
4204
|
size_t size = sizeof(*formp);
|
4193
4205
|
if (!formp) return 0;
|
4194
|
-
if (formp->form) size +=
|
4206
|
+
if (formp->form) size += CURSES_SIZEOF_FORM;
|
4195
4207
|
return size;
|
4196
4208
|
}
|
4197
4209
|
|
@@ -4225,7 +4237,7 @@ form_initialize(VALUE obj, VALUE fields)
|
|
4225
4237
|
int i;
|
4226
4238
|
|
4227
4239
|
Check_Type(fields, T_ARRAY);
|
4228
|
-
curses_init_screen();
|
4240
|
+
curses_init_screen(Qnil);
|
4229
4241
|
TypedData_Get_Struct(obj, struct formdata, &formdata_type, formp);
|
4230
4242
|
if (formp->form) {
|
4231
4243
|
rb_raise(rb_eRuntimeError, "already initialized form");
|
@@ -4725,7 +4737,7 @@ Init_curses(void)
|
|
4725
4737
|
rb_define_module_function(mCurses, "init_screen", curses_init_screen, 0);
|
4726
4738
|
rb_define_module_function(mCurses, "close_screen", curses_close_screen, 0);
|
4727
4739
|
rb_define_module_function(mCurses, "closed?", curses_closed, 0);
|
4728
|
-
rb_define_module_function(mCurses, "stdscr",
|
4740
|
+
rb_define_module_function(mCurses, "stdscr", curses_init_screen, 0);
|
4729
4741
|
rb_define_module_function(mCurses, "refresh", curses_refresh, 0);
|
4730
4742
|
rb_define_module_function(mCurses, "doupdate", curses_doupdate, 0);
|
4731
4743
|
rb_define_module_function(mCurses, "clear", curses_clear, 0);
|
@@ -4865,7 +4877,7 @@ Init_curses(void)
|
|
4865
4877
|
* win.close
|
4866
4878
|
*
|
4867
4879
|
*/
|
4868
|
-
cWindow = rb_define_class_under(mCurses, "Window",
|
4880
|
+
cWindow = rb_define_class_under(mCurses, "Window", rb_cObject);
|
4869
4881
|
rb_define_alloc_func(cWindow, window_s_allocate);
|
4870
4882
|
rb_define_method(cWindow, "initialize", window_initialize, 4);
|
4871
4883
|
rb_define_method(cWindow, "subwin", window_subwin, 4);
|
@@ -4949,7 +4961,7 @@ Init_curses(void)
|
|
4949
4961
|
#endif
|
4950
4962
|
|
4951
4963
|
#ifdef HAVE_MENU
|
4952
|
-
cItem = rb_define_class_under(mCurses, "Item",
|
4964
|
+
cItem = rb_define_class_under(mCurses, "Item", rb_cObject);
|
4953
4965
|
rb_define_alloc_func(cItem, item_s_allocate);
|
4954
4966
|
rb_define_method(cItem, "initialize", item_initialize, 2);
|
4955
4967
|
rb_define_method(cItem, "==", item_eq, 1);
|
@@ -4960,7 +4972,7 @@ Init_curses(void)
|
|
4960
4972
|
rb_define_method(cItem, "opts_off", item_opts_off_m, 1);
|
4961
4973
|
rb_define_method(cItem, "opts", item_opts_m, 0);
|
4962
4974
|
|
4963
|
-
cMenu = rb_define_class_under(mCurses, "Menu",
|
4975
|
+
cMenu = rb_define_class_under(mCurses, "Menu", rb_cObject);
|
4964
4976
|
rb_define_alloc_func(cMenu, menu_s_allocate);
|
4965
4977
|
rb_define_method(cMenu, "initialize", menu_initialize, 1);
|
4966
4978
|
rb_define_method(cMenu, "post", menu_post, 0);
|
@@ -4983,7 +4995,7 @@ Init_curses(void)
|
|
4983
4995
|
#endif
|
4984
4996
|
|
4985
4997
|
#ifdef HAVE_FORM
|
4986
|
-
cField = rb_define_class_under(mCurses, "Field",
|
4998
|
+
cField = rb_define_class_under(mCurses, "Field", rb_cObject);
|
4987
4999
|
rb_define_alloc_func(cField, field_s_allocate);
|
4988
5000
|
rb_define_method(cField, "initialize", field_initialize, 6);
|
4989
5001
|
rb_define_method(cField, "set_buffer", field_set_buffer, 2);
|
@@ -5010,7 +5022,7 @@ Init_curses(void)
|
|
5010
5022
|
rb_define_method(cField, "max=", field_set_max, 1);
|
5011
5023
|
rb_define_method(cField, "set_type", field_set_type, -1);
|
5012
5024
|
|
5013
|
-
cForm = rb_define_class_under(mCurses, "Form",
|
5025
|
+
cForm = rb_define_class_under(mCurses, "Form", rb_cObject);
|
5014
5026
|
rb_define_alloc_func(cForm, form_s_allocate);
|
5015
5027
|
rb_define_method(cForm, "initialize", form_initialize, 1);
|
5016
5028
|
rb_define_method(cForm, "post", form_post, 0);
|