MyPaint w64 1.2.1 with Parblo Coast10 has spurious clicks and and error message on startup

Tags: #<Tag:0x00007f5f3a32c008>
Mypaint version: 1.2.1+gitexport.bcf5a28d
System information: Windows-10-10.0.18362-SP0
Using: Python 2.7.13, GTK 3.22.7, GdkPixbuf 2.36.4, Cairo 1.15.4, GLib 2.50.1
Traceback (most recent call last):
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/gui/document.py", line 623, button_release_cb(self=<gui.document.Document object>, tdw=<tileddrawwidget.TiledDrawWidget object at 0x000...0d981320 (TiledDrawWidget at 0x000000000e445410)>, event=<Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>)
            # Normal event dispatch
            return CanvasController.button_release_cb(self, tdw, event)
  variables: {'CanvasController.button_release_cb': ('global', <unbound method CanvasController.button_release_cb>), 'tdw': ('local', <tileddrawwidget.TiledDrawWidget object at 0x000000000d981320 (TiledDrawWidget at 0x000000000e445410)>), 'self': ('local', <gui.document.Document object at 0x000000000d99a8d0>), 'event': ('local', <Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>)}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/gui/document.py", line 114, button_release_cb(self=<gui.document.Document object>, tdw=<tileddrawwidget.TiledDrawWidget object at 0x000...0d981320 (TiledDrawWidget at 0x000000000e445410)>, event=<Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>)
            mode = self.modes.top
            result = mode.button_release_cb(tdw, event)
            self._update_last_event_info(tdw, event)
  variables: {'mode.button_release_cb': ('local', <bound method FreehandMode.button_release_cb of <gui.freehand.FreehandMode object at 0x000000000ecefc90>>), 'tdw': ('local', <tileddrawwidget.TiledDrawWidget object at 0x000000000d981320 (TiledDrawWidget at 0x000000000e445410)>), 'result': (None, []), 'event': ('local', <Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>)}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/gui/freehand.py", line 410, button_release_cb(self=<gui.freehand.FreehandMode object>, tdw=<tileddrawwidget.TiledDrawWidget object at 0x000...0d981320 (TiledDrawWidget at 0x000000000e445410)>, event=<Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>)
                # Notify observers after processing the event
                self.doc.input_stroke_ended(event)
  variables: {'self.doc.input_stroke_ended': ('local', <MethodWithObservers gui.document.Document.input_stroke_ended>), 'event': ('local', <Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>)}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/lib/observable.py", line 284, __call__(self=<MethodWithObservers gui.document.Document.input_stroke_ended>, *args=(<Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>,), **kwargs={})
                try:
                    observer(observed, *args, **kwargs)
                except BoundObserverMethod._ReferenceError:
  variables: {'observed': ('local', <gui.document.Document object at 0x000000000d99a8d0>), 'args': ('local', (<Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>,)), 'observer': ('local', <BoundObserverMethod gui.brushmanager.BrushManager._input_stroke_ended_cb>), 'kwargs': ('local', {})}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/lib/observable.py", line 467, __call__(self=<BoundObserverMethod gui.brushmanager.BrushManager._input_stroke_ended_cb>, observed=<gui.document.Document object>, *args=(<Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>,), **kwargs={})
                raise self._ReferenceError
            self._observer_func(observer, observed, *args, **kwargs)
            del observer
  variables: {'observed': ('local', <gui.document.Document object at 0x000000000d99a8d0>), 'args': ('local', (<Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>,)), 'self._observer_func': ('local', <function _input_stroke_ended_cb at 0x000000000d8dbc08>), 'observer': ('local', <gui.brushmanager.BrushManager object at 0x000000000daa5090>), 'kwargs': ('local', {})}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/gui/brushmanager.py", line 787, _input_stroke_ended_cb(self=<gui.brushmanager.BrushManager object>, doc=<gui.document.Document object>, event=<Gdk.EventButton object at 0x0000000010d30fc8 (void at 0x0000000012da96e0)>)
                for i, hb in enumerate(self.history):
                    hb_info = hb.brushinfo
                    hb_parent_name = hb_info.settings.get("parent_brush_name")
  variables: {'hb.brushinfo': ('local', <lib.brush.BrushInfo object at 0x000000000ea6bdd0>), 'hb_info': ('local', <lib.brush.BrushInfo object at 0x000000000ea6bf90>)}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/gui/brushmanager.py", line 969, get_brushinfo(self=<ManagedBrush u'history_1' p=deevad/2B_pencil>)
        def get_brushinfo(self):
            self._ensure_settings_loaded()
            return self._brushinfo
  variables: {'self._ensure_settings_loaded': ('local', <bound method ManagedBrush._ensure_settings_loaded of <ManagedBrush u'history_1' p=deevad/2B_pencil>>)}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/gui/brushmanager.py", line 1211, _ensure_settings_loaded(self=<ManagedBrush u'history_1' p=deevad/2B_pencil>)
                logger.debug("Loading %r...", self)
                self.load()
                assert self._settings_loaded
  variables: {'self.load': ('local', <bound method ManagedBrush.load of <ManagedBrush u'history_1' p=deevad/2B_pencil>>)}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/gui/brushmanager.py", line 1153, load(self=<ManagedBrush u'history_1' p=deevad/2B_pencil>)
            self._load_preview()
            self._load_settings()
  variables: {'self._load_settings': ('local', <bound method ManagedBrush._load_settings of <ManagedBrush u'history_1' p=deevad/2B_pencil>>)}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/gui/brushmanager.py", line 1175, _load_settings(self=<ManagedBrush u'history_1' p=deevad/2B_pencil>)
            try:
                self._brushinfo.load_from_string(brushinfo_str)
            except BrushInfo.ParseError, e:
  variables: {'self._brushinfo.load_from_string': ('local', <bound method BrushInfo.load_from_string of <lib.brush.BrushInfo object at 0x000000000ea6bdd0>>), 'brushinfo_str': ('local', '{\n    "comment": "MyPaint brush file", \n    "description": "A digital pencil soft 2B", \n    "group": "", \n    "notes": "A brush preset part of the Brushkit v0.6 \\n created in october 2012 by David Revoy ( aka Deevad ) \\n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \\n license: CC-Zero/Public-Domain", \n    "parent_brush_name": "deevad/2B_pencil", \n    "settings": {\n        "anti_aliasing": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_h": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_hsl_s": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_hsv_s": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_l": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_v": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "color_h": {\n            "base_value": 0.02525252525252525, \n            "inputs": {}\n        }, \n        "color_s": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "color_v": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "colorize": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "custom_input": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "custom_input_slowness": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "dabs_per_actual_radius": {\n            "base_value": 4.0, \n            "inputs": {}\n        }, \n        "dabs_per_basic_radius": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "dabs_per_second": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "direction_filter": {\n            "base_value": 2.0, \n            "inputs": {}\n        }, \n        "elliptical_dab_angle": {\n            "base_value": 90.0, \n            "inputs": {}\n        }, \n        "elliptical_dab_ratio": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "eraser": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "gridmap_scale": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "gridmap_scale_x": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "gridmap_scale_y": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "hardness": {\n            "base_value": 0.2, \n            "inputs": {\n                "pressure": [\n                    [\n                        0.0, \n                        0.0\n                    ], \n                    [\n                        1.0, \n                        0.3\n                    ]\n                ]\n            }\n        }, \n        "lock_alpha": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_2": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_2_asc": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_2_view": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_adj": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_asc": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_view": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_by_random": {\n            "base_value": 0.5, \n            "inputs": {\n                "pressure": [\n                    [\n                        0.0, \n                        0.0\n                    ], \n                    [\n                        1.0, \n                        -0.3\n                    ]\n                ]\n            }\n        }, \n        "offset_by_speed": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_by_speed_slowness": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "offset_multiplier": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_x": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_y": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "opaque": {\n            "base_value": 0.15000000000027122, \n            "inputs": {}\n        }, \n        "opaque_linearize": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "opaque_multiply": {\n            "base_value": 0.0, \n            "inputs": {\n                "pressure": [\n                    [\n                        0.0, \n                        0.0\n                    ], \n                    [\n                        1.0, \n                        1.0\n                    ]\n                ]\n            }\n        }, \n        "paint_mode": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "posterize": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "posterize_num": {\n            "base_value": 0.05000000074505806, \n            "inputs": {}\n        }, \n        "pressure_gain_log": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "radius_by_random": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "radius_logarithmic": {\n            "base_value": 0.75, \n            "inputs": {\n                "pressure": [\n                    [\n                        0.0, \n                        -0.687917\n                    ], \n                    [\n                        0.752976, \n                        0.236471\n                    ], \n                    [\n                        1.0, \n                        0.286632\n                    ]\n                ]\n            }\n        }, \n        "restore_color": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "slow_tracking": {\n            "base_value": 1.03, \n            "inputs": {}\n        }, \n        "slow_tracking_per_dab": {\n            "base_value": 1.5, \n            "inputs": {}\n        }, \n        "smudge": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "smudge_bucket": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "smudge_length": {\n            "base_value": 0.5, \n            "inputs": {}\n        }, \n        "smudge_length_log": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "smudge_radius_log": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "smudge_transparency": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "snap_to_pixel": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "speed1_gamma": {\n            "base_value": 4.0, \n            "inputs": {}\n        }, \n        "speed1_slowness": {\n            "base_value": 0.04, \n            "inputs": {}\n        }, \n        "speed2_gamma": {\n            "base_value": 4.0, \n            "inputs": {}\n        }, \n        "speed2_slowness": {\n            "base_value": 0.8, \n            "inputs": {}\n        }, \n        "stroke_duration_logarithmic": {\n            "base_value": 4.0, \n            "inputs": {}\n        }, \n        "stroke_holdtime": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "stroke_threshold": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "tracking_noise": {\n            "base_value": 0.0, \n            "inputs": {}\n        }\n    }, \n    "version": 3\n}')}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/lib/brush.py", line 181, load_from_string(self=<lib.brush.BrushInfo object>, settings_str='{\n    "comment": "MyPaint brush file", \n    "des..."inputs": {}\n        }\n    }, \n    "version": 3\n}')
                # new json-based brush format
                self.from_json(settings_str)
            elif settings_str.startswith('#'):
  variables: {'self.from_json': ('local', <bound method BrushInfo.from_json of <lib.brush.BrushInfo object at 0x000000000ea6bdd0>>), 'settings_str': ('local', '{\n    "comment": "MyPaint brush file", \n    "description": "A digital pencil soft 2B", \n    "group": "", \n    "notes": "A brush preset part of the Brushkit v0.6 \\n created in october 2012 by David Revoy ( aka Deevad ) \\n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \\n license: CC-Zero/Public-Domain", \n    "parent_brush_name": "deevad/2B_pencil", \n    "settings": {\n        "anti_aliasing": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_h": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_hsl_s": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_hsv_s": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_l": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "change_color_v": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "color_h": {\n            "base_value": 0.02525252525252525, \n            "inputs": {}\n        }, \n        "color_s": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "color_v": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "colorize": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "custom_input": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "custom_input_slowness": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "dabs_per_actual_radius": {\n            "base_value": 4.0, \n            "inputs": {}\n        }, \n        "dabs_per_basic_radius": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "dabs_per_second": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "direction_filter": {\n            "base_value": 2.0, \n            "inputs": {}\n        }, \n        "elliptical_dab_angle": {\n            "base_value": 90.0, \n            "inputs": {}\n        }, \n        "elliptical_dab_ratio": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "eraser": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "gridmap_scale": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "gridmap_scale_x": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "gridmap_scale_y": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "hardness": {\n            "base_value": 0.2, \n            "inputs": {\n                "pressure": [\n                    [\n                        0.0, \n                        0.0\n                    ], \n                    [\n                        1.0, \n                        0.3\n                    ]\n                ]\n            }\n        }, \n        "lock_alpha": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_2": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_2_asc": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_2_view": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_adj": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_asc": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_angle_view": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_by_random": {\n            "base_value": 0.5, \n            "inputs": {\n                "pressure": [\n                    [\n                        0.0, \n                        0.0\n                    ], \n                    [\n                        1.0, \n                        -0.3\n                    ]\n                ]\n            }\n        }, \n        "offset_by_speed": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_by_speed_slowness": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "offset_multiplier": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_x": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "offset_y": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "opaque": {\n            "base_value": 0.15000000000027122, \n            "inputs": {}\n        }, \n        "opaque_linearize": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "opaque_multiply": {\n            "base_value": 0.0, \n            "inputs": {\n                "pressure": [\n                    [\n                        0.0, \n                        0.0\n                    ], \n                    [\n                        1.0, \n                        1.0\n                    ]\n                ]\n            }\n        }, \n        "paint_mode": {\n            "base_value": 1.0, \n            "inputs": {}\n        }, \n        "posterize": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "posterize_num": {\n            "base_value": 0.05000000074505806, \n            "inputs": {}\n        }, \n        "pressure_gain_log": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "radius_by_random": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "radius_logarithmic": {\n            "base_value": 0.75, \n            "inputs": {\n                "pressure": [\n                    [\n                        0.0, \n                        -0.687917\n                    ], \n                    [\n                        0.752976, \n                        0.236471\n                    ], \n                    [\n                        1.0, \n                        0.286632\n                    ]\n                ]\n            }\n        }, \n        "restore_color": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "slow_tracking": {\n            "base_value": 1.03, \n            "inputs": {}\n        }, \n        "slow_tracking_per_dab": {\n            "base_value": 1.5, \n            "inputs": {}\n        }, \n        "smudge": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "smudge_bucket": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "smudge_length": {\n            "base_value": 0.5, \n            "inputs": {}\n        }, \n        "smudge_length_log": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "smudge_radius_log": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "smudge_transparency": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "snap_to_pixel": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "speed1_gamma": {\n            "base_value": 4.0, \n            "inputs": {}\n        }, \n        "speed1_slowness": {\n            "base_value": 0.04, \n            "inputs": {}\n        }, \n        "speed2_gamma": {\n            "base_value": 4.0, \n            "inputs": {}\n        }, \n        "speed2_slowness": {\n            "base_value": 0.8, \n            "inputs": {}\n        }, \n        "stroke_duration_logarithmic": {\n            "base_value": 4.0, \n            "inputs": {}\n        }, \n        "stroke_holdtime": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "stroke_threshold": {\n            "base_value": 0.0, \n            "inputs": {}\n        }, \n        "tracking_noise": {\n            "base_value": 0.0, \n            "inputs": {}\n        }\n    }, \n    "version": 3\n}')}
  File "C:/Program Files/mypaint-w64/mingw64/share/mypaint/lib/brush.py", line 165, from_json(self=<lib.brush.BrushInfo object>, json_string='{\n    "comment": "MyPaint brush file", \n    "des..."inputs": {}\n        }\n    }, \n    "version": 3\n}')
                if k not in self.settings:
                    print 'ignoring unknown brush setting %r' % k
                    continue
  variables: {'k': ('local', u'offset_angle_2_view')}
IOError: [Errno 9] Bad file descriptor

On Windows 10 x64. My windows is fully up to date, as are the drivers for the tablet.

In addition to popping up that error window immediately, MyPaint draws long horizontal lines, as though the cursor was bouncing offscreen to the right and then back, every time I put the stylus down.

In the latest alpha, there are no error messages, but the program doesn’t respond to the stylus at all-- even when tapping on UI elements like the exit button. The mouse acts normally.

I’m assuming you didn’t clean out earlier installs of MyPaint before installing 1.2.1? If not, that is the cause of that error (due to some brush-setting incompatibility), and unrelated to the real issue.

In the alpha, can you see your device(s) under the Devices tab in Preferences (Edit -> Edit Preferences)?
In the same folder that houses the executable for the alpha, there is a program called gkt3-demo.exe, where you can test if the input device is detected. See this issue comment for more info: https://github.com/mypaint/mypaint/issues/484#issuecomment-275644815

Afaik, MyPaint’s input handling is just a thin wrapper on Gtk/Gdk’s input system, so these kind of issues are unfortunately often not fixable without writing upstream patches.