[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xorg-server: Changes to 'ubuntu'



 Xi/exevents.c                                                 |   16 -
 debian/changelog                                              |    7 
 debian/patches/506_touchscreen_pointer_emulation_checks.patch |  157 ++++++++++
 debian/patches/series                                         |    1 
 dix/touch.c                                                   |   12 
 5 files changed, 176 insertions(+), 17 deletions(-)

New commits:
commit 43820c605934c93a3cac9af73b121959879d0d02
Author: Chase Douglas <chase.douglas@ubuntu.com>
Date:   Wed Apr 4 13:53:49 2012 -0700

    Fix touchscreen pointer emulation (LP: #949791)
    
    * Fix touchscreen pointer emulation (LP: #949791)
      - Add temporary patch 506_touchscreen_pointer_emulation_checks.patch

diff --git a/debian/changelog b/debian/changelog
index 8453b8e..ffaaddc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+xorg-server (2:1.11.4-0ubuntu10) UNRELEASED; urgency=low
+
+  * Fix touchscreen pointer emulation (LP: #949791)
+    - Add temporary patch 506_touchscreen_pointer_emulation_checks.patch
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Wed, 04 Apr 2012 13:53:16 -0700
+
 xorg-server (2:1.11.4-0ubuntu9) precise; urgency=low
 
   * Report button press when touchscreen touch is active (LP: #972985)
diff --git a/debian/patches/506_touchscreen_pointer_emulation_checks.patch b/debian/patches/506_touchscreen_pointer_emulation_checks.patch
new file mode 100644
index 0000000..11a9ea2
--- /dev/null
+++ b/debian/patches/506_touchscreen_pointer_emulation_checks.patch
@@ -0,0 +1,157 @@
+From c149cf06d1966d134073d4b33f2ec028fbf7bbd1 Mon Sep 17 00:00:00 2001
+From: Chase Douglas <chase.douglas@canonical.com>
+Date: Wed, 4 Apr 2012 12:41:59 -0700
+Subject: [PATCH 1/3] Don't attempt to add non-master core touch pointer
+ emulation listeners
+
+Core events aren't generated for slave devices, so this is just wrong.
+On top of that, the mask being checked in the removed hunk is wrong as
+well. It is dereferencing a pointer of type OtherClients as though it
+were a pointer to type InputClients.
+
+Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+Conflicts:
+
+	dix/touch.c
+---
+ dix/touch.c |   12 ------------
+ 1 files changed, 0 insertions(+), 12 deletions(-)
+
+diff --git a/dix/touch.c b/dix/touch.c
+index d04801c..87b0f15 100644
+--- a/dix/touch.c
++++ b/dix/touch.c
+@@ -853,18 +853,6 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
+                              win);
+             return TRUE;
+         }
+-
+-        /* all others */
+-        nt_list_for_each_entry(iclients, (InputClients*)wOtherClients(win), next)
+-        {
+-            if (!(iclients->mask[XIAllDevices] & core_filter))
+-                continue;
+-
+-            TouchEventHistoryAllocate(ti);
+-            TouchAddListener(ti, iclients->resource, CORE,
+-                             type, LISTENER_AWAITING_BEGIN, win);
+-            return TRUE;
+-        }
+     }
+ 
+     return FALSE;
+-- 
+1.7.9.1
+
+From 01091806f762f6f8fc83dc1051b5f3cfb38e88b1 Mon Sep 17 00:00:00 2001
+From: Chase Douglas <chase.douglas@canonical.com>
+Date: Wed, 4 Apr 2012 12:57:40 -0700
+Subject: [PATCH 2/3] Check core event mask properly for pointer emulated
+ touch events
+
+The current code checks the core event mask as though it were an XI2
+mask. This change fixes the checks so the proper client and event masks
+are used.
+
+Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+Conflicts:
+
+	Xi/exevents.c
+---
+ Xi/exevents.c |   13 +++++++++----
+ 1 files changed, 9 insertions(+), 4 deletions(-)
+
+diff --git a/Xi/exevents.c b/Xi/exevents.c
+index f390f67..72e6d91 100644
+--- a/Xi/exevents.c
++++ b/Xi/exevents.c
+@@ -1342,6 +1342,8 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
+             BUG_WARN(!iclients);
+             if (!iclients)
+                 return FALSE;
++
++            *client = rClient(iclients);
+         } else if (listener->level == XI)
+         {
+             int xi_type = GetXIType(TouchGetPointerEventType(ev));
+@@ -1352,19 +1354,22 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
+             BUG_WARN(!iclients);
+             if (!iclients)
+                 return FALSE;
++
++            *client = rClient(iclients);
+         } else
+         {
+             int coretype = GetCoreType(TouchGetPointerEventType(ev));
+             Mask core_filter = event_get_filter_from_type(dev, coretype);
++            OtherClients *oclients;
+ 
+             /* all others */
+-            nt_list_for_each_entry(iclients, (InputClients*)wOtherClients(*win), next)
+-                if (iclients->mask[XIAllDevices] & core_filter)
++            nt_list_for_each_entry(oclients, (InputClients*)wOtherClients(*win), next)
++                if (oclients->mask & core_filter)
+                     break;
+-            /* if owner selected, iclients is NULL */
++            /* if owner selected, oclients is NULL */
++            *client = oclients ? rClient(oclients) : wClient(*win);
+         }
+ 
+-        *client = iclients ? rClient(iclients) : wClient(*win);
+         *mask = iclients ? iclients->xi2mask : NULL;
+         *grab = NULL;
+     }
+-- 
+1.7.9.1
+
+From 4b4c88b247c6435578c983d74a90f35472849f3a Mon Sep 17 00:00:00 2001
+From: Chase Douglas <chase.douglas@canonical.com>
+Date: Wed, 4 Apr 2012 12:59:55 -0700
+Subject: [PATCH 3/3] Only set XI2 mask if pointer emulation is for XI2 client
+
+The current code returns a reference to memory that may not actually be
+an XI2 mask. Instead, only return a value when an XI2 client has
+selected for events.
+
+Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+Conflicts:
+
+	Xi/exevents.c
+---
+ Xi/exevents.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/Xi/exevents.c b/Xi/exevents.c
+index 72e6d91..fe06efa 100644
+--- a/Xi/exevents.c
++++ b/Xi/exevents.c
+@@ -1293,6 +1293,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
+ {
+      int rc;
+      InputClients *iclients = NULL;
++     *mask = NULL;
+ 
+     if (listener->type == LISTENER_GRAB ||
+         listener->type == LISTENER_POINTER_GRAB)
+@@ -1343,6 +1344,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
+             if (!iclients)
+                 return FALSE;
+ 
++            *mask = iclients->xi2mask;
+             *client = rClient(iclients);
+         } else if (listener->level == XI)
+         {
+@@ -1370,7 +1372,6 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
+             *client = oclients ? rClient(oclients) : wClient(*win);
+         }
+ 
+-        *mask = iclients ? iclients->xi2mask : NULL;
+         *grab = NULL;
+     }
+ 
+-- 
+1.7.9.1
+
diff --git a/debian/patches/series b/debian/patches/series
index 120a81a..e07cbea 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -37,3 +37,4 @@
 503_fix_mouse_warp.patch
 504_implement_passive_touch_ungrab.patch
 505_query_pointer_touchscreen.patch
