Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env ruby
require 'fox16'
include Fox
class InputHandlerWindow < FXMainWindow
def initialize(app)
# Initialize base class first
super(app, "Input Handlers Test", :opts => DECOR_ALL, :width => 400, :height => 300)
# Text area plus a button
commands = FXHorizontalFrame.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X)
FXLabel.new(commands, "Command:")
@cmdInput = FXTextField.new(commands, 30, :opts => FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X)
@cmdInput.connect(SEL_COMMAND, method(:onCmdText))
FXHorizontalSeparator.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X)
textFrame = FXVerticalFrame.new(self,
FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y)
# Output will be displayed in a multiline text area
@cmdOutput = FXText.new(textFrame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
# Initialize the pipe
@pipe = nil
end
# Create and show the main window
def create
super
show(PLACEMENT_SCREEN)
end
# Remove previous input (if any)
def closePipe
if @pipe
getApp().removeInput(@pipe, INPUT_READ|INPUT_EXCEPT)
@pipe = nil
end
end
def onCmdText(sender, sel, ptr)
# Stop previous command
closePipe
# Clean up the output window
@cmdOutput.text = ""
# Open a new pipe
@pipe = IO.popen(@cmdInput.text)
# Register input callbacks and return
getApp().addInput(@pipe, INPUT_READ|INPUT_EXCEPT) do |sender, sel, ptr|
case FXSELTYPE(sel)
when SEL_IO_READ
text = @pipe.read_nonblock(256)
if text && text.length > 0
@cmdOutput.appendText(text)
else
closePipe
end
when SEL_IO_EXCEPT
# puts 'onPipeExcept'
end
end
return 1
end
end
if $0 == __FILE__
# Construct an application
application = FXApp.new('InputHandler', 'FoxTest')
# Construct the main window
InputHandlerWindow.new(application)
# Create and show the application windows
application.create
# Run the application
application.run
end