Skip to content

Commit ce48751

Browse files
committed
Super gross fix for issue 1609
1 parent 5846dcb commit ce48751

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

src_c/event.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@
5858
static int _custom_event = _PGE_CUSTOM_EVENT_INIT;
5959
static int _pg_event_is_init = 0;
6060

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+
6165
/* Length of our unicode string in bytes. We need 1 to 3 bytes to store
6266
* our unicode data, so we use a length of 4, to include the NULL byte
6367
* at the end as well */
@@ -290,6 +294,7 @@ _pg_put_event_unicode(SDL_Event *event, const char *uni)
290294
#if SDL_VERSION_ATLEAST(3, 0, 0)
291295
scanunicode[i].key = event->key.scancode;
292296
#else
297+
printf("Populating %d\n", i);
293298
scanunicode[i].key = event->key.keysym.scancode;
294299
#endif
295300
_pg_strip_utf8(uni, scanunicode[i].unicode);
@@ -302,6 +307,7 @@ _pg_put_event_unicode(SDL_Event *event, const char *uni)
302307
static PyObject *
303308
_pg_get_event_unicode(SDL_Event *event)
304309
{
310+
printf("Event type: %d\n", event->type);
305311
/* We only deal with one byte here, but still declare an array to silence
306312
* compiler warnings. The other 3 bytes are unused */
307313
char c[4];
@@ -315,6 +321,7 @@ _pg_get_event_unicode(SDL_Event *event)
315321
if (event->type == SDL_KEYUP) {
316322
/* mark the position as free real estate for other
317323
* events to occupy. */
324+
printf("clearing %d\n", i);
318325
scanunicode[i].key = 0;
319326
}
320327
return PyUnicode_FromString(scanunicode[i].unicode);
@@ -325,6 +332,7 @@ _pg_get_event_unicode(SDL_Event *event)
325332
*c = _pg_unicode_from_event(event);
326333
if (_pg_put_event_unicode(event, c))
327334
return _pg_get_event_unicode(event);
335+
printf("empty string\n");
328336
return PyUnicode_FromString("");
329337
}
330338

@@ -1089,6 +1097,7 @@ dict_from_event(SDL_Event *event)
10891097
case SDL_KEYDOWN:
10901098
case SDL_KEYUP:
10911099
PG_LOCK_EVFILTER_MUTEX
1100+
printf("Event Type (in switch): %d\n", event->type);
10921101
/* this accesses state also accessed the event filter, so lock */
10931102
_pg_insobj(dict, "unicode", _pg_get_event_unicode(event));
10941103
PG_UNLOCK_EVFILTER_MUTEX
@@ -2330,6 +2339,7 @@ pg_event_set_allowed(PyObject *self, PyObject *obj)
23302339
VIDEO_INIT_CHECK();
23312340

23322341
if (obj == Py_None) {
2342+
_key_events_blocked = 0U;
23332343
int i;
23342344
for (i = SDL_FIRSTEVENT; i < SDL_LASTEVENT; i++) {
23352345
PG_SetEventEnabled(i, SDL_TRUE);
@@ -2347,6 +2357,26 @@ pg_event_set_allowed(PyObject *self, PyObject *obj)
23472357
return NULL;
23482358
}
23492359
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+
}
23502380
}
23512381
Py_DECREF(seq);
23522382
}
@@ -2362,6 +2392,7 @@ pg_event_set_blocked(PyObject *self, PyObject *obj)
23622392
VIDEO_INIT_CHECK();
23632393

23642394
if (obj == Py_None) {
2395+
_key_events_blocked = (KEYDOWN_BLOCKED | KEYUP_BLOCKED);
23652396
int i;
23662397
/* Start at PGPOST_EVENTBEGIN */
23672398
for (i = PGPOST_EVENTBEGIN; i < SDL_LASTEVENT; i++) {
@@ -2380,6 +2411,26 @@ pg_event_set_blocked(PyObject *self, PyObject *obj)
23802411
return NULL;
23812412
}
23822413
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+
}
23832434
}
23842435
Py_DECREF(seq);
23852436
}
@@ -2389,6 +2440,16 @@ pg_event_set_blocked(PyObject *self, PyObject *obj)
23892440
#endif
23902441
/* Never block PGE_KEYREPEAT too, its needed for pygame internal use */
23912442
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+
}
23922453
Py_RETURN_NONE;
23932454
}
23942455

0 commit comments

Comments
 (0)