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 const 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 *stockid; 81 char *icon; 82 void *userdata; 83 int *groups; 84 size_t ngroups; 85 }; 86 87 struct UiMenuCheckItem { 88 UiMenuItemI item; 89 char *label; 90 char *stockid; 91 char *icon; 92 char *varname; 93 ui_callback callback; 94 void *userdata; 95 int *groups; 96 size_t ngroups; 97 }; 98 99 struct UiMenuRadioItem { 100 UiMenuItemI item; 101 char *label; 102 char *stockid; 103 char *icon; 104 ui_callback callback; 105 void *userdata; 106 int *groups; 107 size_t ngroups; 108 }; 109 110 struct UiMenuItemList { 111 UiMenuItemI item; 112 ui_getvaluefunc getvalue; 113 ui_callback callback; 114 void *userdata; 115 char *varname; 116 }; 117 118 119 120 struct UiMenuBuilder { 121 UiMenu *menus_begin; 122 UiMenu *menus_end; 123 CxList *current; 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_groups(const int* groups, size_t *ngroups); 133 134 #ifdef __cplusplus 135 } 136 #endif 137 138 #endif /* UIC_MENU_H */ 139 140