Files
libsst/libsst-wm/Win32/SST_WMEvent_Win32.c
2026-04-03 00:22:39 -05:00

91 lines
2.3 KiB
C

/*
SST_WMEvent_Win32.c
Author: Patrick Baggett <ptbaggett@762studios.com>
Created: 6/5/2012
Purpose:
Window event functions
License:
This program is free software. It comes without any warranty, to
the extent permitted by applicable law. You can redistribute it
and/or modify it under the terms of the Do What The Fuck You Want
To Public License, Version 2, as published by Sam Hocevar. See
http://sam.zoy.org/wtfpl/COPYING for more details.
*/
#include <SST/SST_WMEvent.h>
#include "Win32Private.h"
#include "../APIPrivate.h"
static void copyAndRemoveUserEvent(SST_DisplayTarget_Win32* displayTarget, SST_WMEvent* eventReturn);
/*************************************************************************/
static int Win32_GetEvent(SST_DisplayTarget target, SST_WMEvent* eventReturn)
{
MSG msg;
SST_DisplayTarget_Win32* displayTarget = (SST_DisplayTarget_Win32*)target;
SST_Window_Win32* win;
int found = 0;
/* First, get Win32 messages and dispatch to winproc. We
do this immediately, otherwise the OS thinks we've hung. */
while(PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
/* Check for user events */
if(RemoveFromEQ(&displayTarget->userEventQueue, eventReturn))
return 1;
/* Now check each window's event queue */
win = displayTarget->firstWindow;
while(win)
{
if(RemoveFromEQ(&win->eventQueue, eventReturn))
{
found = 1;
break;
}
win = win->next;
}
return found;
}
/*************************************************************************/
/* Platform-specific code dealing with user event queue */
static void Win32_lockUserEventQueue(SST_DisplayTarget target)
{
SST_DisplayTarget_Win32* displayTarget = (SST_DisplayTarget_Win32*)target;
EnterCriticalSection(&displayTarget->userEventLock);
}
static void Win32_unlockUserEventQueue(SST_DisplayTarget target)
{
SST_DisplayTarget_Win32* displayTarget = (SST_DisplayTarget_Win32*)target;
LeaveCriticalSection(&displayTarget->userEventLock);
}
static EventQueue* Win32_getUserEventQueue(SST_DisplayTarget target)
{
SST_DisplayTarget_Win32* displayTarget = (SST_DisplayTarget_Win32*)target;
return &displayTarget->userEventQueue;
}
const struct SST_WM_EventFuncs Win32_EventFuncs = {
Win32_GetEvent,
Win32_getUserEventQueue,
Win32_lockUserEventQueue,
Win32_unlockUserEventQueue
};