That would make a good LiveCode article. 

Bob


On Jun 24, 2011, at 10:39 AM, Richard Gaskin wrote:

> Nicolas Cueto wrote:
> 
>> mouseStillDown, for example. When part of a script set as a behavior,
>> mouseStillDown would not work. But that same script with the same
>> mouseStillDown handler, when actually stored as a button's script,
>> worked as expected.
> 
> In a way that's kinda good news, as mouseStillDown is an anomaly among mouse 
> messages.  I think you'll find the other mouse messages quite reliable in 
> behavior scripts, but mouseStillDown is an oddity as noted in the Dictionary:
> 
>     Usually, it is easier and more efficient to use the mouseMove
>     message to track the movement of the mouse while the button
>     is being held down.
> 
>     Note:  If there is no mouseStillDown handler in the target
>     object's script, no mouseStillDown message is sent, even if
>     there is a mouseStillDown handler in an object that's
>     further along the message path.
> 
> Your behavior script should work if you add this to the target object:
> 
> on mouseStillDown
>   pass mouseStillDown
> end mouseStillDown
> 
> Why is mouseStillDown so different from other mouse messages?
> 
> Because it's uniquely inefficient, and the mouseMove message was provided to 
> provide an alternative that's far more flexible and takes fewer system 
> resources for many similar needs.
> 
> Most OSes provide a message when the mouse first goes down, but not all of 
> them provide a second message sent continuously while the mouse is being held 
> down.  So to provide mouseStillDown for us the engine needs to continually 
> poll the OS for the state of the mouse button.   It does this with a 
> frequency defined in the idleRate, which is far less frequent than checking 
> "if the mouse is down" in a repeat loop, but still not optimal.
> 
> If the message was always sent into the message path whether or not it's 
> needed, anytime the user holds the mouse down it would trigger a lot of 
> messaging overhead that's never used.
> 
> But what if you need it?
> 
> Like the idle message (HyperCard's message-clogging workaround for not having 
> timers), all you need to do is include a mouseStillDown handler in any target 
> you want it to be sent to, and the engine will then know to trigger that 
> seldom-used message.
> 
> "Seldom-used?"  Yes:
> 
> Historically, mouseStillDown was most often used for dragging or other 
> operations in which things need to be updated while the mouse is moving.  In 
> such cases, the developer probably doesn't need to update anything until the 
> location of the mouse changes, but mouseStillDown is continually being sent 
> anyway, requiring a lot of redundant processing for things which have no 
> visible effect.
> 
> So the mouseMove message was added, providing a way to update things only 
> when the mouse is moved.
> 
> MouseMove also works when the mouse is up, which can be useful for update 
> mouse position indicators in a drawing program's rulers, for example.
> 
> This additional flexibility requires us to use a few other handlers to 
> substitute for mouseStillDown, but it well worth the few seconds it takes to 
> set up.  You'll need a mouseDown to set a flag so the mouseMove can know that 
> the mouse is down without having to poll the OS (you can also use this flag 
> for other useful info, as shown below), and you'll need mouseUp and 
> mouseRelease messages to clear the flag.
> 
> This example is for a splitter control that adjusts the groups on either side 
> of it:
> 
> local sXOffset
> 
> on mouseDown
>  -- Provide the info mouseMove will need later:
>  put the mouseH - the left of me into sXOffset
> end mouseDown
> 
> on mouseMove
>   -- Is the flag still set?
>   if sXOffset is not empty then
>     -- If so, handle the splitter drag here:
>     set the rect of grp "LeftGroup" to \
>       0,0,the left of me, the height of this cd
>     set the rect of grp "RightGroup" to \
>       the right of me, 0, the width of this cd,
>       the height of this cd
>   end if
> end mouseMove
> 
> -- Clear the flag when the mouse is released over the control:
> on mouseUp
>   put empty into sXOffset
> end mouseUp
> 
> -- Clear the flag when the mouse is release when not over the control:
> on mouseRelease
>  put empty into sXOffset
> end mouseRelease
> 
> 
> In addition to handling simple drags like a splitter, drag-and-drop 
> operations can be handled using the messages provided for those (dragStart, 
> dragMove, dragDrop, dragEnd) far more simply than emulating drag-and-drop 
> behaviors with mouseStillDown.
> 
> So once we use mouseMove for movement-related things and the drag-and-drop 
> messages for those types of actions, the remaining subset of cases where 
> mouseStillDown can be useful are relatively few.  And for those, you can 
> still use it so long as you provide a handler for it in the target object.
> 
> 
>> One other thing I noticed during development and had thought due to my
>> uncertain knowledge about the various mouse-related handlers, was that
>> I couldn't rely on "me" but had to be more specific. Something like
>> "put the short name of the owner of me into tGroup; if the flag of
>> button "theButton" of group tGroup is...", rather than simply "if the
>> flag of me is...".
> 
> More good news:  the uncertainty you subjectively felt is well addressed by 
> the implementation.  If you experiment a bit you'll find that "me" in a 
> behavior script will always refer to the target object.
> 
> Once you've experimented to verify this, you'll become confident with their 
> use and will want to use them every day.  And every night.  And on the 
> weekends.  Highly addictive. :) Behaviors are one of the most powerful 
> additions to the language since arrays.
> 
> 
>> Anyway. I doubt I will ever rely on behaviors again. And I don't feel
>> confident enough with my programming skills to present this to LC as
>> something like a bug. Cause I have been known to be wrong -- though
>> not about mouseStillDown working now when it wasn't before.
> 
> Having addressed the unique anomaly that is the mouseStillDown message, I 
> hope you're inspired to give behaviors a fresh try.
> 
> While your own confidence may not be as strong as the moment, I'm completely 
> confident with with just an hour or two's experimentation to verify how 
> behaviors work, you'll enjoy using them going forward and have simpler and 
> more robust code in the process.
> 
> 
> Hope all is well with you and yours in Tokyo -
> 
> --
> Richard Gaskin
> Fourth World
> LiveCode training and consulting: http://www.fourthworld.com
> Webzine for LiveCode developers: http://www.LiveCodeJournal.com
> LiveCode Journal blog: http://LiveCodejournal.com/blog.irv
> 
> _______________________________________________
> use-livecode mailing list
> use-livecode@lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription 
> preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode


_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to