class mrpt::gui::WxSubsystem

Overview

This class implements the GUI thread required for the wxWidgets-based GUI.

This system is employed internally by gui::CDisplayWindow and gui::CDisplayWindow3D, and must be not used in any way directly by the MRPT user.

The system works by creating a invisible wxFrame that process timer events where it checks a queue of requests sent from the main MRPT thread. The requests include the creation, deletion,… of windows (2D/3D). In that way, just one thread is required for all the GUI windows, and the wxWidgets is initialized and clean-up correctly.

This header should be included just from the implementation files of CDisplayWindow and CDisplayWindow3D, since it uses wxWidgets classes.

See also:

gui::CDisplayWindow, gui::CDisplayWindow3D

#include <mrpt/gui/WxSubsystem.h>

class WxSubsystem
{
public:
    // structs

    struct TRequestToWxMainThread;
    struct TWxMainThreadData;

    // classes

    class CAuxWxSubsystemShutdowner;
    class CWXMainFrame;

    // fields

    static CAuxWxSubsystemShutdowner global_wxsubsystem_shutdown;

    // methods

    static void waitWxShutdownsIfNoWindows();
    static bool isConsoleApp();
    static TWxMainThreadData& GetWxMainThreadInstance();
    static void wxMainThread();
    static TRequestToWxMainThread* popPendingWxRequest();
    static void pushPendingWxRequest(TRequestToWxMainThread* data);
    static bool createOneInstanceMainThread();
    static wxBitmap getMRPTDefaultIcon();
};

Methods

static void waitWxShutdownsIfNoWindows()

This method must be called in the destructor of the user class FROM THE MAIN THREAD, in order to wait for the shutdown of the wx thread if this was the last open window.

static bool isConsoleApp()

Will be set to true at runtime if it’s not detected a running wxApp instance.

For console apps, we’ll create a new thread and run wxEntry from there. For GUI apps (MRPT-based Windows are a part of a user wxWidget apps), we must leave the control of message dispatching to the current main loop, so we cannot create a different threads, making things a little different (hence this variable).

static void wxMainThread()

This will be the “MAIN” of wxWidgets: It starts an application object and does not end until all the windows are closed.

Only one instance of this thread can be running at a given instant, no matter how many windows are open.

static TRequestToWxMainThread* popPendingWxRequest()

Thread-safe method to return the next pending request, or nullptr if there is none (After usage, FREE the memory!)

static void pushPendingWxRequest(TRequestToWxMainThread* data)

Thread-safe method to insert a new pending request (The memory must be dinamically allocated with “new T[1]”, will be freed by receiver.)

static bool createOneInstanceMainThread()

Thread-safe method to create one single instance of the main wxWidgets thread: it will create the thread only if it is not running yet.