ui/common/action.c

Sun, 17 May 2026 10:46:35 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 17 May 2026 10:46:35 +0200
changeset 1127
d3a8c29ebdaa
parent 1092
0accf125a65f
permissions
-rw-r--r--

add ui_call_action/ui_broadcast_action

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
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
146 void ui_call_action(UiContext *ctx, const char *action_name) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
147 ui_call_action2(ctx, action_name, NULL, 0);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
148 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
149
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
150 void ui_call_action2(UiContext *ctx, 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
151 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
152 if(action && action->callback) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
153 UiEvent event;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
154 memset(&event, 0, sizeof(UiEvent));
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
155 event.obj = ctx->obj;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
156 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
157 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
158 if(eventdata) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
159 event.eventdata = eventdata;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
160 event.eventdatatype = UI_EVENT_DATA_POINTER;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
161 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
162 event.intval = intval;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
163 action->callback(&event, action->userdata);
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 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
166
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
167 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
168 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
169 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
170
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
171 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
172 CxList *objects = uic_object_list();
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
173 CxIterator i = cxListIterator(objects);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
174 cx_foreach(UiObject*, obj, i) {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
175 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
176 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
177 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
178
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
179 typedef struct UiActionBroadcast {
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
180 char *action;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
181 void *eventdata;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
182 int intval;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
183 } UiActionBroadcast;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
184
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
185 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
186 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
187 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
188
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
189 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
190 UiActionBroadcast *broadcast = data;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
191 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
192 free(broadcast->action);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
193 free(broadcast);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
194 return 0;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
195 }
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
196
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
197 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
198 UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast));
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
199 broadcast->action = strdup(action_name);
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
200 broadcast->eventdata = eventdata;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
201 broadcast->intval = intval;
d3a8c29ebdaa add ui_call_action/ui_broadcast_action
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1092
diff changeset
202 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
203 }

mercurial