diff --git a/include/gint/gint.h b/include/gint/gint.h index 6925175..d2b5646 100644 --- a/include/gint/gint.h +++ b/include/gint/gint.h @@ -109,6 +109,16 @@ static GINLINE void *gint_inthandler(int code, void const *h, size_t size) { Returns the return value of the callback. */ extern int (*gint_inth_callback)(gint_call_t const *call); +/* gint_set_quit_handler(): Call a GINT_CALL when the user open another add-in + + This function use the SetQuitHandler syscall to call a function when the + user open another add-in. + + @call A GINT_CALL + @do_world_switch 1 to execute @call in a world_switch. */ + +void gint_set_quit_handler(gint_call_t gcall, bool do_world_switch); + #ifdef __cplusplus } #endif diff --git a/src/kernel/osmenu.c b/src/kernel/osmenu.c index 3c54465..47b0d85 100644 --- a/src/kernel/osmenu.c +++ b/src/kernel/osmenu.c @@ -13,6 +13,7 @@ int __GetKeyWait(int *col,int *row,int type,int time,int menu,uint16_t *key); void __ClearKeyBuffer(void); /* ? */ void *__GetVRAMAddress(void); void __ConfigureStatusArea(int mode); +void __SetQuitHandler(void (*callback)(void)); static int __osmenu_id; @@ -76,3 +77,28 @@ void gint_osmenu(void) { gint_world_switch(GINT_CALL(gint_osmenu_native)); } + +static gint_call_t __gcall; +static bool __do_world_switch; + +static void __handler() +{ + if(__do_world_switch){ + gint_call(__gcall); + }else{ + /* TODO: quit the world switch */ + gint_call(__gcall); + } +} + +static void __sethandler() +{ + __SetQuitHandler((void *)__handler); +} + +void gint_set_quit_handler(gint_call_t gcall, bool do_world_switch) +{ + __gcall = gcall; + __do_world_switch = do_world_switch; + gint_world_switch(GINT_CALL(__sethandler)); +}