curses 1.4.0 → 1.4.4.beta.1
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/ubuntu.yml +1 -1
- data/.github/workflows/windows.yml +3 -6
- data/History.md +21 -0
- data/README.md +11 -46
- data/curses.gemspec +2 -2
- data/ext/curses/curses.c +192 -38
- data/sample/addch.rb +19 -0
- data/sample/attr_demo.rb +32 -0
- data/sample/colors.rb +26 -0
- data/sample/mouse_move.rb +75 -0
- metadata +10 -8
- 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: 68047bdb2e3dbf7718cfb3b610341764662471b0ed74ba0cedb749976cbfa01f
|
4
|
+
data.tar.gz: 58f8fcd098df7f5895446944acaa21b8f70cbe100ec4ba7aed434b4d9d91f0f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a510a9e12e08c77fbb855f519d48c923f95024fb12dbccfbae1138106ee3b9e47f1dcf08ef5fc3b66becaf2c00b79c4f7199691067177043ca2544b7c146e633
|
7
|
+
data.tar.gz: 7cefd71ef4136bc52fdfe4b1bb198310a6220f3fe5ae2c793c8e0fa2d8ca6eb7180f61b6fc80aa23d32f60e37ee81ce82a882512567e9474985dae777c8da3cf
|
@@ -7,19 +7,16 @@ jobs:
|
|
7
7
|
runs-on: windows-latest
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
|
-
ruby: [ '
|
10
|
+
ruby: [ 'mingw', 'mswin', '2.7', '2.6' ]
|
11
11
|
steps:
|
12
12
|
- uses: actions/checkout@v2
|
13
13
|
with:
|
14
14
|
submodules: true
|
15
15
|
- name: Set up Ruby
|
16
|
-
uses:
|
16
|
+
uses: ruby/setup-ruby@v1
|
17
17
|
with:
|
18
18
|
ruby-version: ${{ matrix.ruby }}
|
19
|
-
|
20
|
-
run: |
|
21
|
-
gem install bundler --no-document
|
22
|
-
bundle install
|
19
|
+
bundler-cache: true
|
23
20
|
- name: Build package
|
24
21
|
run: bundle exec rake build
|
25
22
|
- name: Install package
|
data/History.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
### 1.4.3 / 2022-01-06
|
2
|
+
|
3
|
+
New features:
|
4
|
+
|
5
|
+
* Added flushinp, menu mark, fore and back functions.
|
6
|
+
Pull request #66 by Isty001.
|
7
|
+
|
8
|
+
### 1.4.2 / 2021-06-14
|
9
|
+
|
10
|
+
New features:
|
11
|
+
|
12
|
+
* Added samples for addch, attron, mouse tracking and colors.
|
13
|
+
Pull request #62 by coezbek.
|
14
|
+
|
15
|
+
### 1.4.1 / 2021-05-22
|
16
|
+
|
17
|
+
Bug fixes:
|
18
|
+
|
19
|
+
* Use chtype instead of char to support attributes
|
20
|
+
* Fixes for Ruby 3.1.
|
21
|
+
|
1
22
|
### 1.4.0 / 2020-12-10
|
2
23
|
|
3
24
|
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
|
@@ -28,8 +29,13 @@ Or
|
|
28
29
|
|
29
30
|
$ apt install libncursesw5-dev
|
30
31
|
|
31
|
-
On
|
32
|
+
On Windows, `gem install curses` will build bundled PDCurses, so you
|
32
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.
|
33
39
|
|
34
40
|
## Documentation
|
35
41
|
|
@@ -42,57 +48,16 @@ After checking out the repo, run `bundle install` to install dependencies.
|
|
42
48
|
To compile the extension library, run `bundle exec rake compile`.
|
43
49
|
|
44
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).
|
45
|
-
|
46
|
-
### Cross compilation for Windows on Debian GNU/Linux based platforms
|
47
|
-
|
48
|
-
1. Install development environment fo 32- and 64-bit Windows.
|
49
|
-
|
50
|
-
```
|
51
|
-
$ sudo apt-get install mingw-w64
|
52
|
-
```
|
53
|
-
|
54
|
-
2. Install rake-compiler.
|
55
|
-
|
56
|
-
```
|
57
|
-
$ gem install rake-compiler
|
58
|
-
```
|
59
|
-
|
60
|
-
3. Compile multiple versions of Ruby.
|
61
|
-
|
62
|
-
```
|
63
|
-
$ rake-compiler cross-ruby HOST=i686-w64-mingw32 VERSION=2.2.6
|
64
|
-
$ rake-compiler cross-ruby HOST=i686-w64-mingw32 VERSION=2.3.3
|
65
|
-
$ rake-compiler cross-ruby HOST=i686-w64-mingw32 VERSION=2.4.0
|
66
|
-
$ rake-compiler cross-ruby HOST=x86_64-w64-mingw32 VERSION=2.2.6
|
67
|
-
$ rake-compiler cross-ruby HOST=x86_64-w64-mingw32 VERSION=2.3.3
|
68
|
-
$ rake-compiler cross-ruby HOST=x86_64-w64-mingw32 VERSION=2.4.0
|
69
|
-
```
|
70
|
-
|
71
|
-
3. Compile PDCurses.
|
72
|
-
|
73
|
-
```
|
74
|
-
$ rake build:pdcurses
|
75
|
-
```
|
76
|
-
|
77
|
-
5. Compile curses.gem.
|
78
|
-
|
79
|
-
```
|
80
|
-
$ rake RUBY_CC_VERSION=2.3.3:2.4.0 cross clean compile native gem
|
81
|
-
```
|
82
|
-
|
83
|
-
Binary gems are generated in pkg/.
|
84
|
-
|
85
51
|
## License
|
86
52
|
|
87
53
|
curses is released under the Ruby and 2-clause BSD licenses. See COPYING for
|
88
54
|
details.
|
89
55
|
|
90
|
-
|
91
|
-
the public domain:
|
56
|
+
It includes a forked version of PDCurses, which is in the public domain:
|
92
57
|
|
93
58
|
https://github.com/Bill-Gray/PDCurses
|
94
59
|
|
95
|
-
The version for Win32 console mode in the
|
60
|
+
The version for Win32 console mode in the wincon subdirectory is used.
|
96
61
|
|
97
62
|
[1]: https://bugs.ruby-lang.org/issues/8584
|
98
63
|
[2]: https://github.com/ruby/ruby/commit/9c5b2fd8aa0fd343ad094d47a638cfd3f6ae0a81
|
data/curses.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new { |s|
|
2
2
|
s.name = "curses"
|
3
|
-
s.version = "1.4.
|
3
|
+
s.version = "1.4.4.beta.1"
|
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"
|
@@ -9,7 +9,7 @@ Gem::Specification.new { |s|
|
|
9
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
|
-
s.required_ruby_version = Gem::Requirement.new('>= 2.
|
12
|
+
s.required_ruby_version = Gem::Requirement.new('>= 2.6.0')
|
13
13
|
s.licenses = ['Ruby', 'BSD-2-Clause']
|
14
14
|
s.add_development_dependency 'bundler'
|
15
15
|
s.add_development_dependency 'rake'
|
data/ext/curses/curses.c
CHANGED
@@ -82,8 +82,19 @@
|
|
82
82
|
# define USE_MOUSE 1
|
83
83
|
#endif
|
84
84
|
|
85
|
-
#define
|
86
|
-
|
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
|
+
}
|
87
98
|
|
88
99
|
static VALUE mCurses;
|
89
100
|
static VALUE mKey;
|
@@ -291,7 +302,7 @@ static void curses_finalize(VALUE);
|
|
291
302
|
* see also Curses.stdscr
|
292
303
|
*/
|
293
304
|
static VALUE
|
294
|
-
curses_init_screen(
|
305
|
+
curses_init_screen(VALUE self)
|
295
306
|
{
|
296
307
|
if (rb_stdscr) return rb_stdscr;
|
297
308
|
initscr();
|
@@ -314,7 +325,7 @@ curses_init_screen(void)
|
|
314
325
|
*
|
315
326
|
* Many curses functions use this window.
|
316
327
|
*/
|
317
|
-
#define curses_stdscr curses_init_screen
|
328
|
+
#define curses_stdscr() curses_init_screen(Qnil)
|
318
329
|
|
319
330
|
/*
|
320
331
|
* Document-method: Curses.close_screen
|
@@ -330,7 +341,7 @@ curses_init_screen(void)
|
|
330
341
|
*
|
331
342
|
*/
|
332
343
|
static VALUE
|
333
|
-
curses_close_screen(
|
344
|
+
curses_close_screen(VALUE self)
|
334
345
|
{
|
335
346
|
curses_stdscr();
|
336
347
|
#ifdef HAVE_ISENDWIN
|
@@ -370,7 +381,7 @@ curses_finalize(VALUE dummy)
|
|
370
381
|
* returns +false+ otherwise.
|
371
382
|
*/
|
372
383
|
static VALUE
|
373
|
-
curses_closed(
|
384
|
+
curses_closed(VALUE self)
|
374
385
|
{
|
375
386
|
curses_stdscr();
|
376
387
|
if (isendwin()) {
|
@@ -420,7 +431,7 @@ curses_erase(VALUE obj)
|
|
420
431
|
* Clears to the end of line, that the cursor is currently on.
|
421
432
|
*/
|
422
433
|
static VALUE
|
423
|
-
curses_clrtoeol(
|
434
|
+
curses_clrtoeol(VALUE self)
|
424
435
|
{
|
425
436
|
curses_stdscr();
|
426
437
|
clrtoeol();
|
@@ -609,6 +620,20 @@ curses_nonl(VALUE obj)
|
|
609
620
|
return Qnil;
|
610
621
|
}
|
611
622
|
|
623
|
+
/*
|
624
|
+
* Document-method: Curses.flushinp
|
625
|
+
*
|
626
|
+
* The flushinp routine throws away any typeahead that has been
|
627
|
+
* typed by the user and has not yet been read by the program.
|
628
|
+
*/
|
629
|
+
static VALUE
|
630
|
+
curses_flushinp(VALUE obj)
|
631
|
+
{
|
632
|
+
curses_stdscr();
|
633
|
+
flushinp();
|
634
|
+
return Qnil;
|
635
|
+
}
|
636
|
+
|
612
637
|
/*
|
613
638
|
* Document-method: Curses.beep
|
614
639
|
*
|
@@ -747,7 +772,7 @@ static VALUE
|
|
747
772
|
curses_inch(VALUE obj)
|
748
773
|
{
|
749
774
|
curses_stdscr();
|
750
|
-
return
|
775
|
+
return CHTYPE2NUM(inch());
|
751
776
|
}
|
752
777
|
|
753
778
|
/*
|
@@ -762,7 +787,7 @@ static VALUE
|
|
762
787
|
curses_addch(VALUE obj, VALUE ch)
|
763
788
|
{
|
764
789
|
curses_stdscr();
|
765
|
-
addch(
|
790
|
+
addch(OBJ2CHTYPE(ch));
|
766
791
|
return Qnil;
|
767
792
|
}
|
768
793
|
|
@@ -777,7 +802,7 @@ static VALUE
|
|
777
802
|
curses_insch(VALUE obj, VALUE ch)
|
778
803
|
{
|
779
804
|
curses_stdscr();
|
780
|
-
insch(
|
805
|
+
insch(OBJ2CHTYPE(ch));
|
781
806
|
return Qnil;
|
782
807
|
}
|
783
808
|
|
@@ -949,7 +974,7 @@ curses_keyname(VALUE obj, VALUE c)
|
|
949
974
|
* Returns the number of lines on the screen
|
950
975
|
*/
|
951
976
|
static VALUE
|
952
|
-
curses_lines(
|
977
|
+
curses_lines(VALUE self)
|
953
978
|
{
|
954
979
|
return INT2FIX(LINES);
|
955
980
|
}
|
@@ -960,7 +985,7 @@ curses_lines(void)
|
|
960
985
|
* Returns the number of columns on the screen
|
961
986
|
*/
|
962
987
|
static VALUE
|
963
|
-
curses_cols(
|
988
|
+
curses_cols(VALUE self)
|
964
989
|
{
|
965
990
|
return INT2FIX(COLS);
|
966
991
|
}
|
@@ -1106,7 +1131,7 @@ curses_bkgdset(VALUE obj, VALUE ch)
|
|
1106
1131
|
{
|
1107
1132
|
#ifdef HAVE_BKGDSET
|
1108
1133
|
curses_stdscr();
|
1109
|
-
bkgdset(
|
1134
|
+
bkgdset(OBJ2CHTYPE(ch));
|
1110
1135
|
#endif
|
1111
1136
|
return Qnil;
|
1112
1137
|
}
|
@@ -1127,7 +1152,7 @@ curses_bkgd(VALUE obj, VALUE ch)
|
|
1127
1152
|
{
|
1128
1153
|
#ifdef HAVE_BKGD
|
1129
1154
|
curses_stdscr();
|
1130
|
-
return (bkgd(
|
1155
|
+
return (bkgd(OBJ2CHTYPE(ch)) == OK) ? Qtrue : Qfalse;
|
1131
1156
|
#else
|
1132
1157
|
return Qfalse;
|
1133
1158
|
#endif
|
@@ -1341,7 +1366,7 @@ curses_can_change_color(VALUE obj)
|
|
1341
1366
|
return can_change_color() ? Qtrue : Qfalse;
|
1342
1367
|
}
|
1343
1368
|
|
1344
|
-
#if defined(HAVE_COLORS)
|
1369
|
+
#if defined(HAVE_COLORS) || defined(COLORS)
|
1345
1370
|
/*
|
1346
1371
|
* Document-method: Curses.color
|
1347
1372
|
*
|
@@ -1548,7 +1573,7 @@ static VALUE
|
|
1548
1573
|
curses_mousemask(VALUE obj, VALUE mask)
|
1549
1574
|
{
|
1550
1575
|
curses_stdscr();
|
1551
|
-
return
|
1576
|
+
return ULONG2NUM(mousemask(NUM2UINT(mask),NULL));
|
1552
1577
|
}
|
1553
1578
|
|
1554
1579
|
#define DEFINE_MOUSE_GET_MEMBER(func_name,mem) \
|
@@ -1589,7 +1614,12 @@ DEFINE_MOUSE_GET_MEMBER(curs_mouse_z, z)
|
|
1589
1614
|
* Returns the current mouse's button state. Use this with the button state
|
1590
1615
|
* constants to determine which buttons were pressed.
|
1591
1616
|
*/
|
1592
|
-
|
1617
|
+
static VALUE curs_mouse_bstate(VALUE mouse)
|
1618
|
+
{
|
1619
|
+
struct mousedata *mdata;
|
1620
|
+
GetMOUSE(mouse, mdata);
|
1621
|
+
return ULONG2NUM(mdata->mevent->bstate);
|
1622
|
+
}
|
1593
1623
|
#undef define_curs_mouse_member
|
1594
1624
|
#endif /* USE_MOUSE */
|
1595
1625
|
|
@@ -1681,7 +1711,7 @@ window_initialize(VALUE obj, VALUE h, VALUE w, VALUE top, VALUE left)
|
|
1681
1711
|
struct windata *winp;
|
1682
1712
|
WINDOW *window;
|
1683
1713
|
|
1684
|
-
curses_init_screen();
|
1714
|
+
curses_init_screen(Qnil);
|
1685
1715
|
TypedData_Get_Struct(obj, struct windata, &windata_type, winp);
|
1686
1716
|
if (winp->window) delwin(winp->window);
|
1687
1717
|
window = newwin(NUM2INT(h), NUM2INT(w), NUM2INT(top), NUM2INT(left));
|
@@ -2178,7 +2208,7 @@ window_begx(VALUE obj)
|
|
2178
2208
|
|
2179
2209
|
/*
|
2180
2210
|
* Document-method: Curses::Window.box
|
2181
|
-
* call-seq: box(vert, hor)
|
2211
|
+
* call-seq: box(vert = nil, hor = nil, corn = nil)
|
2182
2212
|
*
|
2183
2213
|
* set the characters to frame the window in.
|
2184
2214
|
* The vertical +vert+ and horizontal +hor+ character.
|
@@ -2193,16 +2223,18 @@ window_box(int argc, VALUE *argv, VALUE self)
|
|
2193
2223
|
struct windata *winp;
|
2194
2224
|
VALUE vert, hor, corn;
|
2195
2225
|
|
2196
|
-
rb_scan_args(argc, argv, "
|
2226
|
+
rb_scan_args(argc, argv, "03", &vert, &hor, &corn);
|
2197
2227
|
|
2198
2228
|
GetWINDOW(self, winp);
|
2199
|
-
box(winp->window,
|
2229
|
+
box(winp->window,
|
2230
|
+
NIL_P(vert) ? 0 : OBJ2CHTYPE(vert),
|
2231
|
+
NIL_P(hor) ? 0 : OBJ2CHTYPE(hor));
|
2200
2232
|
|
2201
2233
|
if (!NIL_P(corn)) {
|
2202
2234
|
int cur_x, cur_y, x, y;
|
2203
2235
|
chtype c;
|
2204
2236
|
|
2205
|
-
c =
|
2237
|
+
c = OBJ2CHTYPE(corn);
|
2206
2238
|
getyx(winp->window, cur_y, cur_x);
|
2207
2239
|
x = NUM2INT(window_maxx(self)) - 1;
|
2208
2240
|
y = NUM2INT(window_maxy(self)) - 1;
|
@@ -2269,7 +2301,7 @@ window_inch(VALUE obj)
|
|
2269
2301
|
struct windata *winp;
|
2270
2302
|
|
2271
2303
|
GetWINDOW(obj, winp);
|
2272
|
-
return
|
2304
|
+
return CHTYPE2NUM(winch(winp->window));
|
2273
2305
|
}
|
2274
2306
|
|
2275
2307
|
/*
|
@@ -2286,7 +2318,7 @@ window_addch(VALUE obj, VALUE ch)
|
|
2286
2318
|
struct windata *winp;
|
2287
2319
|
|
2288
2320
|
GetWINDOW(obj, winp);
|
2289
|
-
waddch(winp->window,
|
2321
|
+
waddch(winp->window, OBJ2CHTYPE(ch));
|
2290
2322
|
|
2291
2323
|
return Qnil;
|
2292
2324
|
}
|
@@ -2304,7 +2336,7 @@ window_insch(VALUE obj, VALUE ch)
|
|
2304
2336
|
struct windata *winp;
|
2305
2337
|
|
2306
2338
|
GetWINDOW(obj, winp);
|
2307
|
-
winsch(winp->window,
|
2339
|
+
winsch(winp->window, OBJ2CHTYPE(ch));
|
2308
2340
|
|
2309
2341
|
return Qnil;
|
2310
2342
|
}
|
@@ -2732,7 +2764,7 @@ window_bkgdset(VALUE obj, VALUE ch)
|
|
2732
2764
|
struct windata *winp;
|
2733
2765
|
|
2734
2766
|
GetWINDOW(obj,winp);
|
2735
|
-
wbkgdset(winp->window,
|
2767
|
+
wbkgdset(winp->window, OBJ2CHTYPE(ch));
|
2736
2768
|
#endif
|
2737
2769
|
return Qnil;
|
2738
2770
|
}
|
@@ -2753,7 +2785,7 @@ window_bkgd(VALUE obj, VALUE ch)
|
|
2753
2785
|
struct windata *winp;
|
2754
2786
|
|
2755
2787
|
GetWINDOW(obj,winp);
|
2756
|
-
return (wbkgd(winp->window,
|
2788
|
+
return (wbkgd(winp->window, OBJ2CHTYPE(ch)) == OK) ? Qtrue : Qfalse;
|
2757
2789
|
#else
|
2758
2790
|
return Qfalse;
|
2759
2791
|
#endif
|
@@ -2921,7 +2953,7 @@ pad_initialize(VALUE obj, VALUE h, VALUE w)
|
|
2921
2953
|
struct windata *padp;
|
2922
2954
|
WINDOW *window;
|
2923
2955
|
|
2924
|
-
curses_init_screen();
|
2956
|
+
curses_init_screen(Qnil);
|
2925
2957
|
TypedData_Get_Struct(obj, struct windata, &windata_type, padp);
|
2926
2958
|
if (padp->window) delwin(padp->window);
|
2927
2959
|
window = newpad(NUM2INT(h), NUM2INT(w));
|
@@ -3092,7 +3124,7 @@ item_initialize(VALUE obj, VALUE name, VALUE description)
|
|
3092
3124
|
{
|
3093
3125
|
struct itemdata *itemp;
|
3094
3126
|
|
3095
|
-
curses_init_screen();
|
3127
|
+
curses_init_screen(Qnil);
|
3096
3128
|
TypedData_Get_Struct(obj, struct itemdata, &itemdata_type, itemp);
|
3097
3129
|
if (itemp->item) {
|
3098
3130
|
rb_raise(rb_eRuntimeError, "already initialized item");
|
@@ -3305,7 +3337,7 @@ menu_initialize(VALUE obj, VALUE items)
|
|
3305
3337
|
ID id_new;
|
3306
3338
|
|
3307
3339
|
Check_Type(items, T_ARRAY);
|
3308
|
-
curses_init_screen();
|
3340
|
+
curses_init_screen(Qnil);
|
3309
3341
|
TypedData_Get_Struct(obj, struct menudata, &menudata_type, menup);
|
3310
3342
|
if (menup->menu) {
|
3311
3343
|
rb_raise(rb_eRuntimeError, "already initialized menu");
|
@@ -3600,6 +3632,121 @@ menu_set_format(VALUE obj, VALUE rows, VALUE cols)
|
|
3600
3632
|
return obj;
|
3601
3633
|
}
|
3602
3634
|
|
3635
|
+
/*
|
3636
|
+
* Document-method: Curses::Menu#mark=
|
3637
|
+
*
|
3638
|
+
* call-seq:
|
3639
|
+
* mark=(str)
|
3640
|
+
*
|
3641
|
+
* Set the mark string to distinguish the selected items
|
3642
|
+
*/
|
3643
|
+
static VALUE
|
3644
|
+
menu_set_mark(VALUE obj, VALUE mark)
|
3645
|
+
{
|
3646
|
+
struct menudata *menup;
|
3647
|
+
|
3648
|
+
GetMENU(obj, menup);
|
3649
|
+
set_menu_mark(menup->menu, StringValueCStr(mark));
|
3650
|
+
|
3651
|
+
return obj;
|
3652
|
+
}
|
3653
|
+
|
3654
|
+
/*
|
3655
|
+
* Document-method: Curses::Menu#mark
|
3656
|
+
*
|
3657
|
+
* call-seq:
|
3658
|
+
* mark
|
3659
|
+
*
|
3660
|
+
* Get the Menu's mark string
|
3661
|
+
*/
|
3662
|
+
static VALUE
|
3663
|
+
menu_get_mark(VALUE obj)
|
3664
|
+
{
|
3665
|
+
struct menudata *menup;
|
3666
|
+
const char *mark;
|
3667
|
+
|
3668
|
+
GetMENU(obj, menup);
|
3669
|
+
mark = menu_mark(menup->menu);
|
3670
|
+
|
3671
|
+
return rb_external_str_new_with_enc(mark, strlen(mark), terminal_encoding);
|
3672
|
+
}
|
3673
|
+
|
3674
|
+
/*
|
3675
|
+
* Document-method: Curses::Menu#fore=
|
3676
|
+
*
|
3677
|
+
* call-seq:
|
3678
|
+
* fore=(attr)
|
3679
|
+
*
|
3680
|
+
* Sets the foreground attribute of menu.
|
3681
|
+
* This is the highlight used for selected menu items.
|
3682
|
+
*/
|
3683
|
+
static VALUE
|
3684
|
+
menu_set_fore(VALUE obj, VALUE attr)
|
3685
|
+
{
|
3686
|
+
struct menudata *menup;
|
3687
|
+
|
3688
|
+
GetMENU(obj, menup);
|
3689
|
+
set_menu_fore(menup->menu, NUM2CHTYPE(attr));
|
3690
|
+
|
3691
|
+
return attr;
|
3692
|
+
}
|
3693
|
+
|
3694
|
+
/*
|
3695
|
+
* Document-method: Curses::Menu#fore
|
3696
|
+
*
|
3697
|
+
* call-seq:
|
3698
|
+
* fore
|
3699
|
+
*
|
3700
|
+
* Sets the foreground attribute of menu.
|
3701
|
+
* This is the highlight used for selected menu items.
|
3702
|
+
*/
|
3703
|
+
static VALUE
|
3704
|
+
menu_get_fore(VALUE obj, VALUE attr)
|
3705
|
+
{
|
3706
|
+
struct menudata *menup;
|
3707
|
+
|
3708
|
+
GetMENU(obj, menup);
|
3709
|
+
|
3710
|
+
return CHTYPE2NUM(menu_fore(menup->menu));
|
3711
|
+
}
|
3712
|
+
|
3713
|
+
/*
|
3714
|
+
* Document-method: Curses::Menu#set_back
|
3715
|
+
*
|
3716
|
+
* call-seq:
|
3717
|
+
* set_back(attr)
|
3718
|
+
*
|
3719
|
+
* Get the background attribute of menu.
|
3720
|
+
*/
|
3721
|
+
static VALUE
|
3722
|
+
menu_set_back(VALUE obj, VALUE attr)
|
3723
|
+
{
|
3724
|
+
struct menudata *menup;
|
3725
|
+
|
3726
|
+
GetMENU(obj, menup);
|
3727
|
+
CHTYPE2NUM(set_menu_back(menup->menu, NUM2CHTYPE(attr)));
|
3728
|
+
|
3729
|
+
return attr;
|
3730
|
+
}
|
3731
|
+
|
3732
|
+
/*
|
3733
|
+
* Document-method: Curses::Menu#back
|
3734
|
+
*
|
3735
|
+
* call-seq:
|
3736
|
+
* back
|
3737
|
+
*
|
3738
|
+
* Get the background attribute of menu.
|
3739
|
+
*/
|
3740
|
+
static VALUE
|
3741
|
+
menu_get_back(VALUE obj, VALUE attr)
|
3742
|
+
{
|
3743
|
+
struct menudata *menup;
|
3744
|
+
|
3745
|
+
GetMENU(obj, menup);
|
3746
|
+
|
3747
|
+
return CHTYPE2NUM(menu_back(menup->menu));
|
3748
|
+
}
|
3749
|
+
|
3603
3750
|
/*
|
3604
3751
|
* Document-method: Curses::Menu#format
|
3605
3752
|
*
|
@@ -3761,7 +3908,7 @@ field_initialize(VALUE obj, VALUE height, VALUE width,
|
|
3761
3908
|
{
|
3762
3909
|
struct fielddata *fieldp;
|
3763
3910
|
|
3764
|
-
curses_init_screen();
|
3911
|
+
curses_init_screen(Qnil);
|
3765
3912
|
TypedData_Get_Struct(obj, struct fielddata, &fielddata_type, fieldp);
|
3766
3913
|
if (fieldp->field) {
|
3767
3914
|
rb_raise(rb_eRuntimeError, "already initialized field");
|
@@ -4219,7 +4366,7 @@ form_initialize(VALUE obj, VALUE fields)
|
|
4219
4366
|
int i;
|
4220
4367
|
|
4221
4368
|
Check_Type(fields, T_ARRAY);
|
4222
|
-
curses_init_screen();
|
4369
|
+
curses_init_screen(Qnil);
|
4223
4370
|
TypedData_Get_Struct(obj, struct formdata, &formdata_type, formp);
|
4224
4371
|
if (formp->form) {
|
4225
4372
|
rb_raise(rb_eRuntimeError, "already initialized form");
|
@@ -4719,7 +4866,7 @@ Init_curses(void)
|
|
4719
4866
|
rb_define_module_function(mCurses, "init_screen", curses_init_screen, 0);
|
4720
4867
|
rb_define_module_function(mCurses, "close_screen", curses_close_screen, 0);
|
4721
4868
|
rb_define_module_function(mCurses, "closed?", curses_closed, 0);
|
4722
|
-
rb_define_module_function(mCurses, "stdscr",
|
4869
|
+
rb_define_module_function(mCurses, "stdscr", curses_init_screen, 0);
|
4723
4870
|
rb_define_module_function(mCurses, "refresh", curses_refresh, 0);
|
4724
4871
|
rb_define_module_function(mCurses, "doupdate", curses_doupdate, 0);
|
4725
4872
|
rb_define_module_function(mCurses, "clear", curses_clear, 0);
|
@@ -4735,6 +4882,7 @@ Init_curses(void)
|
|
4735
4882
|
rb_define_module_function(mCurses, "nocrmode", curses_nocbreak, 0);
|
4736
4883
|
rb_define_module_function(mCurses, "nl", curses_nl, 0);
|
4737
4884
|
rb_define_module_function(mCurses, "nonl", curses_nonl, 0);
|
4885
|
+
rb_define_module_function(mCurses, "flushinp", curses_flushinp, 0);
|
4738
4886
|
rb_define_module_function(mCurses, "beep", curses_beep, 0);
|
4739
4887
|
rb_define_module_function(mCurses, "flash", curses_flash, 0);
|
4740
4888
|
rb_define_module_function(mCurses, "ungetch", curses_ungetch, 1);
|
@@ -4859,7 +5007,7 @@ Init_curses(void)
|
|
4859
5007
|
* win.close
|
4860
5008
|
*
|
4861
5009
|
*/
|
4862
|
-
cWindow = rb_define_class_under(mCurses, "Window",
|
5010
|
+
cWindow = rb_define_class_under(mCurses, "Window", rb_cObject);
|
4863
5011
|
rb_define_alloc_func(cWindow, window_s_allocate);
|
4864
5012
|
rb_define_method(cWindow, "initialize", window_initialize, 4);
|
4865
5013
|
rb_define_method(cWindow, "subwin", window_subwin, 4);
|
@@ -4943,7 +5091,7 @@ Init_curses(void)
|
|
4943
5091
|
#endif
|
4944
5092
|
|
4945
5093
|
#ifdef HAVE_MENU
|
4946
|
-
cItem = rb_define_class_under(mCurses, "Item",
|
5094
|
+
cItem = rb_define_class_under(mCurses, "Item", rb_cObject);
|
4947
5095
|
rb_define_alloc_func(cItem, item_s_allocate);
|
4948
5096
|
rb_define_method(cItem, "initialize", item_initialize, 2);
|
4949
5097
|
rb_define_method(cItem, "==", item_eq, 1);
|
@@ -4954,7 +5102,7 @@ Init_curses(void)
|
|
4954
5102
|
rb_define_method(cItem, "opts_off", item_opts_off_m, 1);
|
4955
5103
|
rb_define_method(cItem, "opts", item_opts_m, 0);
|
4956
5104
|
|
4957
|
-
cMenu = rb_define_class_under(mCurses, "Menu",
|
5105
|
+
cMenu = rb_define_class_under(mCurses, "Menu", rb_cObject);
|
4958
5106
|
rb_define_alloc_func(cMenu, menu_s_allocate);
|
4959
5107
|
rb_define_method(cMenu, "initialize", menu_initialize, 1);
|
4960
5108
|
rb_define_method(cMenu, "post", menu_post, 0);
|
@@ -4970,6 +5118,12 @@ Init_curses(void)
|
|
4970
5118
|
rb_define_method(cMenu, "scale", menu_scale, 0);
|
4971
5119
|
rb_define_method(cMenu, "set_format", menu_set_format, 2);
|
4972
5120
|
rb_define_method(cMenu, "format", menu_format_m, 0);
|
5121
|
+
rb_define_method(cMenu, "mark=", menu_set_mark, 1);
|
5122
|
+
rb_define_method(cMenu, "mark", menu_get_mark, 0);
|
5123
|
+
rb_define_method(cMenu, "fore=", menu_set_fore, 1);
|
5124
|
+
rb_define_method(cMenu, "fore", menu_get_fore, 0);
|
5125
|
+
rb_define_method(cMenu, "back=", menu_set_back, 1);
|
5126
|
+
rb_define_method(cMenu, "back", menu_get_back, 0);
|
4973
5127
|
rb_define_method(cMenu, "set_opts", menu_set_opts, 1);
|
4974
5128
|
rb_define_method(cMenu, "opts_on", menu_opts_on_m, 1);
|
4975
5129
|
rb_define_method(cMenu, "opts_off", menu_opts_off_m, 1);
|
@@ -4977,7 +5131,7 @@ Init_curses(void)
|
|
4977
5131
|
#endif
|
4978
5132
|
|
4979
5133
|
#ifdef HAVE_FORM
|
4980
|
-
cField = rb_define_class_under(mCurses, "Field",
|
5134
|
+
cField = rb_define_class_under(mCurses, "Field", rb_cObject);
|
4981
5135
|
rb_define_alloc_func(cField, field_s_allocate);
|
4982
5136
|
rb_define_method(cField, "initialize", field_initialize, 6);
|
4983
5137
|
rb_define_method(cField, "set_buffer", field_set_buffer, 2);
|
@@ -5004,7 +5158,7 @@ Init_curses(void)
|
|
5004
5158
|
rb_define_method(cField, "max=", field_set_max, 1);
|
5005
5159
|
rb_define_method(cField, "set_type", field_set_type, -1);
|
5006
5160
|
|
5007
|
-
cForm = rb_define_class_under(mCurses, "Form",
|
5161
|
+
cForm = rb_define_class_under(mCurses, "Form", rb_cObject);
|
5008
5162
|
rb_define_alloc_func(cForm, form_s_allocate);
|
5009
5163
|
rb_define_method(cForm, "initialize", form_initialize, 1);
|
5010
5164
|
rb_define_method(cForm, "post", form_post, 0);
|
data/sample/addch.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# require_relative "../lib/curses"
|
3
|
+
require 'curses'
|
4
|
+
|
5
|
+
include Curses
|
6
|
+
|
7
|
+
init_screen
|
8
|
+
begin
|
9
|
+
addstr("The following letter A should be BOLD and UNDERLINED by using addch:\n")
|
10
|
+
addch('A'.ord | A_BOLD | A_UNDERLINE)
|
11
|
+
|
12
|
+
addstr("\nIt should look the same as when using attron and addstr:\n")
|
13
|
+
attron(A_BOLD | A_UNDERLINE)
|
14
|
+
addstr("A")
|
15
|
+
getch
|
16
|
+
|
17
|
+
ensure
|
18
|
+
close_screen
|
19
|
+
end
|
data/sample/attr_demo.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "curses"
|
2
|
+
include Curses
|
3
|
+
|
4
|
+
init_screen
|
5
|
+
begin
|
6
|
+
attrs = {
|
7
|
+
A_NORMAL => 'Normal display (no highlight)',
|
8
|
+
A_STANDOUT => 'Best highlighting mode of the terminal',
|
9
|
+
A_UNDERLINE => 'Underlining',
|
10
|
+
A_REVERSE => 'Reverse video',
|
11
|
+
A_BLINK => 'Blinking',
|
12
|
+
A_DIM => 'Half bright',
|
13
|
+
A_BOLD => 'Extra bright or bold',
|
14
|
+
A_PROTECT => 'Protected mode',
|
15
|
+
A_INVIS => 'Invisible or blank mode',
|
16
|
+
A_ALTCHARSET => 'Alternate character set',
|
17
|
+
}
|
18
|
+
|
19
|
+
longest_description = attrs.values.map(&:size).max
|
20
|
+
attrs.each { |attribute, description|
|
21
|
+
|
22
|
+
attrset(A_NORMAL)
|
23
|
+
addstr("#{description.ljust(longest_description)}: ")
|
24
|
+
|
25
|
+
attrset(attribute)
|
26
|
+
addstr([*('a'..'z'), *('0'..'9')].join + "\n")
|
27
|
+
}
|
28
|
+
getch
|
29
|
+
|
30
|
+
ensure
|
31
|
+
close_screen
|
32
|
+
end
|
data/sample/colors.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "curses"
|
2
|
+
include Curses
|
3
|
+
|
4
|
+
begin
|
5
|
+
init_screen
|
6
|
+
|
7
|
+
if !Curses.has_colors?
|
8
|
+
addstr "This Terminal does not support colors!"
|
9
|
+
else
|
10
|
+
start_color
|
11
|
+
|
12
|
+
addstr "This Terminal supports #{colors} colors.\n"
|
13
|
+
|
14
|
+
Curses.colors.times { |i|
|
15
|
+
Curses.init_pair(i, i, 0)
|
16
|
+
attrset(color_pair(i))
|
17
|
+
addstr("#{i.to_s.rjust(3)} ")
|
18
|
+
addstr("\n") if i == 15 || (i > 16 && (i - 15) % 36 == 0)
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
getch
|
23
|
+
|
24
|
+
ensure
|
25
|
+
close_screen
|
26
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Mouse movement tracking using CSI 1003 and 1006 (SGR). Will print a cursor that moves with the mouse.
|
4
|
+
#
|
5
|
+
|
6
|
+
require "curses"
|
7
|
+
include Curses
|
8
|
+
|
9
|
+
@positions = []
|
10
|
+
|
11
|
+
def draw_cursor(y, x, button, state)
|
12
|
+
|
13
|
+
# Keep a trail of 10 previous positions visible on the screen
|
14
|
+
if @positions.size >= 10
|
15
|
+
y_old, x_old = @positions.shift
|
16
|
+
setpos(y_old, x_old)
|
17
|
+
addstr(" ")
|
18
|
+
end
|
19
|
+
|
20
|
+
setpos(2, 1)
|
21
|
+
addstr("Mouse is at y=#{y.to_s.ljust(3)} x=#{x.to_s.ljust(3)} button=#{button.to_s.ljust(3)} #{'%08b' % button}")
|
22
|
+
|
23
|
+
setpos(y, x)
|
24
|
+
addstr("+")
|
25
|
+
@positions << [y, x]
|
26
|
+
end
|
27
|
+
|
28
|
+
init_screen
|
29
|
+
crmode
|
30
|
+
noecho
|
31
|
+
stdscr.box('|', "-")
|
32
|
+
setpos(1,1)
|
33
|
+
addstr("Please move your mouse. Press 'q' to close.")
|
34
|
+
|
35
|
+
begin
|
36
|
+
# Switch on mouse continous position reporting
|
37
|
+
print("\x1b[?1003h")
|
38
|
+
|
39
|
+
# Also enable SGR extended reporting, because otherwise we can only
|
40
|
+
# receive values up to 160x94. Everything else confuses Ruby Curses.
|
41
|
+
print("\x1b[?1006h")
|
42
|
+
|
43
|
+
loop do
|
44
|
+
c = get_char
|
45
|
+
case c
|
46
|
+
when "q"
|
47
|
+
return
|
48
|
+
when "\e" # ESC
|
49
|
+
case get_char
|
50
|
+
when '['
|
51
|
+
csi = ""
|
52
|
+
loop do
|
53
|
+
d = get_char
|
54
|
+
csi += d
|
55
|
+
if d.ord >= 0x40 && d.ord <= 0x7E
|
56
|
+
break
|
57
|
+
end
|
58
|
+
end
|
59
|
+
if /<(\d+);(\d+);(\d+)(m|M)/ =~ csi
|
60
|
+
button = $1.to_i
|
61
|
+
x = $2.to_i
|
62
|
+
y = $3.to_i
|
63
|
+
state = $4
|
64
|
+
draw_cursor(y, x, button, state)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
ensure
|
71
|
+
print("\x1b[?1003l")
|
72
|
+
print("\x1b[?1006l")
|
73
|
+
close_screen
|
74
|
+
end
|
75
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curses
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.4.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shugo Maeda
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-02-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -53,23 +53,25 @@ files:
|
|
53
53
|
- ".github/workflows/windows.yml"
|
54
54
|
- ".gitignore"
|
55
55
|
- ".gitmodules"
|
56
|
-
- ".travis.yml"
|
57
56
|
- BSDL
|
58
57
|
- COPYING
|
59
58
|
- Gemfile
|
60
59
|
- History.md
|
61
60
|
- README.md
|
62
61
|
- Rakefile
|
63
|
-
- appveyor.yml
|
64
62
|
- curses.gemspec
|
65
63
|
- ext/curses/curses.c
|
66
64
|
- ext/curses/depend
|
67
65
|
- ext/curses/extconf.rb
|
68
66
|
- lib/curses.rb
|
67
|
+
- sample/addch.rb
|
68
|
+
- sample/attr_demo.rb
|
69
|
+
- sample/colors.rb
|
69
70
|
- sample/form.rb
|
70
71
|
- sample/hello.rb
|
71
72
|
- sample/menu.rb
|
72
73
|
- sample/mouse.rb
|
74
|
+
- sample/mouse_move.rb
|
73
75
|
- sample/rain.rb
|
74
76
|
- sample/view.rb
|
75
77
|
- sample/view2.rb
|
@@ -330,14 +332,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
330
332
|
requirements:
|
331
333
|
- - ">="
|
332
334
|
- !ruby/object:Gem::Version
|
333
|
-
version: 2.
|
335
|
+
version: 2.6.0
|
334
336
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
335
337
|
requirements:
|
336
|
-
- - "
|
338
|
+
- - ">"
|
337
339
|
- !ruby/object:Gem::Version
|
338
|
-
version:
|
340
|
+
version: 1.3.1
|
339
341
|
requirements: []
|
340
|
-
rubygems_version: 3.
|
342
|
+
rubygems_version: 3.4.0.dev
|
341
343
|
signing_key:
|
342
344
|
specification_version: 4
|
343
345
|
summary: A Ruby binding for curses, ncurses, and PDCurses. curses is an extension
|
data/.travis.yml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
---
|
2
|
-
language: ruby
|
3
|
-
notifications:
|
4
|
-
email:
|
5
|
-
recipients:
|
6
|
-
- drbrain@segment7.net
|
7
|
-
- shugo@ruby-lang.org
|
8
|
-
rvm:
|
9
|
-
- 2.2.10
|
10
|
-
- 2.3.8
|
11
|
-
- 2.4.5
|
12
|
-
- 2.5.3
|
13
|
-
- 2.6.1
|
14
|
-
- ruby-head
|
15
|
-
before_install: gem install bundler -v '<2'
|
16
|
-
script: rake compile
|
data/appveyor.yml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
---
|
2
|
-
clone_depth: 10
|
3
|
-
install:
|
4
|
-
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
5
|
-
- appveyor DownloadFile http://dl.bintray.com/oneclick/OpenKnapsack/x64/pdcurses-3.4-x64-windows.tar.lzma
|
6
|
-
- 7z e pdcurses-3.4-x64-windows.tar.lzma
|
7
|
-
- 7z x -y -oC:\Ruby%ruby_version% pdcurses-3.4-x64-windows.tar
|
8
|
-
- bundle install
|
9
|
-
build_script:
|
10
|
-
- rake -rdevkit compile -- --with-curses-dir=C:\Ruby%ruby_version%
|
11
|
-
test: off
|
12
|
-
deploy: off
|
13
|
-
environment:
|
14
|
-
matrix:
|
15
|
-
- ruby_version: "22-x64"
|
16
|
-
- ruby_version: "23-x64"
|