On Mon, 7 Jan 2019 08:59:30 +0100 Stephen Kitt <[email protected]> wrote:
> On Sat, Jan 05, 2019 at 03:32:02AM -0500, Full Name wrote:
> > A similar problem occurs in DOSBox. I'm not sure if this is a bug in xorg
> > or SDL.
> >
> > What is happening is that when you unpause, lbreakout2 tries to fence the
> > mouse in its window,
> > but instead the window immediately loses focus causing lbreakout2 to pause
> > again. I'm not sure
> > why the mouse lock works the first time, but once it releases it cannot be
> > regained.
>
> Yup, this does seem to be the case. This issue was fixed in DOSBox
> with the patch available at
> https://www.dosbox.com/downloads/74-2-events.diff (also included in
> the current DOSBox package in unstable and testing).
>
> Regards,
>
> Stephen
Hi,
I've implemented the mentioned fix for DOSBox and it worked. (see added
diff-file) But I couldn't add the macro from the DOSBox diff, because it
doesn't work (don't know why). I'm also not very familiar with debian
packaging, so I expect the diff file wasn't created/applied correctly. But here
it is.
Kind regards,
bitfreak25
--- lbreakout2-2.6.5.orig/client/game.c 2013-05-03 19:06:20.000000000 +0200
+++ lbreakout2-2.6.5/client/game.c 2019-01-13 00:21:06.339765000 +0100
@@ -1150,6 +1150,17 @@
/* check wether an event occured */
button_clicked = key_pressed = 0;
if ( SDL_PollEvent( &event ) ) {
+ // Special code for broken SDL with Xorg 1.20.1, where pairs of inputfocus gain and loss events are generated
+ // when locking the mouse in windowed mode.
+ if (event.type == SDL_ACTIVEEVENT && event.active.state == SDL_APPINPUTFOCUS && event.active.gain == 0) {
+ SDL_Event test; //Check if the next event would undo this one.
+ if (SDL_PeepEvents(&test,1,SDL_PEEKEVENT,SDL_ACTIVEEVENTMASK) == 1 && test.active.state == SDL_APPINPUTFOCUS && test.active.gain == 1) {
+ // Skip both events.
+ SDL_PeepEvents(&test,1,SDL_GETEVENT,SDL_ACTIVEEVENTMASK);
+ continue;
+ }
+ }
+
if ( client_state == CS_PAUSE && game->game_type == GT_NETWORK )
gui_dispatch_event( &event, ms );
else