+506_touchscreen_pointer_emulation_checks.patch

commit 4b4c88b247c6435578c983d74a90f35472849f3a
Author: Chase Douglas <chase.douglas@canonical.com>
Date:   Wed Apr 4 12:59:55 2012 -0700

    Only set XI2 mask if pointer emulation is for XI2 client
    
    The current code returns a reference to memory that may not actually be
    an XI2 mask. Instead, only return a value when an XI2 client has
    selected for events.
    
    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
    
    Conflicts:
    
    	Xi/exevents.c

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 72e6d91..fe06efa 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1293,6 +1293,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
 {
      int rc;
      InputClients *iclients = NULL;
+     *mask = NULL;
 
     if (listener->type == LISTENER_GRAB ||
         listener->type == LISTENER_POINTER_GRAB)
@@ -1343,6 +1344,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
             if (!iclients)
                 return FALSE;
 
+            *mask = iclients->xi2mask;
             *client = rClient(iclients);
         } else if (listener->level == XI)
         {
@@ -1370,7 +1372,6 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
             *client = oclients ? rClient(oclients) : wClient(*win);
         }
 
-        *mask = iclients ? iclients->xi2mask : NULL;
         *grab = NULL;
     }
 

commit 01091806f762f6f8fc83dc1051b5f3cfb38e88b1
Author: Chase Douglas <chase.douglas@canonical.com>
Date:   Wed Apr 4 12:57:40 2012 -0700

    Check core event mask properly for pointer emulated touch events
    
    The current code checks the core event mask as though it were an XI2
    mask. This change fixes the checks so the proper client and event masks
    are used.
    
    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
    
    Conflicts:
    
    	Xi/exevents.c

