///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/init.h
// Purpose: Private initialization-related data.
// Author: Vadim Zeitlin
// Created: 2023-09-02
// Copyright: (c) 2023 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_INIT_H_
#define _WX_PRIVATE_INIT_H_
// ----------------------------------------------------------------------------
// Initialization data contains parameters we get from the OS entry function.
// ----------------------------------------------------------------------------
struct WXDLLIMPEXP_BASE wxInitData
{
private:
wxInitData() = default;
public:
// Get the single global object.
static wxInitData& Get();
// Initialize from ANSI command line arguments: argv contents should be
// static, i.e. remain valid until the end of the program.
void Initialize(int argc, char** argv);
// Initialize from wide command line arguments if we hadn't been
// initialized in some other way: this allows to call this function
// unconditionally, even when these wide arguments were themselves
// synthesized from ANSI ones by our own code.
//
// Note that here we currently make a copy of the arguments internally, so
// they don't need to be static.
void InitIfNecessary(int argc, wchar_t** argv);
// This function is used instead of the dtor because the global object can
// be initialized multiple times.
void Free();
// We always have argc and (Unicode) argv, they're filled by Initialize()
// and argv as well as its elements are owned by us, see Free().
int argc = 0;
wchar_t** argv = nullptr;
#ifdef __WINDOWS__
// Initialize from the implicitly available Unicode command line.
void MSWInitialize();
// This pointer is non-null only if MSWInitialize() was called. In this
// case, argv is also set to it and, because this pointer needs to be freed
// using MSW-specific function, argv must not be freed at all.
//
// It's also possible to use Initialize(), even under Windows, in which
// case this pointer remains null and argv must be freed as usual.
wchar_t** argvMSW = nullptr;
#endif // __WINDOWS__
// At least wxGTK needs narrow command line arguments too and even thought
// other ports under Windows typically don't need them (e.g. wxMSW itself
// doesn't), we have to have them, as this header is toolkit-independent,
// and so can't differ between wxMSW and wxGTK.
// Initializes argvA using argc and argv. This means that argc and argv
// MUST be initialized before calling this function.
void InitArgvA();
// This pointer may or not need to be freed, as indicated by ownsArgvA flag.
char** argvA = nullptr;
bool ownsArgvA = false;
wxDECLARE_NO_COPY_CLASS(wxInitData);
};
// Type of the hook function, see wxAddEntryHook(). If this function returns
// a value different from -1, the process exits using it as error code.
using wxEntryHook = int (*)();
// Set a special hook function which will be called before performing any
// normal initialization. Note that this hook can't use any wxWidgets
// functionality because nothing has been initialized yet, but can use
// wxInitData to examine the command line arguments and determine if it should
// be applied.
//
// This is currently used only by wxWebViewChromium to allow running Chromium
// helper applications without initializing GTK under Linux but could, in
// principle, be used for any other similar purpose.
WXDLLIMPEXP_BASE void wxAddEntryHook(wxEntryHook hook);
#endif // _WX_PRIVATE_INIT_H_