xmlterm changes only;

Windows mode implemented
This commit is contained in:
svn%xmlterm.org 2000-04-05 05:15:14 +00:00
parent c5728a0a70
commit 8a61ef0d28
6 changed files with 113 additions and 60 deletions

View File

@ -77,7 +77,7 @@ LtermGlobal ltermGlobal;
int ltermClose(struct lterms *lts);
static int ltermShellInit(struct lterms *lts);
static int ltermShellInit(struct lterms *lts, int all);
static int ltermCreatePipe(FILEDESC *writePIPE, FILEDESC *readPIPE);
static int ltermCreateProcess(struct LtermProcess *ltp,
char *const argv[], int nostderr, int noexport);
@ -535,44 +535,58 @@ int lterm_open(int lterm, char *const argv[],
LTERM_LOG(lterm_open,11,("cookie='%s'\n",lts->cookie));
/* Shell initialization string */
if (lts->processType == LTERM_UNKNOWN_PROCESS) {
lts->shellInitStr[0] = '\0';
/* Shell initialization commands have not been sent yet */
lts->shellInitCommands = 0;
} else {
/* NOTE: Shell init commands are stored in reverse order of execution */
if (init_command != NULL) {
/* User supplied shell init command */
if (strlen(init_command) <= MAXSHELLINITSTR-1) {
int cmd = lts->shellInitCommands++;
assert(cmd < MAXSHELLCMD);
(void) strncpy(lts->shellInitStr[cmd], init_command, MAXSHELLINITSTR-1);
lts->shellInitStr[cmd][MAXSHELLINITSTR-1] = '\0';
} else {
LTERM_WARNING("lterm_open: Warning - user init command too long\n");
}
}
if (lts->processType != LTERM_UNKNOWN_PROCESS) {
/* Process dependent shell init command */
int result;
char* shellInitFormat;
char* initStr = "";
if (init_command != NULL)
initStr = (char *) init_command;
if ((lts->processType == LTERM_CSH_PROCESS) ||
(lts->processType == LTERM_TCSH_PROCESS)) {
/* C-shell family */
shellInitFormat = "setenv LTERM_COOKIE '%s'; if (-f $HOME/.xmltermrc) source $HOME/.xmltermrc\n%s";
shellInitFormat = "setenv LTERM_COOKIE '%s'; if (-f $HOME/.xmltermrc) source $HOME/.xmltermrc\n";
} else {
/* Bourne-shell family */
shellInitFormat = "LTERM_COOKIE='%s'; export LTERM_COOKIE; if [ -f $HOME/.xmltermrc ]; then source $HOME/.xmltermrc; fi\n%s";
shellInitFormat = "LTERM_COOKIE='%s'; export LTERM_COOKIE; if [ -f $HOME/.xmltermrc ]; then source $HOME/.xmltermrc; fi\n";
}
/* **** WATCH OUT FOR BUFFER OVERFLOW!!! *** */
if (strlen(shellInitFormat)-4+strlen(lts->cookie)+strlen(initStr) <=
MAXSHELLINITSTR-1) {
sprintf(lts->shellInitStr, shellInitFormat, lts->cookie, initStr);
if (strlen(shellInitFormat)-4+strlen(lts->cookie) <= MAXSHELLINITSTR-1) {
int cmd = lts->shellInitCommands++;
assert(cmd < MAXSHELLCMD);
sprintf(lts->shellInitStr[cmd], shellInitFormat, lts->cookie);
lts->shellInitStr[cmd][MAXSHELLINITSTR-1] = '\0';
} else {
LTERM_WARNING("lterm_open: Warning - shell initialization string too long\n");
lts->shellInitStr[0] = '\0';
LTERM_WARNING("lterm_open: Warning - process init command too long\n");
}
}
LTERM_LOG(lterm_open,11,("shellInitStr='%s'\n",lts->shellInitStr));
/* Shell initialization commands have not been sent yet */
lts->shellInitFlag = 0;
for (j=lts->shellInitCommands-1; j>0; j--) {
LTERM_LOG(lterm_open,11,("shellInitStr%d='%s'\n",j,lts->shellInitStr[j]));
}
/* Initialize regular expression string matching command prompt */
if ((ucslen(prompt_regexp) == 0) ||
@ -863,9 +877,9 @@ int lterm_setecho(int lterm, int echo_flag)
return -2;
}
if (!lts->shellInitFlag) {
if (lts->shellInitCommands > 0) {
/* send shell initialization string */
if (ltermShellInit(lts) != 0) {
if (ltermShellInit(lts,1) != 0) {
GLOBAL_UNLOCK;
return -1;
}
@ -1028,9 +1042,9 @@ int lterm_write(int lterm, const UNICHAR *buf, int count, int dataType)
lts->disabledInputEcho = 0;
}
if (!lts->shellInitFlag) {
if (lts->shellInitCommands > 0) {
/* send shell initialization string */
if (ltermShellInit(lts) != 0) {
if (ltermShellInit(lts,1) != 0) {
GLOBAL_UNLOCK;
return -1;
}
@ -1172,9 +1186,9 @@ int lterm_read(int lterm, int timeout, UNICHAR *buf, int count,
RELEASE_UNILOCK(outputMutex,outputMutexLocked)
GLOBAL_LOCK;
if ((*opcodes != 0) && !lts->shellInitFlag) {
if ((*opcodes != 0) && (lts->shellInitCommands > 0)) {
/* send shell initialization string */
if (ltermShellInit(lts) != 0) {
if (ltermShellInit(lts,0) != 0) {
GLOBAL_UNLOCK;
return -1;
}
@ -1188,38 +1202,56 @@ int lterm_read(int lterm, int timeout, UNICHAR *buf, int count,
}
/** Sends shell initialization string
/** Sends shell initialization commands, if any
* (WORKS UNDER GLOBAL_LOCK)
* @param all if true, send all init commands, else send just one command
* @return 0 on success and -1 on error.
*/
static int ltermShellInit(struct lterms *lts)
static int ltermShellInit(struct lterms *lts, int all)
{
int shellInitLen = strlen(lts->shellInitStr);
int shellInitLen, lowCommand, j;
if (lts->shellInitCommands <= 0)
return 0;
LTERM_LOG(ltermShellInit,20,("sending shell initialization string\n"));
lts->shellInitFlag = 1;
if (all) {
/* Send all commands */
lowCommand = 0;
} else {
/* Send single command */
lowCommand = lts->shellInitCommands - 1;
}
if (shellInitLen > 0) {
/* Send shell initialization string */
UNICHAR temLine[PIPEHEADER+MAXCOL];
int remaining, encoded, byteCount;
for (j=lts->shellInitCommands-1; j>=lowCommand; j--) {
/* Send shell init command and decrement count */
lts->shellInitCommands--;
utf8toucs(lts->shellInitStr, shellInitLen,
temLine+PIPEHEADER, MAXCOL,
1, &remaining, &encoded);
if (remaining > 0) {
LTERM_ERROR("ltermShellInit: Shell initialization string too long\n");
return -1;
}
shellInitLen = strlen(lts->shellInitStr[j]);
temLine[0] = (UNICHAR) encoded;
temLine[PHDR_TYPE] = (UNICHAR) LTERM_WRITE_PLAIN_INPUT;
byteCount = (PIPEHEADER+encoded)*sizeof(UNICHAR);
if (shellInitLen > 0) {
/* Send shell initialization string */
UNICHAR temLine[PIPEHEADER+MAXCOL];
int remaining, encoded, byteCount;
if (WRITE(lts->writeBUFFER, temLine, (SIZE_T)byteCount) != byteCount) {
LTERM_ERROR("ltermShellInit: Error in writing to input pipe buffer\n");
return -1;
utf8toucs(lts->shellInitStr[j], shellInitLen,
temLine+PIPEHEADER, MAXCOL,
1, &remaining, &encoded);
if (remaining > 0) {
LTERM_ERROR(
"ltermShellInit: Shell init command %d string too long\n", j+1);
return -1;
}
temLine[0] = (UNICHAR) encoded;
temLine[PHDR_TYPE] = (UNICHAR) LTERM_WRITE_PLAIN_INPUT;
byteCount = (PIPEHEADER+encoded)*sizeof(UNICHAR);
if (WRITE(lts->writeBUFFER, temLine, (SIZE_T)byteCount) != byteCount) {
LTERM_ERROR("ltermShellInit: Error in writing to input pipe buffer\n");
return -1;
}
}
}

View File

@ -228,10 +228,11 @@ typedef FILE FILESTREAM;
#define MAXPROMPT 256 /* Maximum length of prompt regexp+1 */
#define MAXRAWINCOMPLETE 5 /* Maximum incomplete raw buffer size */
#define MAXSTREAMTERM 11 /* Maximum stream terminator buffer size */
#define MAXSHELLINITSTR 256 /* Maximum length of shell init string+1 */
#define MAXCOOKIESTR 64 /* Maximum length of cookie string+1 */
#define MAXESCAPEPARAMS 16 /* Maximum no. of numeric ESCAPE parameters */
#define MAXSTRINGPARAM 512 /* Maximum length of string ESCAPE parameters */
#define MAXSHELLINITCMD 2 /* Maximum no. of shell init commands */
#define MAXSHELLINITSTR 256 /* Maximum length of shell init string+1 */
#define MAXPTYIN 128 /* 1/2 POSIX minimum MAX_INPUT for PTY */
@ -506,9 +507,9 @@ struct lterms {
JUST A LIST OF DELIMITERS AT PRESENT */
char cookie[MAXCOOKIESTR]; /* cookie string */
char shellInitStr[MAXSHELLINITSTR];
/* shell initialization string */
int shellInitFlag; /* shell initialization flag */
char shellInitStr[MAXSHELLINITCMD][MAXSHELLINITSTR];
/* shell initialization strings */
int shellInitCommands; /* shell init command count */
struct ptys pty; /* pseudo-tty (PTY) stream info for LTERM */
struct LtermProcess ltermProcess; /* LTERM process structure */

View File

@ -33,6 +33,9 @@ function StartupXMLTerm() {
window.xmlterm = xmltshell;
xmltwin.xmlterm = xmltshell;
if (window.arguments != null)
window.title = "xmlterm: "+window.arguments;
// Initialize XMLTerm shell in content window with argvals
window.xmlterm.Init(xmltwin, "", window.arguments);
}

View File

@ -34,6 +34,9 @@ DefineTip('Beginner level setting displays keyboard shortcuts at the top of the
DefineTip('Icons setting controls whether directory listings use icons',
'icons');
DefineTip('Windows setting controls whether double-clicking creates new windows',
'windows');
DefineTip('Single click an explicit (underlined) hyperlink; double click implicit (usually blue) hyperlinks',
'clicking');
@ -209,7 +212,6 @@ function NewXMLTerm(firstcommand) {
newwin = window.openDialog( "chrome://xmlterm/content/xmlterm.xul",
"xmlterm", "chrome,dialog=no,resizable",
firstcommand);
//newwin = window.xmlterm.NewXMLTermWindow(firstcommand);
dump("NewXMLTerm: "+newwin+"\n")
return (false);
}
@ -244,7 +246,7 @@ function UpdateSettings() {
var oldShowIcons = window.showIcons;
window.showIcons = document.xmltform1.icons.options[document.xmltform1.icons.selectedIndex].value;
//window.windowsMode = document.xmltform1.windows.options[document.xmltform1.windows.selectedIndex].value;
window.windowsMode = document.xmltform1.windows.options[document.xmltform1.windows.selectedIndex].value;
dump("UpdateSettings: userLevel="+window.userLevel+"\n");
dump("UpdateSettings: windowsMode="+window.windowsMode+"\n");
@ -475,9 +477,12 @@ function HandleEvent(eventObj, eventType, targetType, entryNumber,
var isCurrentCommand = (Math.abs(entryNumber)+1 ==
window.xmlterm.currentEntryNumber);
if (!isCurrentCommand && (arg2 != null)) {
if ( (arg2 != null) &&
(!isCurrentCommand || (window.windowsMode === "on")) ) {
// Full pathname
filename = arg2+arg1;
} else {
// Short pathname
filename = arg1;
if (targetType === "exec")
filename = "./"+filename;

View File

@ -18,7 +18,7 @@
<input type="button" value="New XMLTerm"
onClick="return NewXMLTerm('');">
<span class="helplink" onclick="return ExplainTip('level-setting');">
<span class="helplink" onclick="return ExplainTip('level');">
Level:</span>
<select name="level" size=1 onchange="return UpdateSettings();">
<option value="beginner">beginner</option>
@ -27,22 +27,20 @@
</select>
&nbsp;
<span class="helplink" onclick="return ExplainTip('icons-setting');">
<span class="helplink" onclick="return ExplainTip('icons');">
Icons:</span>
<select name="icons" size=1 onchange="return UpdateSettings();">
<option value="off" selected>off</option>
<option value="on">on</option>
</select>
<!--
&nbsp;
<span class="helplink" onclick="return ExplainTip('windows-setting');">
<span class="helplink" onclick="return ExplainTip('windows');">
Windows:</span>
<select name="windows" size=1 onchange="return UpdateSettings();">
<option value="off" selected>off</option>
<option value="on">on</option>
</select>
-->
<!--
<input type="button" value="Save Settings"

View File

@ -58,6 +58,20 @@
<p>
<a name='windows'></a>
<table class="tiptable" width='100%' height=120 frame=none border=0
cellpadding=0 cellspacing=0>
<tr><td>
<div class="tipelement">
The <b>windows</b> preference setting determines whether double-clicking
icons etc. executes commands in a new window (as in a GUI) or in the
same window (as in a CLI).
</div>
</table>
<p>
<a name='clicking'></a>
<table class="tiptable" width='100%' height=120 frame=none border=0
cellpadding=0 cellspacing=0>