OK, I got this working on my Wacom Bamboo. I updated the get_tablets
method to work better at detecting more tablet names. I also noticed in the
docs that the tablet.open(window) method returns a "canvas device", which
you need to get your events from. I think that was the last bit you were
missing. I'll post two code snippets below. One is the updated method, and
the second is a working example.
def get_tablets(display=None):
# Each cursor appears as a separate xinput device; find devices that look
# like Wacom tablet cursors and amalgamate them into a single tablet.
valid_names = ('stylus', 'cursor', 'eraser', 'wacom', 'pen', 'pad')
cursors = []
devices = get_devices(display)
for device in devices:
dev_name = device.name.lower().split()
if any(n in dev_name for n in valid_names) and len(device.axes) >= 3:
cursors.append(XInputTabletCursor(device))
if cursors:
return [XInputTablet(cursors)]
return []
And a working example:
import pyglet
window = pyglet.window.Window()
tablet = pyglet.input.get_tablets()[0]
tablet_canvas = tablet.open(window)
@tablet_canvas.event
def on_motion(cursor_name, x, y, pressure, what, huh):
print("X: {}, Y: {}, Pressure: {}".format(x, y, pressure))
if __name__ == "__main__":
window.clear()
pyglet.app.run()
On Monday, August 1, 2016 at 6:31:52 PM UTC+9, Benjamin Moran wrote:
>
> I had a chance to try the Wacom Bamboo tablet today, and the "good" news
> is that mine doesn't work either, so the problem is not just with your
> tablet model.
>
> In my case, the raw device names are "Wacom Bamboo Pen" and "Wacom Bamboo
> Pad". At the very least, the function needs to be fixed to properly detect
> the newer evdev tablet names. I don't know if any of the core pyglet devs
> are using tablets anymore, but maybe we can fix this.
>
> -Ben
>
>
>
>
>
> On Saturday, July 30, 2016 at 5:58:27 PM UTC+9, Jesus Luis wrote:
>>
>> I get no feedback from the others either.
>> No feedback when I remove "... and len(device.axis) >= 3"
>>
>> printing the cursor list gives me:
>> [XInputTabletCursor(Wacom Cintiq 13HD Pen stylus),
>> XInputTabletCursor(Wacom Cintiq 13HD Pad pad), XInputTabletCursor(Wacom
>> Cintiq 13HD Pen eraser)]
>>
>> I'm not quite sure how to check if the controls are being detected and
>> created correctly however, so no data on your forth option.
>>
>> On Sat, 30 Jul 2016 at 17:35 Benjamin Moran <[email protected]> wrote:
>>
>>> Ah, I get the "Exception Ignored...." message sometimes on Arch. It's
>>> good to know that it affects other people as well. Maybe I'll try to track
>>> that one down when I have time and submit a patch. In any case, you can
>>> ignore that one for now, as it's harmless. I'm not sure if this affects
>>> other Linux distributions, or maybe just caused by the newer Xorg version
>>> in Arch.
>>>
>>> Anyway, do you get any feedback at all? Anything from printing cursor,
>>> x, y? If not, from this point, I would try to remove the "... and
>>> len(device.axis) >= 3" from the method. Maybe some of the tablet devices
>>> have a matching name, but they don't have enough axis to be included in the
>>> "cursors" list? Or, maybe just print the cursor list in the method to see
>>> if it's picking up all of the devices.
>>> If that doesn't work, the next step is to make sure all of the Controls
>>> are being detected and created correctly. This would be done by looking
>>> though the raw devices, though that might be a little difficult.
>>>
>>> If none of this works, I think I have a tablet at the office I can test
>>> for you. It's an older Wacom Bamboo, but at least I can confirm if that
>>> works or not.
>>>
>>> -Ben
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Saturday, July 30, 2016 at 4:40:36 PM UTC+9, Jesus Luis wrote:
>>>
>>>> Hi Benjamin, I Made the changes you suggested:
>>>>
>>>> def get_tablets(display=None):
>>>> # Each cursor appears as a separate xinput device; find devices
>>>> that look
>>>> # like Wacom tablet cursors and amalgamate them into a single
>>>> tablet.
>>>> cursors = []
>>>> devices = get_devices(display)
>>>> for device in devices:
>>>> if device.name in ('Wacom Cintiq 13HD Pen stylus',
>>>> 'Wacom Cintiq 13HD Pad pad',
>>>> 'Wacom Cintiq 13HD Pen eraser') and \
>>>> len(device.axes) >= 3:
>>>> cursors.append(XInputTabletCursor(device))
>>>>
>>>> if cursors:
>>>> return [XInputTablet(cursors)]
>>>> return []
>>>>
>>>>
>>>> And here's the test code:
>>>>
>>>>
>>>> import pyglet
>>>>
>>>> window = pyglet.window.Window()
>>>>
>>>> tablet = pyglet.input.get_tablets()
>>>>
>>>> print(tablet[0])
>>>> # <pyglet.input.x11_xinput_tablet.XInputTablet object at 0x7f89dea640f0>
>>>>
>>>> tablet[0].open(window)
>>>>
>>>>
>>>> @window.event
>>>> def on_motion(cursor, x, y, pressure):
>>>> print(pressure)
>>>>
>>>>
>>>> pyglet.app.run()
>>>>
>>>>
>>>> No print on the on_motion event, and when I close the windo I get a
>>>> Traceback:
>>>>
>>>> Exception ignored in: <bound method BaseWindow.__del__ of
>>>> XlibWindow(width=1, height=1)>
>>>> Traceback (most recent call last):
>>>> File
>>>> "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/window/__init__.py", line
>>>> 582, in __del__
>>>> File
>>>> "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/window/xlib/__init__.py",
>>>> line 477, in close
>>>> File "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/gl/xlib.py",
>>>> line 344, in destroy
>>>> File "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/gl/base.py",
>>>> line 334, in destroy
>>>> File "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/gl/xlib.py",
>>>> line 334, in detach
>>>> File "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/gl/lib.py", line
>>>> 97, in errcheck
>>>> File "<frozen importlib._bootstrap>", line 969, in _find_and_load
>>>> File "<frozen importlib._bootstrap>", line 954, in
>>>> _find_and_load_unlocked
>>>> File "<frozen importlib._bootstrap>", line 887, in _find_spec
>>>> TypeError: 'NoneType' object is not iterable
>>>>
>>>> On Sat, 30 Jul 2016 at 15:57 Benjamin Moran <[email protected]> wrote:
>>>>
>>> Great, at least we can say it's being detected OK.
>>>>> I took a look at the pyglet.input.x11_xinput_tablet.py file, and it
>>>>> looks like this function might need some updating. Tablets seem to be
>>>>> created as a few separate devices, combined into one device. You can see
>>>>> it's looking for devices with the names below. Your tablet, instead, has
>>>>> device names like "Wacom Cintiq 13HD Pen stylus", etc.
>>>>>
>>>>> Maybe a good test is to update this function with your actual device
>>>>> names, and see if it can detect and create the Tablet Device.
>>>>>
>>>>> The real question is if the Wacom device names have changed because of
>>>>> the newer Linux kernel, or if only some devices have different names.
>>>>>
>>>>>
>>>>>
>>>>> def get_tablets(display=None):
>>>>> # Each cursor appears as a separate xinput device; find devices that
>>>>> look
>>>>> # like Wacom tablet cursors and amalgamate them into a single
>>>>> tablet.
>>>>> cursors = []
>>>>> devices = get_devices(display)
>>>>> for device in devices:
>>>>> if device.name in ('stylus', 'cursor', 'eraser') and \
>>>>> len(device.axes) >= 3:
>>>>> cursors.append(XInputTabletCursor(device))
>>>>>
>>>>> if cursors:
>>>>> return [XInputTablet(cursors)]
>>>>> return []
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Saturday, July 30, 2016 at 3:19:07 PM UTC+9, Jesus Luis wrote:
>>>>>>
>>>>>> Great job, it's working!
>>>>>>
>>>>>> But only with get_devices(), get_tablets() still returns an empty
>>>>>> list.
>>>>>>
>>>>>>
>>>>>> Python 3.5.2 (default, Jun 28 2016, 08:46:01)
>>>>>> [GCC 6.1.1 20160602] on linux
>>>>>> Type "help", "copyright", "credits" or "license" for more information.
>>>>>> >>> import pyglet
>>>>>> >>> window = pyglet.window.Window()
>>>>>> >>> tablets = pyglet.input.get_tablets()
>>>>>> >>> tablets
>>>>>> []
>>>>>> >>> devices = pyglet.input.get_devices()
>>>>>> >>> devices
>>>>>> [XInputDevice(name=Virtual core pointer), XInputDevice(name=Virtual
>>>>>> core keyboard), XInputDevice(name=Virtual core XTEST pointer),
>>>>>> XInputDevice(name=Virtual core XTEST keyboard), XInputDevice(name=Power
>>>>>> Button), XInputDevice(name=Video Bus), XInputDevice(name=Power Button),
>>>>>> XInputDevice(name=USB Keyboard), XInputDevice(name=USB Keyboard),
>>>>>> XInputDevice(name=Logitech USB Receiver), XInputDevice(name=Logitech USB
>>>>>> Receiver), XInputDevice(name=Wacom Cintiq 13HD Pen stylus),
>>>>>> XInputDevice(name=Wacom Cintiq 13HD Pad pad), XInputDevice(name=Logitech
>>>>>> USB Receiver), XInputDevice(name=Wacom Cintiq 13HD Pen eraser),
>>>>>> XInputDevice(name=00:08:E0:4B:4C:80)]
>>>>>> >>> devices[11].get_controls()
>>>>>> [Button(name=button0, raw_name=None), Button(name=button1,
>>>>>> raw_name=None), Button(name=button2, raw_name=None),
>>>>>> Button(name=button3,
>>>>>> raw_name=None), Button(name=button4, raw_name=None),
>>>>>> Button(name=button5,
>>>>>> raw_name=None), Button(name=button6, raw_name=None), Button(name=key0,
>>>>>> raw_name=None), Button(name=key1, raw_name=None), Button(name=key2,
>>>>>> raw_name=None), Button(name=key3, raw_name=None), Button(name=key4,
>>>>>> raw_name=None), Button(name=key5, raw_name=None), Button(name=key6,
>>>>>> raw_name=None), Button(name=key7, raw_name=None), Button(name=key8,
>>>>>> raw_name=None), Button(name=key9, raw_name=None), Button(name=key10,
>>>>>> raw_name=None), Button(name=key11, raw_name=None), Button(name=key12,
>>>>>> raw_name=None), Button(name=key13, raw_name=None), Button(name=key14,
>>>>>> raw_name=None), Button(name=key15, raw_name=None), Button(name=key16,
>>>>>> raw_name=None), Button(name=key17, raw_name=None), Button(name=key18,
>>>>>> raw_name=None), Button(name=key19, raw_name=None), Button(name=key20,
>>>>>> raw_name=None), Button(name=key21, raw_name=None), Button(name=key22,
>>>>>> raw_name=None), Button(name=key23, raw_name=None), Button(name=key24,
>>>>>> raw_name=None), Button(name=key25, raw_name=None), Button(name=key26,
>>>>>> raw_name=None), Button(name=key27, raw_name=None), Button(name=key28,
>>>>>> raw_name=None), Button(name=key29, raw_name=None), Button(name=key30,
>>>>>> raw_name=None), Button(name=key31, raw_name=None), Button(name=key32,
>>>>>> raw_name=None), Button(name=key33, raw_name=None), Button(name=key34,
>>>>>> raw_name=None), Button(name=key35, raw_name=None), Button(name=key36,
>>>>>> raw_name=None), Button(name=key37, raw_name=None), Button(name=key38,
>>>>>> raw_name=None), Button(name=key39, raw_name=None), Button(name=key40,
>>>>>> raw_name=None), Button(name=key41, raw_name=None), Button(name=key42,
>>>>>> raw_name=None), Button(name=key43, raw_name=None), Button(name=key44,
>>>>>> raw_name=None), Button(name=key45, raw_name=None), Button(name=key46,
>>>>>> raw_name=None), Button(name=key47, raw_name=None), Button(name=key48,
>>>>>> raw_name=None), Button(name=key49, raw_name=None), Button(name=key50,
>>>>>> raw_name=None), Button(name=key51, raw_name=None), Button(name=key52,
>>>>>> raw_name=None), Button(name=key53, raw_name=None), Button(name=key54,
>>>>>> raw_name=None), Button(name=key55, raw_name=None), Button(name=key56,
>>>>>> raw_name=None), Button(name=key57, raw_name=None), Button(name=key58,
>>>>>> raw_name=None), Button(name=key59, raw_name=None), Button(name=key60,
>>>>>> raw_name=None), Button(name=key61, raw_name=None), Button(name=key62,
>>>>>> raw_name=None), Button(name=key63, raw_name=None), Button(name=key64,
>>>>>> raw_name=None), Button(name=key65, raw_name=None), Button(name=key66,
>>>>>> raw_name=None), Button(name=key67, raw_name=None), Button(name=key68,
>>>>>> raw_name=None), Button(name=key69, raw_name=None), Button(name=key70,
>>>>>> raw_name=None), Button(name=key71, raw_name=None), Button(name=key72,
>>>>>> raw_name=None), Button(name=key73, raw_name=None), Button(name=key74,
>>>>>> raw_name=None), Button(name=key75, raw_name=None), Button(name=key76,
>>>>>> raw_name=None), Button(name=key77, raw_name=None), Button(name=key78,
>>>>>> raw_name=None), Button(name=key79, raw_name=None), Button(name=key80,
>>>>>> raw_name=None), Button(name=key81, raw_name=None), Button(name=key82,
>>>>>> raw_name=None), Button(name=key83, raw_name=None), Button(name=key84,
>>>>>> raw_name=None), Button(name=key85, raw_name=None), Button(name=key86,
>>>>>> raw_name=None), Button(name=key87, raw_name=None), Button(name=key88,
>>>>>> raw_name=None), Button(name=key89, raw_name=None), Button(name=key90,
>>>>>> raw_name=None), Button(name=key91, raw_name=None), Button(name=key92,
>>>>>> raw_name=None), Button(name=key93, raw_name=None), Button(name=key94,
>>>>>> raw_name=None), Button(name=key95, raw_name=None), Button(name=key96,
>>>>>> raw_name=None), Button(name=key97, raw_name=None), Button(name=key98,
>>>>>> raw_name=None), Button(name=key99, raw_name=None), Button(name=key100,
>>>>>> raw_name=None), Button(name=key101, raw_name=None), Button(name=key102,
>>>>>> raw_name=None), Button(name=key103, raw_name=None), Button(name=key104,
>>>>>> raw_name=None), Button(name=key105, raw_name=None), Button(name=key106,
>>>>>> raw_name=None), Button(name=key107, raw_name=None), Button(name=key108,
>>>>>> raw_name=None), Button(name=key109, raw_name=None), Button(name=key110,
>>>>>> raw_name=None), Button(name=key111, raw_name=None), Button(name=key112,
>>>>>> raw_name=None), Button(name=key113, raw_name=None), Button(name=key114,
>>>>>> raw_name=None), Button(name=key115, raw_name=None), Button(name=key116,
>>>>>> raw_name=None), Button(name=key117, raw_name=None), Button(name=key118,
>>>>>> raw_name=None), Button(name=key119, raw_name=None), Button(name=key120,
>>>>>> raw_name=None), Button(name=key121, raw_name=None), Button(name=key122,
>>>>>> raw_name=None), Button(name=key123, raw_name=None), Button(name=key124,
>>>>>> raw_name=None), Button(name=key125, raw_name=None), Button(name=key126,
>>>>>> raw_name=None), Button(name=key127, raw_name=None), Button(name=key128,
>>>>>> raw_name=None), Button(name=key129, raw_name=None), Button(name=key130,
>>>>>> raw_name=None), Button(name=key131, raw_name=None), Button(name=key132,
>>>>>> raw_name=None), Button(name=key133, raw_name=None), Button(name=key134,
>>>>>> raw_name=None), Button(name=key135, raw_name=None), Button(name=key136,
>>>>>> raw_name=None), Button(name=key137, raw_name=None), Button(name=key138,
>>>>>> raw_name=None), Button(name=key139, raw_name=None), Button(name=key140,
>>>>>> raw_name=None), Button(name=key141, raw_name=None), Button(name=key142,
>>>>>> raw_name=None), Button(name=key143, raw_name=None), Button(name=key144,
>>>>>> raw_name=None), Button(name=key145, raw_name=None), Button(name=key146,
>>>>>> raw_name=None), Button(name=key147, raw_name=None), Button(name=key148,
>>>>>> raw_name=None), Button(name=key149, raw_name=None), Button(name=key150,
>>>>>> raw_name=None), Button(name=key151, raw_name=None), Button(name=key152,
>>>>>> raw_name=None), Button(name=key153, raw_name=None), Button(name=key154,
>>>>>> raw_name=None), Button(name=key155, raw_name=None), Button(name=key156,
>>>>>> raw_name=None), Button(name=key157, raw_name=None), Button(name=key158,
>>>>>> raw_name=None), Button(name=key159, raw_name=None), Button(name=key160,
>>>>>> raw_name=None), Button(name=key161, raw_name=None), Button(name=key162,
>>>>>> raw_name=None), Button(name=key163, raw_name=None), Button(name=key164,
>>>>>> raw_name=None), Button(name=key165, raw_name=None), Button(name=key166,
>>>>>> raw_name=None), Button(name=key167, raw_name=None), Button(name=key168,
>>>>>> raw_name=None), Button(name=key169, raw_name=None), Button(name=key170,
>>>>>> raw_name=None), Button(name=key171, raw_name=None), Button(name=key172,
>>>>>> raw_name=None), Button(name=key173, raw_name=None), Button(name=key174,
>>>>>> raw_name=None), Button(name=key175, raw_name=None), Button(name=key176,
>>>>>> raw_name=None), Button(name=key177, raw_name=None), Button(name=key178,
>>>>>> raw_name=None), Button(name=key179, raw_name=None), Button(name=key180,
>>>>>> raw_name=None), Button(name=key181, raw_name=None), Button(name=key182,
>>>>>> raw_name=None), Button(name=key183, raw_name=None), Button(name=key184,
>>>>>> raw_name=None), Button(name=key185, raw_name=None), Button(name=key186,
>>>>>> raw_name=None), Button(name=key187, raw_name=None), Button(name=key188,
>>>>>> raw_name=None), Button(name=key189, raw_name=None), Button(name=key190,
>>>>>> raw_name=None), Button(name=key191, raw_name=None), Button(name=key192,
>>>>>> raw_name=None), Button(name=key193, raw_name=None), Button(name=key194,
>>>>>> raw_name=None), Button(name=key195, raw_name=None), Button(name=key196,
>>>>>> raw_name=None), Button(name=key197, raw_name=None), Button(name=key198,
>>>>>> raw_name=None), Button(name=key199, raw_name=None), Button(name=key200,
>>>>>> raw_name=None), Button(name=key201, raw_name=None), Button(name=key202,
>>>>>> raw_name=None), Button(name=key203, raw_name=None), Button(name=key204,
>>>>>> raw_name=None), Button(name=key205, raw_name=None), Button(name=key206,
>>>>>> raw_name=None), Button(name=key207, raw_name=None), Button(name=key208,
>>>>>> raw_name=None), Button(name=key209, raw_name=None), Button(name=key210,
>>>>>> raw_name=None), Button(name=key211, raw_name=None), Button(name=key212,
>>>>>> raw_name=None), Button(name=key213, raw_name=None), Button(name=key214,
>>>>>> raw_name=None), Button(name=key215, raw_name=None), Button(name=key216,
>>>>>> raw_name=None), Button(name=key217, raw_name=None), Button(name=key218,
>>>>>> raw_name=None), Button(name=key219, raw_name=None), Button(name=key220,
>>>>>> raw_name=None), Button(name=key221, raw_name=None), Button(name=key222,
>>>>>> raw_name=None), Button(name=key223, raw_name=None), Button(name=key224,
>>>>>> raw_name=None), Button(name=key225, raw_name=None), Button(name=key226,
>>>>>> raw_name=None), Button(name=key227, raw_name=None), Button(name=key228,
>>>>>> raw_name=None), Button(name=key229, raw_name=None), Button(name=key230,
>>>>>> raw_name=None), Button(name=key231, raw_name=None), Button(name=key232,
>>>>>> raw_name=None), Button(name=key233, raw_name=None), Button(name=key234,
>>>>>> raw_name=None), Button(name=key235, raw_name=None), Button(name=key236,
>>>>>> raw_name=None), Button(name=key237, raw_name=None), Button(name=key238,
>>>>>> raw_name=None), Button(name=key239, raw_name=None), Button(name=key240,
>>>>>> raw_name=None), Button(name=key241, raw_name=None), Button(name=key242,
>>>>>> raw_name=None), Button(name=key243, raw_name=None), Button(name=key244,
>>>>>> raw_name=None), Button(name=key245, raw_name=None), Button(name=key246,
>>>>>> raw_name=None), Button(name=key247, raw_name=None),
>>>>>> AbsoluteAxis(name=axis0, raw_name=None), AbsoluteAxis(name=axis1,
>>>>>> raw_name=None), AbsoluteAxis(name=axis2, raw_name=None),
>>>>>> AbsoluteAxis(name=axis3, raw_name=None), AbsoluteAxis(name=axis4,
>>>>>> raw_name=None), AbsoluteAxis(name=axis5, raw_name=None),
>>>>>> Button(name=proximity, raw_name=None)]
>>>>>> >>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Saturday, 30 July 2016 14:30:21 UTC+9, Benjamin Moran wrote:
>>>>>>>
>>>>>>> Jesus,
>>>>>>>
>>>>>>> give the development branch of pyglet a try. It contains a fix for
>>>>>>> the ctypes crash on Python 3. I also extended the evdev stuff on Linux
>>>>>>> a
>>>>>>> bit to detect more joysticks, so it may work with your tablet as well.
>>>>>>> Could you give that a try and let me know the results?
>>>>>>> (The quickest way to try out the development version would be to
>>>>>>> download the repo, and just copy the pyglet folder into your project).
>>>>>>>
>>>>>>> If the crash is gone, but your tablet is still not detected by
>>>>>>> pyglet.input.get_tablets():
>>>>>>> Start with pyglet.input.get_devices(), and see if your tablet shows
>>>>>>> up in there. If it does, great. You should be able to open the device,
>>>>>>> and
>>>>>>> try the device.get_controls() method to see what inputs on your tablet
>>>>>>> are
>>>>>>> being detected. Tablets (and joysticks) are just a subset of "devices"
>>>>>>> that
>>>>>>> have specific controls).
>>>>>>>
>>>>>>> Let me know how far along you get. Hopefully your tablet will work
>>>>>>> with the dev branch, but if not it should be fixable.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Saturday, July 30, 2016 at 2:05:34 AM UTC+9, Jesus Luis wrote:
>>>>>>>>
>>>>>>>> Hey Benjamin,
>>>>>>>>
>>>>>>>> It works on python2, but it doesn't find my Wacom tablet.
>>>>>>>>
>>>>>>>> Python 2.7.12 (default, Jun 28 2016, 08:31:05)
>>>>>>>> [GCC 6.1.1 20160602] on linux2
>>>>>>>> Type "help", "copyright", "credits" or "license" for more
>>>>>>>> information.
>>>>>>>> >>> import pyglet
>>>>>>>> >>> window = pyglet.window.Window()
>>>>>>>> >>> tablets = pyglet.input.get_tablets()
>>>>>>>> >>> tablets
>>>>>>>> []
>>>>>>>> >>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Saturday, 30 July 2016 00:45:15 UTC+9, Benjamin Moran wrote:
>>>>>>>>>
>>>>>>>>> It looks like you might have hit a bug in the crowd bindings,
>>>>>>>>> probably due to the new Python 2/3 dual compatible codebase.
>>>>>>>>>
>>>>>>>>> Could you try running it again with Python2, and see if it works?
>>>>>>>>> If so, it should be easily fixable for Python 3. Let me know how it
>>>>>>>>> goes.
>>>>>>>>>
>>>>>>>> --
>>>>> You received this message because you are subscribed to a topic in the
>>>>> Google Groups "pyglet-users" group.
>>>>> To unsubscribe from this topic, visit
>>>>> https://groups.google.com/d/topic/pyglet-users/NnF2xH_5GSY/unsubscribe
>>>>> .
>>>>>
>>>> To unsubscribe from this group and all its topics, send an email to
>>>>> [email protected].
>>>>> To post to this group, send email to [email protected].
>>>>
>>>>
>>>>> Visit this group at https://groups.google.com/group/pyglet-users.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>> --
>>> You received this message because you are subscribed to a topic in the
>>> Google Groups "pyglet-users" group.
>>> To unsubscribe from this topic, visit
>>> https://groups.google.com/d/topic/pyglet-users/NnF2xH_5GSY/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to
>>> [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at https://groups.google.com/group/pyglet-users.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
--
You received this message because you are subscribed to the Google Groups
"pyglet-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/pyglet-users.
For more options, visit https://groups.google.com/d/optout.