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/>.
22 #include "eventdist.h"
26 struct event_data *next;
28 event_handler *callback;
34 /** @brief Register an event handler
35 * @param event Event type to handle
36 * @param callback Function to call when event occurs
37 * @param callbackdata Passed to @p callback
38 * @return Handle for this registration (for use with event_cancel())
40 event_handle event_register(const char *event,
41 event_handler *callback,
43 static const struct event_data *null;
44 struct event_data *ed = xmalloc(sizeof *ed), **head;
47 events = hash_new(sizeof (struct event_data *));
48 if(!(head = hash_find(events, event))) {
49 hash_add(events, event, &null, HASH_INSERT);
50 head = hash_find(events, event);
53 ed->event = xstrdup(event);
54 ed->callback = callback;
55 ed->callbackdata = callbackdata;
60 /** @brief Stop handling an event
61 * @param handle Registration to cancel (as returned from event_register())
63 * @p handle is allowed to be NULL.
65 void event_cancel(event_handle handle) {
66 struct event_data **head, **edp;
71 head = hash_find(events, handle->event);
72 for(edp = head; *edp && *edp != handle; edp = &(*edp)->next)
74 assert(*edp == handle);
78 /** @brief Raise an event
79 * @param event Event type to raise
80 * @param eventdata Event-specific data
82 void event_raise(const char *event,
84 struct event_data *ed, **head;
87 if(!(head = hash_find(events, event)))
89 for(ed = *head; ed; ed = ed->next)
90 ed->callback(event, eventdata, ed->callbackdata);