Ticket #461: spawn.diff

File spawn.diff, 2.7 KB (added by tryagain, 10 years ago)

New version of external command patch. It seems to work on WinCE and Linux. Idea what functions to use is stolen from speech_cmdline.c. Example for linux: <osd enabled="yes" type="button" x="0" y="-96" command='spawn("/bin/echo","Hi")' src="zoom_out.svg"/>.

  • navit.c

     
    6666#include "vehicleprofile.h"
    6767#include "sunriset.h"
    6868#include "bookmarks.h"
     69#ifdef HAVE_API_WIN32_BASE
     70#include <windows.h>
     71#include "util.h"
     72#endif
    6973
    7074/**
    7175 * @defgroup navit the navit core instance. navit is the object containing nearly everything: A set of maps, one or more vehicle, a graphics object for rendering the map, a gui object for displaying the user interface, a route object, a navigation object and so on. Be warned that it is theoretically possible to have more than one navit object
     
    941945        }
    942946}
    943947
     948/**
     949 * Call external program
     950 *
     951 * @param navit The navit instance
     952 * @param function unused (needed to match command function signiture)
     953 * @param in input attributes in[0] - name of executable, in[1..] - parameters
     954 * @param out output attribute unused
     955 * @param valid unused
     956 * @returns nothing
     957 */
     958static void
     959navit_cmd_spawn(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid)
     960{
     961        int i,j, nparms, nvalid;
     962        const char ** spawn_params=NULL;
     963
     964        nparms=0;
     965        nvalid=0;
     966        if(in) {
     967                while(in[nparms]) {
     968                        if (ATTR_IS_STRING(in[nparms]->type) && in[nparms]->u.str)
     969                                nvalid++;
     970                        nparms++;
     971                }
     972        }
     973       
     974        if(nvalid>0) {
     975                spawn_params=g_new(char*,nvalid+1);
     976                for(i=0,j=0;in[i];i++) {
     977                        if((ATTR_IS_STRING(in[i]->type) && in[i]->u.str))
     978                                spawn_params[j++]=in[i]->u.str;
     979                }
     980                spawn_params[j]=NULL;
     981#ifdef USE_EXEC
     982                if(fork()==0) {
     983                        execvp(spawn_params[0], spawn_params);
     984                        /*Shouldn't reach here*/
     985                        exit(1);
     986                }
     987                g_free(spawn_params);
     988                return;
     989#else
     990#ifdef HAVE_API_WIN32_BASE
     991        {
     992                char *cmdline;
     993                PROCESS_INFORMATION pr;
     994                LPCWSTR cmd,args;
     995                cmdline=g_strjoinv(" ",spawn_params+1);
     996                cmd = newSysString(spawn_params[0]);
     997                args=newSysString(cmdline);
     998                CreateProcess(cmd, args, NULL, NULL, 0, 0, NULL, NULL, NULL, &pr);
     999                dbg(0, "CreateProcess(%s,%s)\n",spawn_params[0],cmdline);
     1000                g_free(cmdline);
     1001                g_free(cmd);
     1002                g_free(args);
     1003                g_free(spawn_params);
     1004                return;
     1005        }
     1006#else
     1007        {
     1008                char *cmdline;
     1009                cmdline=g_strjoinv(" ",spawn_params);
     1010                system(cmdline);
     1011                g_free(cmdline);
     1012                g_free(spawn_params);
     1013                return;
     1014        }
     1015#endif
     1016#endif
     1017        g_free(spawn_params);
     1018        }
     1019}
     1020
     1021
    9441022static struct command_table commands[] = {
    9451023        {"zoom_in",command_cast(navit_cmd_zoom_in)},
    9461024        {"zoom_out",command_cast(navit_cmd_zoom_out)},
     
    9561034        {"pop_int",command_cast(navit_cmd_pop_int)},
    9571035        {"int_stack_size",command_cast(navit_cmd_int_stack_size)},
    9581036        {"toggle_layer",command_cast(navit_cmd_toggle_layer)},
     1037        {"spawn",command_cast(navit_cmd_spawn)},
    9591038};
    9601039       
    9611040void