[quake3-bugzilla] [Bug 4520] New: /sysexec, execute an external program
bugzilla-daemon at icculus.org
bugzilla-daemon at icculus.org
Fri Jan 29 18:34:28 EST 2010
http://bugzilla.icculus.org/show_bug.cgi?id=4520
Summary: /sysexec, execute an external program
Product: ioquake3
Version: SVN HEAD
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P3
Component: Misc
AssignedTo: zakk at icculus.org
ReportedBy: arxeio at gmail.com
QAContact: quake3-bugzilla at icculus.org
The reason I wanted it was to change winamp songs with a bind:P
e.g. this plugin http://membres.multimania.fr/clamp/
and
/bind x sysexec clamp /next <--------goes next winamp song
with clamp in the path or using its full path.
The way this works on Windows is with some acrobatics using CreateProcess() to
avoid the new program stealing focus (especially for changing songs with
CLamp). For non-Windows it assumes system() will be enough by letting the user
using some userland magic to avoid such stealing of focus. It is generally a
raw method - especially on non-WIN32 - that may need proper care on what is
being fed to it. e.g. Winamp (initial launching) or even ioq3 itself (a new
one) will steal focus from it by force even if they are instructed not to. This
can be considered 'normal'. On non-windows it may require a shell method that
exits right after execution since system() itself halts the program until exit.
Theoretically, even windows can be left requiring a userland program doing any
focusing/unfocusing business but it allowed some handholding.
void Com_Sysexec_f (void) {
int num, i;
char cmd[1024];
#ifdef WIN32
char errormsg[1024];
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) ); //up to here carbon copy microsoft's example
si.dwFlags = STARTF_USESHOWWINDOW; //needed to use the next one
si.wShowWindow = SW_SHOWNOACTIVATE; //needed to *not activate, i.e. not
focus*
#endif
num = Cmd_Argc();
if (num < 2) {
Com_Printf ("sysexec [command and parameters] : run an external system
command/program with its parameters, it can be in the path or be entered in
full path\n");
return;
}
cmd[0] = 0; //required to start with a null string
for (i = 1; i < num; i++) {
strcat (cmd, Cmd_Argv(i));
if (i != (num-1))
strcat (cmd, " ");
}
Com_Printf("Issuing external command: %s\n",cmd);
#ifdef WIN32
if(!CreateProcess( NULL,cmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi )) {
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),0,errormsg,1024,NULL);
Com_Printf("Issuing of %s failed, error: %s.\n",cmd, errormsg);
if (GetLastError() == 2)
Com_Printf("a command can be in the path or full path can be
used\n");
}
#else
system(cmd);
#endif
}
//in an 'init':
Cmd_AddCommand( "sysexec", Com_Sysexec_f );
--
Configure bugmail: http://bugzilla.icculus.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
More information about the quake3-bugzilla
mailing list