rendered paste body#!/usr/bin/env rubyrequire 'libglade2'#require 'open3'class Gui def initialize Gtk.init wdt = GladeXML.new("ddiface.glade"){|h| method(h)} @desde = wdt.get_widget("desde_combo") @desde.active = 0 @en = wdt.get_widget("en_entry") @estado = wdt.get_widget("estado_textview") @copiar = wdt.get_widget("copiar_button") Gtk.main end def on_main_window_delete_event(widget,event) puts("main delete event!") Gtk.main_quit puts("Gtk finished!") false end def on_copiar_button_released(widget) puts("copiar button released!") if(@en.text=='' || @desde.active_text=='' ) @estado.buffer.text = @estado.buffer.text + "\nDebe especificar desde y hacia donde copiar..." else @estado.buffer.text = @estado.buffer.text + "\nCopiando en \"#{@en.text}\" desde \"#{@desde.active_text}\"" @copiar.sensitive = false begin fin = open(@desde.active_text,"r") fout = open(@en.text,"w") unless fout.flock(File::LOCK_EX|File::LOCK_NB) puts("Cannot get immediate lock...") fout.flock(File::LOCK_EX) end @estado.buffer.text = @estado.buffer.text + "\nStarting copy..." Thread.new{fin.each_line{|line| fout.puts(line)}}.join rescue IOError => e puts("IOError: #{e.message}\nAborting copy...") ensure fin.close fout.close @copiar.sensitive = true end end end def on_salir_button_released(widget) puts("salir button released!") self.on_main_window_delete_event(widget,nil) end def on_main_window_destroy_event(widget) puts("main destroy event!") endendSignal::trap("SIGINT"){ puts("Control + C got it!\nterminating copy...") Thread.list.each{|thread| thread.stop unless !thread.alive?}}Gui.new