get rid of debugger bits
[swfdec.git] / libswfdec / swfdec_event.c
blob5474248e8ab52548a9c685b7f0f1e0d2cc1cdc02
1 /* Swfdec
2 * Copyright (C) 2006 Benjamin Otte <otte@gnome.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301 USA
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23 #include "swfdec_event.h"
24 #include "swfdec_as_internal.h"
25 #include "swfdec_as_strings.h"
26 #include "swfdec_debug.h"
27 #include "swfdec_player_internal.h"
28 #include "swfdec_script_internal.h"
30 typedef struct _SwfdecEvent SwfdecEvent;
32 struct _SwfdecEvent {
33 guint conditions;
34 guint8 key;
35 SwfdecScript *script;
38 struct _SwfdecEventList {
39 SwfdecPlayer * player;
40 guint refcount;
41 GArray * events;
44 /**
45 * swfdec_event_type_get_name:
46 * @type: a #SwfdecEventType
48 * Gets the name for the event as a refcounted string or %NULL if the
49 * given clip event has no associated event.
51 * Returns: The name of the event or %NULL if none.
52 **/
53 const char *
54 swfdec_event_type_get_name (SwfdecEventType type)
56 switch (type) {
57 case SWFDEC_EVENT_LOAD:
58 return SWFDEC_AS_STR_onLoad;
59 case SWFDEC_EVENT_ENTER:
60 return SWFDEC_AS_STR_onEnterFrame;
61 case SWFDEC_EVENT_UNLOAD:
62 return SWFDEC_AS_STR_onUnload;
63 case SWFDEC_EVENT_MOUSE_MOVE:
64 return SWFDEC_AS_STR_onMouseMove;
65 case SWFDEC_EVENT_MOUSE_DOWN:
66 return SWFDEC_AS_STR_onMouseDown;
67 case SWFDEC_EVENT_MOUSE_UP:
68 return SWFDEC_AS_STR_onMouseUp;
69 case SWFDEC_EVENT_KEY_UP:
70 return SWFDEC_AS_STR_onKeyUp;
71 case SWFDEC_EVENT_KEY_DOWN:
72 return SWFDEC_AS_STR_onKeyDown;
73 case SWFDEC_EVENT_DATA:
74 return SWFDEC_AS_STR_onData;
75 case SWFDEC_EVENT_INITIALIZE:
76 return NULL;
77 case SWFDEC_EVENT_PRESS:
78 return SWFDEC_AS_STR_onPress;
79 case SWFDEC_EVENT_RELEASE:
80 return SWFDEC_AS_STR_onRelease;
81 case SWFDEC_EVENT_RELEASE_OUTSIDE:
82 return SWFDEC_AS_STR_onReleaseOutside;
83 case SWFDEC_EVENT_ROLL_OVER:
84 return SWFDEC_AS_STR_onRollOver;
85 case SWFDEC_EVENT_ROLL_OUT:
86 return SWFDEC_AS_STR_onRollOut;
87 case SWFDEC_EVENT_DRAG_OVER:
88 return SWFDEC_AS_STR_onDragOver;
89 case SWFDEC_EVENT_DRAG_OUT:
90 return SWFDEC_AS_STR_onDragOut;
91 case SWFDEC_EVENT_KEY_PRESS:
92 return NULL;
93 case SWFDEC_EVENT_CONSTRUCT:
94 return SWFDEC_AS_STR_onConstruct;
95 default:
96 g_assert_not_reached ();
97 return NULL;
101 SwfdecEventList *
102 swfdec_event_list_new (SwfdecPlayer *player)
104 SwfdecEventList *list;
106 g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
108 list = g_new0 (SwfdecEventList, 1);
109 list->player = player;
110 list->refcount = 1;
111 list->events = g_array_new (FALSE, FALSE, sizeof (SwfdecEvent));
113 return list;
116 /* FIXME: this is a bit nasty because of modifying */
117 SwfdecEventList *
118 swfdec_event_list_copy (SwfdecEventList *list)
120 g_return_val_if_fail (list != NULL, NULL);
122 list->refcount++;
124 return list;
127 void
128 swfdec_event_list_free (SwfdecEventList *list)
130 guint i;
132 g_return_if_fail (list != NULL);
134 list->refcount--;
135 if (list->refcount > 0)
136 return;
138 for (i = 0; i < list->events->len; i++) {
139 SwfdecEvent *event = &g_array_index (list->events, SwfdecEvent, i);
140 swfdec_script_unref (event->script);
142 g_array_free (list->events, TRUE);
143 g_free (list);
146 static const char *
147 swfdec_event_list_condition_name (guint conditions)
149 if (conditions & SWFDEC_EVENT_LOAD)
150 return "Load";
151 if (conditions & SWFDEC_EVENT_ENTER)
152 return "Enter";
153 if (conditions & SWFDEC_EVENT_UNLOAD)
154 return "Unload";
155 if (conditions & SWFDEC_EVENT_MOUSE_MOVE)
156 return "MouseMove";
157 if (conditions & SWFDEC_EVENT_MOUSE_DOWN)
158 return "MouseDown";
159 if (conditions & SWFDEC_EVENT_MOUSE_UP)
160 return "MouseUp";
161 if (conditions & SWFDEC_EVENT_KEY_UP)
162 return "KeyUp";
163 if (conditions & SWFDEC_EVENT_KEY_DOWN)
164 return "KeyDown";
165 if (conditions & SWFDEC_EVENT_DATA)
166 return "Data";
167 if (conditions & SWFDEC_EVENT_INITIALIZE)
168 return "Initialize";
169 if (conditions & SWFDEC_EVENT_PRESS)
170 return "Press";
171 if (conditions & SWFDEC_EVENT_RELEASE)
172 return "Release";
173 if (conditions & SWFDEC_EVENT_RELEASE_OUTSIDE)
174 return "ReleaseOutside";
175 if (conditions & SWFDEC_EVENT_ROLL_OVER)
176 return "RollOver";
177 if (conditions & SWFDEC_EVENT_ROLL_OUT)
178 return "RollOut";
179 if (conditions & SWFDEC_EVENT_DRAG_OVER)
180 return "DragOver";
181 if (conditions & SWFDEC_EVENT_DRAG_OUT)
182 return "DragOut";
183 if (conditions & SWFDEC_EVENT_KEY_PRESS)
184 return "KeyPress";
185 if (conditions & SWFDEC_EVENT_CONSTRUCT)
186 return "Construct";
187 return "No Event";
190 void
191 swfdec_event_list_parse (SwfdecEventList *list, SwfdecBits *bits, int version,
192 guint conditions, guint8 key, const char *description)
194 SwfdecEvent event;
195 char *name;
197 g_return_if_fail (list != NULL);
198 g_return_if_fail (list->refcount == 1);
199 g_return_if_fail (description != NULL);
201 event.conditions = conditions;
202 event.key = key;
203 name = g_strconcat (description, ".",
204 swfdec_event_list_condition_name (conditions), NULL);
205 event.script = swfdec_script_new_from_bits (bits, name, version);
206 g_free (name);
207 if (event.script)
208 g_array_append_val (list->events, event);
211 void
212 swfdec_event_list_execute (SwfdecEventList *list, SwfdecAsObject *object,
213 guint condition, guint8 key)
215 guint i;
217 g_return_if_fail (list != NULL);
218 g_return_if_fail (SWFDEC_IS_AS_OBJECT (object));
220 for (i = 0; i < list->events->len; i++) {
221 SwfdecEvent *event = &g_array_index (list->events, SwfdecEvent, i);
222 if ((event->conditions & condition) &&
223 event->key == key) {
224 SWFDEC_LOG ("executing script for event %u on scriptable %p", condition, object);
225 swfdec_as_object_run (object, event->script);
230 gboolean
231 swfdec_event_list_has_conditions (SwfdecEventList *list, SwfdecAsObject *object,
232 guint condition, guint8 key)
234 guint i;
235 const char *name;
237 g_return_val_if_fail (list != NULL, FALSE);
238 g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), FALSE);
240 for (i = 0; i < list->events->len; i++) {
241 SwfdecEvent *event = &g_array_index (list->events, SwfdecEvent, i);
242 if ((event->conditions & condition) &&
243 event->key == key)
244 return TRUE;
246 name = swfdec_event_type_get_name (condition);
247 if (name)
248 return swfdec_as_object_has_function (object, name);
249 return FALSE;