module Fox class FXApp alias addTimeoutOrig addTimeout # :nodoc: alias removeTimeoutOrig removeTimeout # :nodoc: alias hasTimeoutOrig? hasTimeout? # :nodoc: alias remainingTimeoutOrig remainingTimeout # :nodoc: # # Add a timeout message to be sent to target object in _ms_ milliseconds. # By default, the timer fires only once after the interval expires. The last argument # is optional user data which will be passed along as the _ptr_ argument of # the message handler. If a timer with the same target and message already exists, # it will be rescheduled. # # There are several forms for #addTimeout; the original form (from FOX) # takes three arguments: # # timeout = app.addTimeout(delay, tgt, sel) # # Here, _delay_ is the time interval (in milliseconds) to wait # before firing this timeout. The second and third arguments are the # target object and message identifier for the message to be sent when # this timeout fires. # # A second form of #addTimeout takes a Method instance as its single argument: # # timeout = app.addTimeout(delay, mthd) # # For this form, the method should have the standard argument list # for a FOX message handler. That is, the method should take three # arguments, for the message _sender_ (an FXObject), the message _selector_, # and the message _data_ (if any). # # The last form of #addTimeout takes a block: # # timeout = app.addTimeout(delay) do |sender, sel, data| # ... handle the timeout ... # end # # All of these return a reference to an opaque object (actually, a hash) that # can be passed to #removeTimeout if it is necessary to remove the timeout # before it fires. # # For the last two forms, you can pass in the optional +:repeat+ parameter to # cause the timeout to be re-registered after it fires, e.g. # # timeout = app.addTimeout(delay, :repeat => true) do |sender, sel, data| # ... handle the timeout ... # ... re-add the timeout with the same delay ... # end # def addTimeout(ms, *args, &block) params = {} params = args.pop if args.last.is_a? Hash params[:delay] = ms tgt, sel = nil, 0 if args.length > 0 if args[0].respond_to? :call tgt = params[:target] || FXPseudoTarget.new tgt.pconnect(SEL_TIMEOUT, args[0], params) else # it's some other kind of object tgt = args[0] sel = args[1] end else tgt = params[:target] || FXPseudoTarget.new tgt.pconnect(SEL_TIMEOUT, block, params) end addTimeoutOrig(tgt, sel, ms) params[:target] = tgt params[:selector] = sel params end # # Remove timeout previously registered using #addTimeout; returns +nil+. # For an example of how to use #removeTimeout, see the documentation for # the #hasTimeout? method. # def removeTimeout(*args) if args.length == 2 removeTimeoutOrig(args[0], args[1]) else params = args[0] removeTimeoutOrig(params[:target], params[:selector]) end end # # Return +true+ if given timeout has been set, otherwise return +false+. # # For example, suppose you set up a timeout event to run ten seconds from # now: # # timeout = app.addTimeout(10*1000, ...) # # but in the meantime, you decide that you want to cancel it if it hasn't # run yet: # # if app.hasTimeout?(timeout) # app.removeTimeout(timeout) # end # def hasTimeout?(*args) if args.length == 2 hasTimeoutOrig?(args[0], args[1]) else hsh = args[0] hasTimeoutOrig?(hsh[:target], hsh[:selector]) end end # # Return the time remaining (in milliseconds) until the given timer fires. # If the timer is past due, zero is returned. If there is no such # timer, infinity (UINT_MAX) is returned. # # For example: # # timeout = app.addTimeout(ms, ...) # time_left = app.remainingTimeout(timeout) # def remainingTimeout(*args) if args.length == 2 remainingTimeoutOrig(args[0], args[1]) else hsh = args[0] remainingTimeoutOrig(hsh[:target], hsh[:selector]) end end end # class FXApp end # module Fox