diff --git a/Xi/exevents.c b/Xi/exevents.c
index f390f67..72e6d91 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1342,6 +1342,8 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
             BUG_WARN(!iclients);
             if (!iclients)
                 return FALSE;
+
+            *client = rClient(iclients);
         } else if (listener->level == XI)
         {
             int xi_type = GetXIType(TouchGetPointerEventType(ev));
@@ -1352,19 +1354,22 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
             BUG_WARN(!iclients);
             if (!iclients)
                 return FALSE;
+
+            *client = rClient(iclients);
         } else
         {
             int coretype = GetCoreType(TouchGetPointerEventType(ev));
             Mask core_filter = event_get_filter_from_type(dev, coretype);
+            OtherClients *oclients;
 
             /* all others */
-            nt_list_for_each_entry(iclients, (InputClients*)wOtherClients(*win), next)
-                if (iclients->mask[XIAllDevices] & core_filter)
+            nt_list_for_each_entry(oclients, (InputClients*)wOtherClients(*win), next)
+                if (oclients->mask & core_filter)
                     break;
-            /* if owner selected, iclients is NULL */
+            /* if owner selected, oclients is NULL */
+            *client = oclients ? rClient(oclients) : wClient(*win);
         }
 
-        *client = iclients ? rClient(iclients) : wClient(*win);
         *mask = iclients ? iclients->xi2mask : NULL;
         *grab = NULL;
     }

commit c149cf06d1966d134073d4b33f2ec028fbf7bbd1
Author: Chase Douglas <chase.douglas@canonical.com>
Date:   Wed Apr 4 12:41:59 2012 -0700

    Don't attempt to add non-master core touch pointer emulation listeners
    
    Core events aren't generated for slave devices, so this is just wrong.
    On top of that, the mask being checked in the removed hunk is wrong as
    well. It is dereferencing a pointer of type OtherClients as though it
    were a pointer to type InputClients.
    
    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
    
    Conflicts:
    
    	dix/touch.c

diff --git a/dix/touch.c b/dix/touch.c
index d04801c..87b0f15 100644
--- a/dix/touch.c
+++ b/dix/touch.c
@@ -853,18 +853,6 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
                              win);
             return TRUE;
         }
-
-        /* all others */
-        nt_list_for_each_entry(iclients, (InputClients*)wOtherClients(win), next)
-        {
-            if (!(iclients->mask[XIAllDevices] & core_filter))
-                continue;
-
-            TouchEventHistoryAllocate(ti);
-            TouchAddListener(ti, iclients->resource, CORE,
-                             type, LISTENER_AWAITING_BEGIN, win);
-            return TRUE;
-        }
     }
 
     return FALSE;


Reply to: