clio 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. data/CHANGES +66 -0
  2. data/MANIFEST +48 -169
  3. data/README +13 -17
  4. data/RELEASE +8 -0
  5. data/VERSION +1 -0
  6. data/lib/clio/buffer.rb +93 -0
  7. data/lib/clio/commandable.rb +71 -69
  8. data/lib/clio/commandline.rb +429 -230
  9. data/lib/clio/consoleutils.rb +0 -16
  10. data/lib/clio/facets/kernel.rb +13 -0
  11. data/lib/clio/facets/string.rb +25 -0
  12. data/lib/clio/layout.rb +14 -0
  13. data/lib/clio/layout/flow.rb +1 -0
  14. data/lib/clio/layout/line.rb +23 -0
  15. data/lib/clio/layout/list.rb +33 -0
  16. data/lib/clio/layout/split.rb +122 -0
  17. data/lib/clio/layout/stack.rb +17 -0
  18. data/lib/clio/layout/table.rb +46 -0
  19. data/lib/clio/progressbar.rb +189 -210
  20. data/lib/clio/string.rb +116 -109
  21. data/lib/clio/usage.rb +184 -0
  22. data/lib/clio/usage/argument.rb +84 -0
  23. data/lib/clio/usage/command.rb +440 -0
  24. data/lib/clio/usage/interface.rb +122 -0
  25. data/lib/clio/usage/main.rb +165 -0
  26. data/lib/clio/usage/option.rb +251 -0
  27. data/lib/clio/usage/parser.rb +191 -0
  28. data/lib/clio/usage/signature.rb +55 -0
  29. data/meta/abstract +3 -0
  30. data/meta/authors +1 -0
  31. data/meta/created +1 -0
  32. data/meta/homepage +1 -0
  33. data/meta/license +1 -0
  34. data/meta/repository +1 -0
  35. data/meta/summary +1 -0
  36. data/spec/commandline/autousage.rd +56 -0
  37. data/spec/commandline/bracket.rd +64 -0
  38. data/spec/commandline/completion.rd +38 -0
  39. data/spec/commandline/define.rd +44 -0
  40. data/spec/commandline/method.rd +60 -0
  41. data/spec/commandline/parse.rd +72 -0
  42. data/spec/commandline/scenario.rd +81 -0
  43. data/spec/commandline/subclass.rd +54 -0
  44. data/spec/string/unit.rd +58 -0
  45. data/spec/usage/define.rd +44 -0
  46. data/spec/usage/parse.rd +47 -0
  47. metadata +65 -196
  48. data/HISTORY +0 -11
  49. data/METADATA +0 -18
  50. data/NEWS +0 -10
  51. data/admin/config/reap.yaml +0 -30
  52. data/admin/depot/commandline.rb +0 -219
  53. data/admin/depot/multicommand.rb +0 -403
  54. data/admin/depot/test_multicommand.rb +0 -40
  55. data/admin/log/notes.xml +0 -28
  56. data/admin/log/stats.html +0 -25
  57. data/admin/log/syntax.log +0 -0
  58. data/admin/log/testunit.log +0 -16
  59. data/admin/pack/clio-0.0.1.gem +0 -0
  60. data/admin/share/reap/example.rb +0 -7
  61. data/admin/temps/lib/clio/about.rb.erb +0 -4
  62. data/lib/clio/command.rb +0 -296
  63. data/lib/clio/option.rb +0 -36
  64. data/lib/clio/runmode.rb +0 -126
  65. data/test/test_command.rb +0 -42
  66. data/test/test_commandline.rb +0 -83
  67. data/vendor/Console/Console.cpp +0 -1203
  68. data/vendor/Console/Console.rdoc +0 -690
  69. data/vendor/Console/Console_ANSI.rdoc +0 -302
  70. data/vendor/Console/HISTORY.txt +0 -7
  71. data/vendor/Console/INSTALL.txt +0 -18
  72. data/vendor/Console/Makefile +0 -162
  73. data/vendor/Console/README.txt +0 -26
  74. data/vendor/Console/doc/classes/Win32.html +0 -115
  75. data/vendor/Console/doc/classes/Win32/Console.html +0 -650
  76. data/vendor/Console/doc/classes/Win32/Console.src/M000001.html +0 -31
  77. data/vendor/Console/doc/classes/Win32/Console.src/M000002.html +0 -23
  78. data/vendor/Console/doc/classes/Win32/Console.src/M000003.html +0 -23
  79. data/vendor/Console/doc/classes/Win32/Console.src/M000004.html +0 -27
  80. data/vendor/Console/doc/classes/Win32/Console.src/M000005.html +0 -23
  81. data/vendor/Console/doc/classes/Win32/Console.src/M000006.html +0 -28
  82. data/vendor/Console/doc/classes/Win32/Console.src/M000007.html +0 -23
  83. data/vendor/Console/doc/classes/Win32/Console.src/M000008.html +0 -24
  84. data/vendor/Console/doc/classes/Win32/Console.src/M000009.html +0 -44
  85. data/vendor/Console/doc/classes/Win32/Console.src/M000010.html +0 -23
  86. data/vendor/Console/doc/classes/Win32/Console.src/M000011.html +0 -33
  87. data/vendor/Console/doc/classes/Win32/Console.src/M000012.html +0 -26
  88. data/vendor/Console/doc/classes/Win32/Console.src/M000013.html +0 -27
  89. data/vendor/Console/doc/classes/Win32/Console.src/M000014.html +0 -28
  90. data/vendor/Console/doc/classes/Win32/Console.src/M000015.html +0 -23
  91. data/vendor/Console/doc/classes/Win32/Console.src/M000016.html +0 -23
  92. data/vendor/Console/doc/classes/Win32/Console.src/M000017.html +0 -23
  93. data/vendor/Console/doc/classes/Win32/Console.src/M000018.html +0 -29
  94. data/vendor/Console/doc/classes/Win32/Console.src/M000019.html +0 -23
  95. data/vendor/Console/doc/classes/Win32/Console.src/M000020.html +0 -23
  96. data/vendor/Console/doc/classes/Win32/Console.src/M000021.html +0 -28
  97. data/vendor/Console/doc/classes/Win32/Console.src/M000022.html +0 -23
  98. data/vendor/Console/doc/classes/Win32/Console.src/M000023.html +0 -28
  99. data/vendor/Console/doc/classes/Win32/Console.src/M000024.html +0 -35
  100. data/vendor/Console/doc/classes/Win32/Console.src/M000025.html +0 -28
  101. data/vendor/Console/doc/classes/Win32/Console.src/M000026.html +0 -28
  102. data/vendor/Console/doc/classes/Win32/Console.src/M000027.html +0 -28
  103. data/vendor/Console/doc/classes/Win32/Console.src/M000028.html +0 -31
  104. data/vendor/Console/doc/classes/Win32/Console.src/M000029.html +0 -23
  105. data/vendor/Console/doc/classes/Win32/Console.src/M000030.html +0 -23
  106. data/vendor/Console/doc/classes/Win32/Console.src/M000031.html +0 -23
  107. data/vendor/Console/doc/classes/Win32/Console.src/M000032.html +0 -27
  108. data/vendor/Console/doc/classes/Win32/Console.src/M000033.html +0 -27
  109. data/vendor/Console/doc/classes/Win32/Console.src/M000034.html +0 -25
  110. data/vendor/Console/doc/classes/Win32/Console/ANSI.html +0 -103
  111. data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.html +0 -220
  112. data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.src/M000035.html +0 -32
  113. data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.src/M000036.html +0 -205
  114. data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.src/M000037.html +0 -40
  115. data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.src/M000038.html +0 -25
  116. data/vendor/Console/doc/classes/Win32/Console/API.html +0 -758
  117. data/vendor/Console/doc/classes/Win32/Console/API.src/M000039.html +0 -27
  118. data/vendor/Console/doc/classes/Win32/Console/API.src/M000040.html +0 -27
  119. data/vendor/Console/doc/classes/Win32/Console/API.src/M000041.html +0 -27
  120. data/vendor/Console/doc/classes/Win32/Console/API.src/M000042.html +0 -32
  121. data/vendor/Console/doc/classes/Win32/Console/API.src/M000043.html +0 -32
  122. data/vendor/Console/doc/classes/Win32/Console/API.src/M000044.html +0 -28
  123. data/vendor/Console/doc/classes/Win32/Console/API.src/M000045.html +0 -26
  124. data/vendor/Console/doc/classes/Win32/Console/API.src/M000046.html +0 -26
  125. data/vendor/Console/doc/classes/Win32/Console/API.src/M000047.html +0 -27
  126. data/vendor/Console/doc/classes/Win32/Console/API.src/M000048.html +0 -30
  127. data/vendor/Console/doc/classes/Win32/Console/API.src/M000049.html +0 -29
  128. data/vendor/Console/doc/classes/Win32/Console/API.src/M000050.html +0 -27
  129. data/vendor/Console/doc/classes/Win32/Console/API.src/M000051.html +0 -28
  130. data/vendor/Console/doc/classes/Win32/Console/API.src/M000052.html +0 -30
  131. data/vendor/Console/doc/classes/Win32/Console/API.src/M000053.html +0 -27
  132. data/vendor/Console/doc/classes/Win32/Console/API.src/M000054.html +0 -29
  133. data/vendor/Console/doc/classes/Win32/Console/API.src/M000055.html +0 -29
  134. data/vendor/Console/doc/classes/Win32/Console/API.src/M000056.html +0 -28
  135. data/vendor/Console/doc/classes/Win32/Console/API.src/M000057.html +0 -27
  136. data/vendor/Console/doc/classes/Win32/Console/API.src/M000058.html +0 -47
  137. data/vendor/Console/doc/classes/Win32/Console/API.src/M000059.html +0 -32
  138. data/vendor/Console/doc/classes/Win32/Console/API.src/M000060.html +0 -47
  139. data/vendor/Console/doc/classes/Win32/Console/API.src/M000061.html +0 -34
  140. data/vendor/Console/doc/classes/Win32/Console/API.src/M000062.html +0 -32
  141. data/vendor/Console/doc/classes/Win32/Console/API.src/M000063.html +0 -32
  142. data/vendor/Console/doc/classes/Win32/Console/API.src/M000064.html +0 -35
  143. data/vendor/Console/doc/classes/Win32/Console/API.src/M000065.html +0 -26
  144. data/vendor/Console/doc/classes/Win32/Console/API.src/M000066.html +0 -27
  145. data/vendor/Console/doc/classes/Win32/Console/API.src/M000067.html +0 -29
  146. data/vendor/Console/doc/classes/Win32/Console/API.src/M000068.html +0 -27
  147. data/vendor/Console/doc/classes/Win32/Console/API.src/M000069.html +0 -27
  148. data/vendor/Console/doc/classes/Win32/Console/API.src/M000070.html +0 -28
  149. data/vendor/Console/doc/classes/Win32/Console/API.src/M000071.html +0 -27
  150. data/vendor/Console/doc/classes/Win32/Console/API.src/M000072.html +0 -26
  151. data/vendor/Console/doc/classes/Win32/Console/API.src/M000073.html +0 -27
  152. data/vendor/Console/doc/classes/Win32/Console/API.src/M000074.html +0 -31
  153. data/vendor/Console/doc/classes/Win32/Console/API.src/M000075.html +0 -27
  154. data/vendor/Console/doc/classes/Win32/Console/API.src/M000076.html +0 -32
  155. data/vendor/Console/doc/classes/Win32/Console/API.src/M000077.html +0 -27
  156. data/vendor/Console/doc/classes/Win32/Console/API.src/M000078.html +0 -32
  157. data/vendor/Console/doc/classes/Win32/Console/API.src/M000079.html +0 -32
  158. data/vendor/Console/doc/classes/Win32/Console/API.src/M000080.html +0 -32
  159. data/vendor/Console/doc/classes/Win32/Console/Constants.html +0 -360
  160. data/vendor/Console/doc/created.rid +0 -1
  161. data/vendor/Console/doc/files/Console_ANSI_rdoc.html +0 -407
  162. data/vendor/Console/doc/files/Console_cpp.html +0 -104
  163. data/vendor/Console/doc/files/Console_rdoc.html +0 -964
  164. data/vendor/Console/doc/files/lib/Win32/Console/ANSI_rb.html +0 -123
  165. data/vendor/Console/doc/files/lib/Win32/Console_rb.html +0 -297
  166. data/vendor/Console/doc/fr_class_index.html +0 -32
  167. data/vendor/Console/doc/fr_file_index.html +0 -31
  168. data/vendor/Console/doc/fr_method_index.html +0 -106
  169. data/vendor/Console/doc/index.html +0 -24
  170. data/vendor/Console/doc/rdoc-style.css +0 -172
  171. data/vendor/Console/extconf.rb +0 -18
  172. data/vendor/Console/lib/Term/ansicolor.rb +0 -76
  173. data/vendor/Console/lib/Win32/Console.rb +0 -970
  174. data/vendor/Console/lib/Win32/Console/ANSI.rb +0 -305
  175. data/vendor/Console/test/test_cursor.rb +0 -9
  176. data/vendor/Console/test/test_mouse.rb +0 -6
  177. data/vendor/Console/test/test_readinput.rb +0 -62
  178. data/vendor/Console/test/test_readoutput.rb +0 -52
  179. data/vendor/Console/test/test_sendevent.rb +0 -17
  180. data/vendor/Console/test/test_title.rb +0 -14
  181. data/vendor/Console/test/test_write.rb +0 -36
