io-console 0.5.7-java → 0.5.8-java

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1493164f1796b8bd1a67e9263d12de32cce6fc7135c6f4eb3603ea19ee3d1152
4
- data.tar.gz: a1c28fb7e965635d4b039aa5ff672833818116885daae8a6b3224d153144df2f
3
+ metadata.gz: a32a2bab33c5cdfeb72667a0e16580d322c3a6fa7127206ad6ec8f033b1fd503
4
+ data.tar.gz: eb107f1e5891acf99dcaf0bd6f3a664cd9f7911ace5dff034925aa7ad7e3752b
5
5
  SHA512:
6
- metadata.gz: 1a8a824c8cdefab44e2e6276faedc1911e035f9fccf2853e09fe2ae35484fdf9aaa61bbfee474aac55b41d7cdd2f210037fc13c188ba453fb2c2d92cdc59799a
7
- data.tar.gz: 82cdc2b38f9ab9975766cfd36920373fb7af1fd9bb1fb6166963551a0ffc2feb03f252d9fd57fd3864b5314f60821098bfab9ad9cdd678d222859eb8b5057388
6
+ metadata.gz: 8b348ea503826ebe463dde1188036c281dd5c15b433d4a2b3ada790a150022f0e71570d05ff0b59a57806ec4fdd1968986f9cc8ec3cd5a48ca3fa1499dcda1b7
7
+ data.tar.gz: 7e0facb56e8727a66eff702812adbcbae18f79d314342c1d6c29860562a3b174778c08b629d651c1331d4ba46d5a02e08bf8197c42d8caaa28055472658bd615
data/lib/io/console.rb ADDED
@@ -0,0 +1,5 @@
1
+ if RUBY_ENGINE == 'ruby'
2
+ require_relative 'console.so'
3
+ else
4
+ require_relative 'console/ffi/console'
5
+ end
@@ -138,7 +138,7 @@ module IO::LibC
138
138
  :c_oflag, :tcflag_t,
139
139
  :c_cflag, :tcflag_t,
140
140
  :c_lflag, :tcflag_t,
141
- :cc_c, [ :uchar, NCCS ],
141
+ :c_cc, [ :uchar, NCCS ],
142
142
  :c_ispeed, :speed_t,
143
143
  :c_ospeed, :speed_t
144
144
  end
@@ -1,7 +1,7 @@
1
1
  # Methods common to all backend impls
2
2
  class IO
3
- def getch(*)
4
- raw do
3
+ def getch(*, **opts)
4
+ raw(**opts) do
5
5
  getc
6
6
  end
7
7
  end
@@ -21,11 +21,11 @@
21
21
 
22
22
  require 'rbconfig'
23
23
 
24
- require_relative 'console/common'
24
+ require_relative 'common'
25
25
 
26
26
  # If Windows, always use the stub version
27
27
  if RbConfig::CONFIG['host_os'] =~ /(mswin)|(win32)|(ming)/
28
- require_relative 'console/stub_console'
28
+ require_relative 'stub_console'
29
29
  else
30
30
 
31
31
  # If Linux or BSD, try to load the native version
@@ -33,7 +33,7 @@ else
33
33
  begin
34
34
 
35
35
  # Attempt to load the native Linux and BSD console logic
36
- require_relative 'console/native_console'
36
+ require_relative 'native_console'
37
37
  ready = true
38
38
 
39
39
  rescue Exception => ex
@@ -48,7 +48,7 @@ else
48
48
  if !ready
49
49
  begin
50
50
 
51
- require_relative 'console/stty_console'
51
+ require_relative 'stty_console'
52
52
  ready = true
53
53
 
54
54
  rescue Exception
@@ -61,7 +61,7 @@ else
61
61
 
62
62
  # If still not ready, just use stubbed version
63
63
  if !ready
64
- require_relative 'console/stub_console'
64
+ require_relative 'stub_console'
65
65
  end
66
66
 
67
67
  end
@@ -171,7 +171,7 @@ module IO::LibC
171
171
  :c_cflag, :tcflag_t,
172
172
  :c_lflag, :tcflag_t,
173
173
  :c_line, :uchar,
174
- :cc_c, [ :uchar, NCCS ],
174
+ :c_cc, [ :uchar, NCCS ],
175
175
  :c_ispeed, :speed_t,
176
176
  :c_ospeed, :speed_t
177
177
  end
@@ -13,38 +13,47 @@ class IO
13
13
  def ttymode
14
14
  termios = LibC::Termios.new
15
15
  if LibC.tcgetattr(self.fileno, termios) != 0
16
- raise SystemCallError.new("tcgetattr", FFI.errno)
16
+ raise SystemCallError.new(path, FFI.errno)
17
17
  end
18
18
 
19
19
  if block_given?
20
20
  yield tmp = termios.dup
21
- if LibC.tcsetattr(self.fileno, LibC::TCSADRAIN, tmp) != 0
22
- raise SystemCallError.new("tcsetattr", FFI.errno)
21
+ if LibC.tcsetattr(self.fileno, LibC::TCSANOW, tmp) != 0
22
+ raise SystemCallError.new(path, FFI.errno)
23
23
  end
24
24
  end
25
25
  termios
26
26
  end
27
27
  private :ttymode
28
28
 
29
- def ttymode_yield(block, &setup)
29
+ def ttymode_yield(block, **opts, &setup)
30
30
  begin
31
- orig_termios = ttymode { |t| setup.call(t) }
31
+ orig_termios = ttymode { |t| setup.call(t, **opts) }
32
32
  block.call(self)
33
33
  ensure
34
- if orig_termios && LibC.tcsetattr(self.fileno, LibC::TCSADRAIN, orig_termios) != 0
35
- raise SystemCallError.new("tcsetattr", FFI.errno)
34
+ if orig_termios && LibC.tcsetattr(self.fileno, LibC::TCSANOW, orig_termios) != 0
35
+ raise SystemCallError.new(path, FFI.errno)
36
36
  end
37
37
  end
38
38
  end
39
39
  private :ttymode_yield
40
40
 
41
- TTY_RAW = Proc.new do |t|
41
+ TTY_RAW = Proc.new do |t, min: 1, time: nil, intr: nil|
42
42
  LibC.cfmakeraw(t)
43
43
  t[:c_lflag] &= ~(LibC::ECHOE|LibC::ECHOK)
44
+ if min >= 0
45
+ t[:c_cc][LibC::VMIN] = min
46
+ end
47
+ t[:c_cc][LibC::VTIME] = (time&.to_i || 0) * 10
48
+ if intr
49
+ t[:c_iflag] |= LibC::BRKINT
50
+ t[:c_lflag] |= LibC::ISIG
51
+ t[:c_oflag] |= LibC::OPOST
52
+ end
44
53
  end
45
54
 
46
- def raw(*, &block)
47
- ttymode_yield(block, &TTY_RAW)
55
+ def raw(*, **kwargs, &block)
56
+ ttymode_yield(block, **kwargs, &TTY_RAW)
48
57
  end
49
58
 
50
59
  def raw!(*)
@@ -93,13 +102,25 @@ class IO
93
102
  end
94
103
 
95
104
  def winsize=(size)
105
+ size = size.to_ary unless size.kind_of?(Array)
106
+ sizelen = size.size
107
+
108
+ if sizelen != 2 && sizelen != 4
109
+ raise ArgumentError.new("wrong number of arguments (given #{sizelen}, expected 2 or 4)")
110
+ end
111
+
112
+ row, col, xpixel, ypixel = size
113
+
96
114
  ws = LibC::Winsize.new
97
115
  if LibC.ioctl(self.fileno, LibC::TIOCGWINSZ, :pointer, ws.pointer) != 0
98
116
  raise SystemCallError.new("ioctl(TIOCGWINSZ)", FFI.errno)
99
117
  end
100
118
 
101
- ws[:ws_row] = size[0]
102
- ws[:ws_col] = size[1]
119
+ ws[:ws_row] = row
120
+ ws[:ws_col] = col
121
+ ws[:ws_xpixel] = xpixel&.to_i || 0
122
+ ws[:ws_ypixel] = ypixel&.to_i || 0
123
+
103
124
  if LibC.ioctl(self.fileno, LibC::TIOCSWINSZ, :pointer, ws.pointer) != 0
104
125
  raise SystemCallError.new("ioctl(TIOCSWINSZ)", FFI.errno)
105
126
  end
@@ -117,6 +138,80 @@ class IO
117
138
  raise SystemCallError.new("tcflush(TCIOFLUSH)", FFI.errno) unless LibC.tcflush(self.fileno, LibC::TCIOFLUSH) == 0
118
139
  end
119
140
 
