MegaGlest/mk/linux/mojosetup/gui.h

303 lines
8.6 KiB
C

/**
* MojoSetup; a portable, flexible installation application.
*
* Please see the file LICENSE.txt in the source's root directory.
*
* This file written by Ryan C. Gordon.
*/
#ifndef _INCL_GUI_H_
#define _INCL_GUI_H_
#include "universal.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum
{
MOJOGUI_PRIORITY_NEVER_TRY = 0,
MOJOGUI_PRIORITY_USER_REQUESTED,
MOJOGUI_PRIORITY_TRY_FIRST,
MOJOGUI_PRIORITY_TRY_NORMAL,
MOJOGUI_PRIORITY_TRY_LAST,
MOJOGUI_PRIORITY_TRY_ABSOLUTELY_LAST,
MOJOGUI_PRIORITY_TOTAL
} MojoGuiPluginPriority;
typedef enum
{
MOJOGUI_NO,
MOJOGUI_YES,
MOJOGUI_ALWAYS,
MOJOGUI_NEVER
} MojoGuiYNAN;
/*
* Abstract GUI interfaces.
*/
typedef struct MojoGuiSetupOptions MojoGuiSetupOptions;
struct MojoGuiSetupOptions
{
const char *description;
const char *tooltip;
boolean value;
boolean is_group_parent;
uint64 size;
int opaque; // GUI drivers shouldn't touch this.
void *guiopaque; // For GUI drivers. App won't touch or free this.
MojoGuiSetupOptions *next_sibling;
MojoGuiSetupOptions *child;
};
typedef enum
{
MOJOGUI_SPLASH_NONE,
MOJOGUI_SPLASH_TOP,
MOJOGUI_SPLASH_LEFT,
MOJOGUI_SPLASH_RIGHT,
MOJOGUI_SPLASH_BOTTOM,
MOJOGUI_SPLASH_BACKGROUND,
} MojoGuiSplashPos;
typedef struct MojoGuiSplash MojoGuiSplash;
struct MojoGuiSplash
{
const uint8 *rgba; // framebuffer.
uint32 w; // width in pixels.
uint32 h; // height in pixels.
MojoGuiSplashPos position; // where to put the splash.
};
#define MOJOGUI_ENTRY_POINT MojoSetup_Gui_GetInterface
#define MOJOGUI_ENTRY_POINT_STR DEFINE_TO_STR(MOJOGUI_ENTRY_POINT)
// Increment this value when MojoGui's structure changes.
#define MOJOGUI_INTERFACE_REVISION 6
typedef struct MojoGui MojoGui;
struct MojoGui
{
uint8 (*priority)(boolean istty);
const char* (*name)(void);
boolean (*init)(void);
void (*deinit)(void);
void (*msgbox)(const char *title, const char *text);
boolean (*promptyn)(const char *title, const char *text, boolean def);
MojoGuiYNAN (*promptynan)(const char *title, const char *text, boolean def);
boolean (*start)(const char *title, const MojoGuiSplash *splash);
void (*stop)(void);
int (*readme)(const char *name, const uint8 *data, size_t len,
boolean can_back, boolean can_fwd);
int (*options)(MojoGuiSetupOptions *opts,
boolean can_back, boolean can_fwd);
char * (*destination)(const char **recommendations, int recnum,
int *command, boolean can_back, boolean can_fwd);
int (*productkey)(const char *desc, const char *fmt, char *buf,
const int buflen, boolean can_back, boolean can_fwd);
boolean (*insertmedia)(const char *medianame);
void (*progressitem)(void);
boolean (*progress)(const char *type, const char *component,
int percent, const char *item, boolean can_cancel);
void (*final)(const char *msg);
};
typedef const MojoGui* (*MojoGuiEntryPoint)(int revision,
const MojoSetupEntryPoints *e);
#if !BUILDING_EXTERNAL_PLUGIN
extern const MojoGui *GGui;
const MojoGui *MojoGui_initGuiPlugin(void);
void MojoGui_deinitGuiPlugin(void);
#else
__EXPORT__ const MojoGui *MOJOGUI_ENTRY_POINT(int revision,
const MojoSetupEntryPoints *e);
/*
* We do this as a macro so we only have to update one place, and it
* enforces some details in the plugins. Without effort, plugins don't
* support anything but the latest version of the interface.
*/
#define MOJOGUI_PLUGIN(module) \
static const MojoSetupEntryPoints *entry = NULL; \
static uint8 MojoGui_##module##_priority(boolean istty); \
static const char* MojoGui_##module##_name(void) { return #module; } \
static boolean MojoGui_##module##_init(void); \
static void MojoGui_##module##_deinit(void); \
static void MojoGui_##module##_msgbox(const char *title, const char *text); \
static boolean MojoGui_##module##_promptyn(const char *t1, const char *t2, \
boolean d); \
static MojoGuiYNAN MojoGui_##module##_promptynan(const char *t1, \
const char *t2, boolean d); \
static boolean MojoGui_##module##_start(const char *t, \
const MojoGuiSplash *splash); \
static void MojoGui_##module##_stop(void); \
static int MojoGui_##module##_readme(const char *name, const uint8 *data, \
size_t len, boolean can_back, \
boolean can_fwd); \
static int MojoGui_##module##_options(MojoGuiSetupOptions *opts, \
boolean can_back, boolean can_fwd); \
static char *MojoGui_##module##_destination(const char **r, int recnum, \
int *command, boolean can_back, boolean can_fwd); \
static int MojoGui_##module##_productkey(const char *desc, const char *fmt, \
char *buf, const int buflen, boolean can_back, \
boolean can_fwd); \
static boolean MojoGui_##module##_insertmedia(const char *medianame); \
static void MojoGui_##module##_progressitem(void); \
static boolean MojoGui_##module##_progress(const char *typ, const char *comp, \
int percent, const char *item, \
boolean can_cancel); \
static void MojoGui_##module##_final(const char *msg); \
const MojoGui *MojoGuiPlugin_##module(int rev, const MojoSetupEntryPoints *e) \
{ \
if (rev == MOJOGUI_INTERFACE_REVISION) { \
static const MojoGui retval = { \
MojoGui_##module##_priority, \
MojoGui_##module##_name, \
MojoGui_##module##_init, \
MojoGui_##module##_deinit, \
MojoGui_##module##_msgbox, \
MojoGui_##module##_promptyn, \
MojoGui_##module##_promptynan, \
MojoGui_##module##_start, \
MojoGui_##module##_stop, \
MojoGui_##module##_readme, \
MojoGui_##module##_options, \
MojoGui_##module##_destination, \
MojoGui_##module##_productkey, \
MojoGui_##module##_insertmedia, \
MojoGui_##module##_progressitem, \
MojoGui_##module##_progress, \
MojoGui_##module##_final, \
}; \
entry = e; \
return &retval; \
} \
return NULL; \
} \
#define CREATE_MOJOGUI_ENTRY_POINT(module) \
const MojoGui *MOJOGUI_ENTRY_POINT(int rev, const MojoSetupEntryPoints *e) \
{ \
return MojoGuiPlugin_##module(rev, e); \
} \
// Redefine things that need to go through the plugin entry point interface,
// so plugins calling into the MojoSetup core can use the same code as the
// rest of the app.
#ifdef _
#undef _
#endif
#define _(x) entry->translate(x)
#ifdef xmalloc
#undef xmalloc
#endif
#define xmalloc(x) entry->xmalloc(x)
#ifdef xrealloc
#undef xrealloc
#endif
#define xrealloc(x,y) entry->xrealloc(x,y)
#ifdef xstrdup
#undef xstrdup
#endif
#define xstrdup(x) entry->xstrdup(x)
#ifdef xstrncpy
#undef xstrncpy
#endif
#define xstrncpy(x,y,z) entry->xstrcpy(x,y,z)
#ifdef logWarning
#undef logWarning
#endif
#define logWarning entry->logWarning
#ifdef logError
#undef logError
#endif
#define logError entry->logError
#ifdef logInfo
#undef logInfo
#endif
#define logInfo entry->logInfo
#ifdef logDebug
#undef logDebug
#endif
#define logDebug entry->logDebug
#ifdef format
#undef format
#endif
#define format entry->format
#ifdef numstr
#undef numstr
#endif
#define numstr(x) entry->numstr(x)
#ifdef ticks
#undef ticks
#endif
#define ticks() entry->ticks()
#ifdef utf8codepoint
#undef utf8codepoint
#endif
#define utf8codepoint(x) entry->utf8codepoint(x)
#ifdef utf8len
#undef utf8len
#endif
#define utf8len(x) entry->utf8len(x)
#ifdef splitText
#undef splitText
#endif
#define splitText(w,x,y,z) entry->splitText(w,x,y,z)
#ifdef isValidProductKey
#undef isValidProductKey
#endif
#define isValidProductKey(x,y) entry->isValidProductKey(x,y)
#endif
/*
* make some decisions about which GUI plugins to build...
* We list them all here, but some are built, some aren't. Some are DLLs,
* some aren't...
*/
const MojoGui *MojoGuiPlugin_stdio(int rev, const MojoSetupEntryPoints *e);
const MojoGui *MojoGuiPlugin_ncurses(int rev, const MojoSetupEntryPoints *e);
const MojoGui *MojoGuiPlugin_gtkplus2(int rev, const MojoSetupEntryPoints *e);
const MojoGui *MojoGuiPlugin_www(int rev, const MojoSetupEntryPoints *e);
const MojoGui *MojoGuiPlugin_cocoa(int rev, const MojoSetupEntryPoints *e);
// !!! FIXME: Qt? KDE? Gnome? Console? wxWidgets?
#ifdef __cplusplus
}
#endif
#endif
// end of gui.h ...