Blob Blame History Raw
From 09265480ec7eeb491da98f43d5e11ec9174e7afa Mon Sep 17 00:00:00 2001
From: Dmitry Shachnev <mitya57@gmail.com>
Date: Thu, 4 Apr 2019 09:17:40 +0300
Subject: [PATCH] Use unsigned long for widget ids instead of signed long

Python's id() function returns memory addresses, which do not fit into
signed long on 32-bit systems.

In PyQt 5.12 overflow checking is enabled by default, so this causes
errors like this:

Traceback (most recent call last):
  [...]
  File "/usr/lib/python3/dist-packages/veusz/widgets/graph3d.py", line 246, in drawToObject
    cont.assignWidgetId(id(self))
OverflowError: argument 1 overflowed: value must be in the range -2147483648 to 2147483647
---
 veusz/helpers/src/threed/objects.cpp |  4 ++--
 veusz/helpers/src/threed/objects.h   |  8 ++++----
 veusz/helpers/src/threed/scene.cpp   | 16 ++++++++--------
 veusz/helpers/src/threed/scene.h     |  6 +++---
 veusz/helpers/src/threed/threed.sip  | 16 ++++++++--------
 5 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/veusz/helpers/src/threed/objects.cpp b/veusz/helpers/src/threed/objects.cpp
index 3293012e..c32702e6 100644
--- a/veusz/helpers/src/threed/objects.cpp
+++ b/veusz/helpers/src/threed/objects.cpp
@@ -31,7 +31,7 @@ void Object::getFragments(const Mat4& perspM, const Mat4& outerM, FragmentVector
 {
 }
 
-void Object::assignWidgetId(long id)
+void Object::assignWidgetId(unsigned long id)
 {
   widgetid = id;
 }
@@ -729,7 +729,7 @@ void ObjectContainer::getFragments(const Mat4& perspM, const Mat4& outerM, Fragm
     objects[i]->getFragments(perspM, totM, v);
 }
 
-void ObjectContainer::assignWidgetId(long id)
+void ObjectContainer::assignWidgetId(unsigned long id)
 {
   for(auto &object : objects)
     object->assignWidgetId(id);
diff --git a/veusz/helpers/src/threed/objects.h b/veusz/helpers/src/threed/objects.h
index 68f4f0d6..147c52ab 100644
--- a/veusz/helpers/src/threed/objects.h
+++ b/veusz/helpers/src/threed/objects.h
@@ -33,17 +33,17 @@
 class Object
 {
  public:
-  Object() : widgetid(-1) {}
+  Object() : widgetid(0) {}
 
   virtual ~Object();
 
   virtual void getFragments(const Mat4& perspM, const Mat4& outerM, FragmentVector& v);
 
   // recursive set id of child objects
-  virtual void assignWidgetId(long id);
+  virtual void assignWidgetId(unsigned long id);
 
   // id of widget which generated object
-  long widgetid;
+  unsigned long widgetid;
 };
 
 class Triangle : public Object
@@ -298,7 +298,7 @@ class ObjectContainer : public Object
   }
 
   // recursive set id of child objects
-  void assignWidgetId(long id);
+  void assignWidgetId(unsigned long id);
 
  public:
   Mat4 objM;
diff --git a/veusz/helpers/src/threed/scene.cpp b/veusz/helpers/src/threed/scene.cpp
index 3bb88f4d..83730360 100644
--- a/veusz/helpers/src/threed/scene.cpp
+++ b/veusz/helpers/src/threed/scene.cpp
@@ -528,12 +528,12 @@ Scene::DrawCallback::~DrawCallback()
 {
 }
 
-long Scene::idPixel(Object* root,
-                    QPainter* painter,
-                    const Camera& cam,
-                    double x1, double y1, double x2, double y2,
-                    double scale,
-                    double scaling, int x, int y)
+unsigned long Scene::idPixel(Object* root,
+                             QPainter* painter,
+                             const Camera& cam,
+                             double x1, double y1, double x2, double y2,
+                             double scale,
+                             double scaling, int x, int y)
 {
   constexpr int box = 3;
 
@@ -543,7 +543,7 @@ long Scene::idPixel(Object* root,
   {
   public:
     IdDrawCallback()
-      : lastwidgetid(-1),
+      : lastwidgetid(0),
         pixrender(2*box+1,2*box+1)
     {
       pixrender.fill(QColor(254,254,254));
@@ -565,7 +565,7 @@ long Scene::idPixel(Object* root,
         }
     }
 
-    long lastwidgetid;
+    unsigned long lastwidgetid;
     QPixmap pixrender;
     QImage lastimage;
   };
diff --git a/veusz/helpers/src/threed/scene.h b/veusz/helpers/src/threed/scene.h
index 108d58c7..60afa84e 100644
--- a/veusz/helpers/src/threed/scene.h
+++ b/veusz/helpers/src/threed/scene.h
@@ -66,9 +66,9 @@ class Scene
               double x1, double y1, double x2, double y2, double scale);
 
   // find widget id of pixel painted by drawing scene at (x, y)
-  long idPixel(Object* root, QPainter* painter, const Camera& cam,
-               double x1, double y1, double x2, double y2, double scale,
-               double scaling, int x, int y);
+  unsigned long idPixel(Object* root, QPainter* painter, const Camera& cam,
+                        double x1, double y1, double x2, double y2, double scale,
+                        double scaling, int x, int y);
 
 public:
   // last screen matrix
diff --git a/veusz/helpers/src/threed/threed.sip b/veusz/helpers/src/threed/threed.sip
index 385fc6eb..2903e096 100644
--- a/veusz/helpers/src/threed/threed.sip
+++ b/veusz/helpers/src/threed/threed.sip
@@ -324,8 +324,8 @@ class Object /NoDefaultCtors/
 %End
   public:
    virtual ~Object();
-   virtual void assignWidgetId(long id);
-   long widgetid;
+   virtual void assignWidgetId(unsigned long id);
+   unsigned long widgetid;
 };
 
 class Triangle : public Object /NoDefaultCtors/
@@ -446,7 +446,7 @@ class ObjectContainer : public Object
  public:
   ObjectContainer();
   void addObject(Object* obj /Transfer/);
-  void assignWidgetId(long id);
+  void assignWidgetId(unsigned long id);
 
   Mat4 objM;
 };
@@ -538,11 +538,11 @@ class Scene
   void render(Object* root,
               QPainter* painter, const Camera& cam,
 	      double x1, double y1, double x2, double y2, double scale);
-  long idPixel(Object* root,
-               QPainter* painter, const Camera& cam,
-               double x1, double y1, double x2, double y2,
-               double scale,
-               double scaling, int x, int y);
+  unsigned long idPixel(Object* root,
+                        QPainter* painter, const Camera& cam,
+                        double x1, double y1, double x2, double y2,
+                        double scale,
+                        double scaling, int x, int y);
 
  public:
   Mat3 screenM;