From 66a5f3c42c4e0487d1ce9d393c2331be97bb7811 Mon Sep 17 00:00:00 2001 From: kimci86 Date: Tue, 15 Aug 2023 18:38:08 +0200 Subject: [PATCH] Skip ClientMessage events with other window ID unless it is for IM --- src/SFML/Window/Unix/WindowImplX11.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index 6c88c7d4..554a9dbd 100644 --- a/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/src/SFML/Window/Unix/WindowImplX11.cpp @@ -85,13 +85,25 @@ namespace static const unsigned int maxTrialsCount = 5; - // Filter the events received by windows (only allow those matching a specific window) + // Filter the events received by windows (only allow those matching a specific window or those needed for the IM to work) Bool checkEvent(::Display*, XEvent* event, XPointer userData) { - // Just check if the event matches the window - // The input method sometimes sends ClientMessages with a different window ID, - // our event loop has to process them for the IM to work - return (event->xany.window == reinterpret_cast< ::Window >(userData)) || (event->type == ClientMessage); + if (event->xany.window == reinterpret_cast<::Window>(userData)) + { + // The event matches the current window so pick it up + return true; + } + if (event->type == ClientMessage) + { + // The input method sometimes sends ClientMessage with a different window ID. + // Our event loop has to process them for the IM to work. + // We assume ClientMessage events not having WM_PROTOCOLS message type are such events. + // ClientMessage events having WM_PROTOCOLS message type should be handled by their own window, + // so we ignore them here. They will eventually be picked up with the first condition. + static const Atom wmProtocols = sf::priv::getAtom("WM_PROTOCOLS"); + return event->xclient.message_type != wmProtocols; + } + return false; } // Find the name of the current executable