@@ -169,7 +169,7 @@ initUI = () => {
169
169
document . body . innerHTML += `<section class="mod_column" id="mod_column_left">
170
170
<h3 class="title"><p>PANEL</p><p>SYSTEM</p></h3>
171
171
</section>
172
- <section id="main_shell" class="greeting" style="height:0%;width:0%;opacity:0;margin-bottom:30vh;">
172
+ <section id="main_shell" style="height:0%;width:0%;opacity:0;margin-bottom:30vh;">
173
173
<h3 class="title" style="opacity:0;"><p>TERMINAL</p><p>MAIN SHELL</p></h3>
174
174
<h1 id="main_shell_greeting"></h1>
175
175
</section>
@@ -272,15 +272,32 @@ initGreeter = () => {
272
272
setTimeout ( ( ) => {
273
273
greeter . remove ( ) ;
274
274
setTimeout ( ( ) => {
275
- shellContainer . innerHTML += `<pre id="terminal"></pre>` ;
276
- window . term = new Terminal ( {
277
- role : "client" ,
278
- parentId : "terminal" ,
279
- port : window . settings . port || 3000
280
- } ) ;
275
+ shellContainer . innerHTML += `
276
+ <ul id="main_shell_tabs">
277
+ <li id="shell_tab0" onclick="window.focusShellTab(0);" class="active">MAIN SHELL</li>
278
+ <li id="shell_tab1" onclick="window.focusShellTab(1);">EMPTY</li>
279
+ <li id="shell_tab2" onclick="window.focusShellTab(2);">EMPTY</li>
280
+ <li id="shell_tab3" onclick="window.focusShellTab(3);">EMPTY</li>
281
+ <li id="shell_tab4" onclick="window.focusShellTab(4);">EMPTY</li>
282
+ </ul>
283
+ <div id="main_shell_innercontainer">
284
+ <pre id="terminal0" class="active"></pre>
285
+ <pre id="terminal1"></pre>
286
+ <pre id="terminal2"></pre>
287
+ <pre id="terminal3"></pre>
288
+ <pre id="terminal4"></pre>
289
+ </div>` ;
290
+ window . term = {
291
+ 0 : new Terminal ( {
292
+ role : "client" ,
293
+ parentId : "terminal0" ,
294
+ port : window . settings . port || 3000
295
+ } )
296
+ } ;
297
+ window . currentTerm = 0 ;
281
298
// Prevent losing hardware keyboard focus on the terminal when using touch keyboard
282
299
window . onmouseup = ( e ) => {
283
- window . term . term . focus ( ) ;
300
+ window . term [ window . currentTerm ] . term . focus ( ) ;
284
301
} ;
285
302
286
303
window . fsDisp = new FilesystemDisplay ( {
@@ -298,6 +315,8 @@ initGreeter = () => {
298
315
} ;
299
316
300
317
window . themeChanger = ( theme ) => {
318
+ window . focusShellTab ( 0 ) ;
319
+
301
320
let src = path . join ( themesDir , theme + ".json" || settings . theme + ".json" ) ;
302
321
// Always get fresh theme files
303
322
delete require . cache [ src ] ;
@@ -309,30 +328,33 @@ window.themeChanger = (theme) => {
309
328
for ( let i ; i < 99999 ; i ++ ) {
310
329
clearInterval ( i ) ;
311
330
}
312
- window . term . socket . close ( ) ;
313
- delete window . term ;
331
+ window . term [ window . currentTerm ] . socket . close ( ) ;
332
+ delete window . term [ window . currentTerm ] ;
314
333
delete window . mods ;
315
334
delete window . fsDisp ;
316
335
317
- document . getElementById ( "terminal " ) . innerHTML = "" ;
336
+ document . getElementById ( "terminal0 " ) . innerHTML = "" ;
318
337
document . querySelectorAll ( ".mod_column" ) . forEach ( ( e ) => {
319
338
e . setAttribute ( "class" , "mod_column" ) ;
320
339
} ) ;
321
340
document . querySelectorAll ( ".mod_column > div" ) . forEach ( e => { e . remove ( ) } ) ;
322
341
document . querySelectorAll ( "div.smoothie-chart-tooltip" ) . forEach ( e => { e . remove ( ) } ) ;
323
342
324
- window . term = new Terminal ( {
325
- role : "client" ,
326
- parentId : "terminal" ,
327
- port : window . settings . port || 3000
328
- } ) ;
343
+ window . term = {
344
+ 0 : new Terminal ( {
345
+ role : "client" ,
346
+ parentId : "terminal0" ,
347
+ port : window . settings . port || 3000
348
+ } )
349
+ } ;
350
+ window . currentTerm = 0 ;
329
351
initMods ( ) ;
330
352
window . fsDisp = new FilesystemDisplay ( {
331
353
parentId : "filesystem"
332
354
} ) ;
333
355
334
356
setTimeout ( ( ) => {
335
- window . term . fit ( ) ;
357
+ window . term [ window . currentTerm ] . fit ( ) ;
336
358
} , 2700 ) ;
337
359
} ;
338
360
@@ -344,6 +366,67 @@ window.remakeKeyboard = (layout) => {
344
366
} ) ;
345
367
} ;
346
368
369
+ window . focusShellTab = ( number ) => {
370
+ if ( number !== window . currentTerm && window . term [ number ] ) {
371
+ window . currentTerm = number ;
372
+
373
+ document . querySelectorAll ( `ul#main_shell_tabs > li:not(:nth-child(${ number + 1 } ))` ) . forEach ( e => {
374
+ e . setAttribute ( "class" , "" ) ;
375
+ } ) ;
376
+ document . getElementById ( "shell_tab" + number ) . setAttribute ( "class" , "active" ) ;
377
+
378
+ document . querySelectorAll ( `div#main_shell_innercontainer > pre:not(:nth-child(${ number + 1 } ))` ) . forEach ( e => {
379
+ e . setAttribute ( "class" , "" ) ;
380
+ } ) ;
381
+ document . getElementById ( "terminal" + number ) . setAttribute ( "class" , "active" ) ;
382
+
383
+ window . term [ number ] . fit ( ) ;
384
+ window . term [ number ] . term . focus ( ) ;
385
+ window . term [ number ] . resendCWD ( ) ;
386
+ } else if ( number > 0 && number <= 4 && window . term [ number ] !== null ) {
387
+ window . term [ number ] = null ;
388
+
389
+ document . getElementById ( "shell_tab" + number ) . innerText = "LOADING..." ;
390
+ ipc . send ( "ttyspawn" , "true" ) ;
391
+ ipc . once ( "ttyspawn-reply" , ( e , r ) => {
392
+ if ( r . startsWith ( "ERROR" ) ) {
393
+ document . getElementById ( "shell_tab" + number ) . innerText = "ERROR" ;
394
+ } else if ( r . startsWith ( "SUCCESS" ) ) {
395
+ let port = Number ( r . substr ( 9 ) ) ;
396
+
397
+ window . term [ number ] = new Terminal ( {
398
+ role : "client" ,
399
+ parentId : "terminal" + number ,
400
+ port
401
+ } ) ;
402
+
403
+ window . term [ number ] . onclose = e => {
404
+ document . getElementById ( "shell_tab" + number ) . innerText = "EMPTY" ;
405
+ document . getElementById ( "terminal" + number ) . innerHTML = "" ;
406
+ delete window . term [ number ] ;
407
+ window . focusShellTab ( 0 ) ;
408
+ } ;
409
+
410
+ document . getElementById ( "shell_tab" + number ) . innerText = "::" + port ;
411
+ setTimeout ( ( ) => {
412
+ window . focusShellTab ( number ) ;
413
+ } , 500 ) ;
414
+ }
415
+ } ) ;
416
+ }
417
+ } ;
418
+
419
+ // Global keyboard shortcuts
420
+ const globalShortcut = electron . remote . globalShortcut ;
421
+ globalShortcut . register ( "CommandOrControl+Tab" , ( ) => {
422
+ if ( window . currentTerm <= 3 ) {
423
+ window . focusShellTab ( window . currentTerm + 1 ) ;
424
+ } else {
425
+ window . focusShellTab ( 0 ) ;
426
+ }
427
+ } ) ;
428
+
429
+
347
430
// Prevent showing menu, exiting fullscreen or app with keyboard shortcuts
348
431
window . onkeydown = e => {
349
432
if ( e . key === "Alt" ) {
@@ -362,3 +445,8 @@ window.onkeydown = e => {
362
445
363
446
// Fix double-tap zoom on touchscreens
364
447
require ( 'electron' ) . webFrame . setVisualZoomLevelLimits ( 1 , 1 ) ;
448
+
449
+ // Resize terminal with window
450
+ window . onresize = ( ) => {
451
+ window . term [ window . currentTerm ] . fit ( ) ;
452
+ }
0 commit comments