On Mon, 19 Sep 2011 10:30:01 +0800 "Zhu, Yongsheng" <yongsheng....@intel.com>
said:

> Anyone who are working on EFL port for Xinput2.2?

currently, no-one is as it hasn't turned up as a need yet.

> 
> Regards,
> Yongsheng
> 
> >-----Original Message-----
> >From: Anisse Astier [mailto:ani...@astier.eu]
> >Sent: Saturday, September 17, 2011 12:02 AM
> >To: enlightenment-devel@lists.sourceforge.net
> >Subject: [E-devel] [PATCH RFC] Ecore: Ecore_X : adapt XInput2 handling to
> >support multitouch events with mtev
> >
> >[Please Cc: me as I'm not subscribed to the list]
> >
> >This should work with xorg-x11-drv-mtev driver included in MeeGo
> >(http://build.meego.com/package/files?package=xorg-x11-drv-mtev&project=d
> >evel%3Ax11%3A1.2
> >) providing you have a multitouch panel and that the kernel reports
> >multitouch events (mostly handled by hid-multitouch nowadays).
> >
> >It works pretty well with full screen windows, but has all the known
> >problems of multitouch in a windowed environment. For proper multitouch
> >support, one should wait for Xinput 2.2 :
> >http://cgit.freedesktop.org/~cndougla/inputproto/
> >
> >But we don't wanna wait, do we ?
> >
> >This patch mimics the adaptation that was done to Qt in MeeGo to support
> >multitouch events hidden in valuators:
> >http://build.meego.com/package/view_file?file=add_xinput2_support.patch&pa
> >ckage=qt&project=MeeGo%3A1.2%3Aoss&srcmd5=7f67b59bcb70b759c9667bfa
> >15e9ab3b
> >
> >Known problems:
> > - we register for Xinput and Xinput 2(XIFloatingSlave and XISlavePointer)
> >   events, so you'll receive events for the first finger two times. We can
> >   mitigate that by not sending track point with id 0, but then the app
> >   would need to look at multi_move and mouse_move events to have all the
> >   data.
> > - since there's no xinput-level integration events coordinates are
> >   converted to match screen coordinates. This doesn't work with more
> >   than one screen.
> > - the tracking id for each finger has no correlation with the device
> >   id. Right now we use a dirty hack (devid+trackingid) to separate each
> >   fingers.
> > - there's no corresponding field for touch major/minor (touch finger size)
> >   in ecore events structures. Other concepts are probably left out.
> > - you'll receive the second finger event only if the first finger is in
> >   your window. Otherwise it will be grabbed by the window that has the
> >   first finger.
> > - it only works with an out-of-tree xorg driver.
> > - it was only tested on a Pegatron Lucid (WeTab, ExoPC, Ordissimo
> >   Tablet)
> >---
> > src/lib/ecore_x/xlib/ecore_x_xi2.c |  189
> >+++++++++++++++++++++++++-----------
> > 1 files changed, 130 insertions(+), 59 deletions(-)
> >
> >diff --git a/src/lib/ecore_x/xlib/ecore_x_xi2.c
> >b/src/lib/ecore_x/xlib/ecore_x_xi2.c
> >index 8c0611d..c918cfa 100644
> >--- a/src/lib/ecore_x/xlib/ecore_x_xi2.c
> >+++ b/src/lib/ecore_x/xlib/ecore_x_xi2.c
> >@@ -17,6 +17,27 @@ int _ecore_x_xi2_opcode = -1;
> > #ifdef ECORE_XI2
> > static XIDeviceInfo *_ecore_x_xi2_devs = NULL;
> > static int _ecore_x_xi2_num = 0;
> >+
> >+enum AbsMTLabels {
> >+   AbsMTPositionX = 0,
> >+   AbsMTPositionY,
> >+   AbsMTTouchMajor,
> >+   AbsMTTouchMinor,
> >+   AbsMTTrackingID,
> >+
> >+   AbsMTNumber
> >+};
> >+
> >+static const char* const atom_labels_str[] = {
> >+   "Abs MT Position X",
> >+   "Abs MT Position Y",
> >+   "Abs MT Touch Major",
> >+   "Abs MT Touch Minor",
> >+   "Abs MT Tracking ID",
> >+};
> >+
> >+static Atom atom_labels[AbsMTNumber];
> >+
> > #endif /* ifdef ECORE_XI2 */
> >
> > void
> >@@ -25,6 +46,7 @@ _ecore_x_input_init(void)
> > #ifdef ECORE_XI2
> >    int event, error;
> >    int major = 2, minor = 0;
> >+   int i;
> >
> >    if (!XQueryExtension(_ecore_x_disp, "XInputExtension",
> >                         &_ecore_x_xi2_opcode, &event, &error))
> >@@ -41,6 +63,8 @@ _ecore_x_input_init(void)
> >
> >    _ecore_x_xi2_devs = XIQueryDevice(_ecore_x_disp, XIAllDevices,
> >                                      &_ecore_x_xi2_num);
> >+   for(i = 0; i < AbsMTNumber ; i++)
> >+    atom_labels[i] = XInternAtom(_ecore_x_disp, atom_labels_str[i],
> >False);
> > #endif /* ifdef ECORE_XI2 */
> > } /* _ecore_x_input_init */
> >
> >@@ -65,65 +89,110 @@ _ecore_x_input_handler(XEvent *xevent)
> > #ifdef ECORE_XI2
> >    XIDeviceEvent *evd = (XIDeviceEvent *)(xevent->xcookie.data);
> >    int devid = evd->deviceid;
> >+   XIDeviceInfo *dev = NULL;
> >+   int i = 0;
> >
> >-   //printf("deviceID = %d\n", devid);
> >-   switch (xevent->xcookie.evtype)
> >-     {
> >-      case XI_Motion:
> >-         _ecore_mouse_move
> >-            (evd->time,
> >-            0, // state
> >-            evd->event_x, evd->event_y,
> >-            evd->root_x, evd->root_y,
> >-            evd->event,
> >-            (evd->child ? evd->child : evd->event),
> >-            evd->root,
> >-            1, // same_screen
> >-            devid, 1, 1,
> >-            1.0, // pressure
> >-            0.0, // angle
> >-            evd->event_x, evd->event_y,
> >-            evd->root_x, evd->root_y);
> >-         break;
> >-
> >-      case XI_ButtonPress:
> >-         _ecore_mouse_button
> >-            (ECORE_EVENT_MOUSE_BUTTON_DOWN,
> >-            evd->time,
> >-            0, // state
> >-            0, // button
> >-            evd->event_x, evd->event_y,
> >-            evd->root_x, evd->root_y,
> >-            evd->event,
> >-            (evd->child ? evd->child : evd->event),
> >-            evd->root,
> >-            1, // same_screen
> >-            devid, 1, 1,
> >-            1.0, // pressure
> >-            0.0, // angle
> >-            evd->event_x, evd->event_y,
> >-            evd->root_x, evd->root_y);
> >-         break;
> >-
> >-      case XI_ButtonRelease:
> >-         _ecore_mouse_button
> >-            (ECORE_EVENT_MOUSE_BUTTON_UP,
> >-            evd->time,
> >-            0, // state
> >-            0, // button
> >-            evd->event_x, evd->event_y,
> >-            evd->root_x, evd->root_y,
> >-            evd->event,
> >-            (evd->child ? evd->child : evd->event),
> >-            evd->root,
> >-            1, // same_screen
> >-            devid, 1, 1,
> >-            1.0, // pressure
> >-            0.0, // angle
> >-            evd->event_x, evd->event_y,
> >-            evd->root_x, evd->root_y);
> >-         break;
> >-     } /* switch */
> >+   /* Get XIDeviceInfo structure */
> >+   for (i = 0; i < _ecore_x_xi2_num; i++)
> >+        if (devid == _ecore_x_xi2_devs[i].deviceid)
> >+          {
> >+             dev = &(_ecore_x_xi2_devs[i]);
> >+             break;
> >+          }
> >+
> >+   for (i = 0; i < dev->num_classes; ++i) {
> >+        XIAnyClassInfo *classinfo = dev->classes[i];
> >+        if (classinfo && classinfo->type == XIValuatorClass ) {
> >+             XIValuatorClassInfo *valuatorclassinfo =
> >(XIValuatorClassInfo*)classinfo;
> >+             int n = valuatorclassinfo->number;
> >+         double x, y, winx, winy;
> >+
> >+             if (!XIMaskIsSet(evd->valuators.mask, n))
> >+               continue;
> >+             /*           printf("Valuator %d, class %d, atom = (%d), val
> >= %f\n", n, i,
> >+                          valuatorclassinfo->label,
> >evd->valuators.values[n]);
> >+                          */
> >+             if(valuatorclassinfo->label == atom_labels[AbsMTPositionX]) {
> >+                  /* Convert to screen coordinates. Only works in a
> >one-screen
> >+                   * setup */
> >+              x = (evd->valuators.values[n] - valuatorclassinfo->min) /
> >(valuatorclassinfo->max - valuatorclassinfo->min)*
> >+
> >WidthOfScreen(DefaultScreenOfDisplay(xevent->xcookie.display));
> >+              winx = x + evd->event_x - evd->root_x;
> >+
> >+             }
> >+             else if(valuatorclassinfo->label ==
> >atom_labels[AbsMTPositionY]) {
> >+              y = (evd->valuators.values[n] - valuatorclassinfo->min) /
> >(valuatorclassinfo->max - valuatorclassinfo->min)*
> >+
> >HeightOfScreen(DefaultScreenOfDisplay(xevent->xcookie.display));
> >+              winy = y + evd->event_y - evd->root_y;
> >+             }
> >+             else if(valuatorclassinfo->label ==
> >atom_labels[AbsMTTrackingID]) {
> >+              int trackingid = (int)evd->valuators.values[n];
> >+
> >+              if(winx < 0 || winy < 0 )
> >+                      continue;
> >+                  printf("Finger : %d, x = %05.1f, y = %05.1f, rootx = %
> >05.1f, rooty = %05.1f\n",
> >+                     trackingid, winx, winy, x, y);
> >+
> >+                  switch (xevent->xcookie.evtype)
> >+                    {
> >+                     case XI_Motion:
> >+                        _ecore_mouse_move
> >+                           (evd->time,
> >+                            0, // state
> >+                        winx, winy,
> >+                            x, y,
> >+                            evd->event,
> >+                            (evd->child ? evd->child : evd->event),
> >+                            evd->root,
> >+                            1, // same_screen
> >+                            devid+trackingid, 1, 1,
> >+                            1.0, // pressure
> >+                            0.0, // angle
> >+                        winx, winy,
> >+                            x, y);
> >+                        break;
> >+
> >+                     case XI_ButtonPress:
> >+                        _ecore_mouse_button
> >+                           (ECORE_EVENT_MOUSE_BUTTON_DOWN,
> >+                            evd->time,
> >+                            0, // state
> >+                            0, // button
> >+                        winx, winy,
> >+                            x, y,
> >+                            evd->event,
> >+                            (evd->child ? evd->child : evd->event),
> >+                            evd->root,
> >+                            1, // same_screen
> >+                            devid+trackingid, 1, 1,
> >+                            1.0, // pressure
> >+                            0.0, // angle
> >+                        winx, winy,
> >+                            x, y);
> >+                        break;
> >+
> >+                     case XI_ButtonRelease:
> >+                        _ecore_mouse_button
> >+                           (ECORE_EVENT_MOUSE_BUTTON_UP,
> >+                            evd->time,
> >+                            0, // state
> >+                            0, // button
> >+                        winx, winy,
> >+                            x, y,
> >+                            evd->event,
> >+                            (evd->child ? evd->child : evd->event),
> >+                            evd->root,
> >+                            1, // same_screen
> >+                            devid+trackingid, 1, 1,
> >+                            1.0, // pressure
> >+                            0.0, // angle
> >+                        winx, winy,
> >+                            x, y);
> >+                        break;
> >+                    } /* switch */
> >+             } /* is trackingid*/
> >+        } /* if valuator*/
> >+   } /* for loop on classes */
> > #endif /* ifdef ECORE_XI2 */
> > } /* _ecore_x_input_handler */
> >
> >@@ -142,7 +211,9 @@ ecore_x_input_multi_select(Ecore_X_Window win)
> >      {
> >         XIDeviceInfo *dev = &(_ecore_x_xi2_devs[i]);
> >
> >-        if (dev->use == XIFloatingSlave)
> >+    DBG("Now selected on dev %d, deviceid %d, use = %d, float = %d\n",
> >+        i, dev->deviceid, dev->use, XIFloatingSlave);
> >+        if (dev->use == XIFloatingSlave || dev->use == XISlavePointer)
> >           {
> >              XIEventMask eventmask;
> >              unsigned char mask[1] = { 0 };
> >--
> >1.7.5.3
> >
> >
> >------------------------------------------------------------------------------
> >BlackBerry&reg; DevCon Americas, Oct. 18-20, San Francisco, CA
> >Learn about the latest advances in developing for the
> >BlackBerry&reg; mobile platform with sessions, labs & more.
> >See new tools and technologies. Register for BlackBerry&reg; DevCon today!
> >http://p.sf.net/sfu/rim-devcon-copy1
> >_______________________________________________
> >enlightenment-devel mailing list
> >enlightenment-devel@lists.sourceforge.net
> >https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> 
> ------------------------------------------------------------------------------
> BlackBerry&reg; DevCon Americas, Oct. 18-20, San Francisco, CA
> Learn about the latest advances in developing for the 
> BlackBerry&reg; mobile platform with sessions, labs & more.
> See new tools and technologies. Register for BlackBerry&reg; DevCon today!
> http://p.sf.net/sfu/rim-devcon-copy1 
> _______________________________________________
> 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


------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to