X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=src%2Fvg%2Fvg_steam.h;h=ab135bcc675ea02d434d66f8ae8c323d28a0330a;hb=367883958336d1c04c8a304af6119b21f0f2f15a;hp=604dcdfa1d7f2a88adce79210c669d69b0eac8d1;hpb=290b48a4215fa0a0906b0d75075a1c8b90a34cc4;p=vg.git diff --git a/src/vg/vg_steam.h b/src/vg/vg_steam.h index 604dcdf..ab135bc 100644 --- a/src/vg/vg_steam.h +++ b/src/vg/vg_steam.h @@ -470,8 +470,43 @@ steam_async *steam_new_async(void) return &steam_async_trackers[ steam_async_track_count ++ ]; } +/* + * Regular callbacks + * ============================================================================= + */ + +typedef struct steam_callback_handler steam_callback_handler; +struct steam_callback_handler +{ + u32 callback_id; + void (*p_handler)( CallbackMsg_t *msg ); +} +static steam_callback_handlers[64]; +static u32 steam_callback_handler_count; + +static int steam_register_callback( u32 id, + void (*p_handler)( CallbackMsg_t *msg ) ) +{ + if( steam_callback_handler_count == vg_list_size(steam_callback_handlers) ) + { + vg_error( "Too many steam callback handlers registered (%u)\n", + steam_callback_handler_count ); + + return 0; + } + + steam_callback_handler *handler = &steam_callback_handlers[ + steam_callback_handler_count ++ ]; + + handler->p_handler = p_handler; + handler->callback_id = id; + + return 1; +} + /* * Event loop + * ============================================================================= */ HSteamPipe SteamAPI_GetHSteamPipe(void); HSteamPipe SteamGameServer_GetHSteamPipe(void); @@ -487,15 +522,14 @@ int SteamAPI_ManualDispatch_GetAPICallResult( HSteamPipe hSteamPipe, void SteamAPI_ReleaseCurrentThreadMemory(void); -static void steamworks_event_loop( HSteamPipe pipe, - void(*callback_handler)(CallbackMsg_t *msg) ) +static void steamworks_event_loop( HSteamPipe pipe ) { SteamAPI_ManualDispatch_RunFrame( pipe ); CallbackMsg_t callback; while( SteamAPI_ManualDispatch_GetNextCallback( pipe, &callback ) ) { - vg_log( "steamworks_event::callback( %i )\n", callback.m_iCallback ); + vg_low( "steamworks_event::callback( %i )\n", callback.m_iCallback ); /* Check for dispatching API call results */ if( callback.m_iCallback == k_iSteamAPICallCompleted ) @@ -503,7 +537,7 @@ static void steamworks_event_loop( HSteamPipe pipe, SteamAPICallCompleted_t *pCallCompleted = (SteamAPICallCompleted_t *)callback.m_pubParam; - void *pTmpCallResult = malloc( pCallCompleted->m_cubParam ); + void *pTmpCallResult = vg_alloc( pCallCompleted->m_cubParam ); int bFailed; if( SteamAPI_ManualDispatch_GetAPICallResult( @@ -567,7 +601,7 @@ static void steamworks_event_loop( HSteamPipe pipe, #endif } - free( pTmpCallResult ); + vg_free( pTmpCallResult ); } else { @@ -577,7 +611,15 @@ static void steamworks_event_loop( HSteamPipe pipe, * void *data = callback.m_pubParam; */ - callback_handler(&callback); + for( int i=0; icallback_id == callback.m_iCallback ) + { + handler->p_handler( &callback ); + break; + } + } } SteamAPI_ManualDispatch_FreeLastCallback( pipe );