diff --git a/README.md b/README.md index 473f6b8..f5dda44 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ The library also offers powerful higher-level features: * An enhanced version of the system's GetKey() and GetKeyWait() * A gray engine that works by rapidly swapping monochrome images on fx-9860G II -* Blazingly fast rendering functions (image rendering is 10 times faster tha +* Blazingly fast rendering functions (image rendering is 10 times faster than MonochromeLib) * Integrated font management 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)); +} diff --git a/src/kernel/syscalls.S b/src/kernel/syscalls.S index 12b0325..1261859 100644 --- a/src/kernel/syscalls.S +++ b/src/kernel/syscalls.S @@ -42,6 +42,7 @@ .global ___ClearKeyBuffer .global ___GetVRAMAddress .global ___ConfigureStatusArea +.global ___SetQuitHandler #define syscall_(id, syscall_table) \ mov.l syscall_table, r2 ;\ @@ -111,6 +112,8 @@ ___ClearKeyBuffer: syscall(0x241) ___GetVRAMAddress: syscall(0x135) +___SetQuitHandler: + syscall(0x494) syscall_table: .long 0x80010070 @@ -178,6 +181,8 @@ ___GetVRAMAddress: syscall(0x1e6) ___ConfigureStatusArea: syscall(0x2b7) +___SetQuitHandler: + syscall(0x1e6e) .global ___SpecialMatrixCodeProcessing ___SpecialMatrixCodeProcessing: