diff --git a/ext/fox16/FXRuby.cpp b/ext/fox16/FXRuby.cpp
index ec68669d5fee0c15e20cd9791272010074f2bd98..40440315b861d0b74ddcf6274980cc1676c756d7 100644
--- a/ext/fox16/FXRuby.cpp
+++ b/ext/fox16/FXRuby.cpp
@@ -204,12 +204,11 @@ FXInputHandle FXRbGetReadFileHandle(VALUE obj) {
 #ifdef RUBY_1_9
   rb_io_t *fptr;
   GetOpenFile(obj, fptr);
-  FILE *fpr=fptr->stdio_file;
+  return fptr->fd;
 #else
   OpenFile *fptr;
   GetOpenFile(obj, fptr);
   FILE *fpr=GetReadFile(fptr);
-#endif /* RUBY_1_9 */
 #ifdef WIN32
 #ifdef __CYGWIN__
   return (FXInputHandle) get_osfhandle(fileno(fpr));
@@ -219,6 +218,7 @@ FXInputHandle FXRbGetReadFileHandle(VALUE obj) {
 #else
   return (FXInputHandle) fileno(fpr);
 #endif
+#endif /* RUBY_1_9 */
   }
 
 
@@ -227,12 +227,11 @@ FXInputHandle FXRbGetWriteFileHandle(VALUE obj) {
 #ifdef RUBY_1_9
   rb_io_t *fptr;
   GetOpenFile(obj, fptr);
-  FILE *fpw=fptr->stdio_file;
+  return fptr->fd;
 #else
   OpenFile *fptr;
   GetOpenFile(obj, fptr);
   FILE *fpw=GetWriteFile(fptr);
-#endif /* RUBY_1_9 */
 #ifdef WIN32
 #ifdef __CYGWIN__
   return (FXInputHandle) get_osfhandle(fileno(fpw));
@@ -242,6 +241,7 @@ FXInputHandle FXRbGetWriteFileHandle(VALUE obj) {
 #else
   return (FXInputHandle) fileno(fpw);
 #endif
+#endif /* RUBY_1_9 */
   }
 
 
@@ -431,7 +431,7 @@ VALUE FXRbMakeArray(const FXRectangle* rectangles,FXuint nrectangles){
     rb_ary_push(result,FXRbGetRubyObj(&rectangles[i],"FXRectangle *"));
   return result;
   }
-  
+
 // Returns a Ruby array of FXSegments
 VALUE FXRbMakeArray(const FXSegment* segments,FXuint nsegments){
   VALUE result=rb_ary_new();
@@ -1170,7 +1170,7 @@ void* FXRbGetExpectedData(VALUE recv,FXSelector key,VALUE value){
 	    }
 		return 0;
     }
-	
+
 	if(type==SEL_DRAGGED){
 	    SWIG_Ruby_ConvertPtr(value,&ptr,FXRbTypeQuery("FXEvent *"),1);
 	    return ptr;
@@ -1344,7 +1344,7 @@ void FXRbRange2LoHi(VALUE range,FXdouble& lo,FXdouble& hi){
       }
     }
   }
-  
+
 //----------------------------------------------------------------------
 
 void FXRbCallVoidMethod(FXObject* recv, ID func) {
@@ -1594,7 +1594,7 @@ FXRbMenuRadio::~FXRbMenuRadio(){
 void FXRbTreeList::enumerateItem(FXTreeItem* item,FXObjectListOf<FXTreeItem>& items){
   // Add this item to the list
   items.append(item);
-  
+
   // Add this item's children
   FXRbTreeList::enumerateItems(item->getFirst(),item->getLast(),items);
   }
@@ -1623,7 +1623,7 @@ void FXRbTreeList::enumerateItems(FXTreeItem* fm,FXTreeItem* to,FXObjectListOf<F
 void FXRbFoldingList::enumerateItem(FXFoldingItem* item,FXObjectListOf<FXFoldingItem>& items){
   // Add this item to the list
   items.append(item);
-  
+
   // Add this item's children
   FXRbFoldingList::enumerateItems(item->getFirst(),item->getLast(),items);
   }
@@ -1658,7 +1658,7 @@ FXint FXRbComboBox::sortFunc(const FXListItem* a,const FXListItem* b){
   return static_cast<FXint>(NUM2INT(result));
   }
 
-  
+
 // Sort function stand-in for FXFoldingList
 FXint FXRbFoldingList::sortFunc(const FXFoldingItem* a,const FXFoldingItem* b){
   VALUE itemA = FXRbGetRubyObj(const_cast<FXFoldingItem*>(a), "FXFoldingItem *");
@@ -1694,7 +1694,7 @@ FXint FXRbListBox::sortFunc(const FXListItem* a,const FXListItem* b){
   return static_cast<FXint>(NUM2INT(result));
   }
 
-  
+
 // Sort function stand-in for FXTreeList
 FXint FXRbTreeList::sortFunc(const FXTreeItem* a,const FXTreeItem* b){
   VALUE itemA = FXRbGetRubyObj(const_cast<FXTreeItem*>(a), "FXTreeItem *");
@@ -2013,7 +2013,7 @@ extern "C" void Init_ui(void);
 #ifdef USE_RB_REQUIRE
 #define REQUIRE(fname) rb_require((fname))
 #else
-#define REQUIRE(fname) rb_funcall(rb_mKernel,rb_intern("require"),1,rb_str_new2((fname))) 
+#define REQUIRE(fname) rb_funcall(rb_mKernel,rb_intern("require"),1,rb_str_new2((fname)))
 #endif
 
 extern "C" void
@@ -2053,14 +2053,14 @@ Init_fox16(void) {
   REQUIRE("fox16/version");
   REQUIRE("fox16/kwargs");
   REQUIRE("fox16/exceptions_for_fxerror");
-  
+
   id_assocs=rb_intern("@assocs");
   id_backtrace=rb_intern("backtrace");
   id_cmp=rb_intern("<=>");
   id_begin=rb_intern("begin");
   id_end=rb_intern("end");
   id_exclude_endp=rb_intern("exclude_end?");
-  
+
   FXRuby_Objects=st_init_numtable();
   appSensitiveObjs=st_init_numtable();
   appSensitiveDCs=st_init_numtable();
diff --git a/test/TC_FXApp.rb b/test/TC_FXApp.rb
index 3c706ece54732c8e4944e2b5392c7ecd811eece7..11ca3438028df6650c13142147abe4ef7c0c2289 100755
--- a/test/TC_FXApp.rb
+++ b/test/TC_FXApp.rb
@@ -1,5 +1,7 @@
 require 'test/unit'
 require 'fox16'
+require 'testcase'
+require 'socket'
 
 include Fox
 
@@ -14,3 +16,40 @@ class TC_FXApp < Test::Unit::TestCase
   end
 end
 
+class TC_FXApp2 < TestCase
+  def setup
+    super(self.class.name)
+  end
+
+  def check_events(pipe_rd, pipe_wr)
+    app.addInput(pipe_wr, INPUT_WRITE, app, FXApp::ID_QUIT)
+    app.run
+    app.removeInput(pipe_wr, INPUT_WRITE)
+
+    app.addInput(pipe_rd, INPUT_READ, app, FXApp::ID_QUIT)
+    data_sent = false
+    app.addTimeout(1) do
+      data_sent = true
+      pipe_wr.write " "
+    end
+    app.run
+    app.removeInput(pipe_rd, INPUT_READ)
+    pipe_wr.close
+    pipe_rd.close
+
+    assert data_sent, "the read input event shouldn't fire before some data is available"
+  end
+
+  def test_addInput_on_pipe
+    check_events *IO.pipe
+  end
+
+  def test_addInput_on_socket
+    s = TCPServer.open 'localhost', 0
+    pipe_wr = TCPSocket.open 'localhost', s.addr[1]
+    pipe_rd = s.accept
+    s.close
+
+    check_events pipe_rd, pipe_wr
+  end
+end