[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).
This commit is contained in:
Bill Currie 2021-12-18 13:02:42 +09:00
parent 5128029368
commit 83ec2be2a6
2 changed files with 33 additions and 0 deletions

View file

@ -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

View file

@ -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);
}
}