/* * 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 . * */ #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