From c8131042001660e330bdc9e4cd98be90684a30b4 Mon Sep 17 00:00:00 2001 From: skeezix Date: Fri, 26 Mar 2010 13:53:50 -0400 Subject: [PATCH] New exec(disco-t) for more flexible pnd exec. PXML may specify appdata dirname, and may be ovr overridden. pndevmapperd will not force shutdown at low power when charging. --- apps/pndevmapperd.c | 30 ++++++++----- artwork/PandoraLogo.png | Bin 0 -> 27351 bytes include/pnd_apps.h | 11 +++++ include/pnd_device.h | 2 + include/pnd_discovery.h | 1 + include/pnd_pxml.h | 2 + include/pnd_pxml_names.h | 1 + lib/pnd_apps.c | 88 ++++++++++++++++++++++++++------------- lib/pnd_desktop.c | 6 ++- lib/pnd_device.c | 11 +++++ lib/pnd_discovery.c | 13 ++++++ lib/pnd_pxml.c | 8 ++++ lib/pnd_tinyxml.cpp | 1 + minimenu/TODO.txt | 1 - minimenu/mmui.c | 10 +---- 15 files changed, 133 insertions(+), 52 deletions(-) create mode 100644 artwork/PandoraLogo.png diff --git a/apps/pndevmapperd.c b/apps/pndevmapperd.c index aa090c4..14bd6a3 100644 --- a/apps/pndevmapperd.c +++ b/apps/pndevmapperd.c @@ -776,20 +776,28 @@ void sigalrm_handler ( int n ) { // first -- are we critical yet? if so, shut down! if ( batlevel <= b_shutdown && b_shutdown_script ) { - int x; + int mamps = 0; - pnd_log ( pndn_error, "CRITICAL BATTERY LEVEL -- shutdown the system down! Invoke: %s\n", b_shutdown_script ); + if ( pnd_device_get_charge_current ( &mamps ) && mamps > 100 ) { + // critical battery, but charging, so relax. + } else { + int x; - if ( ( x = fork() ) < 0 ) { - pnd_log ( pndn_error, "ERROR: Couldn't fork()\n" ); - exit ( -3 ); - } + pnd_log ( pndn_error, "CRITICAL BATTERY LEVEL -- shutdown the system down! Invoke: %s\n", + b_shutdown_script ); - if ( x == 0 ) { - execl ( b_shutdown_script, b_shutdown_script, (char*)NULL ); - pnd_log ( pndn_error, "ERROR: Couldn't exec(%s)\n", b_shutdown_script ); - exit ( -4 ); - } + if ( ( x = fork() ) < 0 ) { + pnd_log ( pndn_error, "ERROR: Couldn't fork()\n" ); + exit ( -3 ); + } + + if ( x == 0 ) { + execl ( b_shutdown_script, b_shutdown_script, (char*)NULL ); + pnd_log ( pndn_error, "ERROR: Couldn't exec(%s)\n", b_shutdown_script ); + exit ( -4 ); + } + + } // charging } diff --git a/artwork/PandoraLogo.png b/artwork/PandoraLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..289234ec20fafb273fd96f9e067af50b9c4ed062 GIT binary patch literal 27351 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 O0000 ...*/ #define PND_PXML_ATTRNAME_UID "id" +#define PND_PXML_ATTRNAME_APPDATANAME "appdata" /* */ #define PND_PXML_APP "application" diff --git a/lib/pnd_apps.c b/lib/pnd_apps.c index cefebbb..fd5d566 100644 --- a/lib/pnd_apps.c +++ b/lib/pnd_apps.c @@ -3,6 +3,7 @@ #include /* for malloc */ #include /* for memset */ #include /* for fork/exec */ +#include #include /* for wait */ #include /* for wait */ @@ -18,13 +19,11 @@ char *pnd_apps_exec_runline ( void ) { return ( apps_exec_runline ); } -unsigned char pnd_apps_exec ( char *pndrun, char *fullpath, char *unique_id, - char *rel_exec, char *rel_startdir, - char *args, - unsigned int clockspeed, unsigned int options ) +unsigned char pnd_apps_exec_disco ( char *pndrun, pnd_disco_t *app, + unsigned int options, void *reserved ) { char *argv [ 60 ]; - char s_clockspeed [ 100 ]; + char fullpath [ PATH_MAX ] = ""; int f; //printf ( "Entering pnd_apps_exec\n" ); @@ -33,27 +32,19 @@ unsigned char pnd_apps_exec ( char *pndrun, char *fullpath, char *unique_id, return ( 0 ); } - if ( ! fullpath ) { + if ( ! app -> unique_id ) { return ( 0 ); } - if ( ! unique_id ) { + if ( ! app -> exec ) { return ( 0 ); } - if ( ! rel_exec ) { - return ( 0 ); - } - -#if 0 - printf ( " runscript: %s\n", pndrun ); - printf ( " path: %s\n", fullpath ); - printf ( " id: %s\n", unique_id ); - printf ( " exec: %s\n", rel_exec ); - printf ( " cwd: %s\n", rel_startdir ); - printf ( " clock: %u\n", clockspeed ); -#endif + // determine path to pnd-file + sprintf ( fullpath, "%s/%s", app -> object_path, app -> object_filename ); + // nail down argv for the app + // memset ( argv, '\0', sizeof(char*) * 20 ); f = 0; @@ -61,21 +52,25 @@ unsigned char pnd_apps_exec ( char *pndrun, char *fullpath, char *unique_id, argv [ f++ ] = "-p"; argv [ f++ ] = fullpath; argv [ f++ ] = "-e"; - argv [ f++ ] = rel_exec; - if ( rel_startdir ) { + argv [ f++ ] = app -> exec; + if ( app -> startdir ) { argv [ f++ ] = "-s"; - argv [ f++ ] = rel_startdir; + argv [ f++ ] = app -> startdir; } - if ( args ) { + if ( app -> execargs ) { argv [ f++ ] = "-a"; - argv [ f++ ] = args; + argv [ f++ ] = app -> execargs; } - argv [ f++ ] = "-b"; - argv [ f++ ] = unique_id; - if ( clockspeed ) { + if ( app -> appdata_dirname ) { + argv [ f++ ] = "-b"; + argv [ f++ ] = app -> appdata_dirname; + } else { + argv [ f++ ] = "-b"; + argv [ f++ ] = app -> unique_id; + } + if ( app -> clockspeed ) { argv [ f++ ] = "-c"; - snprintf ( s_clockspeed, 100, "%u", clockspeed ); - argv [ f++ ] = s_clockspeed; + argv [ f++ ] = app -> clockspeed; } // skip -a (arguments) for now @@ -166,6 +161,41 @@ unsigned char pnd_apps_exec ( char *pndrun, char *fullpath, char *unique_id, return ( 1 ); } +unsigned char pnd_apps_exec ( char *pndrun, char *fullpath, char *unique_id, + char *rel_exec, char *rel_startdir, + char *args, + unsigned int clockspeed, unsigned int options ) +{ + pnd_disco_t d; + bzero ( &d, sizeof(pnd_disco_t) ); + + char cpuspeed [ 10 ]; + sprintf ( cpuspeed, "%u", clockspeed ); + + char hackpath [ PATH_MAX ]; + strncpy ( hackpath, fullpath, PATH_MAX ); + char *c = strrchr ( hackpath, '/' ); + if ( c ) { + *c = '\0'; + d.object_path = hackpath; + d.object_filename = c + 1; + } else { + d.object_path = fullpath; + } + + d.unique_id = unique_id; + d.exec = rel_exec; + d.startdir = rel_startdir; + d.execargs = args; + if ( clockspeed ) { + d.clockspeed = cpuspeed; + } else { + d.clockspeed = NULL; + } + + return ( pnd_apps_exec_disco ( pndrun, &d, options, NULL ) ); +} + void pnd_get_ro_mountpoint ( char *fullpath, char *unique_id, char *r_mountpoint, unsigned int mountpoint_len ) { if ( ! r_mountpoint ) { diff --git a/lib/pnd_desktop.c b/lib/pnd_desktop.c index 8b05b07..3ef81a0 100644 --- a/lib/pnd_desktop.c +++ b/lib/pnd_desktop.c @@ -104,10 +104,12 @@ unsigned char pnd_emit_dotdesktop ( char *targetpath, char *pndrun, pnd_disco_t // basics if ( p -> object_type == pnd_object_type_directory ) { snprintf ( buffer, 1020, "Exec=%s%s -p %s -e %s -b %s", - nohup, pndrun, p -> object_path, p -> exec, p -> unique_id ); + nohup, pndrun, p -> object_path, p -> exec, + p -> appdata_dirname ? p -> appdata_dirname : p -> unique_id ); } else if ( p -> object_type == pnd_object_type_pnd ) { snprintf ( buffer, 1020, "Exec=%s%s -p %s/%s -e %s -b %s", - nohup, pndrun, p -> object_path, p -> object_filename, p -> exec, p -> unique_id ); + nohup, pndrun, p -> object_path, p -> object_filename, p -> exec, + p -> appdata_dirname ? p -> appdata_dirname : p -> unique_id ); } // start dir diff --git a/lib/pnd_device.c b/lib/pnd_device.c index d255c97..e158711 100644 --- a/lib/pnd_device.c +++ b/lib/pnd_device.c @@ -92,6 +92,17 @@ int pnd_device_get_battery_gauge_perc ( void ) { return ( -1 ); } +unsigned char pnd_device_get_charge_current ( int *result ) { + char buffer [ 100 ]; + + if ( pnd_device_open_read_close ( PND_DEVICE_CHARGE_CURRENT, buffer, 100 ) ) { + *result = atoi ( buffer ); + return ( 1 ); + } + + return ( 0 ); +} + unsigned char pnd_device_set_led_power_brightness ( unsigned char v ) { char buffer [ 100 ]; diff --git a/lib/pnd_discovery.c b/lib/pnd_discovery.c index 074513d..1e41ead 100644 --- a/lib/pnd_discovery.c +++ b/lib/pnd_discovery.c @@ -30,6 +30,7 @@ void pnd_disco_destroy ( pnd_disco_t *p ) { if ( p -> title_en ) { free ( p -> title_en ); } if ( p -> unique_id ) { free ( p -> unique_id ); } + if ( p -> appdata_dirname ) { free ( p -> appdata_dirname ); } if ( p -> icon ) { free ( p -> icon ); } if ( p -> exec ) { free ( p -> exec ); } if ( p -> execargs ) { free ( p -> execargs ); } @@ -237,6 +238,9 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, if ( pnd_pxml_get_unique_id ( pxmlh ) ) { p -> unique_id = strdup ( pnd_pxml_get_unique_id ( pxmlh ) ); } + if ( pnd_pxml_get_appdata_dirname ( pxmlh ) ) { + p -> appdata_dirname = strdup ( pnd_pxml_get_appdata_dirname ( pxmlh ) ); + } if ( pnd_pxml_get_clockspeed ( pxmlh ) ) { p -> clockspeed = strdup ( pnd_pxml_get_clockspeed ( pxmlh ) ); } @@ -338,6 +342,15 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, p -> clockspeed = strdup ( v ); } + // appdata dirname + snprintf ( key, 100, "Application-%u.appdata", p -> subapp_number ); + if ( ( v = pnd_conf_get_as_char ( ovrh, key ) ) ) { + if ( p -> appdata_dirname ) { + free ( p -> appdata_dirname ); + } + p -> appdata_dirname = strdup ( v ); + } + // categories snprintf ( key, 100, "Application-%u.maincategory", p -> subapp_number ); if ( ( v = pnd_conf_get_as_char ( ovrh, key ) ) ) { diff --git a/lib/pnd_pxml.c b/lib/pnd_pxml.c index 7632c05..2b597ce 100644 --- a/lib/pnd_pxml.c +++ b/lib/pnd_pxml.c @@ -176,6 +176,9 @@ void pnd_pxml_delete ( pnd_pxml_handle h ) { if ( p -> startdir ) { free ( p -> startdir ); } + if ( p -> appdata_dirname ) { + free ( p -> appdata_dirname ); + } free(p); /*very important!*/ @@ -338,6 +341,11 @@ char *pnd_pxml_get_unique_id ( pnd_pxml_handle h ) { return ( p -> unique_id ); } +char *pnd_pxml_get_appdata_dirname ( pnd_pxml_handle h ) { + pnd_pxml_t *p = (pnd_pxml_t*) h; + return ( p -> appdata_dirname ); +} + char *pnd_pxml_get_standalone ( pnd_pxml_handle h ) { pnd_pxml_t *p = (pnd_pxml_t*) h; return ( p -> standalone ); diff --git a/lib/pnd_tinyxml.cpp b/lib/pnd_tinyxml.cpp index 6159562..95cf3ec 100644 --- a/lib/pnd_tinyxml.cpp +++ b/lib/pnd_tinyxml.cpp @@ -158,6 +158,7 @@ unsigned char pnd_pxml_parse ( const char *pFilename, char *buffer, unsigned int if ( appwrappermode ) { app->unique_id = pnd_pxml_get_attribute(appElem, PND_PXML_ATTRNAME_UID); //pnd_log ( PND_LOG_DEFAULT, (char*)" Subapp #%u has unique_id %s\n", appcount, app -> unique_id ); + app->appdata_dirname = pnd_pxml_get_attribute(appElem, PND_PXML_ATTRNAME_APPDATANAME); } else { app->unique_id = pnd_pxml_get_attribute(hRoot.Element(), PND_PXML_ATTRNAME_UID); //pnd_log ( PND_LOG_DEFAULT, (char*)" Only-app #%u has unique_id %s\n", appcount, app -> unique_id ); diff --git a/minimenu/TODO.txt b/minimenu/TODO.txt index 81be21d..7370511 100644 --- a/minimenu/TODO.txt +++ b/minimenu/TODO.txt @@ -6,7 +6,6 @@ - libpnd: appdata-dir-name? - add font and fontcolour control to conf -- evmapperd.. no force off, if charging on /sys/class/power_supply/bq27500-0/current_now is +ve - About screen and shoutouts // konami code? - skinning .. mmenu.conf and then skin.conf in each skin dir? - skin picker/saver diff --git a/minimenu/mmui.c b/minimenu/mmui.c index 8fd5bf1..467678e 100644 --- a/minimenu/mmui.c +++ b/minimenu/mmui.c @@ -1462,16 +1462,8 @@ void ui_push_down ( void ) { void ui_push_exec ( void ) { if ( ui_selected ) { + pnd_apps_exec_disco ( pnd_run_script, ui_selected -> ref, PND_EXEC_OPTION_NORUN, NULL ); char buffer [ PATH_MAX ]; - sprintf ( buffer, "%s/%s", ui_selected -> ref -> object_path, ui_selected -> ref -> object_filename ); - pnd_apps_exec ( pnd_run_script, - buffer, - ui_selected -> ref -> unique_id, - ui_selected -> ref -> exec, - ui_selected -> ref -> startdir, - ui_selected -> ref -> execargs, - ui_selected -> ref -> clockspeed ? atoi ( ui_selected -> ref -> clockspeed ) : 0, - PND_EXEC_OPTION_NORUN ); sprintf ( buffer, "%s %s\n", MM_RUN, pnd_apps_exec_runline() ); emit_and_quit ( buffer ); } -- 2.39.5