Frequently asked question
-------------------------

How do I use *pystray* in a *virtualenv* on *Linux*?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

On *Linux*, runtime introspection data is required to use the *AppIndicator*
backend, and the *GTK* backend may not be fully functional without installing
desktop environment extensions. The *XOrg* backend will work, but it provides
limited functionality.

In order to use the *AppIndicator* backend, you may install the package
``PyGObject``. No wheel is provided, so the package must be built locally. On
*Debian* derivatives, such as *Ubuntu*, the following packages, in addition to
compilers and *pkg-config*, must be installed:

- ``libcairo-dev``
- ``libgirepository1.0-dev``


I am trying to integrate with a framework, but ``run_detached`` does not work
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The ``run_detached`` method is used to allow a different framework to drive the
main loop. This requires that the framework uses the same kind of mainloop.

On *Windows* and *macOS*, this will be the case if you use the platform GUI
toolkits. On *Linux*, the situation is a bit more complicated. Generally, the
*xorg* backend will work with any toolkit, as long as you run it in an *X*
session and not under *Wayland*. The *GTK* and *AppIndicator* backends will
work if your toolkit is based on *GObject*.

However, ``run_detached`` is strictly necessary only on *macOS*. For other
platforms, it is possible to just launch the icon mainloop in a thread::

    import pystray
    import threading
    import some_toolkit

    # Create the icon
    icon = pystray.Icon(
        'test name',
        icon=create_icon())

    # Run the icon mainloop in a separate thread
    threading.Thread(target=icon.run).start()

    # Run the toolkit mainlon in the main thread
    some_toolkit.mainloop()
