Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

XWayland is required even though wxPython programs runs under wayland #2557

Closed
bhepple opened this issue Jun 8, 2024 · 13 comments · Fixed by #2638
Closed

XWayland is required even though wxPython programs runs under wayland #2557

bhepple opened this issue Jun 8, 2024 · 13 comments · Fixed by #2638

Comments

@bhepple
Copy link

bhepple commented Jun 8, 2024

Operating system: Void Linux
wxPython version & source: wxPython-4.2.1_4 from voidlinux repo
Python version & source: python3-3.12.3_1

Description of the problem:
On linux, wxPython programs can run under wayland for example in the sway WM.

However, if XWayland is not available and enabled they will not run:

Unable to access the X Display, is $DISPLAY set properly?

Any wxPython program will do eg:

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MyFrame, self).__init__(parent, title=title)
        top_panel = wx.Panel(self)
        top_panel_sizer = wx.BoxSizer(wx.VERTICAL)
        top_panel.SetSizer(top_panel_sizer)
        collapsible_pane = wx.CollapsiblePane(top_panel, label="Collapsible Pane",
                                              style=wx.CP_DEFAULT_STYLE|wx.CP_NO_TLW_RESIZE)
        self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnPaneChanged, collapsible_pane)
        pane = collapsible_pane.GetPane()
        pane_sizer = wx.BoxSizer(wx.VERTICAL)
        pane.SetSizer(pane_sizer)
        text_box = wx.TextCtrl(pane, value = "foo")
        pane_sizer.Add(text_box, 1, wx.ALL | wx.EXPAND, 5)
        top_panel_sizer.Add(collapsible_pane, 1, wx.ALL | wx.EXPAND, 5)
        
    def OnPaneChanged(self, evt=None):
        self.Layout()
        
if __name__ == "__main__":
    app = wx.App()
    frm = MyFrame(None, title="Minimal wxPython Program")
    frm.Show()
    app.MainLoop()
@swt2c
Copy link
Collaborator

swt2c commented Jun 11, 2024

Confirmed. wxPython calls XOpenDisplay unconditionally here:
https://github.com/wxWidgets/Phoenix/blob/master/src/app_ex.cpp#L303

@swt2c
Copy link
Collaborator

swt2c commented Jun 11, 2024

You can probably hack around this problem by monkey-patching IsDisplayAvailable:

wx.PyApp.IsDisplayAvailable = lambda _: True

I wonder if the check still makes sense, but it does seem at least somewhat useful. If I remove it on a system with no display (e.g., over an SSH connection), wxPython startup will just hang there.

@bhepple
Copy link
Author

bhepple commented Jun 11, 2024

Thanks for that - works just fine without Xwayland now.

The problem for me is that my Xwayland is rather buggy and brings down the sway session occasionally - so this should be a life changer.

@bhepple
Copy link
Author

bhepple commented Jun 11, 2024

Up to you if you want to close this. I'm OK with the patch but I still think it's a bit janky that otherwise you must have Xwayland.

@swt2c
Copy link
Collaborator

swt2c commented Jun 11, 2024

No, this is definitely an issue that we need to address. I'm just not sure how exactly.

@nanonyme
Copy link

I'm curious why this precheck function exists at all. Don't you get some sensible error when you try to actually initialize the toolkit?

@bhepple
Copy link
Author

bhepple commented Jul 30, 2024

nanonyme - I don't normally. However with Xwayland unavailable I get this:

Unable to access the X Display, is $DISPLAY set properly?

.... and it exits with status 1.

But perhaps I misunderstood your question. If there's something you'd like me to run on sway/wayland with or without Xwayland, do let me know.

@nanonyme
Copy link

The question was directed to maintainer as it was architectural question about this toolkit.

@swt2c
Copy link
Collaborator

swt2c commented Jul 30, 2024

I'm curious why this precheck function exists at all. Don't you get some sensible error when you try to actually initialize the toolkit?

Good question that I don't know the answer to. It seems this display check has existed at least 18 years, so it has been there a while. Would need to ask @RobinD42.

@nanonyme
Copy link

nanonyme commented Jul 31, 2024

Please let's do that. It seems in current state toolkit is hardcoded to only support X11 on Linux, not Wayland. 18 years ago Wayland didn't even exist. By far simplest way forward would be to remove aforementioned check and let things break later but seems need more info to make that decision.

@EvilSupahFly
Copy link

Just out of curiosity... Where does this stand?

@swt2c
Copy link
Collaborator

swt2c commented Nov 6, 2024

I do plan to work on it eventually:

  • Update IsDisplayAvailable to support Wayland also
  • Remove IsDisplayAvailable check during startup as it seems unnecessary.

In the meantime perhaps you can use the workaround listed above.

@swt2c
Copy link
Collaborator

swt2c commented Nov 8, 2024

FYI, I submitted a PR to make IsDisplayAvailable work on Wayland (and any other toolkits supported by GTK). Please let me know if this works well enough. If not, we can look into removing the check altogether.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants