From 83ec2be2a62b71204d7fdec857c84d9c3e7e42a9 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 18 Dec 2021 13:02:42 +0900 Subject: [PATCH] [vid] Add a listener set for palette changes This was needed to get crosshaircolor working correctly, but is likely another step towards resizable windows (the listener set types are generic for any viddef event, not just palette changes). --- include/QF/vid.h | 11 +++++++++++ libs/video/targets/vid.c | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) 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); + } +}