[squeak-dev] Re: Event filters for user input events (i.e. mouse clicks etc.)

Tobias Pape Das.Linux at gmx.de
Fri May 27 19:40:27 UTC 2016


On 27.05.2016, at 20:36, Chris Muller <asqueaker at gmail.com> wrote:

> Hi Marcel, global keyboard shortcuts are important, a 1-microsecond
> slowdown per event does not sound significant.  But, yes, for
> performance critical code like event handling, its probably worth
> adding an instvar than a dictionary lookup.
> 
> I don't know under what case an event-type would ever change.  Events
> are events generated by the input devices.  They should basically be
> created and then immutable...
> 

Unless you want a filter that turns a mouse click into a keypress, like for automation?

Best
	-Tobias

> On Fri, May 27, 2016 at 8:40 AM, marcel.taeumel <Marcel.Taeumel at hpi.de> wrote:
>> marcel.taeumel wrote
>>> Hi, there.
>>> 
>>> Here is a new version of event filters with support for separating
>>> capturing filters from bubbling filters.
>>> https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture
>>> https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-bubbling
>>> 
>>> Here is the change set:
>>> event-filters.cs <http://forum.world.st/file/n4896486/event-filters.cs>
>>> 
>>> Note that you should either use a fresh trunk image with the latest
>>> updates OR unload all the changes from my previous change set because I
>>> cleaned up this one. So, there will be some "method removed" calls
>>> missing.
>>> 
>>> Anyway, with support for capturing filters, you can also filter, for
>>> example, mouse events for system windows that are always active (see
>>> preference "Windows Active Only On Top" disabled).
>>> 
>>> wnd := ActiveWorld submorphs fourth.
>>> mouseFilter := PluggableEventFilter on: [:evt :target | evt ignore].
>>> wnd addMouseCaptureFilter: mouseFilter.
>>> wnd removeMouseCaptureFilter: mouseFilter.
>>> 
>>> See how the behavior is different when you use the filter for the bubbling
>>> phase:
>>> 
>>> wnd addMouseBubbleFilter: mouseFilter.
>>> wnd removeMouseBubbleFilter: mouseFilter.
>>> 
>>> Note that event bubbling is implemented in MorphicEventDispatcher. If
>>> there would be no bubbling, those filters would be meaningless. However, I
>>> am not aware of an alternative event dispatcher for Squeak's Morphic.
>>> 
>>> What other dispatch patterns are out there? :-)
>>> 
>>> Best,
>>> Marcel
>> 
>> Hi, there.
>> 
>> I benched the event filters mechanism without having any active filters to
>> reveal the impact of my changes. Here is the benchmark:
>> 
>> 0) Close all windows.
>> 
>> 1) Open a system browser and position it in the upper-left corner right
>> below the world main docking bar.
>> 
>> 2) Open a workspace, not covering the system browser.
>> 
>> 3) Execute some code:
>> 
>> event := MouseButtonEvent new
>>                setType: #mouseDown
>>                position: 100 at 100
>>                which: 2r000 "no change"
>>                buttons: 2r100 "red/left pressed"
>>                hand: ActiveHand
>>                stamp: 0. "not needed"
>> 
>> [
>>        event resetHandlerFields.
>>        event hand sendMouseEvent: event.
>> ] bench.
>> 
>> On my Windows 10 machine (MS Surface Pro 3, Core i7 mobile) with Cog/Spur
>> #3663 and Squeak #15987 I got:
>> 
>> Before: 3.73 microseconds per run
>> After: 4.5 microseconds per run
>> 
>> This tests a mouse-down event because it involves full dispatching (resp.
>> capturing) and handling (resp. bubbling) without taking the shortcut via
>> mouse focus (or keyboard focus).
>> 
>> This benchmark combined with MessageTally class >> #spyOn: provided
>> interesting insights about expensive calls.
>> 
>> About 5.9 percent are spend for sending generic and mouse bubble filters.
>> Note that 4.1 percent are spend for accessing the Morph's properties to find
>> out that there are no filters at the moment. This could be optimized by
>> adding instance variables to MorphExtension.
>> 
>> (Interestingly, about 11 percent (before: 12.7 percent) are spent in Morph
>>>> #handleMouseDown: to call HandMorph >> #removePendingBalloonFor:.)
>> 
>> (On a side note, the current way to provide global keyboard shortcuts eats
>> up 47.1 percent (before: 48.4 precent) for this mouse down handling because
>> of installing/removing event listeners in PasteUpMorph >>
>> #becomeActiveDuring:. But this will be optimized on a few days.)
>> 
>> The following questions remain:
>> - Can I put this in trunk and use it to improve the implementation of global
>> keyboard shortcuts?
>> - Should I add instance variables in MorphExtension to speed-up the look-up?
>> Note that I already did add instance variables to HandMorph to speed-up the
>> look-up of global event capturing filters.
>> - Is it conceptually good to re-evaluate the filters if one of them changes
>> the kind of an event? This affects only mouse event filters and keyboard
>> event filters that convert between mouse and keyboard. Note that an endless
>> loop is possible if such filters do not converge.
>> 
>> Best,
>> Marcel
>> 
>> 
>> 
>> --
>> View this message in context: http://forum.world.st/Event-filters-for-user-input-events-i-e-mouse-clicks-etc-tp4895521p4897830.html
>> Sent from the Squeak - Dev mailing list archive at Nabble.com.




More information about the Squeak-dev mailing list