diff options
author | Thomas Martitz <kugel@rockbox.org> | 2010-08-24 14:30:46 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2010-08-24 14:30:46 +0000 |
commit | cae4ae2c71ae10ff67d39a78a705136e740dc07e (patch) | |
tree | b5bb5e1879493f67d7c7ad977fba90eb49b743d7 /apps/plugins/cube.c | |
parent | 3478bc5d6dc0a081c3aeb4f501c8b4cb4f53a78d (diff) | |
download | rockbox-cae4ae2c71ae10ff67d39a78a705136e740dc07e.tar.gz rockbox-cae4ae2c71ae10ff67d39a78a705136e740dc07e.zip |
Second try: Introduce plugin_crt0.c that every plugin links.
It handles exit() properly, calling the handler also when the plugin returns
normally (also make exit() more standard compliant while at it).
It also holds PLUGIN_HEADER, so that it doesn't need to be in each plugin anymore.
To work better together with callbacks passed to rb->default_event_handler_ex() introduce exit_on_usb() which will call the exit handler before showing the usb screen and exit() after it.
In most cases rb->default_event_handler_ex() was passed a callback which was manually called at all other return points. This can now be done via atexit().
In future plugin_crt0.c could also handle clearing bss, initializing iram and more.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27873 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/cube.c')
-rw-r--r-- | apps/plugins/cube.c | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c index 2b1e00d690..7dec822d56 100644 --- a/apps/plugins/cube.c +++ b/apps/plugins/cube.c | |||
@@ -22,6 +22,7 @@ | |||
22 | ***************************************************************************/ | 22 | ***************************************************************************/ |
23 | #include "plugin.h" | 23 | #include "plugin.h" |
24 | #include "lib/playergfx.h" | 24 | #include "lib/playergfx.h" |
25 | #include "lib/pluginlib_exit.h" | ||
25 | #if LCD_DEPTH > 1 | 26 | #if LCD_DEPTH > 1 |
26 | #include "lib/mylcd.h" /* MYLCD_CFG_RB_XLCD or MYLCD_CFG_PGFX */ | 27 | #include "lib/mylcd.h" /* MYLCD_CFG_RB_XLCD or MYLCD_CFG_PGFX */ |
27 | #include "lib/grey.h" | 28 | #include "lib/grey.h" |
@@ -32,8 +33,6 @@ | |||
32 | #include "lib/xlcd.h" | 33 | #include "lib/xlcd.h" |
33 | #include "lib/fixedpoint.h" | 34 | #include "lib/fixedpoint.h" |
34 | 35 | ||
35 | PLUGIN_HEADER | ||
36 | |||
37 | /* Loops that the values are displayed */ | 36 | /* Loops that the values are displayed */ |
38 | #define DISP_TIME 30 | 37 | #define DISP_TIME 30 |
39 | 38 | ||
@@ -611,10 +610,8 @@ static void cube_draw(void) | |||
611 | } | 610 | } |
612 | } | 611 | } |
613 | 612 | ||
614 | void cleanup(void *parameter) | 613 | void cleanup(void) |
615 | { | 614 | { |
616 | (void)parameter; | ||
617 | |||
618 | #ifdef USEGSLIB | 615 | #ifdef USEGSLIB |
619 | grey_release(); | 616 | grey_release(); |
620 | #elif defined HAVE_LCD_CHARCELLS | 617 | #elif defined HAVE_LCD_CHARCELLS |
@@ -638,7 +635,7 @@ enum plugin_status plugin_start(const void* parameter) | |||
638 | bool highspeed = false; | 635 | bool highspeed = false; |
639 | bool paused = false; | 636 | bool paused = false; |
640 | bool redraw = true; | 637 | bool redraw = true; |
641 | bool exit = false; | 638 | bool quit = false; |
642 | 639 | ||
643 | (void)(parameter); | 640 | (void)(parameter); |
644 | 641 | ||
@@ -651,6 +648,7 @@ enum plugin_status plugin_start(const void* parameter) | |||
651 | rb->splash(HZ, "Couldn't init greyscale display"); | 648 | rb->splash(HZ, "Couldn't init greyscale display"); |
652 | return PLUGIN_ERROR; | 649 | return PLUGIN_ERROR; |
653 | } | 650 | } |
651 | |||
654 | /* init lcd_ function pointers */ | 652 | /* init lcd_ function pointers */ |
655 | lcdfuncs.update = rb->lcd_update; | 653 | lcdfuncs.update = rb->lcd_update; |
656 | lcdfuncs.clear_display = rb->lcd_clear_display; | 654 | lcdfuncs.clear_display = rb->lcd_clear_display; |
@@ -673,7 +671,8 @@ enum plugin_status plugin_start(const void* parameter) | |||
673 | pgfx_display(0, 0); | 671 | pgfx_display(0, 0); |
674 | #endif | 672 | #endif |
675 | 673 | ||
676 | while(!exit) | 674 | atexit(cleanup); |
675 | while(!quit) | ||
677 | { | 676 | { |
678 | if (redraw) | 677 | if (redraw) |
679 | { | 678 | { |
@@ -830,24 +829,17 @@ enum plugin_status plugin_start(const void* parameter) | |||
830 | case CUBE_RC_QUIT: | 829 | case CUBE_RC_QUIT: |
831 | #endif | 830 | #endif |
832 | case CUBE_QUIT: | 831 | case CUBE_QUIT: |
833 | exit = true; | 832 | exit(EXIT_SUCCESS); |
834 | break; | 833 | break; |
835 | 834 | ||
836 | default: | 835 | default: |
837 | if (rb->default_event_handler_ex(button, cleanup, NULL) | 836 | exit_on_usb(button); |
838 | == SYS_USB_CONNECTED) | ||
839 | return PLUGIN_USB_CONNECTED; | ||
840 | break; | 837 | break; |
841 | } | 838 | } |
842 | if (button != BUTTON_NONE) | 839 | if (button != BUTTON_NONE) |
843 | lastbutton = button; | 840 | lastbutton = button; |
844 | } | 841 | } |
845 | 842 | ||
846 | #ifdef USEGSLIB | ||
847 | grey_release(); | ||
848 | #elif defined(HAVE_LCD_CHARCELLS) | ||
849 | pgfx_release(); | ||
850 | #endif | ||
851 | return PLUGIN_OK; | 843 | return PLUGIN_OK; |
852 | } | 844 | } |
853 | 845 | ||