add exit handler
This commit is contained in:
1
Makefile
1
Makefile
@@ -18,6 +18,7 @@ OBJ=src/riverguile.o $\
|
||||
src/call-layout-demand-handler.o $\
|
||||
src/call-user-command-handler.o $\
|
||||
src/call-idle-handler.o $\
|
||||
src/call-exit-handler.o $\
|
||||
src/load-script.o $\
|
||||
protocol/river-layout-v3.o $\
|
||||
protocol/ext-idle-notify-v1.o
|
||||
|
||||
@@ -78,6 +78,9 @@ of the system being idle is over.
|
||||
Multiple idle handlers can be installed.
|
||||
Note: All idle events relate to the first advetised seat.
|
||||
As of now, river only supports a single seat anyway.
|
||||
.P
|
||||
The key \fBexit\fR installs a handler which is called when riverguile exits.
|
||||
The procedure takes no arguments.
|
||||
.
|
||||
.
|
||||
.SH EXAMPLE
|
||||
|
||||
29
src/call-exit-handler.c
Normal file
29
src/call-exit-handler.c
Normal file
@@ -0,0 +1,29 @@
|
||||
#include <libguile.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "riverguile.h"
|
||||
|
||||
static void *call_exit_handler_inner (void *data)
|
||||
{
|
||||
assert(data == NULL);
|
||||
return scm_call_0(context.exit_handler);
|
||||
}
|
||||
|
||||
void *call_exit_handler (void)
|
||||
{
|
||||
assert(context.exit_handler != NULL);
|
||||
|
||||
/* Continuation barrier causes stack unwind on exceptions (i.e. errors
|
||||
* in the user defined exit 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_exit_handler_inner, NULL
|
||||
);
|
||||
|
||||
if ( call_result == NULL )
|
||||
return (void *)"ERROR: An exception occured while calling the exit handler.\n";
|
||||
|
||||
return NULL;
|
||||
}
|
||||
6
src/call-exit-handler.h
Normal file
6
src/call-exit-handler.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef RIVERGUILE_CALL_EXIT_HANDLER_H
|
||||
#define RIVERGUILE_CALL_EXIT_HANDLER_H
|
||||
|
||||
void *call_exit_handler (void);
|
||||
|
||||
#endif
|
||||
@@ -21,7 +21,7 @@ static void *call_idle_handler_inner (void *data)
|
||||
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
|
||||
* in the user defined idle handler) to stop here. Otherwise the entire
|
||||
* stack created by scm_with_guile() would be unwound. This makes
|
||||
* responding to exceptions nicer.
|
||||
*/
|
||||
@@ -30,7 +30,7 @@ void *call_idle_handler (void *data)
|
||||
);
|
||||
|
||||
if ( call_result == NULL )
|
||||
return (void *)"ERROR: An exception occured while calling the user-command handler.\n";
|
||||
return (void *)"ERROR: An exception occured while calling the idle handler.\n";
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -78,6 +78,8 @@ static SCM install_handler (SCM key, SCM proc)
|
||||
context.layout_demand_handler = proc;
|
||||
else if ( scm_is_eq(scm_from_utf8_symbol("user-command"), key) == 1)
|
||||
context.user_command_handler = proc;
|
||||
else if ( scm_is_eq(scm_from_utf8_symbol("exit"), key) == 1)
|
||||
context.exit_handler = proc;
|
||||
else if ( scm_is_true(scm_string_prefix_p(scm_from_utf8_string("idle:"), scm_symbol_to_string(key),
|
||||
scm_from_int(0), scm_from_int(5),
|
||||
scm_from_int(0), scm_string_length(scm_symbol_to_string(key)))) == 1 )
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "ext-idle-notify-v1.h"
|
||||
|
||||
#include "load-script.h"
|
||||
#include "call-exit-handler.h"
|
||||
#include "riverguile.h"
|
||||
#include "output.h"
|
||||
#include "seat.h"
|
||||
@@ -346,6 +347,9 @@ int main(int argc, char *argv[])
|
||||
if ( setjmp(skip_main_loop) == 0 )
|
||||
while ( context.loop && wl_display_dispatch(context.wl_display) > 0 );
|
||||
|
||||
if ( context.exit_handler != NULL )
|
||||
call_exit_handler();
|
||||
|
||||
struct Idle *idle, *tmp_i;
|
||||
wl_list_for_each_safe(idle, tmp_i, &context.unconfigured_idles, link)
|
||||
{
|
||||
|
||||
@@ -11,6 +11,7 @@ struct Context
|
||||
{
|
||||
SCM layout_demand_handler;
|
||||
SCM user_command_handler;
|
||||
SCM exit_handler;
|
||||
|
||||
bool loop;
|
||||
int ret;
|
||||
|
||||
Reference in New Issue
Block a user