Files
riverguile/src/call-idle-handler.c
2024-01-06 23:38:04 +01:00

37 lines
969 B
C

#include <libguile.h>
#include "seat.h"
#include "call-idle-handler.h"
static void *call_idle_handler_inner (void *data)
{
struct Call_idle_handler_parameters *params =
(struct Call_idle_handler_parameters *)data;
SCM event;
switch (params->event)
{
case IDLE: event = scm_from_utf8_symbol("idle"); break;
case RESUME: event = scm_from_utf8_symbol("resume"); break;
}
return scm_call_1(params->idle->handler, event);
}
void *call_idle_handler (void *data)
{
/* Continuation barrier causes stack unwind on exceptions (i.e. errors
* in the user defined ide handler) to stop here. Otherwise the entire
* stack created by scm_with_guile() would be unwound. This makes
* responding to exceptions nicer.
*/
SCM call_result = scm_c_with_continuation_barrier(
call_idle_handler_inner, data
);
if ( call_result == NULL )
return (void *)"ERROR: An exception occured while calling the user-command handler.\n";
return NULL;
}