2 * This file is part of DisOrder
3 * Copyright (C) 2008 Richard Kettlewell
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 /** @file lib/eventdist.c
19 * @brief Event distribution
24 #include "eventdist.h"
29 * @c event_data structures form linked lists; one list per event and one node
33 /** @brief Next handler */
34 struct event_data
*next
;
36 /** @brief Name of event */
39 /** @brief Handler callback */
40 event_handler
*callback
;
42 /** @brief Passed to @ref callback */
48 /** @brief Register an event handler
49 * @param event Event type to handle
50 * @param callback Function to call when event occurs
51 * @param callbackdata Passed to @p callback
52 * @return Handle for this registration (for use with event_cancel())
54 event_handle
event_register(const char *event
,
55 event_handler
*callback
,
57 static const struct event_data
*null
;
58 struct event_data
*ed
= xmalloc(sizeof *ed
), **head
;
61 events
= hash_new(sizeof (struct event_data
*));
62 if(!(head
= hash_find(events
, event
))) {
63 hash_add(events
, event
, &null
, HASH_INSERT
);
64 head
= hash_find(events
, event
);
67 ed
->event
= xstrdup(event
);
68 ed
->callback
= callback
;
69 ed
->callbackdata
= callbackdata
;
74 /** @brief Stop handling an event
75 * @param handle Registration to cancel (as returned from event_register())
77 * @p handle is allowed to be NULL.
79 void event_cancel(event_handle handle
) {
80 struct event_data
**head
, **edp
;
85 head
= hash_find(events
, handle
->event
);
86 for(edp
= head
; *edp
&& *edp
!= handle
; edp
= &(*edp
)->next
)
88 assert(*edp
== handle
);
92 /** @brief Raise an event
93 * @param event Event type to raise
94 * @param eventdata Event-specific data
96 void event_raise(const char *event
,
98 struct event_data
*ed
, **head
;
101 if(!(head
= hash_find(events
, event
)))
103 for(ed
= *head
; ed
; ed
= ed
->next
)
104 ed
->callback(event
, eventdata
, ed
->callbackdata
);