[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: USEREVENT clash fix, was Re: [pygame] Re: Starting the pygame 2 series


thanks for your response, and for reviving this.

On Sat, Dec 22, 2018 at 10:34 AM DR0ID <dr0id@xxxxxxxxxx> wrote:
This is a bit cumbersome to use (since I don't know why pygame.NUMEVENTS is limited to 32) but will work.

NUMEVENTS limited to 32 is because of a SDL1 limitation. We can't raise that limit directly.

However, it is possible to change things underneath (inside the pygame functions).
See https://github.com/pygame/pygame/issues/477#issuecomment-407551211

This is what the new API would look like:
ZOG_UP = pg.event.custom_type()
ZOG_DOWN = pg.event.custom_type()
pg.event.post(pg.Event(ZOG_DOWN, msg='hello'))
for e in pg.event.get():
  if e.type == ZOG_UP:
  print('zog goes up!')

Now... what would happen underneath (inside the pygame functions) is that on SDL1...
  • One custom type would be allocated from the 32 to pygame custom types.
  • pygame.USEREVENT would be set to pygame.USEREVENT + 1 (so CUSTOM_TYPE is not used by other things).
  • When the python object is created, the SDL structure would use CUSTOM_TYPE. however event.type would be the custom type (eg. 'ZOG_UP').
  • pygame.event.post() would first translate this ZOG_UP to use CUSTOM_TYPE in the SDL structure.
  • pygame.event.get() and pygame.event.wait() would return an event with the type translated from the CUSTOM_TYPE (as used in the internal SDL structure) to the custom type (eg. e.type == ZOG_UP).

Does this all make sense?

These problems are solved by this:
  • no way to coordinate custom events between libraries.  Now pg.event.custom_type() would be used.
  • the number of custom events is too small. Now pygame would handle this translation at the C level.

But there is a strange thing: using mixer.music, mixer.Channel or pygame.time.set_timer() objects. They provide an set_endevent() method, but only can take an integer (which is almost useless with the NUMEVENTS limit). I would have expected to be able to set a custom event there too because that would solve it the same way as with normal events.

Yeah, it would be nice if these accepted events rather than event ids.

Can you please give some examples of how using these APIs would look taking events?

Especially when using a timer you normally want many timers bound to different ids. If pygame would provide that built-in this would really be good (hmm, maybe there should be an additional module for this like for sprites).

Would you please be able to explain this some more?