141
+ def cursor
142
+ raw do
143
+ syswrite "\e[6n"
144
+
145
+ return nil if getbyte != 0x1b
146
+ return nil if getbyte != ?[.ord
147
+
148
+ num = 0
149
+ result = []
150
+
151
+ while b = getbyte
152
+ c = b.to_i
153
+ if c == ?;.ord
154
+ result.push num
155
+ num = 0
156
+ elsif c >= ?0.ord && c <= ?9.ord
157
+ num = num * 10 + c - ?0.ord
158
+ #elsif opt && c == opt
159
+ else
160
+ last = c
161
+ result.push num
162
+ b = last.chr
163
+ return nil unless b == ?R
164
+ break
165
+ end
166
+ end
167
+
168
+ result.map(&:pred)
169
+ end
170
+ end
171
+
172
+ def cursor=(pos)
173
+ pos = pos.to_ary if !pos.kind_of?(Array)
174
+
175
+ raise "expected 2D coordinates" unless pos.size == 2
176
+
177
+ x, y = pos
178
+ syswrite(format("\x1b[%d;%dH", x + 1, y + 1))
179
+
180
+ self
181
+ end
182
+
183
+ def cursor_down(n)
184
+ raw do
185
+ syswrite "\x1b[#{n}B"
186
+ end
187
+
188
+ self
189
+ end
190
+
191
+ def cursor_right(n)
192
+ raw do
193
+ syswrite "\x1b[#{n}C"
194
+ end
195
+
196
+ self
197
+ end
198
+
199
+ def cursor_left(n)
200
+ raw do
201
+ syswrite "\x1b[#{n}D"
202
+ end
203
+
204
+ self
205
+ end
206
+
207
+ def cursor_up(n)
208
+ raw do
209
+ syswrite "\x1b[#{n}A"
210
+ end
211
+
212
+ self
213
+ end
214
+
120
215
  # TODO: Windows version uses "conin$" and "conout$" instead of /dev/tty
121
216
  def self.console(sym = nil, *args)
122
217
  raise TypeError, "expected Symbol, got #{sym.class}" unless sym.nil? || sym.kind_of?(Symbol)
@@ -141,8 +236,13 @@ class IO
141
236
  end
142
237
  end
143
238
 
144
- if !con && $stdin.tty?
145
- con = File.open('/dev/tty', 'r+')
239
+ if !con
240
+ begin
241
+ con = File.open('/dev/tty', 'r+')
242
+ rescue
243
+ return nil
244
+ end
245
+
146
246
  con.sync = true
147
247
  @console = con
148
248
  end
@@ -68,7 +68,20 @@ class IO
68
68
  end
69
69
 
70
70
  def winsize=(size)
71
- stty("rows #{size[0]} cols #{size[1]}")
71
+ size = size.to_ary unless size.kind_of?(Array)
72
+ sizelen = size.size
73
+
74
+ if sizelen != 2 && sizelen != 4
75
+ raise ArgumentError.new("wrong number of arguments (given #{sizelen}, expected 2 or 4)")
76
+ end
77
+
78
+ row, col, xpixel, ypixel = size
79
+
80
+ if sizelen == 4
81
+ warn "stty io/console does not support pixel winsize"
82
+ end
83
+
84
+ stty("rows #{row} cols #{col}")
72
85
  end
73
86
 
74
87
  def iflush
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: io-console
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.5.8
5
5
  platform: java
6
6
  authors:
7
7
  - Nobu Nakada
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-16 00:00:00.000000000 Z
11
+ date: 2021-02-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: add console capabilities to IO instances.
14
14
  email: nobu@ruby-lang.org
@@ -18,13 +18,14 @@ extra_rdoc_files: []
18
18
  files:
19
19
  - LICENSE.txt
20
20
  - README.md
21
- - jruby/io/console.rb
22
- - jruby/io/console/bsd_console.rb
23
- - jruby/io/console/common.rb
24
- - jruby/io/console/linux_console.rb
25
- - jruby/io/console/native_console.rb
26
- - jruby/io/console/stty_console.rb
27
- - jruby/io/console/stub_console.rb
21
+ - lib/io/console.rb
22
+ - lib/io/console/ffi/bsd_console.rb
23
+ - lib/io/console/ffi/common.rb
24
+ - lib/io/console/ffi/console.rb
25
+ - lib/io/console/ffi/linux_console.rb
26
+ - lib/io/console/ffi/native_console.rb
27
+ - lib/io/console/ffi/stty_console.rb
28
+ - lib/io/console/ffi/stub_console.rb
28
29
  - lib/io/console/size.rb
29
30
  homepage: https://github.com/ruby/io-console
30
31
  licenses:
@@ -35,7 +36,6 @@ metadata:
35
36
  post_install_message:
36
37
  rdoc_options: []
37
38
  require_paths:
38
- - jruby
39
39
  - lib
40
40
  required_ruby_version: !ruby/object:Gem::Requirement
41
41
  requirements: