On Mon, 16 Dec 2013 15:56:56 -0800 Jason Gerecke <killert...@gmail.com> said:

finally coming back to this. christmas/new years etc. has kept me busy along
with other things and this mail has been on my todo. it's one of 3 last
outstanding ones to e-devel.

> Hello again! Had some other priorities come up, and then vacation, but
> I've recently gotten back to scratching my head and poking around the
> code.

as with everyone. :)

> My idea at the moment is to create a new "axis updated"
> event/callback. Applications that register for it would be notified
> whenever a device axis changed and have access to a snapshot of the
> current state. This has a number of advantages over modifying the
> existing 'mouse' or 'multi' events:
> 
>  * The change should be ABI compatible
>  * Multi events are not abused to mean "any kind of extended pointer"
>  * Cleaner API that keeps mouse and multi APIs focused on their
> "usual" use-cases
>  * "Unusual" axes are only sent to apps that are actually interested
>  * The event can be reasonably sent for many kinds of input devices
> (mouse, touch, stylus, 6DOF "spaceball", knob controller, etc.)

ok - while this means you don't get instant emulation support in existing apps,
it does mean it's cleaner when you REALLY want a pen.

> This approach does wind up duplicating some data that's already
> available through the "standard" events (e.g. stylus X/Y or
> touchscreen tilt). I don't think that's really an issue though: the
> axis event should be viewed as /supplemental/ to any data delivered by
> the standard events. You should be able to interchangeably use either
> source for the duplicated data without too much trouble.
> 
> I've scratched out the following definitions with the aim of making
> something that will be easy to keep forward-compatible, and flexible
> enough to handle many kinds of input devices:
> 
> ~~~~~~~~~~~~~~~~
> enum _Ecore_Axis_Name {
>      UNKNOWN,
>      X, /* Position along physical X axis; ????? units. */
>      Y, /* Position along physical Y axis; ????? units. */
>      PRESSURE, /* Normalized force applied to tool tip; Range: [0.0, 1.0] */
>      DISTANCE, /* Normalized distance along physical Z axis; Range:
> [0.0, 1.0] */
>      AZIMUTH, /* Angle of tool about the Z axis from positive X axis;
> Range: [-PI, PI] radians */
>      TILT, /* Angle of tool about plane of sensor from positive Z
> axis; Range: [0.0, PI] radians */
>      TWIST, /* Angle of tool about tool's major axis from tool's
> "natural" position; Range: [-PI, PI] radians */
>      TOUCH_WIDTH_MAJOR, /* Length of contact ellipse along AZIMUTH */
>      TOUCH_WIDTH_MINOR, /* Length of contact ellipse perpendicular to AZIMUTH
> */ TOOL_WIDTH_MAJOR, /* Length of tool ellipse along AZIMUTH */
>      TOOL_WIDTH_MINOR /* Length of tool ellipse perpendicular to AZIMUTH */
> };

ok - i get the idea. naming needs of course to be namespaced. fyi - i much
prefer degrees to radians. i know. its not what sin/cos and math.h like... but
its what most programmers understand FIRST and otherwise end up converting
to/from degrees. :) also i'm not so sure bout "axis_name" if anything it'd be
axis_type... :)

> enum _Ecore_Tool_Name {
>      UNKNOWN,
>      MOUSE, /* Mouse or "puck" digitizer */
>      FINGER, /* Touchscreen, touchpad, etc. */
>      STYLUS, /* Pen writing tip */
>      ERASER, /* Pen erasing tip */
>      AIRBRUSH, /* ... is this a useful hint? */
>      MARKER /* ... is this a useful hint? */
> }

the last 3 - can you explain these? i am familiar with some wacom tablets and
pens, but the only ting that may make a stylus become an eraser is simply
turning it aroun and using the other end. is this the same for airbrush and
marker? or something similar? hold down a button on the stylus to switch to
airbrush mode? (my wacom pen has such a togle button on it).? if so shouldn't
these last 3 just become modifiers of the stylus?

> struct _Ecore_Axis {
>      enum _Ecore_Axis_Name name;
>      double value;
> };

ok.

> struct _Ecore_Event_Axis_Update
> {
>      unsigned int timestamp;
>      unsigned int modifiers; /* Is this necessary? */

as above... eraser, marker, airbrush... ? maybe?

>      int device; /* Unique device identifier */
>      int toolid; /* Unique tool identifier (e.g. tool serial number,
> touchscreen contact number, etc.) */
>      enum _Ecore_Tool_Name tooltype; /* Type of tool in use (e.g. "puck", ) */
> 
>      int nvalues;
>      struct _Ecore_Axis *values;
> };
> ~~~~~~~~~~~~~~~~

hmm. you want to put an evas_device * handle in there... this allows the event
receiver to figure out much more about the input device by tracking this back
and doing queries.

> These are still in pretty heavy flux though. The basic event structure
> contains identifiers about where the event came from (device and
> toolid), what kind of tool created it (tooltype), and what the current
> axis values are (values). The axis values are stored with a
> dynamically allocated array so that we aren't limited to 'N' axes, and

agree. this sounds fine. since the event is allocated anyway this is easy -
just expand the allocation size to allow the values to be appended at the end
and set the pointer to there. maybe just use an array anyway like:

struct _Ecore_Axis values[1];

and then simply over-allocate the memory yo allow the array to grow to [2] and
[3] and however many are needed for nvalues. :)

> each axis is given an label to make it clear to clients how it should
> be interpreted. The tooltype field might be an unnecessary hint, or
> might belong somewhere else (e.g. evas_device); hard to say. I'm also
> not sure how I want to send X/Y information; none of the options are
> particularly savory.

i think that evas_device here might be where these belong. the stylus, eraser,
mouse/whatever awould be classes/types of evas_device. a quick query of the
evas_Device handle and its type/class will tell you where it comes from. :)

> Would anyone mind giving some feedback on this? I'm hacking up a
> quick-and-dirty implementation to get a feel for the complexities
> involved, and the first half (posting events to the queue) went easy
> enough. Now to work on implementing the labyrinth of functions that
> the event follows on its way from the queue to an application.

as above... and i notice you've sent some code. lt me look at that, but this
mail i had marked. :)

> 
> Jason
> ---
> Now instead of four in the eights place /
> you’ve got three, ‘Cause you added one  /
> (That is to say, eight) to the two,     /
> But you can’t take seven from three,    /
> So you look at the sixty-fours....
> 
> 
> 
> On Thu, Oct 3, 2013 at 5:19 AM, Rafael Antognolli <antogno...@gmail.com>
> wrote:
> > On Thu, Oct 3, 2013 at 7:58 AM, Carsten Haitzler <ras...@rasterman.com>
> > wrote:
> >> On Wed, 2 Oct 2013 22:28:54 -0700 Jason Gerecke <killert...@gmail.com>
> >> said:
> >>
> >>> On Wed, Oct 2, 2013 at 8:21 PM, Carsten Haitzler <ras...@rasterman.com>
> >>> wrote:
> >>> > On Wed, 2 Oct 2013 13:59:47 -0700 Jason Gerecke <killert...@gmail.com>
> >>> > said:
> >>> >
> >>> > 3 things here.
> >>> >
> >>> > 1. for general device queries (get name, description, device classes
> >>> > etc.) there is already an evas_device api. right now though nothng
> >>> > populates the evas device information from lower levels (xi/xi2, etc.
> >>> > etc.), so it's unused. but it's there.
> >>> Would clients be expected to call this just once prior to receiving
> >>> input, or is there some way to notify them that a change has occured?
> >>
> >> the query of the devices and building of their nodes and tree should be in
> >> ecore-evas. EVAS_CALLBACK_DEVICE_CHANGED is already there for this - u can
> >> set a callback on the evas itself to listen for this. the idea is that if
> >> you get this callback - re-query the device tree and see. :)
> >>
> >>> I ask because the type information (e.g. pen tip vs. eraser or
> >>> airbrush vs. inking pen) is likely to change fairly regularly. We
> >>> would want to be sure that clients can get their hands on that,
> >>> whether it means notifying that they need to refresh their
> >>> understanding or sending the type information in each event.
> >>
> >> well the device add/del is really more about plug and unplug. here i'd
> >> expect there to be a single device representing the pen and pen vs eraser
> >> vs brush i'd expect as a mode field on the pen (like i mention below about
> >> eraser)
> >>
> >>> > 2. i've talked with some people about this and the general take was
> >>> > that we need to add new pen events (ala multi) because they need to
> >>> > handle more than multi: e.g.:
> >>> >
> >>> >   * button number on pen pressed/released SEPARATELY from pen touching.
> >>> >   * pen touch vs eraser touch (ie indicate which "end" of N ends a pen
> >>> > presses down).
> >>> >   * some pens support a hover ability - so that means motion events
> >>> > without down/up begin/end points like multi, BUT we would ned/want to
> >>> > report distance as a value during this hover
> >>> >   * possibly other custom inputs on the pens themselves that are not
> >>> > accounted for.
> >>> >
> >>> > we COULD extend multi events and add fields, but i think you are
> >>> > mistaking habitual over-engineering in efl for intent for these to be
> >>> > pen events. a lot of stuff gets extended beyond its initial scope "in
> >>> > case". eg in case out touch surface can report size, pressure and angle
> >>> > of your finger... :) also it'd cause issues with existing multi event
> >>> > usage.
> >>> >
> >>> As I said, the multi event is interesting for its extra fields, but
> >>> might not be a good semantic match. A pen isn't anything more than
> >>> fancy mouse: it has motion without a touch event and a set of buttons
> >>> to worry about. The only thing that makes it special are all those
> >>> extra axes, and most of those could be imagined on a
> >>> sufficiently-advanced mouse. Wacom actually makes such a "mouse" for
> >>> their Intuos tablets which reports things like height above the pad,
> >>> rotation about the z-axis, and absolute position of a spring-loaded
> >>> fingerwheel.
> >>>
> >>> The way most APIs handle pen input is to just pass the data alongside
> >>> the X/Y position you'd expect for a mouse. Throw in an enum or
> >>> function to let clients distinguish pen tip from eraser and you're
> >>> set.
> >>
> >> i'm thinking similarly - have down/up and move events, with a bunch of
> >> extra fields. only q is.. what set of fileds pretty much covers every
> >> aspect of a possible pen.... :)
> >>
> >>> > 3. if you want to tal about the extra buttons and what not that you
> >>> > find on pen tablets (i have a bamboo sitting on my desk at home - i
> >>> > know cheapo little pen tablet, but its indicative at a small scale of a
> >>> > lot of them), i believe these should just be "keys" like any keyboard.
> >>> > i don't think these belong in any specialized event system. as with #1
> >>> > we CAN attach a special device handle to them though so you can
> >>> > differentiate where the key comes from... :)
> >>> >
> >>> Most implementations send these as "buttons" rather than "keys". In
> >>> the case of evdev, the Intuos and Cintiq tablets will send the
> >>> "meaningless" BTN_{0,1,2,3,...} buttons. For a Bamboo though, you'll
> >>> find the mouse buttons BTN_{LEFT,RIGHT,FORWARD,BACK} instead. In the X
> >>> driver these are all mapped to mouse buttons that clients can easily
> >>> understand. The first few mouse buttons usually have attached
> >>> semantics (e.g. button 1 => left click => primary action) which makes
> >>> them non-ideal, but "keys" don't fare much better since you'd need
> >>> clients to properly understand a non-standard keyboard layout. These
> >>> buttons are always a tricky issue.
> >>
> >> sure, but i see keys as better as they have keysyms at least that have
> >> enumerations... if the intent is to emulate a mouse - then buttons sounds
> >> right... anyway... if buttons  then its kind of weirs to expose a button
> >> pres from the tablet base as this press event carries x/y info but
> >> actually has nothing to do with location... :)
> >>
> >>> > adding  new event type isn't too hard in evas - you add the structures,
> >>> > enums (at the end of the current list of callbacks), add the feed api's
> >>> > to feed the event in, add the appropriate routing (the same we do for
> >>> > multi and mouse), and then that's done.
> >>> >
> >>> > then there is edje - likely you want to expose the pen events as signals
> >>> > like mouse. maybe not? optional really.
> >>> >
> >>> > and the important bit then ecore-evas + ecore-input + ecore-input-evas
> >>> > needs to gather the events from the next layer down and call the feed
> >>> > calls. the layer below could be evdev/console input devices (fb) x11
> >>> > (xi/xi2 etc.), or wl.. or win32.. or anything... and then for these
> >>> > ecore-x, ecore-fb, ecore-wl etc. needs to gather the appropriate events
> >>> > from the display system/event input system below that. one thing
> >>> > missign in ecore-evas is what i describe in #1 - querying all available
> >>> > devices, monitoring for new devices being plugged/unplugged and
> >>> > appropriately populating/managing the evas_device tree per canvas. :)
> >>> > it's something we need to get around to ding some time... :)
> >>> >
> >>> Sounds like there'll be a bit of code spelunking in my future. I'll be
> >>> happy once I wrap my head around how each of these components (edje,
> >>> ecore, evas, etc.) fit together.
> >>
> >> indeed. i hope this helped a bit. keep this dialog going and ask questions,
> >> swap initial struct definitions or ideas etc. :)
> >
> > Put a backtrace on _mouse_down_cb, on that evas_multi_touch example,
> > and you will find that it is delivered by the
> > ecore_event_evas_mouse_button_down function, which is a handler for an
> > Ecore event called ECORE_EVENT_MOUSE_BUTTON_DOWN. That one is
> > delivered by the underlying input system for that engine. Find out
> > which part of the code delivers that event and then you can trace
> > where it started by simple gdb backtrace.
> >
> > I suggest using eo_backtrace for debugging, to keep you sane from the
> > lots of eo_internal stuff that goes in the middle of the backtraces.
> >
> > I hope that helps,
> > Rafael
> >
> > ------------------------------------------------------------------------------
> > October Webinars: Code for Performance
> > Free Intel webinars can help you accelerate application performance.
> > Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most
> > from the latest Intel processors and coprocessors. See abstracts and
> > register >
> > http://pubads.g.doubleclick.net/gampad/clk?id=60134791&iu=/4140/ostg.clktrk
> > _______________________________________________ enlightenment-devel mailing
> > list enlightenment-devel@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> 
> ------------------------------------------------------------------------------
> Rapidly troubleshoot problems before they affect your business. Most IT 
> organizations don't have a clear picture of how application performance 
> affects their revenue. With AppDynamics, you get 100% visibility into your 
> Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
> http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
WatchGuard Dimension instantly turns raw network data into actionable 
security intelligence. It gives you real-time visual feedback on key
security issues and trends.  Skip the complicated setup - simply import
a virtual appliance and go from zero to informed in seconds.
http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to