ui/common/action.c

Fri, 05 Jun 2026 19:04:22 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 05 Jun 2026 19:04:22 +0200
changeset 1171
d5500e601996
parent 1170
b79469a55540
child 1183
51c0e1053592
permissions
-rw-r--r--

add wrapper functions for typed obj access

1066
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2026 Olaf Wintermann. All rights reserved.
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
afe02792303d prepare actions
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
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "action.h"
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include "context.h"
1127
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
31 #include "object.h"
1066
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include <cx/string.h>
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 void uic_add_action(
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 UiContext *ctx,
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 const char *name,
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 ui_callback callback,
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 void *userdata,
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 const char *accelerator,
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 const char *accelerator_text)
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 {
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 if(!name) {
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 return;
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 }
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 UiAction action;
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 action.name = ui_strdup(ctx, name);
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 action.callback = callback;
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 action.userdata = userdata;
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 action.accelerator = accelerator ? ui_strdup(ctx, accelerator) : NULL;
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 action.accelerator_text = accelerator_text ? ui_strdup(ctx, accelerator_text) : NULL;
1092
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
53 action.ctx = ctx;
1066
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 cxMapPut(ctx->actions, name, &action);
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 cxMapRehash(ctx->actions);
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 }
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 void uic_bind_action(
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 UiContext *ctx,
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 const char *action,
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 void *bind_obj,
1092
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
62 ui_enablefunc set_enabled)
1066
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 {
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 if(!action) {
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 return;
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 }
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 UiActionBinding binding;
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 binding.action = ui_strdup(ctx, action);
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 binding.userdata = bind_obj;
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 binding.set_enabled = set_enabled;
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 cxListAdd(ctx->action_bindings, &binding);
afe02792303d prepare actions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 }
1092
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
74
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
75 UiAction* uic_resolve_action(UiContext *ctx, const char *action) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
76 UiAction *a = NULL;
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
77 if(ctx->actions) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
78 a = cxMapGet(ctx->actions, action);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
79 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
80 // check if any sub-document defines this action
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
81 // sub-document actions have precedence, the most specific action will
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
82 // be returned
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
83 CxIterator i = cxListIterator(ctx->documents);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
84 cx_foreach(void *, doc, i) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
85 UiContext *doc_ctx = ui_document_context(doc);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
86 UiAction *sub_action = uic_resolve_action(doc_ctx, action);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
87 if(sub_action) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
88 a = sub_action;
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
89 // if one sub-tree has an action, we don't care about other
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
90 // subtrees
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
91 break;
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
92 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
93 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
94
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
95 if(!a && ctx->parent) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
96 // check parents
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
97 a = uic_resolve_action_from_parents(ctx, action);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
98 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
99
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
100 return a;
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
101 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
102
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
103 UiAction* uic_resolve_action_from_parents(UiContext *ctx, const char *action) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
104 UiContext *parent = ctx->parent;
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
105 if(parent == NULL) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
106 return NULL;
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
107 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
108 if(parent->actions) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
109 UiAction *a = cxMapGet(parent->actions, action);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
110 if(a) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
111 return a;
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
112 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
113 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
114 return uic_resolve_action_from_parents(parent, action);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
115 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
116
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
117
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
118
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
119 void ui_update_action_bindings(UiContext *ctx) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
120 CxIterator i = cxListIterator(ctx->action_bindings);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
121 cx_foreach(UiActionBinding*, binding, i) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
122 UiAction *action = uic_resolve_action(ctx, binding->action);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
123 if(binding->set_enabled) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
124 binding->set_enabled(binding->userdata, action != NULL);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
125 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
126 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
127 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
128
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
129 void uic_action_callback(UiEvent *event, const char *action_name) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
130 UiContext *ctx = ui_global_context();
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
131 if(event->obj) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
132 ctx = event->obj->ctx;
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
133 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
134
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
135 UiAction *action = uic_resolve_action(ctx, action_name);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
136 if(action) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
137 // override event document: for actions we know that the event is
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
138 // for a specific document
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
139 event->document = action->ctx->self_doc;
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
140 if(action->callback) {
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
141 action->callback(event, action->userdata);
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
142 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
143 }
0accf125a65f add actions, implement action binding for menu items (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1066
diff changeset
144 }
1127
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
145
1170
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
146 static int call_action(UiContext *ctx, const char *action_name, void *eventdata, UiEventType eventdatatype, int intval) {
1127
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
147 UiAction *action = uic_resolve_action(ctx, action_name);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
148 if(action && action->callback) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
149 UiEvent event;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
150 memset(&event, 0, sizeof(UiEvent));
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
151 event.obj = ctx->obj;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
152 event.window = event.obj ? event.obj->window : NULL;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
153 event.document = ctx->self_doc ? ctx->self_doc : ctx->document;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
154 if(eventdata) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
155 event.eventdata = eventdata;
1170
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
156 event.eventdatatype = eventdatatype;
1127
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
157 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
158 event.intval = intval;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
159 action->callback(&event, action->userdata);
1170
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
160 return 1;
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
161 } else {
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
162 return 0;
1127
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
163 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
164 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
165
1170
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
166 int ui_call_action(UiContext *ctx, const char *action_name) {
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
167 return ui_call_action2(ctx, action_name, NULL, 0);
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
168 }
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
169
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
170 int ui_call_action2(UiContext *ctx, const char *action_name, void *eventdata, int intval) {
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
171 return call_action(ctx, action_name, eventdata, UI_EVENT_DATA_POINTER, intval);
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
172 }
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
173
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
174 int ui_call_action3(UiContext *ctx, const char *action_name, void *ptr, uint64_t type_id) {
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
175 UiTypedObj *obj = malloc(sizeof(UiTypedObj));
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
176 obj->ptr = ptr;
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
177 obj->type = type_id;
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
178 int ret = call_action(ctx, action_name, obj, UI_EVENT_DATA_TYPED_OBJECT, 0);
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
179 free(obj);
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
180 return ret;
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
181 }
b79469a55540 add ui_call_action3 for calling actions with a typed object as argument
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1127
diff changeset
182
1127
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
183 void ui_broadcast_action(const char *action_name) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
184 ui_broadcast_action2(action_name, NULL, 0);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
185 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
186
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
187 void ui_broadcast_action2(const char *action_name, void *eventdata, int intval) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
188 CxList *objects = uic_object_list();
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
189 CxIterator i = cxListIterator(objects);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
190 cx_foreach(UiObject*, obj, i) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
191 ui_call_action2(obj->ctx, action_name, eventdata, intval);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
192 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
193 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
194
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
195 typedef struct UiActionBroadcast {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
196 char *action;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
197 void *eventdata;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
198 int intval;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
199 } UiActionBroadcast;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
200
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
201 void ui_mainthread_broadcast(const char *action_name) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
202 ui_mainthread_broadcast2(action_name, NULL, 0);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
203 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
204
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
205 static int mainthread_action_broadcast(void *data) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
206 UiActionBroadcast *broadcast = data;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
207 ui_broadcast_action2(broadcast->action, broadcast->eventdata, broadcast->intval);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
208 free(broadcast->action);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
209 free(broadcast);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
210 return 0;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
211 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
212
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
213 void ui_mainthread_broadcast2(const char *action_name, void *eventdata, int intval) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
214 UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast));
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
215 broadcast->action = strdup(action_name);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
216 broadcast->eventdata = eventdata;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
217 broadcast->intval = intval;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
218 ui_call_mainthread(mainthread_action_broadcast, broadcast);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
219 }

mercurial