On Fri, Mar 11, 2022 at 11:25:18AM -0500, Miles Alan wrote:
> On Fri, Mar 11, 2022, at 9:11 AM, sir fish wrote:
> > Miles Alan <hackers@suckless.org> wrote:
> >> On Mon, Feb 21, 2022, at 1:10 AM, m...@milesalan.com wrote:
> >> > From: Miles Alan <m...@milesalan.com>
> >> >
> >> > In certain instances trans may be set to a window that doesn't actually
> >> > map to a client via wintoclient; in this case it doesn't make sense
> >> > to set isfloating/oldstate since trans is essentially invalid in that
> >> > case / correlates to the above condition check where trans is set /
> >> > XGetTransientForHint is called.
> >> > ---
> >> >  dwm.c | 2 +-
> >> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >> >
> >> > diff --git a/dwm.c b/dwm.c
> >> > index a96f33c..254ebf2 100644
> >> > --- a/dwm.c
> >> > +++ b/dwm.c
> >> > @@ -1063,7 +1063,7 @@ manage(Window w, XWindowAttributes *wa)
> >> >          XSelectInput(dpy, w, 
> >> > EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
> >> >          grabbuttons(c, 0);
> >> >          if (!c->isfloating)
> >> > -                c->isfloating = c->oldstate = trans != None || 
> >> > c->isfixed;
> >> > +                c->isfloating = c->oldstate = t || c->isfixed;
> >> >          if (c->isfloating)
> >> >                  XRaiseWindow(dpy, c->win);
> >> >          attach(c);
> >> > -- 
> >> > 2.34.1
> >> 
> >> You can test this patch with SDL applications which hit this edge case
> >> by default. Logic in dwm currently forces windows to become floating in
> >> this edge case.
> >> 
> >> For example with the SDL games "rue" and "cdogs_sdl" on alpine, in i3wm
> >> these applications open as tiled windows by default as they should; while
> >> in dwm they open as floating windows due to this bug.
> >> 
> >> This patch resolves that and SDL applications open as tiled with default
> >> flags as they should.
> >> 
> >
> > Hi,
> >
> > I tried this patch on a freshly-cloned dwm, but it doesn't open
> > teeworlds, xonotic, supertuxcart games as tiled.  It does, hover, open
> > the game cdogs as tiled.  I couldn't try with the game rue as it wasn't
> > available on Void.
> >
> > -- 
> > srfsh
> 
> Indeed there are certain SDL games which will still launch as floating
> with this patch (that is *if* the SDL_WINDOW_RESIZABLE flag is not set,
> in which case dwm considers the window fixed). Whether windows set with
> fixed dimensions should be floating or tiled by default is another matter.
> 
> Specifically, this patch corrects the scenario where SDL_WINDOW_RESIZABLE
> *is* set and then dwm incorrectly floats the window. This is due to the
> logic that incorrectly uses the WM_TRANSIENT_FOR hint but doesn't check
> if the transient window is managed. By default SDL sets WM_TRANSIENT_FOR
> to the root window, see:
> https://github.com/libsdl-org/SDL/blob/85e6500065bbe37e9131c0ff9cd7e5af6d256730/src/video/x11/SDL_x11window.c#L364
> 
> A base test case is below. In dwm currently, this window will float. With
> this patch applied, the window becomes tiled as it should. E.g. SDL 
> applications which are resizable should be tiled.
> 
> //gcc -lX11 -o foo foo.c -lSDL2
> #include <SDL2/SDL.h>
> #include <stdio.h>
> 
> int main(int argc, char* args[]) {
>   SDL_Init(SDL_INIT_VIDEO);
>   SDL_Window* window = SDL_CreateWindow("test", 
>     SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
>     500, 500,
>     SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
>   );
>   SDL_Surface* s = SDL_GetWindowSurface(window);
>   SDL_Rect r = { .x = 0, .y = 0 };
>   SDL_FillRect(s, NULL, SDL_MapRGB(s->format, 255, 0, 0));
>   SDL_UpdateWindowSurface(window);
>   SDL_Delay(2000);
>   SDL_DestroyWindow(window);
>   SDL_Quit();
>   return 0;
> }
> 

Hi Miles,

I tested and pushed the patch. I could not find any issues with it.

If someone finds a regression with some (SDL) program, please let me know.

Thanks,

-- 
Kind regards,
Hiltjo

Reply via email to