mirror of
				https://git.proxmox.com/git/mirror_xterm.js
				synced 2025-10-31 05:32:29 +00:00 
			
		
		
		
	Support more CSI codes, remove unused CSI helper functions
This commit is contained in:
		
							parent
							
								
									c7fa2d55b4
								
							
						
					
					
						commit
						db81c28bd7
					
				| @ -1,9 +1,14 @@ | ||||
| import { IInputHandler, ITerminal } from './Interfaces'; | ||||
| import { C0 } from './EscapeSequences'; | ||||
| 
 | ||||
| export class InputHandler implements IInputHandler { | ||||
|   // TODO: We want to type _terminal when it's pulled into TS
 | ||||
|   constructor(private _terminal: any) { } | ||||
| 
 | ||||
|   /** | ||||
|    * BEL | ||||
|    * Bell (Ctrl-G). | ||||
|    */ | ||||
|   public bell(): void { | ||||
|     if (!this._terminal.visualBell) { | ||||
|       return; | ||||
| @ -15,6 +20,10 @@ export class InputHandler implements IInputHandler { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * LF | ||||
|    * Line Feed or New Line (NL).  (LF  is Ctrl-J). | ||||
|    */ | ||||
|   public lineFeed(): void { | ||||
|     if (this._terminal.convertEol) { | ||||
|       this._terminal.x = 0; | ||||
| @ -26,28 +35,54 @@ export class InputHandler implements IInputHandler { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CR | ||||
|    * Carriage Return (Ctrl-M). | ||||
|    */ | ||||
|   public carriageReturn(): void { | ||||
|     this._terminal.x = 0; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * BS | ||||
|    * Backspace (Ctrl-H). | ||||
|    */ | ||||
|   public backspace(): void { | ||||
|     if (this._terminal.x > 0) { | ||||
|       this._terminal.x--; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * TAB | ||||
|    * Horizontal Tab (HT) (Ctrl-I). | ||||
|    */ | ||||
|   public tab(): void { | ||||
|     this._terminal.x = this._terminal.nextStop(); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * SO | ||||
|    * Shift Out (Ctrl-N) -> Switch to Alternate Character Set.  This invokes the | ||||
|    * G1 character set. | ||||
|    */ | ||||
|   public shiftOut(): void { | ||||
|     this._terminal.setgLevel(1); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * SI | ||||
|    * Shift In (Ctrl-O) -> Switch to Standard Character Set.  This invokes the G0 | ||||
|    * character set (the default). | ||||
|    */ | ||||
|   public shiftIn(): void { | ||||
|     this._terminal.setgLevel(0); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CSI Ps A | ||||
|    * Cursor Up Ps Times (default = 1) (CUU). | ||||
|    */ | ||||
|   public cursorUp(params: number[]): void { | ||||
|     let param = params[0]; | ||||
|     if (param < 1) { | ||||
| @ -59,6 +94,10 @@ export class InputHandler implements IInputHandler { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CSI Ps B | ||||
|    * Cursor Down Ps Times (default = 1) (CUD). | ||||
|    */ | ||||
|   public cursorDown(params: number[]) { | ||||
|     let param = params[0]; | ||||
|     if (param < 1) { | ||||
| @ -70,6 +109,10 @@ export class InputHandler implements IInputHandler { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CSI Ps C | ||||
|    * Cursor Forward Ps Times (default = 1) (CUF). | ||||
|    */ | ||||
|   public cursorForward(params: number[]) { | ||||
|     let param = params[0]; | ||||
|     if (param < 1) { | ||||
| @ -81,6 +124,10 @@ export class InputHandler implements IInputHandler { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CSI Ps D | ||||
|    * Cursor Backward Ps Times (default = 1) (CUB). | ||||
|    */ | ||||
|   public cursorBackward(params: number[]) { | ||||
|     let param = params[0]; | ||||
|     if (param < 1) { | ||||
| @ -91,4 +138,352 @@ export class InputHandler implements IInputHandler { | ||||
|       this._terminal.x = 0; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CSI Ps ; Ps H | ||||
|    * Cursor Position [row;column] (default = [1,1]) (CUP). | ||||
|    */ | ||||
|   public cursorPosition(params: number[]) { | ||||
|     let row, col; | ||||
| 
 | ||||
|     row = params[0] - 1; | ||||
| 
 | ||||
|     if (params.length >= 2) { | ||||
|       col = params[1] - 1; | ||||
|     } else { | ||||
|       col = 0; | ||||
|     } | ||||
| 
 | ||||
|     if (row < 0) { | ||||
|       row = 0; | ||||
|     } else if (row >= this._terminal.rows) { | ||||
|       row = this._terminal.rows - 1; | ||||
|     } | ||||
| 
 | ||||
|     if (col < 0) { | ||||
|       col = 0; | ||||
|     } else if (col >= this._terminal.cols) { | ||||
|       col = this._terminal.cols - 1; | ||||
|     } | ||||
| 
 | ||||
|     this._terminal.x = col; | ||||
|     this._terminal.y = row; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CSI Ps J  Erase in Display (ED). | ||||
|    *     Ps = 0  -> Erase Below (default). | ||||
|    *     Ps = 1  -> Erase Above. | ||||
|    *     Ps = 2  -> Erase All. | ||||
|    *     Ps = 3  -> Erase Saved Lines (xterm). | ||||
|    * CSI ? Ps J | ||||
|    *   Erase in Display (DECSED). | ||||
|    *     Ps = 0  -> Selective Erase Below (default). | ||||
|    *     Ps = 1  -> Selective Erase Above. | ||||
|    *     Ps = 2  -> Selective Erase All. | ||||
|    */ | ||||
|   public eraseInDisplay(params: number[]) { | ||||
|     let j; | ||||
|     switch (params[0]) { | ||||
|       case 0: | ||||
|         this._terminal.eraseRight(this._terminal.x, this._terminal.y); | ||||
|         j = this._terminal.y + 1; | ||||
|         for (; j < this._terminal.rows; j++) { | ||||
|           this._terminal.eraseLine(j); | ||||
|         } | ||||
|         break; | ||||
|       case 1: | ||||
|         this._terminal.eraseLeft(this._terminal.x, this._terminal.y); | ||||
|         j = this._terminal.y; | ||||
|         while (j--) { | ||||
|           this._terminal.eraseLine(j); | ||||
|         } | ||||
|         break; | ||||
|       case 2: | ||||
|         j = this._terminal.rows; | ||||
|         while (j--) this._terminal.eraseLine(j); | ||||
|         break; | ||||
|       case 3: | ||||
|         ; // no saved lines
 | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CSI Ps K  Erase in Line (EL). | ||||
|    *     Ps = 0  -> Erase to Right (default). | ||||
|    *     Ps = 1  -> Erase to Left. | ||||
|    *     Ps = 2  -> Erase All. | ||||
|    * CSI ? Ps K | ||||
|    *   Erase in Line (DECSEL). | ||||
|    *     Ps = 0  -> Selective Erase to Right (default). | ||||
|    *     Ps = 1  -> Selective Erase to Left. | ||||
|    *     Ps = 2  -> Selective Erase All. | ||||
|    */ | ||||
|   public eraseInLine(params: number[]) { | ||||
|     switch (params[0]) { | ||||
|       case 0: | ||||
|         this._terminal.eraseRight(this._terminal.x, this._terminal.y); | ||||
|         break; | ||||
|       case 1: | ||||
|         this._terminal.eraseLeft(this._terminal.x, this._terminal.y); | ||||
|         break; | ||||
|       case 2: | ||||
|         this._terminal.eraseLine(this._terminal.y); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CSI Pm m  Character Attributes (SGR). | ||||
|    *     Ps = 0  -> Normal (default). | ||||
|    *     Ps = 1  -> Bold. | ||||
|    *     Ps = 4  -> Underlined. | ||||
|    *     Ps = 5  -> Blink (appears as Bold). | ||||
|    *     Ps = 7  -> Inverse. | ||||
|    *     Ps = 8  -> Invisible, i.e., hidden (VT300). | ||||
|    *     Ps = 2 2  -> Normal (neither bold nor faint). | ||||
|    *     Ps = 2 4  -> Not underlined. | ||||
|    *     Ps = 2 5  -> Steady (not blinking). | ||||
|    *     Ps = 2 7  -> Positive (not inverse). | ||||
|    *     Ps = 2 8  -> Visible, i.e., not hidden (VT300). | ||||
|    *     Ps = 3 0  -> Set foreground color to Black. | ||||
|    *     Ps = 3 1  -> Set foreground color to Red. | ||||
|    *     Ps = 3 2  -> Set foreground color to Green. | ||||
|    *     Ps = 3 3  -> Set foreground color to Yellow. | ||||
|    *     Ps = 3 4  -> Set foreground color to Blue. | ||||
|    *     Ps = 3 5  -> Set foreground color to Magenta. | ||||
|    *     Ps = 3 6  -> Set foreground color to Cyan. | ||||
|    *     Ps = 3 7  -> Set foreground color to White. | ||||
|    *     Ps = 3 9  -> Set foreground color to default (original). | ||||
|    *     Ps = 4 0  -> Set background color to Black. | ||||
|    *     Ps = 4 1  -> Set background color to Red. | ||||
|    *     Ps = 4 2  -> Set background color to Green. | ||||
|    *     Ps = 4 3  -> Set background color to Yellow. | ||||
|    *     Ps = 4 4  -> Set background color to Blue. | ||||
|    *     Ps = 4 5  -> Set background color to Magenta. | ||||
|    *     Ps = 4 6  -> Set background color to Cyan. | ||||
|    *     Ps = 4 7  -> Set background color to White. | ||||
|    *     Ps = 4 9  -> Set background color to default (original). | ||||
|    * | ||||
|    *   If 16-color support is compiled, the following apply.  Assume | ||||
|    *   that xterm's resources are set so that the ISO color codes are | ||||
|    *   the first 8 of a set of 16.  Then the aixterm colors are the | ||||
|    *   bright versions of the ISO colors: | ||||
|    *     Ps = 9 0  -> Set foreground color to Black. | ||||
|    *     Ps = 9 1  -> Set foreground color to Red. | ||||
|    *     Ps = 9 2  -> Set foreground color to Green. | ||||
|    *     Ps = 9 3  -> Set foreground color to Yellow. | ||||
|    *     Ps = 9 4  -> Set foreground color to Blue. | ||||
|    *     Ps = 9 5  -> Set foreground color to Magenta. | ||||
|    *     Ps = 9 6  -> Set foreground color to Cyan. | ||||
|    *     Ps = 9 7  -> Set foreground color to White. | ||||
|    *     Ps = 1 0 0  -> Set background color to Black. | ||||
|    *     Ps = 1 0 1  -> Set background color to Red. | ||||
|    *     Ps = 1 0 2  -> Set background color to Green. | ||||
|    *     Ps = 1 0 3  -> Set background color to Yellow. | ||||
|    *     Ps = 1 0 4  -> Set background color to Blue. | ||||
|    *     Ps = 1 0 5  -> Set background color to Magenta. | ||||
|    *     Ps = 1 0 6  -> Set background color to Cyan. | ||||
|    *     Ps = 1 0 7  -> Set background color to White. | ||||
|    * | ||||
|    *   If xterm is compiled with the 16-color support disabled, it | ||||
|    *   supports the following, from rxvt: | ||||
|    *     Ps = 1 0 0  -> Set foreground and background color to | ||||
|    *     default. | ||||
|    * | ||||
|    *   If 88- or 256-color support is compiled, the following apply. | ||||
|    *     Ps = 3 8  ; 5  ; Ps -> Set foreground color to the second | ||||
|    *     Ps. | ||||
|    *     Ps = 4 8  ; 5  ; Ps -> Set background color to the second | ||||
|    *     Ps. | ||||
|    */ | ||||
|   public charAttributes(params: number[]) { | ||||
|     // Optimize a single SGR0.
 | ||||
|     if (params.length === 1 && params[0] === 0) { | ||||
|       this._terminal.curAttr = this._terminal.defAttr; | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     let l = params.length | ||||
|     , i = 0 | ||||
|     , flags = this._terminal.curAttr >> 18 | ||||
|     , fg = (this._terminal.curAttr >> 9) & 0x1ff | ||||
|     , bg = this._terminal.curAttr & 0x1ff | ||||
|     , p; | ||||
| 
 | ||||
|     for (; i < l; i++) { | ||||
|       p = params[i]; | ||||
|       if (p >= 30 && p <= 37) { | ||||
|         // fg color 8
 | ||||
|         fg = p - 30; | ||||
|       } else if (p >= 40 && p <= 47) { | ||||
|         // bg color 8
 | ||||
|         bg = p - 40; | ||||
|       } else if (p >= 90 && p <= 97) { | ||||
|         // fg color 16
 | ||||
|         p += 8; | ||||
|         fg = p - 90; | ||||
|       } else if (p >= 100 && p <= 107) { | ||||
|         // bg color 16
 | ||||
|         p += 8; | ||||
|         bg = p - 100; | ||||
|       } else if (p === 0) { | ||||
|         // default
 | ||||
|         flags = this._terminal.defAttr >> 18; | ||||
|         fg = (this._terminal.defAttr >> 9) & 0x1ff; | ||||
|         bg = this._terminal.defAttr & 0x1ff; | ||||
|         // flags = 0;
 | ||||
|         // fg = 0x1ff;
 | ||||
|         // bg = 0x1ff;
 | ||||
|       } else if (p === 1) { | ||||
|         // bold text
 | ||||
|         flags |= 1; | ||||
|       } else if (p === 4) { | ||||
|         // underlined text
 | ||||
|         flags |= 2; | ||||
|       } else if (p === 5) { | ||||
|         // blink
 | ||||
|         flags |= 4; | ||||
|       } else if (p === 7) { | ||||
|         // inverse and positive
 | ||||
|         // test with: echo -e '\e[31m\e[42mhello\e[7mworld\e[27mhi\e[m'
 | ||||
|         flags |= 8; | ||||
|       } else if (p === 8) { | ||||
|         // invisible
 | ||||
|         flags |= 16; | ||||
|       } else if (p === 22) { | ||||
|         // not bold
 | ||||
|         flags &= ~1; | ||||
|       } else if (p === 24) { | ||||
|         // not underlined
 | ||||
|         flags &= ~2; | ||||
|       } else if (p === 25) { | ||||
|         // not blink
 | ||||
|         flags &= ~4; | ||||
|       } else if (p === 27) { | ||||
|         // not inverse
 | ||||
|         flags &= ~8; | ||||
|       } else if (p === 28) { | ||||
|         // not invisible
 | ||||
|         flags &= ~16; | ||||
|       } else if (p === 39) { | ||||
|         // reset fg
 | ||||
|         fg = (this._terminal.defAttr >> 9) & 0x1ff; | ||||
|       } else if (p === 49) { | ||||
|         // reset bg
 | ||||
|         bg = this._terminal.defAttr & 0x1ff; | ||||
|       } else if (p === 38) { | ||||
|         // fg color 256
 | ||||
|         if (params[i + 1] === 2) { | ||||
|           i += 2; | ||||
|           fg = this._terminal.matchColor( | ||||
|             params[i] & 0xff, | ||||
|             params[i + 1] & 0xff, | ||||
|             params[i + 2] & 0xff); | ||||
|           if (fg === -1) fg = 0x1ff; | ||||
|           i += 2; | ||||
|         } else if (params[i + 1] === 5) { | ||||
|           i += 2; | ||||
|           p = params[i] & 0xff; | ||||
|           fg = p; | ||||
|         } | ||||
|       } else if (p === 48) { | ||||
|         // bg color 256
 | ||||
|         if (params[i + 1] === 2) { | ||||
|           i += 2; | ||||
|           bg = this._terminal.matchColor( | ||||
|             params[i] & 0xff, | ||||
|             params[i + 1] & 0xff, | ||||
|             params[i + 2] & 0xff); | ||||
|           if (bg === -1) bg = 0x1ff; | ||||
|           i += 2; | ||||
|         } else if (params[i + 1] === 5) { | ||||
|           i += 2; | ||||
|           p = params[i] & 0xff; | ||||
|           bg = p; | ||||
|         } | ||||
|       } else if (p === 100) { | ||||
|         // reset fg/bg
 | ||||
|         fg = (this._terminal.defAttr >> 9) & 0x1ff; | ||||
|         bg = this._terminal.defAttr & 0x1ff; | ||||
|       } else { | ||||
|         this._terminal.error('Unknown SGR attribute: %d.', p); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     this._terminal.curAttr = (flags << 18) | (fg << 9) | bg; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * CSI Ps n  Device Status Report (DSR). | ||||
|    *     Ps = 5  -> Status Report.  Result (``OK'') is | ||||
|    *   CSI 0 n | ||||
|    *     Ps = 6  -> Report Cursor Position (CPR) [row;column]. | ||||
|    *   Result is | ||||
|    *   CSI r ; c R | ||||
|    * CSI ? Ps n | ||||
|    *   Device Status Report (DSR, DEC-specific). | ||||
|    *     Ps = 6  -> Report Cursor Position (CPR) [row;column] as CSI | ||||
|    *     ? r ; c R (assumes page is zero). | ||||
|    *     Ps = 1 5  -> Report Printer status as CSI ? 1 0  n  (ready). | ||||
|    *     or CSI ? 1 1  n  (not ready). | ||||
|    *     Ps = 2 5  -> Report UDK status as CSI ? 2 0  n  (unlocked) | ||||
|    *     or CSI ? 2 1  n  (locked). | ||||
|    *     Ps = 2 6  -> Report Keyboard status as | ||||
|    *   CSI ? 2 7  ;  1  ;  0  ;  0  n  (North American). | ||||
|    *   The last two parameters apply to VT400 & up, and denote key- | ||||
|    *   board ready and LK01 respectively. | ||||
|    *     Ps = 5 3  -> Report Locator status as | ||||
|    *   CSI ? 5 3  n  Locator available, if compiled-in, or | ||||
|    *   CSI ? 5 0  n  No Locator, if not. | ||||
|    */ | ||||
|   public deviceStatus(params: number[]) { | ||||
|     if (!this._terminal.prefix) { | ||||
|       switch (params[0]) { | ||||
|         case 5: | ||||
|           // status report
 | ||||
|           this._terminal.send(C0.ESC + '[0n'); | ||||
|           break; | ||||
|         case 6: | ||||
|           // cursor position
 | ||||
|           this._terminal.send(C0.ESC + '[' | ||||
|                     + (this._terminal.y + 1) | ||||
|                     + ';' | ||||
|                     + (this._terminal.x + 1) | ||||
|                     + 'R'); | ||||
|           break; | ||||
|       } | ||||
|     } else if (this._terminal.prefix === '?') { | ||||
|       // modern xterm doesnt seem to
 | ||||
|       // respond to any of these except ?6, 6, and 5
 | ||||
|       switch (params[0]) { | ||||
|         case 6: | ||||
|           // cursor position
 | ||||
|           this._terminal.send(C0.ESC + '[?' | ||||
|                     + (this._terminal.y + 1) | ||||
|                     + ';' | ||||
|                     + (this._terminal.x + 1) | ||||
|                     + 'R'); | ||||
|           break; | ||||
|         case 15: | ||||
|           // no printer
 | ||||
|           // this.send(C0.ESC + '[?11n');
 | ||||
|           break; | ||||
|         case 25: | ||||
|           // dont support user defined keys
 | ||||
|           // this.send(C0.ESC + '[?21n');
 | ||||
|           break; | ||||
|         case 26: | ||||
|           // north american keyboard
 | ||||
|           // this.send(C0.ESC + '[?27;1;0;0n');
 | ||||
|           break; | ||||
|         case 53: | ||||
|           // no dec locator/mouse
 | ||||
|           // this.send(C0.ESC + '[?50n');
 | ||||
|           break; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -44,9 +44,13 @@ export interface IInputHandler { | ||||
|   tab(): void; | ||||
|   shiftOut(): void; | ||||
|   shiftIn(): void; | ||||
|   // TODO: Make IInputHandler parameter names more friendly? (ie. cursorUp(amount: number))
 | ||||
|   cursorUp(params: number[]): void; | ||||
|   cursorDown(params: number[]); | ||||
|   cursorForward(params: number[]); | ||||
|   cursorBackward(params: number[]); | ||||
|   cursorPosition(params: number[]); | ||||
|   eraseInDisplay(params: number[]); | ||||
|   eraseInLine(params: number[]); | ||||
|   charAttributes(params: number[]); | ||||
|   deviceStatus(params: number[]); | ||||
| } | ||||
|  | ||||
| @ -39,6 +39,11 @@ csiStateHandler['A'] = (handler, params) => handler.cursorUp(params); | ||||
| csiStateHandler['B'] = (handler, params) => handler.cursorDown(params); | ||||
| csiStateHandler['C'] = (handler, params) => handler.cursorForward(params); | ||||
| csiStateHandler['D'] = (handler, params) => handler.cursorBackward(params); | ||||
| csiStateHandler['H'] = (handler, params) => handler.cursorPosition(params); | ||||
| csiStateHandler['J'] = (handler, params) => handler.eraseInDisplay(params); | ||||
| csiStateHandler['K'] = (handler, params) => handler.eraseInLine(params); | ||||
| csiStateHandler['m'] = (handler, params) => handler.charAttributes(params); | ||||
| csiStateHandler['n'] = (handler, params) => handler.deviceStatus(params); | ||||
| 
 | ||||
| enum ParserState { | ||||
|   NORMAL = 0, | ||||
| @ -533,35 +538,6 @@ export class Parser { | ||||
|           } | ||||
| 
 | ||||
|           switch (ch) { | ||||
|             // CSI Ps ; Ps H
 | ||||
|             // Cursor Position [row;column] (default = [1,1]) (CUP).
 | ||||
|             case 'H': | ||||
|               this._terminal.cursorPos(this._terminal.params); | ||||
|               break; | ||||
| 
 | ||||
|             // CSI Ps J  Erase in Display (ED).
 | ||||
|             case 'J': | ||||
|               this._terminal.eraseInDisplay(this._terminal.params); | ||||
|               break; | ||||
| 
 | ||||
|             // CSI Ps K  Erase in Line (EL).
 | ||||
|             case 'K': | ||||
|               this._terminal.eraseInLine(this._terminal.params); | ||||
|               break; | ||||
| 
 | ||||
|             // CSI Pm m  Character Attributes (SGR).
 | ||||
|             case 'm': | ||||
|               if (!this._terminal.prefix) { | ||||
|                 this._terminal.charAttributes(this._terminal.params); | ||||
|               } | ||||
|               break; | ||||
| 
 | ||||
|             // CSI Ps n  Device Status Report (DSR).
 | ||||
|             case 'n': | ||||
|               if (!this._terminal.prefix) { | ||||
|                 this._terminal.deviceStatus(this._terminal.params); | ||||
|               } | ||||
|               break; | ||||
| 
 | ||||
|               /** | ||||
|                * Additions | ||||
|  | ||||
							
								
								
									
										355
									
								
								src/xterm.js
									
									
									
									
									
								
							
							
						
						
									
										355
									
								
								src/xterm.js
									
									
									
									
									
								
							| @ -2223,358 +2223,6 @@ Terminal.prototype.tabSet = function() { | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * CSI Ps ; Ps H | ||||
|  * Cursor Position [row;column] (default = [1,1]) (CUP). | ||||
|  */ | ||||
| Terminal.prototype.cursorPos = function(params) { | ||||
|   var row, col; | ||||
| 
 | ||||
|   row = params[0] - 1; | ||||
| 
 | ||||
|   if (params.length >= 2) { | ||||
|     col = params[1] - 1; | ||||
|   } else { | ||||
|     col = 0; | ||||
|   } | ||||
| 
 | ||||
|   if (row < 0) { | ||||
|     row = 0; | ||||
|   } else if (row >= this.rows) { | ||||
|     row = this.rows - 1; | ||||
|   } | ||||
| 
 | ||||
|   if (col < 0) { | ||||
|     col = 0; | ||||
|   } else if (col >= this.cols) { | ||||
|     col = this.cols - 1; | ||||
|   } | ||||
| 
 | ||||
|   this.x = col; | ||||
|   this.y = row; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * CSI Ps J  Erase in Display (ED). | ||||
|  *     Ps = 0  -> Erase Below (default). | ||||
|  *     Ps = 1  -> Erase Above. | ||||
|  *     Ps = 2  -> Erase All. | ||||
|  *     Ps = 3  -> Erase Saved Lines (xterm). | ||||
|  * CSI ? Ps J | ||||
|  *   Erase in Display (DECSED). | ||||
|  *     Ps = 0  -> Selective Erase Below (default). | ||||
|  *     Ps = 1  -> Selective Erase Above. | ||||
|  *     Ps = 2  -> Selective Erase All. | ||||
|  */ | ||||
| Terminal.prototype.eraseInDisplay = function(params) { | ||||
|   var j; | ||||
|   switch (params[0]) { | ||||
|     case 0: | ||||
|       this.eraseRight(this.x, this.y); | ||||
|       j = this.y + 1; | ||||
|       for (; j < this.rows; j++) { | ||||
|         this.eraseLine(j); | ||||
|       } | ||||
|       break; | ||||
|     case 1: | ||||
|       this.eraseLeft(this.x, this.y); | ||||
|       j = this.y; | ||||
|       while (j--) { | ||||
|         this.eraseLine(j); | ||||
|       } | ||||
|       break; | ||||
|     case 2: | ||||
|       j = this.rows; | ||||
|       while (j--) this.eraseLine(j); | ||||
|       break; | ||||
|     case 3: | ||||
|       ; // no saved lines
 | ||||
|       break; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * CSI Ps K  Erase in Line (EL). | ||||
|  *     Ps = 0  -> Erase to Right (default). | ||||
|  *     Ps = 1  -> Erase to Left. | ||||
|  *     Ps = 2  -> Erase All. | ||||
|  * CSI ? Ps K | ||||
|  *   Erase in Line (DECSEL). | ||||
|  *     Ps = 0  -> Selective Erase to Right (default). | ||||
|  *     Ps = 1  -> Selective Erase to Left. | ||||
|  *     Ps = 2  -> Selective Erase All. | ||||
|  */ | ||||
| Terminal.prototype.eraseInLine = function(params) { | ||||
|   switch (params[0]) { | ||||
|     case 0: | ||||
|       this.eraseRight(this.x, this.y); | ||||
|       break; | ||||
|     case 1: | ||||
|       this.eraseLeft(this.x, this.y); | ||||
|       break; | ||||
|     case 2: | ||||
|       this.eraseLine(this.y); | ||||
|       break; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * CSI Pm m  Character Attributes (SGR). | ||||
|  *     Ps = 0  -> Normal (default). | ||||
|  *     Ps = 1  -> Bold. | ||||
|  *     Ps = 4  -> Underlined. | ||||
|  *     Ps = 5  -> Blink (appears as Bold). | ||||
|  *     Ps = 7  -> Inverse. | ||||
|  *     Ps = 8  -> Invisible, i.e., hidden (VT300). | ||||
|  *     Ps = 2 2  -> Normal (neither bold nor faint). | ||||
|  *     Ps = 2 4  -> Not underlined. | ||||
|  *     Ps = 2 5  -> Steady (not blinking). | ||||
|  *     Ps = 2 7  -> Positive (not inverse). | ||||
|  *     Ps = 2 8  -> Visible, i.e., not hidden (VT300). | ||||
|  *     Ps = 3 0  -> Set foreground color to Black. | ||||
|  *     Ps = 3 1  -> Set foreground color to Red. | ||||
|  *     Ps = 3 2  -> Set foreground color to Green. | ||||
|  *     Ps = 3 3  -> Set foreground color to Yellow. | ||||
|  *     Ps = 3 4  -> Set foreground color to Blue. | ||||
|  *     Ps = 3 5  -> Set foreground color to Magenta. | ||||
|  *     Ps = 3 6  -> Set foreground color to Cyan. | ||||
|  *     Ps = 3 7  -> Set foreground color to White. | ||||
|  *     Ps = 3 9  -> Set foreground color to default (original). | ||||
|  *     Ps = 4 0  -> Set background color to Black. | ||||
|  *     Ps = 4 1  -> Set background color to Red. | ||||
|  *     Ps = 4 2  -> Set background color to Green. | ||||
|  *     Ps = 4 3  -> Set background color to Yellow. | ||||
|  *     Ps = 4 4  -> Set background color to Blue. | ||||
|  *     Ps = 4 5  -> Set background color to Magenta. | ||||
|  *     Ps = 4 6  -> Set background color to Cyan. | ||||
|  *     Ps = 4 7  -> Set background color to White. | ||||
|  *     Ps = 4 9  -> Set background color to default (original). | ||||
|  * | ||||
|  *   If 16-color support is compiled, the following apply.  Assume | ||||
|  *   that xterm's resources are set so that the ISO color codes are | ||||
|  *   the first 8 of a set of 16.  Then the aixterm colors are the | ||||
|  *   bright versions of the ISO colors: | ||||
|  *     Ps = 9 0  -> Set foreground color to Black. | ||||
|  *     Ps = 9 1  -> Set foreground color to Red. | ||||
|  *     Ps = 9 2  -> Set foreground color to Green. | ||||
|  *     Ps = 9 3  -> Set foreground color to Yellow. | ||||
|  *     Ps = 9 4  -> Set foreground color to Blue. | ||||
|  *     Ps = 9 5  -> Set foreground color to Magenta. | ||||
|  *     Ps = 9 6  -> Set foreground color to Cyan. | ||||
|  *     Ps = 9 7  -> Set foreground color to White. | ||||
|  *     Ps = 1 0 0  -> Set background color to Black. | ||||
|  *     Ps = 1 0 1  -> Set background color to Red. | ||||
|  *     Ps = 1 0 2  -> Set background color to Green. | ||||
|  *     Ps = 1 0 3  -> Set background color to Yellow. | ||||
|  *     Ps = 1 0 4  -> Set background color to Blue. | ||||
|  *     Ps = 1 0 5  -> Set background color to Magenta. | ||||
|  *     Ps = 1 0 6  -> Set background color to Cyan. | ||||
|  *     Ps = 1 0 7  -> Set background color to White. | ||||
|  * | ||||
|  *   If xterm is compiled with the 16-color support disabled, it | ||||
|  *   supports the following, from rxvt: | ||||
|  *     Ps = 1 0 0  -> Set foreground and background color to | ||||
|  *     default. | ||||
|  * | ||||
|  *   If 88- or 256-color support is compiled, the following apply. | ||||
|  *     Ps = 3 8  ; 5  ; Ps -> Set foreground color to the second | ||||
|  *     Ps. | ||||
|  *     Ps = 4 8  ; 5  ; Ps -> Set background color to the second | ||||
|  *     Ps. | ||||
|  */ | ||||
| Terminal.prototype.charAttributes = function(params) { | ||||
|   // Optimize a single SGR0.
 | ||||
|   if (params.length === 1 && params[0] === 0) { | ||||
|     this.curAttr = this.defAttr; | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   var l = params.length | ||||
|   , i = 0 | ||||
|   , flags = this.curAttr >> 18 | ||||
|   , fg = (this.curAttr >> 9) & 0x1ff | ||||
|   , bg = this.curAttr & 0x1ff | ||||
|   , p; | ||||
| 
 | ||||
|   for (; i < l; i++) { | ||||
|     p = params[i]; | ||||
|     if (p >= 30 && p <= 37) { | ||||
|       // fg color 8
 | ||||
|       fg = p - 30; | ||||
|     } else if (p >= 40 && p <= 47) { | ||||
|       // bg color 8
 | ||||
|       bg = p - 40; | ||||
|     } else if (p >= 90 && p <= 97) { | ||||
|       // fg color 16
 | ||||
|       p += 8; | ||||
|       fg = p - 90; | ||||
|     } else if (p >= 100 && p <= 107) { | ||||
|       // bg color 16
 | ||||
|       p += 8; | ||||
|       bg = p - 100; | ||||
|     } else if (p === 0) { | ||||
|       // default
 | ||||
|       flags = this.defAttr >> 18; | ||||
|       fg = (this.defAttr >> 9) & 0x1ff; | ||||
|       bg = this.defAttr & 0x1ff; | ||||
|       // flags = 0;
 | ||||
|       // fg = 0x1ff;
 | ||||
|       // bg = 0x1ff;
 | ||||
|     } else if (p === 1) { | ||||
|       // bold text
 | ||||
|       flags |= 1; | ||||
|     } else if (p === 4) { | ||||
|       // underlined text
 | ||||
|       flags |= 2; | ||||
|     } else if (p === 5) { | ||||
|       // blink
 | ||||
|       flags |= 4; | ||||
|     } else if (p === 7) { | ||||
|       // inverse and positive
 | ||||
|       // test with: echo -e '\e[31m\e[42mhello\e[7mworld\e[27mhi\e[m'
 | ||||
|       flags |= 8; | ||||
|     } else if (p === 8) { | ||||
|       // invisible
 | ||||
|       flags |= 16; | ||||
|     } else if (p === 22) { | ||||
|       // not bold
 | ||||
|       flags &= ~1; | ||||
|     } else if (p === 24) { | ||||
|       // not underlined
 | ||||
|       flags &= ~2; | ||||
|     } else if (p === 25) { | ||||
|       // not blink
 | ||||
|       flags &= ~4; | ||||
|     } else if (p === 27) { | ||||
|       // not inverse
 | ||||
|       flags &= ~8; | ||||
|     } else if (p === 28) { | ||||
|       // not invisible
 | ||||
|       flags &= ~16; | ||||
|     } else if (p === 39) { | ||||
|       // reset fg
 | ||||
|       fg = (this.defAttr >> 9) & 0x1ff; | ||||
|     } else if (p === 49) { | ||||
|       // reset bg
 | ||||
|       bg = this.defAttr & 0x1ff; | ||||
|     } else if (p === 38) { | ||||
|       // fg color 256
 | ||||
|       if (params[i + 1] === 2) { | ||||
|         i += 2; | ||||
|         fg = matchColor( | ||||
|           params[i] & 0xff, | ||||
|           params[i + 1] & 0xff, | ||||
|           params[i + 2] & 0xff); | ||||
|         if (fg === -1) fg = 0x1ff; | ||||
|         i += 2; | ||||
|       } else if (params[i + 1] === 5) { | ||||
|         i += 2; | ||||
|         p = params[i] & 0xff; | ||||
|         fg = p; | ||||
|       } | ||||
|     } else if (p === 48) { | ||||
|       // bg color 256
 | ||||
|       if (params[i + 1] === 2) { | ||||
|         i += 2; | ||||
|         bg = matchColor( | ||||
|           params[i] & 0xff, | ||||
|           params[i + 1] & 0xff, | ||||
|           params[i + 2] & 0xff); | ||||
|         if (bg === -1) bg = 0x1ff; | ||||
|         i += 2; | ||||
|       } else if (params[i + 1] === 5) { | ||||
|         i += 2; | ||||
|         p = params[i] & 0xff; | ||||
|         bg = p; | ||||
|       } | ||||
|     } else if (p === 100) { | ||||
|       // reset fg/bg
 | ||||
|       fg = (this.defAttr >> 9) & 0x1ff; | ||||
|       bg = this.defAttr & 0x1ff; | ||||
|     } else { | ||||
|       this.error('Unknown SGR attribute: %d.', p); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   this.curAttr = (flags << 18) | (fg << 9) | bg; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * CSI Ps n  Device Status Report (DSR). | ||||
|  *     Ps = 5  -> Status Report.  Result (``OK'') is | ||||
|  *   CSI 0 n | ||||
|  *     Ps = 6  -> Report Cursor Position (CPR) [row;column]. | ||||
|  *   Result is | ||||
|  *   CSI r ; c R | ||||
|  * CSI ? Ps n | ||||
|  *   Device Status Report (DSR, DEC-specific). | ||||
|  *     Ps = 6  -> Report Cursor Position (CPR) [row;column] as CSI | ||||
|  *     ? r ; c R (assumes page is zero). | ||||
|  *     Ps = 1 5  -> Report Printer status as CSI ? 1 0  n  (ready). | ||||
|  *     or CSI ? 1 1  n  (not ready). | ||||
|  *     Ps = 2 5  -> Report UDK status as CSI ? 2 0  n  (unlocked) | ||||
|  *     or CSI ? 2 1  n  (locked). | ||||
|  *     Ps = 2 6  -> Report Keyboard status as | ||||
|  *   CSI ? 2 7  ;  1  ;  0  ;  0  n  (North American). | ||||
|  *   The last two parameters apply to VT400 & up, and denote key- | ||||
|  *   board ready and LK01 respectively. | ||||
|  *     Ps = 5 3  -> Report Locator status as | ||||
|  *   CSI ? 5 3  n  Locator available, if compiled-in, or | ||||
|  *   CSI ? 5 0  n  No Locator, if not. | ||||
|  */ | ||||
| Terminal.prototype.deviceStatus = function(params) { | ||||
|   if (!this.prefix) { | ||||
|     switch (params[0]) { | ||||
|       case 5: | ||||
|         // status report
 | ||||
|         this.send(C0.ESC + '[0n'); | ||||
|         break; | ||||
|       case 6: | ||||
|         // cursor position
 | ||||
|         this.send(C0.ESC + '[' | ||||
|                   + (this.y + 1) | ||||
|                   + ';' | ||||
|                   + (this.x + 1) | ||||
|                   + 'R'); | ||||
|         break; | ||||
|     } | ||||
|   } else if (this.prefix === '?') { | ||||
|     // modern xterm doesnt seem to
 | ||||
|     // respond to any of these except ?6, 6, and 5
 | ||||
|     switch (params[0]) { | ||||
|       case 6: | ||||
|         // cursor position
 | ||||
|         this.send(C0.ESC + '[?' | ||||
|                   + (this.y + 1) | ||||
|                   + ';' | ||||
|                   + (this.x + 1) | ||||
|                   + 'R'); | ||||
|         break; | ||||
|       case 15: | ||||
|         // no printer
 | ||||
|         // this.send(C0.ESC + '[?11n');
 | ||||
|         break; | ||||
|       case 25: | ||||
|         // dont support user defined keys
 | ||||
|         // this.send(C0.ESC + '[?21n');
 | ||||
|         break; | ||||
|       case 26: | ||||
|         // north american keyboard
 | ||||
|         // this.send(C0.ESC + '[?27;1;0;0n');
 | ||||
|         break; | ||||
|       case 53: | ||||
|         // no dec locator/mouse
 | ||||
|         // this.send(C0.ESC + '[?50n');
 | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * Additions | ||||
|  */ | ||||
| @ -3849,6 +3497,9 @@ function isThirdLevelShift(term, ev) { | ||||
|   return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47); | ||||
| } | ||||
| 
 | ||||
| // Expose to InputHandler (temporary)
 | ||||
| Terminal.prototype.matchColor = matchColor; | ||||
| 
 | ||||
| function matchColor(r1, g1, b1) { | ||||
|   var hash = (r1 << 16) | (g1 << 8) | b1; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Daniel Imms
						Daniel Imms