UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2023 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef UIC_MENU_H 30 #define UIC_MENU_H 31 32 #include "../ui/menu.h" 33 34 #include <cx/linked_list.h> 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 typedef struct UiMenuItemI UiMenuItemI; 41 typedef struct UiMenu UiMenu; 42 typedef struct UiMenuItem UiMenuItem; 43 typedef struct UiMenuCheckItem UiMenuCheckItem; 44 typedef struct UiMenuRadioItem UiMenuRadioItem; 45 typedef struct UiMenuItemList UiMenuItemList; 46 47 enum UiMenuItemType { 48 UI_MENU = 0, 49 UI_MENU_ITEM, 50 UI_MENU_CHECK_ITEM, 51 UI_MENU_RADIO_ITEM, 52 UI_MENU_ITEM_LIST, 53 UI_MENU_CHECKITEM_LIST, 54 UI_MENU_RADIOITEM_LIST, 55 UI_MENU_SEPARATOR 56 }; 57 58 typedef enum UiMenuItemType UiMenuItemType; 59 60 struct UiMenuItemI { 61 UiMenuItemI *prev; 62 UiMenuItemI *next; 63 UiMenuItemType type; 64 char id[8]; 65 }; 66 67 struct UiMenu { 68 UiMenuItemI item; 69 char *label; 70 UiMenuItemI *items_begin; 71 UiMenuItemI *items_end; 72 UiMenu *parent; 73 int end; 74 }; 75 76 struct UiMenuItem { 77 UiMenuItemI item; 78 ui_callback callback; 79 char *label; 80 char *icon; 81 void *userdata; 82 int *states; 83 size_t nstates; 84 }; 85 86 struct UiMenuCheckItem { 87 UiMenuItemI item; 88 char *label; 89 char *icon; 90 char *varname; 91 ui_callback callback; 92 void *userdata; 93 int *states; 94 size_t nstates; 95 }; 96 97 struct UiMenuRadioItem { 98 UiMenuItemI item; 99 char *label; 100 char *icon; 101 char *varname; 102 ui_callback callback; 103 void *userdata; 104 int *states; 105 size_t nstates; 106 }; 107 108 struct UiMenuItemList { 109 UiMenuItemI item; 110 ui_getvaluefunc getvalue; 111 ui_callback callback; 112 void *userdata; 113 char *varname; 114 UiBool addseparator; 115 }; 116 117 118 119 struct UiMenuBuilder { 120 UiMenu *menus_begin; 121 UiMenu *menus_end; 122 CxList *current; 123 int ref; 124 }; 125 126 void uic_menu_init(void); 127 128 UiMenu* uic_get_menu_list(void); 129 130 void uic_add_menu_to_stack(UiMenu* menu); 131 132 int* uic_copy_states(const int* states, size_t *nstates); 133 134 void uic_set_tmp_eventdata(void *eventdata, int type); 135 void* uic_get_tmp_eventdata(void); 136 int uic_get_tmp_eventdata_type(void); 137 138 #ifdef __cplusplus 139 } 140 #endif 141 142 #endif /* UIC_MENU_H */ 143 144