Class: Fox::FXPseudoTarget

Inherits:
FXObject show all
Includes:
Responder
Defined in:
lib/fox16/responder2.rb

Overview

FXPseudoTarget instances act as the message target for any widgets that elect to use the #connect method to map certain message types to blocks.

Constant Summary collapse

@@targets_of_pending_timers =
{}
@@targets_of_pending_chores =
{}
@@targets_of_pending_signals =
{}
@@targets_of_pending_inputs =
{}

Instance Method Summary collapse

Methods included from Responder

#FXMAPFUNC, #FXMAPFUNCS, #FXMAPTYPE, #FXMAPTYPES, #addMapEntry, #assocIndex, #identifier, #messageMap

Methods inherited from FXObject

#bind, #handle, #load, #save, subclasses

Constructor Details

#initializeFXPseudoTarget

Returns an initialized FXPseudoTarget object.



22
23
24
25
# File 'lib/fox16/responder2.rb', line 22

def initialize
  super
  @context = {}
end

Instance Method Details

#onHandleMsg(sender, sel, ptr) ⇒ Object

Handle a message from sender, with selector sel and message data ptr.



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/fox16/responder2.rb', line 50

def onHandleMsg(sender, sel, ptr)
  message_type = Fox.FXSELTYPE(sel)
  ctx = @context[message_type]
  callable_object = ctx[:callable]
  params = ctx[:params]
  result = callable_object.call(sender, sel, ptr)
  case message_type
  when SEL_TIMEOUT
    if params[:repeat]
      FXApp.instance.addTimeout(params[:delay], callable_object, params)
    else
      @@targets_of_pending_timers.delete(self)
    end
  when SEL_CHORE
    if params[:repeat]
      FXApp.instance.addChore(callable_object, params)
    else
      @@targets_of_pending_chores.delete(self)
    end
  end
  result
end

#pconnect(message_type, callable_object, params = {}) ⇒ Object

Store an association between a message of type message_type with a callable object.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/fox16/responder2.rb', line 31

def pconnect(message_type, callable_object, params={})
  @context[message_type] = { :callable => callable_object, :params => params }
  FXMAPTYPE(message_type, :onHandleMsg)
  case message_type
  when SEL_TIMEOUT
    @@targets_of_pending_timers[self] = self
  when SEL_CHORE
    @@targets_of_pending_chores[self] = self
  when SEL_SIGNAL
    @@targets_of_pending_signals[self] = self
  when SEL_IO_READ, SEL_IO_WRITE, SEL_IO_EXCEPT
    @@targets_of_pending_inputs[self] = self
  end
end