From 56f5eebf0ec913b10b50af9b6a343d44b57e2db8 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Sun, 25 Mar 2012 17:08:00 +0200 Subject: [PATCH] hook: delete by callback *and* data argument When deleting a hook we should not search for the callback only. Otherwise we might remove the wrong callback. Therefore, we now search for callback and data argument. If multiple callbacks are registered with the same data and cb, then we don't care which one is removed as this wouldn't make any difference. They behave the same way, anyway. Signed-off-by: David Herrmann --- src/input.c | 5 +++-- src/input.h | 3 ++- src/misc.c | 6 +++--- src/misc.h | 6 +++--- src/ui.c | 8 ++++---- src/uterm.h | 3 ++- src/uterm_video.c | 5 +++-- 7 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/input.c b/src/input.c index 5d6b3d8..21ce421 100644 --- a/src/input.c +++ b/src/input.c @@ -615,12 +615,13 @@ int kmscon_input_register_cb(struct kmscon_input *input, kmscon_input_cb cb, return kmscon_hook_add_cast(input->hook, cb, data); } -void kmscon_input_unregister_cb(struct kmscon_input *input, kmscon_input_cb cb) +void kmscon_input_unregister_cb(struct kmscon_input *input, kmscon_input_cb cb, + void *data) { if (!input || !cb) return; - kmscon_hook_rm_cast(input->hook, cb); + kmscon_hook_rm_cast(input->hook, cb, data); } void kmscon_input_sleep(struct kmscon_input *input) diff --git a/src/input.h b/src/input.h index b6753a9..31e3ddc 100644 --- a/src/input.h +++ b/src/input.h @@ -87,7 +87,8 @@ int kmscon_input_connect_eloop(struct kmscon_input *input, void kmscon_input_disconnect_eloop(struct kmscon_input *input); int kmscon_input_register_cb(struct kmscon_input *input, kmscon_input_cb cb, void *data); -void kmscon_input_unregister_cb(struct kmscon_input *input, kmscon_input_cb cb); +void kmscon_input_unregister_cb(struct kmscon_input *input, kmscon_input_cb cb, + void *data); void kmscon_input_sleep(struct kmscon_input *input); void kmscon_input_wake_up(struct kmscon_input *input); diff --git a/src/misc.c b/src/misc.c index 41867f3..5ee1e92 100644 --- a/src/misc.c +++ b/src/misc.c @@ -227,7 +227,7 @@ int kmscon_hook_add(struct kmscon_hook *hook, kmscon_hook_cb cb, void *data) return 0; } -void kmscon_hook_rm(struct kmscon_hook *hook, kmscon_hook_cb cb) +void kmscon_hook_rm(struct kmscon_hook *hook, kmscon_hook_cb cb, void *data) { struct hook_entry *entry, *tmp; @@ -235,11 +235,11 @@ void kmscon_hook_rm(struct kmscon_hook *hook, kmscon_hook_cb cb) return; tmp = NULL; - if (hook->entries->cb == cb) { + if (hook->entries->cb == cb && hook->entries->data == data) { tmp = hook->entries; hook->entries = tmp->next; } else for (entry = hook->entries; entry->next; entry = entry->next) { - if (entry->next->cb == cb) { + if (entry->next->cb == cb && entry->next->data == data) { tmp = entry->next; entry->next = tmp->next; break; diff --git a/src/misc.h b/src/misc.h index 9c088ce..80b17e4 100644 --- a/src/misc.h +++ b/src/misc.h @@ -51,11 +51,11 @@ typedef void (*kmscon_hook_cb) (void *parent, void *arg, void *data); int kmscon_hook_new(struct kmscon_hook **out); void kmscon_hook_free(struct kmscon_hook *hook); int kmscon_hook_add(struct kmscon_hook *hook, kmscon_hook_cb cb, void *data); -void kmscon_hook_rm(struct kmscon_hook *hook, kmscon_hook_cb cb); +void kmscon_hook_rm(struct kmscon_hook *hook, kmscon_hook_cb cb, void *data); void kmscon_hook_call(struct kmscon_hook *hook, void *parent, void *arg); #define kmscon_hook_add_cast(hook, cb, data) \ kmscon_hook_add((hook), (kmscon_hook_cb)(cb), (data)) -#define kmscon_hook_rm_cast(hook, cb) \ - kmscon_hook_rm((hook), (kmscon_hook_cb)(cb)) +#define kmscon_hook_rm_cast(hook, cb, data) \ + kmscon_hook_rm((hook), (kmscon_hook_cb)(cb), (data)) #endif /* KMSCON_MISC_H */ diff --git a/src/ui.c b/src/ui.c index e81b75a..a26e2e8 100644 --- a/src/ui.c +++ b/src/ui.c @@ -137,9 +137,9 @@ int kmscon_ui_new(struct kmscon_ui **out, return 0; err_input: - kmscon_input_unregister_cb(ui->input, input_event); + kmscon_input_unregister_cb(ui->input, input_event, ui); err_video: - uterm_video_unregister_cb(ui->video, video_event); + uterm_video_unregister_cb(ui->video, video_event, ui); err_term: kmscon_terminal_unref(ui->term); err_ff: @@ -156,8 +156,8 @@ void kmscon_ui_free(struct kmscon_ui *ui) if (!ui) return; - kmscon_input_unregister_cb(ui->input, input_event); - uterm_video_unregister_cb(ui->video, video_event); + kmscon_input_unregister_cb(ui->input, input_event, ui); + uterm_video_unregister_cb(ui->video, video_event, ui); kmscon_terminal_unref(ui->term); kmscon_font_factory_unref(ui->ff); kmscon_symbol_table_unref(ui->st); diff --git a/src/uterm.h b/src/uterm.h index 0e435af..fce4dde 100644 --- a/src/uterm.h +++ b/src/uterm.h @@ -186,7 +186,8 @@ void uterm_video_segfault(struct uterm_video *video); struct uterm_display *uterm_video_get_displays(struct uterm_video *video); int uterm_video_register_cb(struct uterm_video *video, uterm_video_cb cb, void *data); -void uterm_video_unregister_cb(struct uterm_video *video, uterm_video_cb cb); +void uterm_video_unregister_cb(struct uterm_video *video, uterm_video_cb cb, + void *data); void uterm_video_sleep(struct uterm_video *video); int uterm_video_wake_up(struct uterm_video *video); diff --git a/src/uterm_video.c b/src/uterm_video.c index 1d94c2d..444f412 100644 --- a/src/uterm_video.c +++ b/src/uterm_video.c @@ -535,12 +535,13 @@ int uterm_video_register_cb(struct uterm_video *video, uterm_video_cb cb, return kmscon_hook_add_cast(video->hook, cb, data); } -void uterm_video_unregister_cb(struct uterm_video *video, uterm_video_cb cb) +void uterm_video_unregister_cb(struct uterm_video *video, uterm_video_cb cb, + void *data) { if (!video || !cb) return; - kmscon_hook_rm_cast(video->hook, cb); + kmscon_hook_rm_cast(video->hook, cb, data); } void uterm_video_sleep(struct uterm_video *video) -- 2.7.4