58
58
static int _custom_event = _PGE_CUSTOM_EVENT_INIT ;
59
59
static int _pg_event_is_init = 0 ;
60
60
61
+ static uint8_t _key_events_blocked = 0U ;
62
+ static const uint8_t KEYUP_BLOCKED = 0x1 ;
63
+ static const uint8_t KEYDOWN_BLOCKED = 0x2 ;
64
+
61
65
/* Length of our unicode string in bytes. We need 1 to 3 bytes to store
62
66
* our unicode data, so we use a length of 4, to include the NULL byte
63
67
* at the end as well */
@@ -290,6 +294,7 @@ _pg_put_event_unicode(SDL_Event *event, const char *uni)
290
294
#if SDL_VERSION_ATLEAST (3 , 0 , 0 )
291
295
scanunicode [i ].key = event -> key .scancode ;
292
296
#else
297
+ printf ("Populating %d\n" , i );
293
298
scanunicode [i ].key = event -> key .keysym .scancode ;
294
299
#endif
295
300
_pg_strip_utf8 (uni , scanunicode [i ].unicode );
@@ -302,6 +307,7 @@ _pg_put_event_unicode(SDL_Event *event, const char *uni)
302
307
static PyObject *
303
308
_pg_get_event_unicode (SDL_Event * event )
304
309
{
310
+ printf ("Event type: %d\n" , event -> type );
305
311
/* We only deal with one byte here, but still declare an array to silence
306
312
* compiler warnings. The other 3 bytes are unused */
307
313
char c [4 ];
@@ -315,6 +321,7 @@ _pg_get_event_unicode(SDL_Event *event)
315
321
if (event -> type == SDL_KEYUP ) {
316
322
/* mark the position as free real estate for other
317
323
* events to occupy. */
324
+ printf ("clearing %d\n" , i );
318
325
scanunicode [i ].key = 0 ;
319
326
}
320
327
return PyUnicode_FromString (scanunicode [i ].unicode );
@@ -325,6 +332,7 @@ _pg_get_event_unicode(SDL_Event *event)
325
332
* c = _pg_unicode_from_event (event );
326
333
if (_pg_put_event_unicode (event , c ))
327
334
return _pg_get_event_unicode (event );
335
+ printf ("empty string\n" );
328
336
return PyUnicode_FromString ("" );
329
337
}
330
338
@@ -1089,6 +1097,7 @@ dict_from_event(SDL_Event *event)
1089
1097
case SDL_KEYDOWN :
1090
1098
case SDL_KEYUP :
1091
1099
PG_LOCK_EVFILTER_MUTEX
1100
+ printf ("Event Type (in switch): %d\n" , event -> type );
1092
1101
/* this accesses state also accessed the event filter, so lock */
1093
1102
_pg_insobj (dict , "unicode" , _pg_get_event_unicode (event ));
1094
1103
PG_UNLOCK_EVFILTER_MUTEX
@@ -2330,6 +2339,7 @@ pg_event_set_allowed(PyObject *self, PyObject *obj)
2330
2339
VIDEO_INIT_CHECK ();
2331
2340
2332
2341
if (obj == Py_None ) {
2342
+ _key_events_blocked = 0U ;
2333
2343
int i ;
2334
2344
for (i = SDL_FIRSTEVENT ; i < SDL_LASTEVENT ; i ++ ) {
2335
2345
PG_SetEventEnabled (i , SDL_TRUE );
@@ -2347,6 +2357,26 @@ pg_event_set_allowed(PyObject *self, PyObject *obj)
2347
2357
return NULL ;
2348
2358
}
2349
2359
PG_SetEventEnabled (_pg_pgevent_proxify (type ), SDL_TRUE );
2360
+ if (type == SDL_KEYDOWN ) {
2361
+ _key_events_blocked &= ~KEYDOWN_BLOCKED ;
2362
+ printf ("keydown allowed\n" );
2363
+
2364
+ if (_key_events_blocked &= KEYUP_BLOCKED ) {
2365
+ PG_SetEventEnabled (_pg_pgevent_proxify (SDL_KEYUP ),
2366
+ SDL_TRUE );
2367
+ printf ("Forcing KEYUP allowed\n" );
2368
+ }
2369
+ }
2370
+ else if (type == SDL_KEYUP ) {
2371
+ _key_events_blocked &= ~KEYUP_BLOCKED ;
2372
+ printf ("keyup allowed\n" );
2373
+
2374
+ if (_key_events_blocked &= KEYDOWN_BLOCKED ) {
2375
+ PG_SetEventEnabled (_pg_pgevent_proxify (SDL_KEYDOWN ),
2376
+ SDL_TRUE );
2377
+ printf ("Forcing KEYDOWN allowed\n" );
2378
+ }
2379
+ }
2350
2380
}
2351
2381
Py_DECREF (seq );
2352
2382
}
@@ -2362,6 +2392,7 @@ pg_event_set_blocked(PyObject *self, PyObject *obj)
2362
2392
VIDEO_INIT_CHECK ();
2363
2393
2364
2394
if (obj == Py_None ) {
2395
+ _key_events_blocked = (KEYDOWN_BLOCKED | KEYUP_BLOCKED );
2365
2396
int i ;
2366
2397
/* Start at PGPOST_EVENTBEGIN */
2367
2398
for (i = PGPOST_EVENTBEGIN ; i < SDL_LASTEVENT ; i ++ ) {
@@ -2380,6 +2411,26 @@ pg_event_set_blocked(PyObject *self, PyObject *obj)
2380
2411
return NULL ;
2381
2412
}
2382
2413
PG_SetEventEnabled (_pg_pgevent_proxify (type ), SDL_FALSE );
2414
+ if (type == SDL_KEYDOWN ) {
2415
+ _key_events_blocked |= KEYDOWN_BLOCKED ;
2416
+ printf ("keydown blocked\n" );
2417
+
2418
+ if (_key_events_blocked & KEYUP_BLOCKED ) {
2419
+ PG_SetEventEnabled (_pg_pgevent_proxify (SDL_KEYUP ),
2420
+ SDL_FALSE );
2421
+ printf ("Both are now blocked\n" );
2422
+ }
2423
+ }
2424
+ else if (type == SDL_KEYUP ) {
2425
+ _key_events_blocked |= KEYUP_BLOCKED ;
2426
+ printf ("keyup blocked\n" );
2427
+
2428
+ if (_key_events_blocked & KEYDOWN_BLOCKED ) {
2429
+ PG_SetEventEnabled (_pg_pgevent_proxify (SDL_KEYDOWN ),
2430
+ SDL_FALSE );
2431
+ printf ("Both are now blocked\n" );
2432
+ }
2433
+ }
2383
2434
}
2384
2435
Py_DECREF (seq );
2385
2436
}
@@ -2389,6 +2440,16 @@ pg_event_set_blocked(PyObject *self, PyObject *obj)
2389
2440
#endif
2390
2441
/* Never block PGE_KEYREPEAT too, its needed for pygame internal use */
2391
2442
PG_SetEventEnabled (PGE_KEYREPEAT , SDL_TRUE );
2443
+ /* If KEYUP is not blocked, don't block KEYDOWN */
2444
+ if (!(_key_events_blocked & KEYUP_BLOCKED )) {
2445
+ PG_SetEventEnabled (_pg_pgevent_proxify (SDL_KEYDOWN ), SDL_TRUE );
2446
+ printf ("skipping block on keydown\n" );
2447
+ }
2448
+ /* If KEYDOWN is not blocked, don't block KEYUP */
2449
+ if (!(_key_events_blocked & KEYDOWN_BLOCKED )) {
2450
+ PG_SetEventEnabled (_pg_pgevent_proxify (SDL_KEYUP ), SDL_TRUE );
2451
+ printf ("skipping block on keyup\n" );
2452
+ }
2392
2453
Py_RETURN_NONE ;
2393
2454
}
2394
2455
0 commit comments