ui/common/menu.h

Mon, 29 Sep 2025 21:14:46 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 29 Sep 2025 21:14:46 +0200
changeset 779
b84cbe57e0bd
parent 747
6aa58fed572d
child 836
5a8485ff7f54
permissions
-rw-r--r--

change UiCellValue from struct to union and pass it as pointer to the onsave function, for better compatibility with other languages

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

mercurial