kpmpgsmkii/client/src/gui/gui.h
2022-04-16 19:59:12 -05:00

232 lines
6 KiB
C

/*
* Kangaroo Punch MultiPlayer Game Server Mark II
* Copyright (C) 2020-2021 Scott Duensing
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifndef GUI_H
#define GUI_H
#include "os.h"
#include "vesa.h"
#include "surface.h"
#include "array.h"
#include "mouse.h"
#include "font.h"
#include "rect.h"
#define GUI_GET_FLAG(w,f) (((w)->flags & (1 << (f))) != 0)
#define GUI_SET_FLAG(w,f) ((w)->flags |= (1 << (f)))
#define GUI_CLEAR_FLAG(w,f) ((w)->flags &= (~(1 << (f))))
#define W(w) ((WidgetT *)w)
#define D(w) ((WidgetT **)&w)
// Widget Magics. Don't forget to change _magicDebugNames!
enum MagicE {
MAGIC_UNKNOWN = 0,
MAGIC_DESKTOP,
MAGIC_WINDOW,
MAGIC_BUTTON,
MAGIC_LABEL,
MAGIC_CHECKBOX,
MAGIC_RADIOBUTTON,
MAGIC_PICTURE,
MAGIC_FRAME,
MAGIC_TEXTBOX,
MAGIC_UPDOWN,
MAGIC_LISTBOX,
MAGIC_TERMINAL,
MAGIC_TIMER,
//MAGIC_DROPDOWN,
MAGIC_COUNT
};
// Widget Metrics
enum MetricE {
METRIC_BUTTON_BEZEL_SIZE = 0,
METRIC_BUTTON_HORIZONTAL_PADDING,
METRIC_BUTTON_VERTICAL_PADDING,
METRIC_WINDOW_BORDER_WIDTH,
METRIC_WINDOW_TITLE_HEIGHT,
METRIC_WINDOW_TITLE_GRAB_HEIGHT,
METRIC_CHECKBOX_PADDING,
METRIC_RADIOBUTTON_PADDING,
METRIC_TEXTBOX_HORIZONTAL_PADDING,
METRIC_TEXTBOX_VERTICAL_PADDING,
METRIC_TEXTBOX_PADDING,
METRIC_UPDOWN_PADDING,
METRIC_UPDOWN_ARROW_PADDING,
METRIC_UPDOWN_HORIZONTAL_PADDING,
METRIC_UPDOWN_VERTICAL_PADDING,
METRIC_LISTBOX_HORIZONTAL_PADDING,
METRIC_LISTBOX_VERTICAL_PADDING,
METRIC_COUNT
};
// Widget Colors
enum ColorE {
COLOR_BUTTON_BACKGROUND = 0,
COLOR_BUTTON_HIGHLIGHT,
COLOR_BUTTON_SHADOW,
COLOR_BUTTON_TEXT,
COLOR_BUTTON_BACKGROUND_DISABLED,
COLOR_BUTTON_HIGHLIGHT_DISABLED,
COLOR_BUTTON_SHADOW_DISABLED,
COLOR_BUTTON_TEXT_DISABLED,
COLOR_DESKTOP,
COLOR_WINDOW_BACKGROUND,
COLOR_WINDOW_HIGHLIGHT,
COLOR_WINDOW_SHADOW,
COLOR_WINDOW_TITLE_ACTIVE,
COLOR_WINDOW_TITLE_INACTIVE,
COLOR_WINDOW_TITLE_TEXT_ACTIVE,
COLOR_WINDOW_TITLE_TEXT_INACTIVE,
COLOR_LABEL_TEXT_ACTIVE,
COLOR_LABEL_TEXT_INACTIVE,
COLOR_CHECKBOX_HIGHLIGHT,
COLOR_CHECKBOX_SHADOW,
COLOR_CHECKBOX_ACTIVE,
COLOR_CHECKBOX_INACTIVE,
COLOR_CHECKBOX_TEXT,
COLOR_CHECKBOX_HIGHLIGHT_DISABLED,
COLOR_CHECKBOX_SHADOW_DISABLED,
COLOR_CHECKBOX_ACTIVE_DISABLED,
COLOR_CHECKBOX_INACTIVE_DISABLED,
COLOR_CHECKBOX_TEXT_DISABLED,
COLOR_RADIOBUTTON_HIGHLIGHT,
COLOR_RADIOBUTTON_SHADOW,
COLOR_RADIOBUTTON_ACTIVE,
COLOR_RADIOBUTTON_INACTIVE,
COLOR_RADIOBUTTON_TEXT,
COLOR_RADIOBUTTON_HIGHLIGHT_DISABLED,
COLOR_RADIOBUTTON_SHADOW_DISABLED,
COLOR_RADIOBUTTON_ACTIVE_DISABLED,
COLOR_RADIOBUTTON_INACTIVE_DISABLED,
COLOR_RADIOBUTTON_TEXT_DISABLED,
COLOR_FRAME_HIGHLIGHT,
COLOR_FRAME_SHADOW,
COLOR_FRAME_TEXT,
COLOR_TEXTBOX_HIGHLIGHT,
COLOR_TEXTBOX_SHADOW,
COLOR_TEXTBOX_TEXT,
COLOR_TEXTBOX_BACKGROUND,
COLOR_UPDOWN_HIGHLIGHT,
COLOR_UPDOWN_SHADOW,
COLOR_UPDOWN_TEXT,
COLOR_UPDOWN_BACKGROUND,
COLOR_UPDOWN_ARROWS_BACKGROUND,
COLOR_UPDOWN_ARROWS_ACTIVE,
COLOR_UPDOWN_ARROWS_INACTIVE,
COLOR_LISTBOX_HIGHLIGHT,
COLOR_LISTBOX_SHADOW,
COLOR_LISTBOX_TEXT,
COLOR_LISTBOX_BACKGROUND,
COLOR_LISTBOX_SELECTED_TEXT,
COLOR_LISTBOX_SELECTED_BACKGROUND,
COLOR_LISTBOX_ARROWS_BACKGROUND,
COLOR_LISTBOX_ARROWS_ACTIVE,
COLOR_LISTBOX_ARROWS_INACTIVE,
COLOR_COUNT
};
// Mouse Events
enum MouseE {
MOUSE_EVENT_NONE = 0,
MOUSE_EVENT_IN,
MOUSE_EVENT_OUT,
MOUSE_EVENT_LEFT_DOWN,
MOUSE_EVENT_LEFT_HOLD,
MOUSE_EVENT_LEFT_UP
};
typedef struct DesktopS DesktopT;
typedef struct WidgetS WidgetT;
typedef struct WindowS WindowT;
extern int16_t __guiMetric[METRIC_COUNT];
extern ColorT __guiColor[COLOR_COUNT];
extern FontT *__guiFont;
extern WidgetT *__guiDragWidget;
extern uint16_t _guiDragOffsetX;
extern uint16_t __guiDragOffsetY;
extern WindowT *__guiActiveWindow;
extern char *__guiMagicDebugNames[MAGIC_COUNT];
void guiAttach(WidgetT *parent, WidgetT *child);
void guiComposite(void);
void guiDebugAreaShow(WidgetT *widget);
void guiDebugWidgetTreeDump(WidgetT *widget, uint16_t depth);
void guiDelayedFree(void **pointer);
void guiDelete(WidgetT **widget);
WidgetT *guiFocusGet(void);
void guiFocusSet(WidgetT *widget);
uint8_t guiHasStopped(void);
void guiKeyboardProcess(uint8_t ascii, uint8_t extended, uint8_t scancode, uint8_t shift, uint8_t control, uint8_t alt);
void guiMousePositionOnWidgetGet(WidgetT *widget, MouseT *mouse, uint16_t *x, uint16_t *y);
void guiMouseProcess(MouseT *mouse);
void guiMouseBusyClear();
uint8_t guiMouseBusyGet();
void guiMouseBusyPop();
void guiMouseBusyPush();
void guiPaint(WidgetT *widget);
void guiParentAndChildrenDirtySet(WidgetT *widget);
void guiPendingEventAdd(WidgetT *widget, void *callback);
WidgetT *guiRootGet(void);
void guiShutdown(void);
DesktopT *guiStartup(void);
void guiStop(void);
uint32_t guiTimerGet(void);
uint8_t guiTimerHalfSecondOn(void);
uint8_t guiTimerHalfSecondTick(void);
void guiTimerProcess(uint32_t rawClock);
uint8_t guiTimerQuarterSecondOn(void);
uint8_t guiTimerQuarterSecondTick(void);
uint8_t guiTimerSecondOn(void);
uint8_t guiTimerSecondTick(void);
void *guiUserDataGet(WidgetT *widget);
void guiUserDataSet(WidgetT *widget, void *userData);
void guiWidgetAndChildrenDirtySet(WidgetT *widget);
void guiWidgetBoundsDrawableOnScreenGet(WidgetT *widget, RectT *bounds);
void guiWidgetPositionOnScreenGet(WidgetT *widget, RectT *pos);
WindowT *guiWindowFindTop(void);
#endif // GUI_H