data/lib/clio/runmode.rb DELETED
@@ -1,126 +0,0 @@
1
- warn "deprecated by commandline"
2
- exit 0
3
-
4
- require 'clio/commandline'
5
-
6
- module Clio
7
-
8
- # = Runmode
9
- #
10
- class Runmode
11
-
12
- ###
13
- def self.attr(name, *aliases)
14
- name = name.to_s
15
- if name =~ /\?$/
16
- name = name.chomp('?')
17
- attr_writer name
18
- module_eval do
19
- "def #{name}?; @#{name} ; end"
20
- end
21
- aliases.each do |alt|
22
- alt = alt.to_s.chomp('?')
23
- alias_method("#{alt}?", "#{name}?")
24
- alias_method("#{alt}=", "#{name}=")
25
- end
26
- else
27
- attr_accessor name
28
- aliases.each do |alt|
29
- alt = alt.to_s.chomp('?')
30
- alias_method("#{alt}" , "#{name}")
31
- alias_method("#{alt}=", "#{name}=")
32
- end
33
- end
34
- end
35
-
36
- #
37
- def self.runmodes
38
- i = ancestors.index(::Clio::Runmode)
39
- m = ancestors[0...i].inject([]) do |modes, ancestor|
40
- modes | ancestor.instance_methods(false)
41
- end
42
- modes.reject{ |mode| mode =~ /\=$/ }
43
- end
44
-
45
- ###
46
- def initialize(argv=ARGV)
47
- if Hash===argv
48
- argv.each{ |k,v| send("#{k}=", v) }
49
- else
50
- cmd = Commandline.new(argv)
51
- self.class.runmodes.each do |mode|
52
- key = mode.chomp('?')
53
- val = cmd.send(mode)
54
- send("#{key}=", val) if val
55
- end
56
- @runmode_commandline = cmd
57
- end
58
-
59
- ###
60
- def runmode_commandline
61
- @runmode_commandline
62
- end
63
-
64
- ###
65
- def runmode_leftover
66
- runmode_commandline.instance_delegate
67
- end
68
- end
69
-
70
-
71
- =begin
72
- #
73
- def runmode_parse(argv)
74
- opts = {}
75
- runmodes.each do |mode|
76
- if mode =~ /\?$/
77
- # If a simple letter flag
78
- if mode.to_s.size == 1
79
- if argv.delete("-#{mode}")
80
- opts[mode] = true
81
- else
82
- if fs = argv.select{ |a| a =~ /^\-\w+#{mode}\w*$/ }
83
- opts[mode] = true unless fs.empty?
84
- fs.each{ |a| a.gsub!(mode, '') }
85
- end
86
- end
87
- else
88
- opts[mode] = true if argv.delete("--#{mode}")
89
- end
90
- else
91
-
92
- end
93
- end
94
- new(opts)
95
- end
96
- =end
97
-
98
- end
99
-
100
- ### = Runmode::Standard
101
- # Convenience class for the most common modes.
102
- # This class encapsulates common global options for
103
- # command line scripts. The built-in modes are:
104
- #
105
- # force
106
- # trace
107
- # debug
108
- # dryrun -or- noharm -or- pretend ?
109
- # silent -or- quiet
110
- # verbose
111
- #
112
- class Runmode::Standard < Runmode
113
- attr :force?
114
- attr :debug?
115
- attr :trace?
116
-
117
- # TODO: Reduce to one, two at most.
118
- attr :noharm, :dryrun, :pretend, :n
119
-
120
- attr :quiet?, :q?
121
-
122
- attr :verbose?, :v? #:V ? :loud ?
123
- end
124
-
125
- end
126
-
data/test/test_command.rb DELETED
@@ -1,42 +0,0 @@
1
- require 'test/unit'
2
- require 'clio/command'
3
-
4
- class TestCommand < Test::Unit::TestCase
5
-
6
- class ExampleCommand < ::Clio::Command
7
-
8
- def setup
9
- @check = {}
10
- end
11
-
12
- # No arguments and no options.
13
- def _a
14
- @check['a'] = true
15
- end
16
-
17
- # Takes only option.
18
- def _b(opts)
19
- @check['b'] = opts
20
- end
21
-
22
- # Takes multiple arguments and options. (Ruby 1.9 only)
23
- #def c(*args, opts)
24
- #end
25
-
26
- # opt 'a', :bolean, 'example option a'
27
-
28
- # Takes one argument and options.
29
- def call(args, opts)
30
- @check['args'] = args
31
- @check['opts'] = opts
32
- end
33
-
34
- end
35
-
36
-
37
- def test_one
38
- assert(true)
39
- end
40
-
41
- end
42
-
@@ -1,83 +0,0 @@
1
- require 'clio/commandline'
2
- require 'test/unit'
3
-
4
- class TC_Commandline < Test::Unit::TestCase
5
-
6
- def setup
7
- @cmd = Clio::Commandline.new("--force copy --file try.rb")
8
- end
9
-
10
- def test_flag_option
11
- assert(@cmd.force?)
12
- end
13
-
14
- def test_value_option
15
- assert_equal('try.rb', @cmd.file)
16
- end
17
-
18
- def test_argument
19
- assert_equal('copy', @cmd[0])
20
- end
21
-
22
- end
23
-
24
-
25
- class TC_Commandline_Aliases < Test::Unit::TestCase
26
-
27
- def setup
28
- @cmd = Clio::Commandline.new("--force copy --file try.rb")
29
- @cmd.option_alias(:f?, :force?)
30
- @cmd.option_alias(:o, :file)
31
- end
32
-
33
- def test_flag_option
34
- assert(@cmd.f?)
35
- end
36
-
37
- def test_value_option
38
- assert_equal('try.rb', @cmd.o)
39
- end
40
-
41
- def test_argument
42
- assert_equal('copy', @cmd[0])
43
- end
44
-
45
- end
46
-
47
-
48
- class TC_Commandline_Subclass < Test::Unit::TestCase
49
-
50
- class SCommandline < Clio::Commandline
51
- attr :force?, :f?
52
- attr :file, :o
53
- end
54
-
55
- def setup
56
- @cmd = SCommandline.new("--force copy --file try.rb")
57
- end
58
-
59
- def test_predefined_options
60
- o = @cmd.object_class.predefined_options
61
- assert( o.include?( [:file, :o]) )
62
- assert( o.include?( [:force?, :f?]) )
63
- end
64
-
65
- def test_flag_option
66
- assert(@cmd.f?)
67
- end
68
-
69
- def test_value_option
70
- assert_equal('try.rb', @cmd.o)
71
- end
72
-
73
- def test_argument
74
- assert_equal('copy', @cmd[0])
75
- end
76
-
77
- def test_instance_options
78
- e = {:force=>true, :file=>'try.rb'}
79
- assert_equal(e, @cmd.instance_options)
80
- end
81
-
82
- end
83
-
@@ -1,1203 +0,0 @@
1
-
2
- #include "windows.h"
3
- #include "ruby.h"
4
-
5
- #ifdef WIN32
6
- #define CONSOLE_EXPORT __declspec(dllexport)
7
- #else
8
- #error Not compiling on Windows
9
- #endif
10
-
11
- VALUE rb_mWin32;
12
- VALUE rb_mConsole;
13
- VALUE rb_mAPI;
14
- VALUE rb_mConstants;
15
-
16
- /* old RUBY_METHOD_FUNC() definition doesn't match to prototypes in those days. */
17
- #ifndef ANYARGS
18
- #undef RUBY_METHOD_FUNC
19
- #define RUBY_METHOD_FUNC(func) ((VALUE (*)())func)
20
- #endif
21
-
22
-
23
- #define RB_DEF_S_METHOD(klass,method,func,argtype) \
24
- rb_define_singleton_method(klass,method,RUBY_METHOD_FUNC(func), argtype)
25
-
26
- #define RB_DEF_API_METHOD(name,argtype) \
27
- RB_DEF_S_METHOD(rb_mAPI,#name,RUBY_METHOD_FUNC(rb_##name), argtype)
28
-
29
- #define RB_DEF_METHOD(klass,method,func,argtype) \
30
- rb_define_method(klass,method,RUBY_METHOD_FUNC(func), argtype)
31
-
32
- VALUE
33
- rb_getWin32Error()
34
- {
35
- DWORD e = GetLastError();
36
- LPVOID lpMsgBuf;
37
- if (!FormatMessage(
38
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
39
- FORMAT_MESSAGE_FROM_SYSTEM |
40
- FORMAT_MESSAGE_IGNORE_INSERTS,
41
- NULL,
42
- GetLastError(),
43
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
44
- (LPTSTR) &lpMsgBuf,
45
- 0,
46
- NULL ))
47
- {
48
- // Handle the error.
49
- return Qnil;
50
- }
51
-
52
- VALUE t = rb_str_new2( (LPCTSTR) lpMsgBuf );
53
-
54
- // Free the buffer.
55
- LocalFree( lpMsgBuf );
56
-
57
- // Raise exception
58
- rb_raise(rb_eRuntimeError, RSTRING(t)->ptr);
59
- return Qnil;
60
-
61
- }
62
-
63
-
64
- extern "C"
65
- {
66
-
67
- static VALUE rb_GetStdHandle(VALUE self, VALUE handle)
68
- {
69
- unsigned long x;
70
- if ( FIXNUM_P( handle ) )
71
- {
72
- x = NUM2ULONG( handle );
73
- }
74
- else
75
- {
76
- Check_Type( handle, T_BIGNUM );
77
- x = rb_big2ulong(handle);
78
- }
79
- unsigned long h = PtrToUlong( GetStdHandle( x ) );
80
- return ULONG2NUM(h);
81
- }
82
-
83
-
84
- static VALUE rb_AllocConsole(VALUE self)
85
- {
86
- if (AllocConsole()) return INT2FIX(1);
87
- return rb_getWin32Error();
88
- }
89
-
90
-
91
- static VALUE rb_FreeConsole(VALUE self)
92
- {
93
- if (FreeConsole()) return INT2FIX(1);
94
- return rb_getWin32Error();
95
- }
96
-
97
- static VALUE rb_GenerateConsoleCtrlEvent(VALUE self, VALUE event, VALUE pgid)
98
- {
99
- unsigned int e = NUM2UINT(event);
100
- if ( e != CTRL_C_EVENT && e != CTRL_BREAK_EVENT )
101
- rb_raise(rb_eArgError, "Wrong event: only CTRL_C_EVENT or "
102
- "CTRL_BREAK_EVENT accepted.");
103
- if ( GenerateConsoleCtrlEvent(e, NUM2UINT(pgid)) )
104
- return INT2FIX(1);
105
- return rb_getWin32Error();
106
- }
107
-
108
- static VALUE rb_GetConsoleMode(VALUE self, VALUE hConsoleOutput)
109
- {
110
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
111
- DWORD mode;
112
- if (GetConsoleMode(handle,&mode))
113
- return UINT2NUM(mode);
114
- return rb_getWin32Error();
115
- }
116
-
117
- static VALUE rb_GetConsoleTitle(VALUE self)
118
- {
119
- char title[1024];
120
- if (GetConsoleTitle((char*)&title,1024))
121
- return rb_str_new2( title );
122
- return rb_getWin32Error();
123
- }
124
-
125
-
126
-
127
-
128
- static VALUE rb_GetNumberOfConsoleMouseButtons( VALUE self )
129
- {
130
- DWORD mb;
131
- if (GetNumberOfConsoleMouseButtons( &mb ))
132
- return INT2FIX(mb);
133
- return rb_getWin32Error();
134
- }
135
-
136
-
137
-
138
- static VALUE rb_GetNumberOfConsoleInputEvents( VALUE self, VALUE hConsoleOutput )
139
- {
140
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
141
- DWORD events;
142
- if (GetNumberOfConsoleInputEvents(handle, &events))
143
- return INT2FIX(events);
144
- return rb_getWin32Error();
145
- }
146
-
147
-
148
- static VALUE
149
- rb_CreateConsoleScreenBuffer( VALUE self, VALUE dwDesiredAccess,
150
- VALUE dwShareMode, VALUE dwFlags )
151
- {
152
- if (CreateConsoleScreenBuffer( NUM2UINT(dwDesiredAccess),
153
- NUM2UINT( dwShareMode),
154
- NULL,
155
- NUM2UINT( dwFlags),
156
- NULL
157
- ))
158
- return INT2FIX(1);
159
- return rb_getWin32Error();
160
- }
161
-
162
-
163
- static VALUE rb_GetConsoleCP( VALUE self )
164
- {
165
- unsigned int h = GetConsoleCP();
166
- return UINT2NUM(h);
167
- }
168
-
169
- static VALUE rb_GetConsoleOutputCP( VALUE self )
170
- {
171
- unsigned int h = GetConsoleOutputCP();
172
- return UINT2NUM(h);
173
- }
174
-
175
- static VALUE rb_SetConsoleMode( VALUE self, VALUE hConsoleOutput,
176
- VALUE Mode )
177
- {
178
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
179
- if ( SetConsoleMode( handle, NUM2UINT( Mode ) ) )
180
- return INT2FIX(1);
181
- return rb_getWin32Error();
182
- }
183
-
184
- static VALUE rb_SetConsoleCP( VALUE self, VALUE wCodePageID )
185
- {
186
- if ( SetConsoleCP( NUM2UINT( wCodePageID ) ) )
187
- return INT2FIX(1);
188
- return rb_getWin32Error();
189
- }
190
-
191
- static VALUE rb_SetConsoleOutputCP( VALUE self, VALUE wCodePageID )
192
- {
193
- if ( SetConsoleOutputCP( NUM2UINT( wCodePageID ) ) )
194
- return INT2FIX(1);
195
- return rb_getWin32Error();
196
- }
197
-
198
- static VALUE rb_GetConsoleWindow( VALUE self )
199
- {
200
- unsigned long h = PtrToUlong( GetConsoleOutputCP() );
201
- return ULONG2NUM(h);
202
- }
203
-
204
- static VALUE rb_WriteConsole( VALUE self, VALUE hConsoleOutput,
205
- VALUE lpBuffer )
206
- {
207
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
208
- DWORD nNumberOfCharsToWrite = RSTRING(lpBuffer)->len;
209
-
210
- DWORD lpNumberOfCharsWritten;
211
-
212
- WriteConsole( handle, RSTRING(lpBuffer)->ptr,
213
- nNumberOfCharsToWrite,
214
- &lpNumberOfCharsWritten, NULL );
215
- return UINT2NUM( lpNumberOfCharsWritten );
216
- }
217
-
218
-
219
- static VALUE rb_GetLargestConsoleWindowSize( VALUE self, VALUE hConsoleOutput )
220
- {
221
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
222
- COORD size = GetLargestConsoleWindowSize( handle);
223
-
224
- VALUE ret = rb_ary_new();
225
- rb_ary_push( ret, UINT2NUM( size.X ) );
226
- rb_ary_push( ret, UINT2NUM( size.Y ) );
227
- return ret;
228
- }
229
-
230
- static VALUE rb_GetConsoleCursorInfo( VALUE self, VALUE hConsoleOutput )
231
- {
232
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
233
-
234
- CONSOLE_CURSOR_INFO out;
235
- if ( !GetConsoleCursorInfo( handle, &out ) )
236
- return rb_getWin32Error();
237
-
238
- VALUE ret = rb_ary_new();
239
- rb_ary_push( ret, UINT2NUM( out.dwSize ) );
240
- rb_ary_push( ret, UINT2NUM( out.bVisible ) );
241
- return ret;
242
- }
243
-
244
- void rb_ParseEvent(VALUE ret, INPUT_RECORD& event )
245
- {
246
- switch(event.EventType) {
247
- case KEY_EVENT:
248
- {
249
- KEY_EVENT_RECORD* kevent=(KEY_EVENT_RECORD *)&(event.Event);
250
- rb_ary_push(ret, UINT2NUM(KEY_EVENT));
251
- rb_ary_push(ret, UINT2NUM(kevent->bKeyDown));
252
- rb_ary_push(ret, UINT2NUM(kevent->wRepeatCount));
253
- rb_ary_push(ret, UINT2NUM(kevent->wVirtualKeyCode));
254
- rb_ary_push(ret, UINT2NUM(kevent->wVirtualScanCode));
255
- #ifdef UNICODE
256
- rb_ary_push(ret, UINT2NUM(kevent->uChar.UnicodeChar));
257
- #else
258
- rb_ary_push(ret, UINT2NUM(kevent->uChar.AsciiChar));
259
- #endif
260
- rb_ary_push(ret, UINT2NUM(kevent->dwControlKeyState));
261
- break;
262
- }
263
- case MOUSE_EVENT:
264
- {
265
- MOUSE_EVENT_RECORD * mevent=(MOUSE_EVENT_RECORD *)&(event.Event);
266
- rb_ary_push(ret, UINT2NUM(MOUSE_EVENT) );
267
- rb_ary_push(ret, UINT2NUM(mevent->dwMousePosition.X) );
268
- rb_ary_push(ret, UINT2NUM(mevent->dwMousePosition.Y) );
269
- rb_ary_push(ret, UINT2NUM(mevent->dwButtonState) );
270
- rb_ary_push(ret, UINT2NUM(mevent->dwControlKeyState) );
271
- rb_ary_push(ret, UINT2NUM(mevent->dwEventFlags) );
272
- break;
273
- }
274
- case WINDOW_BUFFER_SIZE_EVENT:
275
- {
276
- WINDOW_BUFFER_SIZE_RECORD* wevent=
277
- (WINDOW_BUFFER_SIZE_RECORD *)&(event.Event);
278
- rb_ary_push(ret, UINT2NUM(WINDOW_BUFFER_SIZE_EVENT) );
279
- rb_ary_push(ret, UINT2NUM(wevent->dwSize.X) );
280
- rb_ary_push(ret, UINT2NUM(wevent->dwSize.Y) );
281
- }
282
- break;
283
- case MENU_EVENT:
284
- {
285
- MENU_EVENT_RECORD* mevent= (MENU_EVENT_RECORD *)&(event.Event);
286
- rb_ary_push(ret, UINT2NUM(MENU_EVENT) );
287
- rb_ary_push(ret, UINT2NUM(mevent->dwCommandId) );
288
- }
289
- break;
290
- case FOCUS_EVENT:
291
- {
292
- FOCUS_EVENT_RECORD* mevent= (FOCUS_EVENT_RECORD *)&(event.Event);
293
- rb_ary_push(ret, UINT2NUM(FOCUS_EVENT) );
294
- rb_ary_push(ret, UINT2NUM(mevent->bSetFocus) );
295
- }
296
- break;
297
- }
298
- }
299
-
300
- static VALUE rb_PeekConsoleInput( VALUE self, VALUE hConsoleOutput )
301
- {
302
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
303
-
304
- DWORD nofread;
305
- INPUT_RECORD event;
306
- if (!PeekConsoleInput(handle,&event,1,&nofread))
307
- return rb_getWin32Error();
308
-
309
- VALUE ret = rb_ary_new();
310
- rb_ParseEvent( ret, event );
311
- return ret;
312
- }
313
-
314
- static VALUE rb_ReadConsole( VALUE self, VALUE hConsoleOutput,
315
- VALUE buffer, VALUE numread )
316
- {
317
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
318
- DWORD nofread;
319
- Check_Type( buffer, T_STRING );
320
- int to_read = NUM2INT(numread);
321
- if ( RSTRING(buffer)->len > to_read )
322
- rb_raise(rb_eArgError, "String is too small to read that many characters.");
323
- if (ReadConsole(handle,(void *)RSTRING(buffer)->ptr, to_read,
324
- &nofread,NULL))
325
- return UINT2NUM(nofread);
326
- return rb_getWin32Error();
327
- }
328
-
329
- static VALUE rb_ReadConsoleInput( VALUE self, VALUE hConsoleOutput )
330
- {
331
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
332
- DWORD nofread;
333
- INPUT_RECORD event;
334
- if (!ReadConsoleInput(handle,&event,1,&nofread))
335
- return rb_getWin32Error();
336
-
337
- VALUE ret = rb_ary_new();
338
- rb_ParseEvent( ret, event );
339
- return ret;
340
- }
341
-
342
-
343
-
344
- static VALUE rb_ReadConsoleOutputCharacter( VALUE self, VALUE hConsoleOutput,
345
- VALUE charbuf, VALUE len,
346
- VALUE x, VALUE y )
347
- {
348
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
349
- COORD coords;
350
- DWORD nofread;
351
- coords.X= NUM2UINT( x );
352
- coords.Y= NUM2UINT( y );
353
- int l = NUM2INT(len);
354
- if ( RSTRING(charbuf)->len < l*sizeof(TCHAR) )
355
- rb_raise(rb_eArgError, "String is too small to read that many characters.");
356
- if (ReadConsoleOutputCharacter(handle,RSTRING(charbuf)->ptr,l,
357
- coords,&nofread))
358
- return UINT2NUM( nofread );
359
- return rb_getWin32Error();
360
- }
361
-
362
-
363
- static VALUE rb_ReadConsoleOutputAttribute( VALUE self, VALUE hConsoleOutput,
364
- VALUE len, VALUE x, VALUE y )
365
- {
366
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
367
- COORD coords;
368
- DWORD nofread;
369
- unsigned short abuffer[80*999*sizeof(unsigned short)];
370
- char cbuffer[80*999];
371
- coords.X= NUM2UINT( x );
372
- coords.Y= NUM2UINT( y );
373
- if (ReadConsoleOutputAttribute(handle, abuffer, NUM2UINT(len),
374
- coords,&nofread))
375
- {
376
- for(unsigned i=0;i<nofread;++i) {
377
- cbuffer[i]=(char)abuffer[i];
378
- }
379
- return rb_str_new( cbuffer, nofread );
380
- }
381
- return rb_getWin32Error();
382
- }
383
-
384
-
385
- static VALUE rb_ReadConsoleOutput( VALUE self, VALUE hConsoleOutput,
386
- VALUE buffer, VALUE srcwid, VALUE srcht,
387
- VALUE startx, VALUE starty,
388
- VALUE l, VALUE t, VALUE r, VALUE b )
389
- {
390
- COORD coords;
391
- COORD size;
392
- SMALL_RECT from;
393
- size.X= NUM2UINT( srcwid );
394
- size.Y= NUM2UINT( srcht );
395
- coords.X= NUM2INT( startx );
396
- coords.Y= NUM2INT( starty );
397
- from.Left = NUM2INT( l );
398
- from.Top = NUM2INT( t );
399
- from.Right = NUM2INT( r );
400
- from.Bottom = NUM2INT( b );
401
- Check_Type( buffer, T_STRING );
402
- if ( RSTRING(buffer)->len < (sizeof(CHAR_INFO)*size.X*size.Y) )
403
- rb_raise(rb_eArgError, "string buffer is too small for reading that many characters.");
404
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
405
- if (!ReadConsoleOutput(handle,(CHAR_INFO *)RSTRING(buffer)->ptr,size,coords,&from))
406
- return rb_getWin32Error();
407
-
408
- VALUE ret = rb_ary_new();
409
- rb_ary_push( ret, INT2FIX(from.Left) );
410
- rb_ary_push( ret, INT2FIX(from.Top) );
411
- rb_ary_push( ret, INT2FIX(from.Right) );
412
- rb_ary_push( ret, INT2FIX(from.Bottom) );
413
- return ret;
414
- }
415
-
416
-
417
-
418
- static VALUE rb_GetConsoleScreenBufferInfo( VALUE self, VALUE hConsoleOutput )
419
- {
420
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
421
-
422
- CONSOLE_SCREEN_BUFFER_INFO out;
423
-
424
- if ( !GetConsoleScreenBufferInfo( handle, &out ) )
425
- return rb_getWin32Error();
426
-
427
- VALUE ret = rb_ary_new();
428
- rb_ary_push( ret, UINT2NUM( out.dwSize.X ) );
429
- rb_ary_push( ret, UINT2NUM( out.dwSize.Y ) );
430
- rb_ary_push( ret, UINT2NUM( out.dwCursorPosition.X ) );
431
- rb_ary_push( ret, UINT2NUM( out.dwCursorPosition.Y ) );
432
-
433
- rb_ary_push( ret, UINT2NUM( out.wAttributes ) );
434
-
435
- rb_ary_push( ret, INT2FIX( out.srWindow.Left ) );
436
- rb_ary_push( ret, INT2FIX( out.srWindow.Top ) );
437
- rb_ary_push( ret, INT2FIX( out.srWindow.Right ) );
438
- rb_ary_push( ret, INT2FIX( out.srWindow.Bottom ) );
439
-
440
- rb_ary_push( ret, UINT2NUM( out.dwMaximumWindowSize.X ) );
441
- rb_ary_push( ret, UINT2NUM( out.dwMaximumWindowSize.Y ) );
442
-
443
-
444
- return ret;
445
- }
446
-
447
-
448
- #define strEQ(x,y) strcmp(x,y) == 0
449
-
450
- DWORD c_constant(char *name)
451
- {
452
- switch (*name) {
453
- case 'A':
454
- break;
455
- case 'B':
456
- if (strEQ(name, "BACKGROUND_BLUE"))
457
- #ifdef BACKGROUND_BLUE
458
- return BACKGROUND_BLUE;
459
- #else
460
- goto not_there;
461
- #endif
462
- if (strEQ(name, "BACKGROUND_GREEN"))
463
- #ifdef BACKGROUND_GREEN
464
- return BACKGROUND_GREEN;
465
- #else
466
- goto not_there;
467
- #endif
468
- if (strEQ(name, "BACKGROUND_INTENSITY"))
469
- #ifdef BACKGROUND_INTENSITY
470
- return BACKGROUND_INTENSITY;
471
- #else
472
- goto not_there;
473
- #endif
474
- if (strEQ(name, "BACKGROUND_RED"))
475
- #ifdef BACKGROUND_RED
476
- return BACKGROUND_RED;
477
- #else
478
- goto not_there;
479
- #endif
480
- break;
481
- case 'C':
482
- if (strEQ(name, "CAPSLOCK_ON"))
483
- #ifdef CAPSLOCK_ON
484
- return CAPSLOCK_ON;
485
- #else
486
- goto not_there;
487
- #endif
488
- if (strEQ(name, "CONSOLE_TEXTMODE_BUFFER"))
489
- #ifdef CONSOLE_TEXTMODE_BUFFER
490
- return CONSOLE_TEXTMODE_BUFFER;
491
- #else
492
- goto not_there;
493
- #endif
494
- if (strEQ(name, "CTRL_BREAK_EVENT"))
495
- #ifdef CTRL_BREAK_EVENT
496
- return CTRL_BREAK_EVENT;
497
- #else
498
- goto not_there;
499
- #endif
500
- if (strEQ(name, "CTRL_C_EVENT"))
501
- #ifdef CTRL_C_EVENT
502
- return CTRL_C_EVENT;
503
- #else
504
- goto not_there;
505
- #endif
506
- break;
507
-
508
- case 'D':
509
- break;
510
- case 'E':
511
- if (strEQ(name, "ENABLE_ECHO_INPUT"))
512
- #ifdef ENABLE_ECHO_INPUT
513
- return ENABLE_ECHO_INPUT;
514
- #else
515
- goto not_there;
516
- #endif
517
- if (strEQ(name, "ENABLE_LINE_INPUT"))
518
- #ifdef ENABLE_LINE_INPUT
519
- return ENABLE_LINE_INPUT;
520
- #else
521
- goto not_there;
522
- #endif
523
- if (strEQ(name, "ENABLE_MOUSE_INPUT"))
524
- #ifdef ENABLE_MOUSE_INPUT
525
- return ENABLE_MOUSE_INPUT;
526
- #else
527
- goto not_there;
528
- #endif
529
- if (strEQ(name, "ENABLE_PROCESSED_INPUT"))
530
- #ifdef ENABLE_PROCESSED_INPUT
531
- return ENABLE_PROCESSED_INPUT;
532
- #else
533
- goto not_there;
534
- #endif
535
- if (strEQ(name, "ENABLE_PROCESSED_OUTPUT"))
536
- #ifdef ENABLE_PROCESSED_OUTPUT
537
- return ENABLE_PROCESSED_OUTPUT;
538
- #else
539
- goto not_there;
540
- #endif
541
- if (strEQ(name, "ENABLE_WINDOW_INPUT"))
542
- #ifdef ENABLE_WINDOW_INPUT
543
- return ENABLE_WINDOW_INPUT;
544
- #else
545
- goto not_there;
546
- #endif
547
- if (strEQ(name, "ENABLE_WRAP_AT_EOL_OUTPUT"))
548
- #ifdef ENABLE_WRAP_AT_EOL_OUTPUT
549
- return ENABLE_WRAP_AT_EOL_OUTPUT;
550
- #else
551
- goto not_there;
552
- #endif
553
- if (strEQ(name, "ENHANCED_KEY"))
554
- #ifdef ENHANCED_KEY
555
- return ENHANCED_KEY;
556
- #else
557
- goto not_there;
558
- #endif
559
- break;
560
- case 'F':
561
- if (strEQ(name, "FILE_SHARE_READ"))
562
- #ifdef FILE_SHARE_READ
563
- return FILE_SHARE_READ;
564
- #else
565
- goto not_there;
566
- #endif
567
- if (strEQ(name, "FILE_SHARE_WRITE"))
568
- #ifdef FILE_SHARE_WRITE
569
- return FILE_SHARE_WRITE;
570
- #else
571
- goto not_there;
572
- #endif
573
- if (strEQ(name, "FOREGROUND_BLUE"))
574
- #ifdef FOREGROUND_BLUE
575
- return FOREGROUND_BLUE;
576
- #else
577
- goto not_there;
578
- #endif
579
- if (strEQ(name, "FOREGROUND_GREEN"))
580
- #ifdef FOREGROUND_GREEN
581
- return FOREGROUND_GREEN;
582
- #else
583
- goto not_there;
584
- #endif
585
- if (strEQ(name, "FOREGROUND_INTENSITY"))
586
- #ifdef FOREGROUND_INTENSITY
587
- return FOREGROUND_INTENSITY;
588
- #else
589
- goto not_there;
590
- #endif
591
- if (strEQ(name, "FOREGROUND_RED"))
592
- #ifdef FOREGROUND_RED
593
- return FOREGROUND_RED;
594
- #else
595
- goto not_there;
596
- #endif
597
- break;
598
- case 'G':
599
- if (strEQ(name, "GENERIC_READ"))
600
- #ifdef GENERIC_READ
601
- return GENERIC_READ;
602
- #else
603
- goto not_there;
604
- #endif
605
- if (strEQ(name, "GENERIC_WRITE"))
606
- #ifdef GENERIC_WRITE
607
- return GENERIC_WRITE;
608
- #else
609
- goto not_there;
610
- #endif
611
- break;
612
- case 'H':
613
- break;
614
- case 'I':
615
- break;
616
- case 'J':
617
- break;
618
- case 'K':
619
- if (strEQ(name, "KEY_EVENT"))
620
- #ifdef KEY_EVENT
621
- return KEY_EVENT;
622
- #else
623
- goto not_there;
624
- #endif
625
- break;
626
- case 'L':
627
- if (strEQ(name, "LEFT_ALT_PRESSED"))
628
- #ifdef LEFT_ALT_PRESSED
629
- return LEFT_ALT_PRESSED;
630
- #else
631
- goto not_there;
632
- #endif
633
- if (strEQ(name, "LEFT_CTRL_PRESSED"))
634
- #ifdef LEFT_CTRL_PRESSED
635
- return LEFT_CTRL_PRESSED;
636
- #else
637
- goto not_there;
638
- #endif
639
- break;
640
- case 'M':
641
- break;
642
- case 'N':
643
- if (strEQ(name, "NUMLOCK_ON"))
644
- #ifdef NUMLOCK_ON
645
- return NUMLOCK_ON;
646
- #else
647
- goto not_there;
648
- #endif
649
- break;
650
- case 'O':
651
- break;
652
- case 'P':
653
- break;
654
- case 'Q':
655
- break;
656
- case 'R':
657
- if (strEQ(name, "RIGHT_ALT_PRESSED"))
658
- #ifdef RIGHT_ALT_PRESSED
659
- return RIGHT_ALT_PRESSED;
660
- #else
661
- goto not_there;
662
- #endif
663
- if (strEQ(name, "RIGHT_CTRL_PRESSED"))
664
- #ifdef RIGHT_CTRL_PRESSED
665
- return RIGHT_CTRL_PRESSED;
666
- #else
667
- goto not_there;
668
- #endif
669
- break;
670
- case 'S':
671
- if (strEQ(name, "SCROLLLOCK_ON"))
672
- #ifdef SCROLLLOCK_ON
673
- return SCROLLLOCK_ON;
674
- #else
675
- goto not_there;
676
- #endif
677
- if (strEQ(name, "SHIFT_PRESSED"))
678
- #ifdef SHIFT_PRESSED
679
- return SHIFT_PRESSED;
680
- #else
681
- goto not_there;
682
- #endif
683
- if (strEQ(name, "STD_ERROR_HANDLE"))
684
- #ifdef STD_ERROR_HANDLE
685
- return STD_ERROR_HANDLE;
686
- #else
687
- goto not_there;
688
- #endif
689
- if (strEQ(name, "STD_INPUT_HANDLE"))
690
- #ifdef STD_INPUT_HANDLE
691
- return STD_INPUT_HANDLE;
692
- #else
693
- goto not_there;
694
- #endif
695
- if (strEQ(name, "STD_OUTPUT_HANDLE"))
696
- #ifdef STD_OUTPUT_HANDLE
697
- return STD_OUTPUT_HANDLE;
698
- #else
699
- goto not_there;
700
- #endif
701
- break;
702
- case 'T':
703
- break;
704
- case 'U':
705
- break;
706
- case 'V':
707
- break;
708
- case 'W':
709
- break;
710
- case 'X':
711
- break;
712
- case 'Y':
713
- break;
714
- case 'Z':
715
- break;
716
- }
717
- rb_raise(rb_eArgError, "Not such constant.");
718
- return 0;
719
-
720
- not_there:
721
- rb_raise(rb_eArgError, "Not defined.");
722
- return 0;
723
- }
724
-
725
- VALUE rb_constant( VALUE self, VALUE name )
726
- {
727
- Check_Type( name, T_STRING );
728
- return ULONG2NUM( c_constant( RSTRING(name)->ptr ) );
729
- }
730
-
731
-
732
- void define_constants()
733
- {
734
- #define DEF_SELF_CONST(NAME) \
735
- rb_define_const(rb_mConstants, #NAME, ULONG2NUM( (ULONG)NAME ) );
736
-
737
- DEF_SELF_CONST( STD_INPUT_HANDLE );
738
- DEF_SELF_CONST( STD_OUTPUT_HANDLE );
739
- DEF_SELF_CONST( STD_ERROR_HANDLE );
740
- DEF_SELF_CONST( INVALID_HANDLE_VALUE );
741
- DEF_SELF_CONST( GENERIC_READ );
742
- DEF_SELF_CONST( GENERIC_WRITE );
743
- DEF_SELF_CONST( FILE_SHARE_READ );
744
- DEF_SELF_CONST( FILE_SHARE_WRITE );
745
- DEF_SELF_CONST( CONSOLE_TEXTMODE_BUFFER );
746
-
747
- DEF_SELF_CONST( FOREGROUND_BLUE );
748
- DEF_SELF_CONST( FOREGROUND_GREEN );
749
- DEF_SELF_CONST( FOREGROUND_RED );
750
- DEF_SELF_CONST( FOREGROUND_INTENSITY );
751
- DEF_SELF_CONST( BACKGROUND_BLUE );
752
- DEF_SELF_CONST( BACKGROUND_GREEN );
753
- DEF_SELF_CONST( BACKGROUND_RED );
754
- DEF_SELF_CONST( BACKGROUND_INTENSITY );
755
-
756
- DEF_SELF_CONST( ENABLE_PROCESSED_INPUT );
757
- DEF_SELF_CONST( ENABLE_LINE_INPUT );
758
- DEF_SELF_CONST( ENABLE_ECHO_INPUT );
759
- DEF_SELF_CONST( ENABLE_WINDOW_INPUT );
760
- DEF_SELF_CONST( ENABLE_MOUSE_INPUT );
761
- DEF_SELF_CONST( ENABLE_PROCESSED_OUTPUT );
762
- DEF_SELF_CONST( ENABLE_WRAP_AT_EOL_OUTPUT );
763
-
764
- DEF_SELF_CONST( KEY_EVENT );
765
- DEF_SELF_CONST( MOUSE_EVENT );
766
- DEF_SELF_CONST( WINDOW_BUFFER_SIZE_EVENT );
767
- DEF_SELF_CONST( MENU_EVENT );
768
- DEF_SELF_CONST( FOCUS_EVENT );
769
-
770
- DEF_SELF_CONST( CAPSLOCK_ON );
771
- DEF_SELF_CONST( ENHANCED_KEY );
772
- DEF_SELF_CONST( NUMLOCK_ON );
773
- DEF_SELF_CONST( SHIFT_PRESSED );
774
- DEF_SELF_CONST( LEFT_CTRL_PRESSED );
775
- DEF_SELF_CONST( RIGHT_CTRL_PRESSED );
776
- DEF_SELF_CONST( LEFT_ALT_PRESSED );
777
- DEF_SELF_CONST( RIGHT_ALT_PRESSED );
778
- DEF_SELF_CONST( SCROLLLOCK_ON );
779
-
780
- DEF_SELF_CONST( MOUSE_WHEELED );
781
- DEF_SELF_CONST( DOUBLE_CLICK );
782
- DEF_SELF_CONST( MOUSE_MOVED );
783
-
784
- DEF_SELF_CONST( FROM_LEFT_1ST_BUTTON_PRESSED );
785
- DEF_SELF_CONST( FROM_LEFT_2ND_BUTTON_PRESSED );
786
- DEF_SELF_CONST( FROM_LEFT_3RD_BUTTON_PRESSED );
787
- DEF_SELF_CONST( FROM_LEFT_4TH_BUTTON_PRESSED );
788
- DEF_SELF_CONST( RIGHTMOST_BUTTON_PRESSED );
789
-
790
- DEF_SELF_CONST( CTRL_C_EVENT );
791
- DEF_SELF_CONST( CTRL_BREAK_EVENT );
792
- DEF_SELF_CONST( CTRL_CLOSE_EVENT );
793
- DEF_SELF_CONST( CTRL_LOGOFF_EVENT );
794
- DEF_SELF_CONST( CTRL_SHUTDOWN_EVENT );
795
- }
796
-
797
-
798
- VALUE
799
- rb_FillConsoleOutputAttribute( VALUE self, VALUE hConsoleOutput,
800
- VALUE wAttribute, VALUE nLength,
801
- VALUE col, VALUE row )
802
- {
803
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
804
-
805
- COORD dwWriteCoord;
806
- dwWriteCoord.X = NUM2UINT(col);
807
- dwWriteCoord.Y = NUM2UINT(row);
808
- DWORD numChars;
809
- if (FillConsoleOutputAttribute( handle, NUM2UINT(wAttribute),
810
- NUM2ULONG(nLength), dwWriteCoord,
811
- &numChars ))
812
- return ULONG2NUM(numChars);
813
- return rb_getWin32Error();
814
- }
815
-
816
- VALUE
817
- rb_SetConsoleScreenBufferSize( VALUE self, VALUE hConsoleOutput,
818
- VALUE x, VALUE y )
819
- {
820
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
821
- COORD size;
822
- size.X=NUM2UINT(x);
823
- size.Y=NUM2UINT(y);
824
- if (SetConsoleScreenBufferSize(handle, size))
825
- return NUM2UINT(1);
826
- return rb_getWin32Error();
827
- }
828
-
829
- VALUE
830
- rb_SetConsoleTitle( VALUE self, VALUE title )
831
- {
832
- Check_Type( title, T_STRING );
833
- if (SetConsoleTitle(RSTRING( title )->ptr))
834
- return NUM2UINT(1);
835
- return rb_getWin32Error();
836
- }
837
-
838
- VALUE
839
- rb_SetStdHandle( VALUE self, VALUE fd, VALUE hConsoleOutput )
840
- {
841
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
842
- if (SetStdHandle(NUM2UINT(fd), handle))
843
- return NUM2UINT(1);
844
- return rb_getWin32Error();
845
- }
846
-
847
- VALUE
848
- rb_SetConsoleWindowInfo( VALUE self, VALUE hConsoleOutput, VALUE bAbsolute,
849
- VALUE left, VALUE top, VALUE right, VALUE bottom )
850
- {
851
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
852
-
853
- SMALL_RECT rect;
854
- rect.Left = NUM2INT( left );
855
- rect.Top = NUM2INT( top );
856
- rect.Right = NUM2INT( right );
857
- rect.Bottom = NUM2INT( bottom );
858
- if (SetConsoleWindowInfo( handle, NUM2INT( bAbsolute ), &rect ))
859
- return UINT2NUM(1);
860
- return rb_getWin32Error();
861
- }
862
-
863
-
864
-
865
- VALUE
866
- rb_SetConsoleCursorPosition( VALUE self, VALUE hConsoleOutput,
867
- VALUE col, VALUE row )
868
- {
869
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
870
-
871
- COORD dwWriteCoord;
872
- dwWriteCoord.X = NUM2UINT(col);
873
- dwWriteCoord.Y = NUM2UINT(row);
874
- // Cannot call rb_getWin32Error as this function fails when
875
- // setting cursor to last column/row.
876
- if ( !SetConsoleCursorPosition( handle, dwWriteCoord ) )
877
- return Qnil;
878
- return INT2FIX(1);
879
- }
880
-
881
- VALUE
882
- rb_SetConsoleCursorInfo( VALUE self, VALUE hConsoleOutput,
883
- VALUE size, VALUE visib )
884
- {
885
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
886
- CONSOLE_CURSOR_INFO c;
887
- c.dwSize = NUM2UINT(size);
888
- c.bVisible = NUM2UINT(visib);
889
- if ( !SetConsoleCursorInfo( handle, &c ) )
890
- return rb_getWin32Error();
891
- return INT2FIX(1);
892
- }
893
-
894
-
895
-
896
- VALUE
897
- rb_SetConsoleActiveScreenBuffer( VALUE self, VALUE hConsoleOutput )
898
- {
899
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
900
-
901
- if ( !SetConsoleActiveScreenBuffer( handle ) )
902
- return rb_getWin32Error();
903
- return INT2FIX(1);
904
- }
905
-
906
- VALUE
907
- rb_SetConsoleTextAttribute( VALUE self, VALUE hConsoleOutput,
908
- VALUE wAttributes )
909
- {
910
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
911
-
912
- if ( !SetConsoleTextAttribute( handle, NUM2UINT(wAttributes) ) )
913
- return Qnil; // no getWin32Error to allow piping/redirecting
914
- return INT2FIX(1);
915
- }
916
-
917
-
918
-
919
- VALUE
920
- rb_ScrollConsoleScreenBuffer( VALUE self, VALUE hConsoleOutput, VALUE left1,
921
- VALUE top1, VALUE right1, VALUE bottom1,
922
- VALUE col, VALUE row, VALUE cChar, VALUE attr,
923
- VALUE left2, VALUE top2, VALUE right2,
924
- VALUE bottom2)
925
- {
926
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
927
-
928
- SMALL_RECT scroll, clip;
929
- scroll.Left = NUM2INT( left1 );
930
- scroll.Right = NUM2INT( right1 );
931
- scroll.Top = NUM2INT( top1 );
932
- scroll.Bottom = NUM2INT( bottom1 );
933
- clip.Left = NUM2INT( left2 );
934
- clip.Right = NUM2INT( right2 );
935
- clip.Top = NUM2INT( top2 );
936
- clip.Bottom = NUM2INT( bottom2 );
937
- CHAR_INFO fill;
938
- #ifdef UNICODE
939
- fill.Char.UnicodeChar = NUM2CHR( cChar );
940
- #else
941
- fill.Char.AsciiChar = NUM2CHR( cChar );
942
- #endif
943
- fill.Attributes = NUM2INT(attr);
944
- COORD origin;
945
- origin.X = NUM2UINT( col );
946
- origin.Y = NUM2UINT( row );
947
-
948
- if ( ScrollConsoleScreenBuffer( handle, &scroll, &clip, origin,
949
- &fill ) )
950
- return INT2FIX(1);
951
- return rb_getWin32Error();
952
- }
953
-
954
-
955
- VALUE
956
- rb_FillConsoleOutputCharacter( VALUE self, VALUE hConsoleOutput,
957
- VALUE cCharacter, VALUE nLength,
958
- VALUE col, VALUE row )
959
- {
960
- HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
961
-
962
- COORD dwWriteCoord;
963
- dwWriteCoord.X = NUM2UINT(col);
964
- dwWriteCoord.Y = NUM2UINT(row);
965
- DWORD numChars;
966
- if (FillConsoleOutputCharacter( handle, NUM2CHR(cCharacter),
967
- NUM2ULONG(nLength), dwWriteCoord,
968
- &numChars ))
969
- return ULONG2NUM(numChars);
970
- return rb_getWin32Error();
971
- }
972
-
973
-
974
- VALUE
975
- rb_WriteConsoleInput(int argc, VALUE *argv, VALUE self)
976
- {
977
- if (argc < 3)
978
- rb_raise(rb_eArgError, "Wrong number of arguments.");
979
-
980
- HANDLE handle = ULongToPtr( NUM2ULONG( argv[0] ) );
981
- WORD type = NUM2INT( argv[1] );
982
- DWORD written;
983
- INPUT_RECORD event;
984
- event.EventType = type;
985
- switch(event.EventType) {
986
- case KEY_EVENT:
987
- {
988
- KEY_EVENT_RECORD* kevent=(KEY_EVENT_RECORD *)&(event.Event);
989
- kevent->bKeyDown=(BOOL)NUM2UINT( argv[2] );
990
- kevent->wRepeatCount=NUM2UINT( argv[3] );
991
- kevent->wVirtualKeyCode=NUM2UINT( argv[4] );
992
- kevent->wVirtualScanCode=NUM2UINT( argv[5] );
993
- #ifdef UNICODE
994
- if (argc < 7)
995
- rb_raise(rb_eArgError, "Wrong number of arguments.");
996
- kevent->uChar.UnicodeChar=NUM2UINT( argv[6] );
997
- #else
998
- if (argc < 8)
999
- rb_raise(rb_eArgError, "Wrong number of arguments.");
1000
- kevent->uChar.AsciiChar=NUM2UINT( argv[7] );
1001
- #endif
1002
- break;
1003
- }
1004
- case MOUSE_EVENT:
1005
- {
1006
- if (argc < 7)
1007
- rb_raise(rb_eArgError, "Wrong number of arguments.");
1008
-
1009
- MOUSE_EVENT_RECORD* mevent=(MOUSE_EVENT_RECORD *)&(event.Event);
1010
- mevent->dwMousePosition.X=NUM2UINT( argv[2] );
1011
- mevent->dwMousePosition.Y=NUM2UINT( argv[3] );
1012
- mevent->dwButtonState=NUM2UINT( argv[4] );
1013
- mevent->dwControlKeyState=NUM2UINT( argv[5] );
1014
- mevent->dwEventFlags=NUM2UINT( argv[6] );
1015
- break;
1016
- }
1017
- case WINDOW_BUFFER_SIZE_EVENT:
1018
- {
1019
- if (argc < 4)
1020
- rb_raise(rb_eArgError, "Wrong number of arguments.");
1021
- WINDOW_BUFFER_SIZE_RECORD* mevent=
1022
- (WINDOW_BUFFER_SIZE_RECORD *)&(event.Event);
1023
- mevent->dwSize.X = NUM2UINT( argv[2] );
1024
- mevent->dwSize.Y = NUM2UINT( argv[3] );
1025
- }
1026
- break;
1027
- case MENU_EVENT:
1028
- {
1029
- if (argc < 3)
1030
- rb_raise(rb_eArgError, "Wrong number of arguments.");
1031
- MENU_EVENT_RECORD* mevent= (MENU_EVENT_RECORD *)&(event.Event);
1032
- mevent->dwCommandId = argv[2];
1033
- }
1034
- break;
1035
- case FOCUS_EVENT:
1036
- {
1037
- if (argc < 3)
1038
- rb_raise(rb_eArgError, "Wrong number of arguments.");
1039
- FOCUS_EVENT_RECORD* mevent= (FOCUS_EVENT_RECORD *)&(event.Event);
1040
- mevent->bSetFocus = NUM2UINT( argv[2] );
1041
- }
1042
- default:
1043
- rb_raise( rb_eArgError, "Unknown type of event.");
1044
- break;
1045
- }
1046
- if (WriteConsoleInput(handle,&event,1,&written))
1047
- return INT2FIX(1);
1048
- return rb_getWin32Error();
1049
- }
1050
-
1051
- VALUE
1052
- rb_WriteConsoleOutput(VALUE self, VALUE h, VALUE buffer,
1053
- VALUE srcwid, VALUE srcht, VALUE startx,
1054
- VALUE starty, VALUE l, VALUE t, VALUE r, VALUE b)
1055
- {
1056
- COORD coords;
1057
- COORD size;
1058
- SMALL_RECT to;
1059
-
1060
- HANDLE handle = ULongToPtr( NUM2ULONG( h ) );
1061
- Check_Type( buffer, T_STRING );
1062
- size.X=NUM2UINT( srcwid );
1063
- size.Y=NUM2UINT( srcht );
1064
- coords.X=NUM2INT( startx );
1065
- coords.Y=NUM2INT( starty );
1066
- to.Left = NUM2INT( l );
1067
- to.Top = NUM2INT( t );
1068
- to.Right = NUM2INT( r );
1069
- to.Bottom = NUM2INT( b );
1070
- if (WriteConsoleOutput(handle,(CHAR_INFO *)RSTRING(buffer)->ptr,
1071
- size,coords,&to)) {
1072
- VALUE ret = rb_ary_new();
1073
- rb_ary_push( ret, INT2FIX( to.Left ) );
1074
- rb_ary_push( ret, INT2FIX( to.Top ) );
1075
- rb_ary_push( ret, INT2FIX( to.Right ) );
1076
- rb_ary_push( ret, INT2FIX( to.Bottom ) );
1077
- return ret;
1078
- }
1079
- return rb_getWin32Error();
1080
- }
1081
-
1082
-
1083
- VALUE
1084
- rb_WriteConsoleOutputAttribute(VALUE self, VALUE h, VALUE s,
1085
- VALUE x, VALUE y)
1086
- {
1087
-
1088
- HANDLE handle = ULongToPtr( NUM2ULONG( h ) );
1089
- Check_Type( s, T_STRING );
1090
-
1091
- unsigned short buffer[80*999*sizeof(unsigned short)];
1092
- DWORD written;
1093
- DWORD towrite = RSTRING(s)->len;
1094
- for(unsigned i=0; i<towrite; i++) {
1095
- buffer[i] = (unsigned short)(RSTRING(s)->ptr[i]);
1096
- }
1097
- COORD coords;
1098
- coords.X=NUM2INT( x );
1099
- coords.Y=NUM2INT( y );
1100
- if (WriteConsoleOutputAttribute(handle,(const unsigned short *)&buffer,
1101
- towrite,coords,&written)) {
1102
- return UINT2NUM( written );
1103
- }
1104
- return rb_getWin32Error();
1105
- }
1106
-
1107
-
1108
- VALUE
1109
- rb_WriteConsoleOutputCharacter(VALUE self, VALUE h, VALUE s,
1110
- VALUE x, VALUE y)
1111
- {
1112
-
1113
- HANDLE handle = ULongToPtr( NUM2ULONG( h ) );
1114
- Check_Type( s, T_STRING );
1115
-
1116
- DWORD written;
1117
- COORD coords;
1118
- coords.X=NUM2INT( x );
1119
- coords.Y=NUM2INT( y );
1120
- if (WriteConsoleOutputCharacter(handle,(LPCTSTR)RSTRING(s)->ptr,
1121
- RSTRING(s)->len,coords,&written)) {
1122
- return UINT2NUM( written );
1123
- }
1124
- return rb_getWin32Error();
1125
- }
1126
-
1127
-
1128
- CONSOLE_EXPORT void
1129
- Init_Console(void)
1130
- {
1131
- rb_mWin32 = rb_define_module("Win32");
1132
- rb_define_const(rb_mKernel, "Win32", rb_mWin32);
1133
-
1134
- rb_mConsole = rb_define_class_under(rb_mWin32, "Console", rb_cObject);
1135
-
1136
- // Handle Constants
1137
- rb_mConstants = rb_define_module_under(rb_mConsole,"Constants");
1138
- define_constants();
1139
-
1140
- // Handle API
1141
- rb_mAPI = rb_define_class_under(rb_mConsole, "API", rb_cObject);
1142
-
1143
- RB_DEF_API_METHOD(constant, 1); //OK
1144
-
1145
- RB_DEF_API_METHOD(AllocConsole, 0);
1146
-
1147
- RB_DEF_API_METHOD(CreateConsoleScreenBuffer, 3); //OK
1148
-
1149
- RB_DEF_API_METHOD(FillConsoleOutputAttribute, 5); //OK
1150
- RB_DEF_API_METHOD(FillConsoleOutputCharacter, 5); //OK
1151
- // RB_DEF_API_METHOD(FillConsoleInputBuffer, 1); // Does not exist anymore
1152
-
1153
- RB_DEF_API_METHOD(FreeConsole, 0);
1154
-
1155
- RB_DEF_API_METHOD(GenerateConsoleCtrlEvent, 2);
1156
-
1157
- RB_DEF_API_METHOD(GetConsoleCP, 0); //OK
1158
- RB_DEF_API_METHOD(GetConsoleCursorInfo, 1); //OK
1159
- RB_DEF_API_METHOD(GetConsoleMode, 1);
1160
- RB_DEF_API_METHOD(GetConsoleOutputCP, 0);
1161
- RB_DEF_API_METHOD(GetConsoleScreenBufferInfo, 1); //OK
1162
- RB_DEF_API_METHOD(GetConsoleTitle, 0);
1163
- RB_DEF_API_METHOD(GetConsoleWindow, 0);
1164
- RB_DEF_API_METHOD(GetLargestConsoleWindowSize, 1);
1165
- RB_DEF_API_METHOD(GetNumberOfConsoleInputEvents, 1);
1166
- RB_DEF_API_METHOD(GetNumberOfConsoleMouseButtons, 0);
1167
-
1168
- RB_DEF_API_METHOD(GetStdHandle, 1); //OK
1169
-
1170
- RB_DEF_API_METHOD(PeekConsoleInput, 1); //OK
1171
- RB_DEF_API_METHOD(ReadConsole, 3); //OK
1172
- RB_DEF_API_METHOD(ReadConsoleInput, 1); //OK
1173
-
1174
- RB_DEF_API_METHOD(ReadConsoleOutput, 10); // OK
1175
- RB_DEF_API_METHOD(ReadConsoleOutputAttribute, 4); // OK
1176
- RB_DEF_API_METHOD(ReadConsoleOutputCharacter, 5); // OK
1177
-
1178
-
1179
- RB_DEF_API_METHOD(ScrollConsoleScreenBuffer, 13); //OK
1180
-
1181
- RB_DEF_API_METHOD(SetConsoleActiveScreenBuffer, 1);
1182
- RB_DEF_API_METHOD(SetConsoleCP, 1);
1183
- RB_DEF_API_METHOD(SetConsoleCursorPosition, 3);
1184
- RB_DEF_API_METHOD(SetConsoleCursorInfo, 3);
1185
- RB_DEF_API_METHOD(SetConsoleMode, 2); //OK
1186
- RB_DEF_API_METHOD(SetConsoleOutputCP, 1);
1187
- RB_DEF_API_METHOD(SetConsoleScreenBufferSize, 3);
1188
- RB_DEF_API_METHOD(SetConsoleTextAttribute, 2);
1189
- RB_DEF_API_METHOD(SetConsoleTitle, 1); //OK
1190
- RB_DEF_API_METHOD(SetConsoleWindowInfo, 6);
1191
-
1192
- RB_DEF_API_METHOD(SetStdHandle, 2);
1193
-
1194
- RB_DEF_API_METHOD(WriteConsole, 2);
1195
-
1196
- RB_DEF_API_METHOD(WriteConsoleInput, -1);
1197
- RB_DEF_API_METHOD(WriteConsoleOutput, 10);
1198
- RB_DEF_API_METHOD(WriteConsoleOutputAttribute, 4);
1199
- RB_DEF_API_METHOD(WriteConsoleOutputCharacter, 4);
1200
-
1201
- }
1202
-
1203
- }