Create your own terminal window

This snippet exists with thanks to the suggestions from many people.
Normally one uses the Igor command line to call user defined functions and Igor+XOP Operations and functions. However, there is no way (AFAIK) of having a user defined operation from the command line. i.e. the user defined function must always be of the form "myfunc(arg1, arg2)" instead of "myop arg1 arg1".

Where this becomes interesting is when you are talking to something like a network server, or an acquisition device. Normally they have their own command set. One would wish to issue that command directly from a terminal instead of wrapping it up into a user function, i.e. why can't I write:
>drive ss2vg 10
instead of always having to write:
>sendmymessage("drive ss2vg 10")

The following code snippet implements a really simple terminal window. In this you type commands into the notebook window, on pressing return the commands are executed. If you wanted to make this act as a terminal for a device instead of the Execute/z/q line you could substitute the code that deals with your device, i.e. sendmymessage(S_Selection). All you have to do then is intercept the incoming messages and display them in the notebook. I leave that as an exercise for the reader (which is what people always say when they don't want to deal with that).


#pragma rtGlobals=1		// Use modern global access method.

Menu "Macros"
	"Terminal Window/2", TerminalWIndow()
End

Function TerminalCmdHook(s)
	STRUCT WMWinHookStruct &s
	Variable statusCode = 0
	
	String platform= UpperStr(igorinfo(2))
	string cmdChar, temp
	if(stringmatch(platform,"MACINTOSH"))
		cmdChar = num2char(-91)
	else
		cmdChar = num2char(-107)	
	endif
		
	strswitch(s.winname)
		case "Terminal#TerminalNB":
			switch(s.eventCode)
				case 11: // Keyboard
					switch (s.keycode)
						case 30:
							notebook $s.winname, findtext={cmdChar, 2^4+2^0}
							notebook $s.winname, selection={startOfParagraph, endOfParagraph}
							statuscode=1
							break
						case 31:
							notebook $s.winname, findtext={cmdChar, 2^0}
							notebook $s.winname, selection={startOfParagraph, endOfParagraph}
							statuscode=1
							break
						case 13:
							notebook $s.winname, selection={startOfParagraph, endOfParagraph}
							notebook $s.winname, textRGB=(0, 0,  65535), fstyle=1, fsize=8
							getselection notebook, $s.winname, 2
							execute/q/z S_Selection

							if(strlen(S_Selection) > 0 && (!stringmatch(S_Selection, "\r")) )
								temp = ""
								notebook $s.winname, selection={startofparagraph, endofparagraph}
								if(!Stringmatch(S_Selection[0], cmdchar))
									temp = cmdChar
								endif
								temp += S_Selection
								if(!Stringmatch(S_Selection[strlen(S_Selection)-1],"\r"))
									temp +="\r"
								endif
								notebook $s.winname, text = temp
							endif
//							if(strlen(S_Selection)>0)
//								notebookaction/w=$s.winname commands=S_Selection, frame=1,ignoreerrors=1, title=S_Selection 
//							endif
							notebook $s.winname, selection={endofparagraph,startofnextparagraph}
							notebook $s.winname, textRGB=(0, 0, 0)
							statuscode=1
							break
					endswitch
			endswitch
			break
	endswitch

	return statusCode
	// 0 if nothing done, else 1
End

Function TerminalWindow()
	DoWindow/F Terminal
	if (V_flag != 0)
		return -1
	endif

	NewPanel /W=(68, 50, 360, 500) /K=1 /N=Terminal
	SetWindow kwTopWin, hook(Hook1)=TerminalCmdHook

	NewNotebook /F=1 /N=TerminalNB/W=(10, 27, 290, 490) /HOST=#
	Notebook kwTopWin, defaultTab=20, statusWidth=0, autoSave=1, showRuler=0, rulerUnits=1
	SetActiveSubwindow ##

	return 0
End
I like this, I learned a lot about using the Notebook commands. Suggestion for the commented-out section:

if( strlen(S_Selection) > 0 && s.eventMod & 2 ) // restrict to the case where Shift was pressed
   temp = S_Selection[1,strlen(S_Selection)-2]  // remove cmdChar and trailing "\r"
   notebookaction/w=$s.winname commands=temp, frame=1, ignoreerrors=1, title=temp
   notebook $s.winname, text = "\r"  // add new line character
endif

Wolfgang Harneit

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More