diff --git a/include/QF/vid.h b/include/QF/vid.h index 9255e7210..499989f20 100644 --- a/include/QF/vid.h +++ b/include/QF/vid.h @@ -28,6 +28,7 @@ #ifndef __QF_vid_h #define __QF_vid_h +#include "QF/listener.h" #include "QF/qtypes.h" #define VID_CBITS 6 @@ -56,8 +57,14 @@ typedef struct { quat_t cshift_color; struct view_s *conview; struct vid_internal_s *vid_internal; + + struct viddef_listener_set_s *onPaletteChanged; } viddef_t; +typedef struct viddef_listener_set_s LISTENER_SET_TYPE (viddef_t) + viddef_listener_set_t; +typedef void (*viddef_listener_t) (void *data, const viddef_t *viddef); + #define viddef (*r_data->vid) extern unsigned int d_8to24table[256]; //FIXME nq/qw uses @@ -73,4 +80,8 @@ void VID_Init (byte *palette, byte *colormap); void VID_SetCaption (const char *text); void VID_ClearMemory (void); +void VID_OnPaletteChange_AddListener (viddef_listener_t listener, void *data); +void VID_OnPaletteChange_RemoveListener (viddef_listener_t listener, + void *data); + #endif//__QF_vid_h diff --git a/libs/video/targets/vid.c b/libs/video/targets/vid.c index 682d301d5..b918dd1b9 100644 --- a/libs/video/targets/vid.c +++ b/libs/video/targets/vid.c @@ -241,6 +241,10 @@ VID_InitGamma (const byte *pal) VID_UpdateGamma, "Gamma correction"); VID_BuildGammaTable (vid_gamma->value); + + if (viddef.onPaletteChanged) { + LISTENER_INVOKE (viddef.onPaletteChanged, &viddef); + } } void @@ -317,3 +321,21 @@ VID_ClearMemory (void) vi->flush_caches (vi->data); } } + +VISIBLE void +VID_OnPaletteChange_AddListener (viddef_listener_t listener, void *data) +{ + if (!viddef.onPaletteChanged) { + viddef.onPaletteChanged = malloc (sizeof (*viddef.onPaletteChanged)); + LISTENER_SET_INIT (viddef.onPaletteChanged, 8); + } + LISTENER_ADD (viddef.onPaletteChanged, listener, data); +} + +VISIBLE void +VID_OnPaletteChange_RemoveListener (viddef_listener_t listener, void *data) +{ + if (viddef.onPaletteChanged) { + LISTENER_REMOVE (viddef.onPaletteChanged, listener, data); + } +}