mirror of
https://codeberg.org/TicklishHoneyBee/CLIte.git
synced 2026-03-11 09:04:37 +00:00
terminal scrolling headaches
This commit is contained in:
parent
ded2aa9739
commit
7fcd7a0694
3 changed files with 120 additions and 92 deletions
|
|
@ -1,15 +1,16 @@
|
|||
html,body {margin:0; padding:0; overflow:auto; width:100%; height:100%; background-color:#000000; color:#FFFFFF; font-family:monospace; font-size:14px;}
|
||||
body {display:flex; flex-direction: column;}
|
||||
html,body {margin:0; padding:0; overflow:hidden; width:100%; height:100%; max-height:100%; background-color:#000000; color:#FFFFFF; font-family:monospace; font-size:14px;}
|
||||
body {display:flex; flex-direction:column;}
|
||||
|
||||
div, header, section, article, p, form, h1 {display:block; margin:0; padding:0;}
|
||||
header {padding:10px;}
|
||||
header h1 {line-height:40px; font-size:30px;}
|
||||
section {}
|
||||
section.content {flex-grow:1;}
|
||||
section.content div#terminal {width:100%; min-width: 500px; max-width:1000px; margin:0 auto; overflow:hidden; height:100%; min-height:100px;}
|
||||
section.content article {unicode-bidi: embed; white-space: pre;}
|
||||
section.content form {}
|
||||
section.content form label, section.content form input, section.content form input:focus {display:block; float:left; border:none; margin:0; padding:0; font-family:monospace; font-size:14px; line-height:20px; background-color:#000000; color:#FFFFFF; outline:none;}
|
||||
section.content {position:relative; overflow:hidden;}
|
||||
section.content div#terminal {width:100%; min-width: 500px; max-width:1000px; margin:0 auto; overflow:hidden; overflow-y:auto; scrollbar-width:none;}
|
||||
section.content article {unicode-bidi: embed; white-space: pre-wrap;}
|
||||
section.content form {display:flex;}
|
||||
section.content form label, section.content form input, section.content form input:focus {display:block; border:none; margin:0; padding:0; font-family:monospace; font-size:14px; line-height:20px; background-color:#000000; color:#FFFFFF; outline:none;}
|
||||
section.content form input, section.content form input:focus {flex-grow:100;}
|
||||
|
||||
div.vga {margin:auto; z-index:10; background-color:#000000;}
|
||||
div.io {position:absolute; top:0px; left:0px; width:100px; height:100px; z-index:3;}
|
||||
|
|
|
|||
193
clite/core.js
193
clite/core.js
|
|
@ -79,104 +79,130 @@ var clite = {
|
|||
|
||||
this.core.execSafeAsync(function() {
|
||||
clite.term.clear(false);
|
||||
var vfsapi = null;
|
||||
|
||||
// setup vfs
|
||||
clite.log.write('Setting up VFS');
|
||||
clite.vfs.init();
|
||||
var vfsapi = clite.vfs.getApi();
|
||||
clite.log.init(vfsapi);
|
||||
clite.log.write('Mounting wfs on /');
|
||||
// mount core (root) filesystem using data/filesys.txt
|
||||
clite.core.load.file('data/filesys.txt',function(data) {
|
||||
function init1() {
|
||||
// setup vfs
|
||||
clite.log.write('Setting up VFS');
|
||||
clite.vfs.init();
|
||||
vfsapi = clite.vfs.getApi();
|
||||
clite.log.init(vfsapi);
|
||||
clite.log.write('Mounting wfs on /');
|
||||
// mount core (root) filesystem using data/filesys.txt
|
||||
if (window.location.protocol == 'file:') {
|
||||
// work around the file: problems by just not loading files, here's a temporary filesystem
|
||||
var d = `
|
||||
clite/core.js:/usr/clite/core.js:0:0:-rw-r-----
|
||||
clite/core.css:/usr/clite/web/core.css:0:0:-rw-r-----
|
||||
data/intro:/usr/share/introduction:0:0:-rw-rw-r--`;
|
||||
init2(d);
|
||||
return;
|
||||
}
|
||||
clite.core.load.file('data/filesys.txt',init2);
|
||||
}
|
||||
function init2(data) {
|
||||
if (data == null) {
|
||||
clite.log.write('No Filesystem Found');
|
||||
return;
|
||||
}
|
||||
vfsapi.mkFile('/dev/wfs');
|
||||
var n = vfsapi.getNode('/dev/wfs');
|
||||
if (!n) {
|
||||
clite.log.write('wfs device failure');
|
||||
return;
|
||||
}
|
||||
n.data.content = data;
|
||||
n.perms = 'cr--r-----';
|
||||
n.isdev = true;
|
||||
var fd = clite.io.open('/dev/wfs');
|
||||
var l;
|
||||
while ((l = clite.io.readLine(fd)) != null) {
|
||||
if (l.length <1 || l[0] == '#')
|
||||
continue;
|
||||
var parts = l.split(':');
|
||||
if (parts.length != 5)
|
||||
continue;
|
||||
var url = parts[0];
|
||||
var path = parts[1];
|
||||
var uid = parseInt(parts[2]);
|
||||
var gid = parseInt(parts[3]);
|
||||
var perms = parts[4];
|
||||
vfsapi.mkFile('/dev/wfs');
|
||||
var n = vfsapi.getNode('/dev/wfs');
|
||||
if (!n) {
|
||||
clite.log.write('wfs device failure');
|
||||
return;
|
||||
}
|
||||
n.data.content = data;
|
||||
n.perms = 'cr--r-----';
|
||||
n.isdev = true;
|
||||
var fd = clite.io.open('/dev/wfs');
|
||||
var l;
|
||||
while ((l = clite.io.readLine(fd)) != null) {
|
||||
if (l.length <1 || l[0] == '#')
|
||||
continue;
|
||||
var parts = l.split(':');
|
||||
if (parts.length != 5)
|
||||
continue;
|
||||
var url = parts[0];
|
||||
var path = parts[1];
|
||||
var uid = parseInt(parts[2]);
|
||||
var gid = parseInt(parts[3]);
|
||||
var perms = parts[4];
|
||||
|
||||
var fn = vfsapi.getNode(path);
|
||||
// TODO: make the full path if needed
|
||||
if (!fn) {
|
||||
if (perms[0] == 'd') {
|
||||
vfsapi.mkDir(path);
|
||||
}else{
|
||||
vfsapi.mkFile(path);
|
||||
var fn = vfsapi.getNode(path);
|
||||
// TODO: make the full path if needed
|
||||
if (!fn) {
|
||||
if (perms[0] == 'd') {
|
||||
vfsapi.mkDir(path);
|
||||
}else{
|
||||
vfsapi.mkFile(path);
|
||||
}
|
||||
fn = vfsapi.getNode(path);
|
||||
}
|
||||
fn = vfsapi.getNode(path);
|
||||
if (!fn)
|
||||
continue;
|
||||
fn.perms = perms;
|
||||
fn.uid = uid;
|
||||
fn.gid = gid;
|
||||
fn.name = clite.lib.basename(path);
|
||||
fn.data.remote = url;
|
||||
fn.data.content = null;
|
||||
}
|
||||
if (!fn)
|
||||
continue;
|
||||
fn.perms = perms;
|
||||
fn.uid = uid;
|
||||
fn.gid = gid;
|
||||
fn.name = clite.lib.basename(path);
|
||||
fn.data.remote = url;
|
||||
fn.data.content = null;
|
||||
}
|
||||
clite.io.close(fd);
|
||||
// populate /dev (data/filesys.txt is /dev/wfs already)
|
||||
clite.log.write('Populating /dev');
|
||||
// TODO: are there any other devices we need?
|
||||
// populate /bin
|
||||
clite.log.write('Populating /bin');
|
||||
// create a temporary function to load in commands
|
||||
clite.commands = {
|
||||
data:null,
|
||||
load:function(name,fn) {
|
||||
vfsapi.mkFile('/bin/'+name);
|
||||
var f = vfsapi.getNode('/bin/'+name);
|
||||
if (!f)
|
||||
return;
|
||||
f.perms = '-r-xr-xr-x';
|
||||
f.data.content = fn;
|
||||
clite.io.close(fd);
|
||||
// populate /dev (data/filesys.txt is /dev/wfs already)
|
||||
clite.log.write('Populating /dev');
|
||||
// TODO: are there any other devices we need?
|
||||
// populate /bin
|
||||
clite.log.write('Populating /bin');
|
||||
// create a temporary function to load in commands
|
||||
clite.commands = {
|
||||
data:null,
|
||||
load:function(name,fn) {
|
||||
vfsapi.mkFile('/bin/'+name);
|
||||
var f = vfsapi.getNode('/bin/'+name);
|
||||
if (!f)
|
||||
return;
|
||||
f.perms = '-r-xr-xr-x';
|
||||
f.data.content = fn;
|
||||
}
|
||||
}
|
||||
clite.core.load.script('clite/commands.js',init3);
|
||||
}
|
||||
clite.core.load.script('clite/commands.js',function() {
|
||||
function init3(data) {
|
||||
clite.core.execSafe(clite.commands.data);
|
||||
clite.commands = null;
|
||||
// check cookies for login
|
||||
clite.log.write('Checking for user session');
|
||||
if (clite.user.init(vfsapi)) {// if logged in:
|
||||
clite.log.write('found user session?');
|
||||
// create user session
|
||||
}else{// if new user:
|
||||
clite.log.write('Generating guest session');
|
||||
// read in /usr/share/introduction and write to shell
|
||||
var fd = clite.io.open('/usr/share/introduction',function(fd) {
|
||||
clite.user.genGuest();
|
||||
if (!fd)
|
||||
return;
|
||||
var d = clite.io.readAll(fd);
|
||||
if (d != null)
|
||||
clite.shell.writeLine(d);
|
||||
clite.io.close(fd);
|
||||
// check cookies for login
|
||||
clite.log.write('Checking for user session');
|
||||
if (clite.user.init(vfsapi)) {// if logged in:
|
||||
clite.log.write('found user session?');
|
||||
// create user session
|
||||
}else{// if new user:
|
||||
clite.log.write('Generating guest session');
|
||||
// read in /usr/share/introduction and write to shell
|
||||
if (window.location.protocol == 'file:') {
|
||||
clite.user.genGuest();
|
||||
clite.shell.writeLine(`
|
||||
_____ _ _____ _
|
||||
/ ____| | |_ _| |
|
||||
| | | | | | | |_ ___
|
||||
| | | | | | | __/ _ \\
|
||||
| |____| |____ _| |_| || __/
|
||||
\\_____|______|_____|\\__\\___|`);
|
||||
}else{
|
||||
var fd = clite.io.open('/usr/share/introduction',function(fd) {
|
||||
clite.user.genGuest();
|
||||
if (!fd)
|
||||
return;
|
||||
var d = clite.io.readAll(fd);
|
||||
if (d != null)
|
||||
clite.shell.writeLine(d);
|
||||
clite.io.close(fd);
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}); // end command load callback
|
||||
}); // end filesys load callback
|
||||
init1();
|
||||
|
||||
});
|
||||
}
|
||||
|
|
@ -661,6 +687,7 @@ clite.term = {
|
|||
if (!t)
|
||||
return;
|
||||
t.appendChild(a);
|
||||
t.scrollTop = t.scrollHeight;
|
||||
},
|
||||
genForm:function() {
|
||||
var f = document.getElementById('form');
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>CLITE</title>
|
||||
<title>CLIte</title>
|
||||
<script type="text/javascript" src="clite/core.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="clite/core.css" />
|
||||
<style type="text/css"></style>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1 id="title">CLITE</h1>
|
||||
<h1 id="title">CLIte</h1>
|
||||
</header>
|
||||
<section class="content">
|
||||
<div id="terminal">
|
||||
|
|
|
|||
Loading…
Reference in a new issue