I am going to replace it after I finish making the ANSI escape parser
modular again (it became a bit less modular during the development of
this terminal).
These changes are part of an effort to make the terminal more efficient.
Another goal is to make the terminal use the "new-style" compositor
interface, which is still in development.
Major speed improvement, though it might make things like "Scale
windows" look a bit less polished; windows that are scaled up in scale
mode are rendered with bilinear scaling. Will probably replace with the
FAST/GOOD macros later.
Also, add the framework for Alt+Tab window picking (not implemented yet)
Also fix the mouse to account for this... development.
Smoother mouse movement all around, though it may make things slightlys
lower by spamming lots of mouse packets. Just write good clients and
everything will be fine...
There are both some good changes and some terribly hacky changes in this
commit.
- Server uses a different struct than client now for windows, so
arbitrary compositor things like effect parameters can be added
without having to rebuild everything. That's good.
- Client window structs no longer attempt to track or use window
locations. That's good.
- Windows do not destroy in response to the destory command, but rather,
a special animation is triggered; the end state for this animation
calls the actually window destruction code. That's a hack.
- Animations are based on rendered frames, not on time. That's a hack.
* Dumb bounding box top_at logic replaced with select buffer
* Select buffer rendered through cairo with AA disabled
Using rectangles for window shapes - this should easily
be expandable to 1bpp bitmaps. Currently, the select buffer
is very inefficient, using twice the space it needs (plus,
it's double buffered, so in reality, 4x the space needed),
however, it's also very accurate and fast, and I like that.
* Window rotation is controlled through Ctrl+Shift+{z,x,c} where
z = rotate 1 degree left
x = rotate 1 degree right
c = reset rotation
* Input is remapped based on window rotation, so you *can* use the
draw app, and it is totally epic.
* login should set some environment variables now
* init should start terminals as login shells, so --single doesn't really
mean "single user" any more, just sorta single terminal session
* system() should work now since esh now accepts -c; not that vim is
still going to be unhappy because it does crazy shit.
This fixes a bug in Vim and one introduced an hour ago in Nyancat.
This bug was also present in early versions of bim.
Problem: If the background is set to 16 (all black) explicitly, we still
treat it as if it is the default color and thus make it transparent.
This is wrong, only the default background, as set by resetting either
the bg itself (with mode 49) or the full display parameter set (with 0)
should show up transparent.
Solution: By using flag to indicate wether the background is "default",
we can detect other uses of background color 16 without having fudge
with other colors like 0. The flag is ANSI_SPECBG, where SPEC means
"special", and thus it is set any time the background changes
explicitly, and is unset in raw cells or places where we are in default
mode.
Also, sleep() as a function (implemented by way of nanosleep) and new
absolute and relative sleep system calls added to newlib.
[ci skip] I damn well know this is going to break CI.
It now takes sizes in cells and calculates the correct window size.
Thus, \033[3000;127;45z should set the terminal to the "standard" size
available in 1024x768 full-screen mode, and which is specified in the
terminfo file provide.
* Speed improvements
* Crash fixers
* Significant overhaul to escape handling based on extensive use of the
new serial console and a remote connection to a Linux box.
* Updated included terminfo file to accurately reflect terminal
behavior.
Some fun facts:
* vim runs great on a remote console (though the serial line slows a lot
of things down, it still runs rather smoothly)
* going to fix GNU screen, maybe in next commit, dunno
* tested with htop, less, and a bunch of other stuff
* fix some terminal bugs (some, not all)
* add a serial device to the VFS
* fix up serial so it works better
* add a serial-console application
* fix a bug in some other stuff relating to allocations
* change size of the terminal described by toaru.terminfo
* adds a new system call
* Reenables building of libstdc++
* Enables building of g++
* WARNING: The static binary loader does NOT support static
initializer functions! You must run them yourself (see
userspace/test-cpp.cpp for an example that initializes the standard
streams in order to use cout) until this is fixed.
* C++ stuff is slow to load, try to manually strip, it'll speed things
up a bit.
So that I don't need to keep changing this or worry about bad commits,
support falling back to the classic compositor if the new compositor
doesn't work.
- Desktop icons use the shadowing
- The login screen uses shadows instead of poorly-executed strokes
- The blur_test app has been updated to show multiple blur levels,
but does not use the library function.
Type to change the text.
Resize if you need more space.
Alt+F4 to quit.
(And remember, focus follows mouse, but does not go through transparent
windows, so if you're in the right box, you'll be fine)
Kernel driver sends raw scancodes, compositor or terminal handle the
rest. Support for F* keys will be added soon, in the mean time userspace
applications can know about the status of modifiers (control, shift,
alt, and super).
Compositor actions have been changed to Alt+Left Click for move and
Alt+Middle Click for resize. I'll work on adding more mouse events once
I get them to be faster (they're annoyingly slow at the moment... I want
more accuracy and less latency).
Also add functionality to the terminal to toggle it on and off.
There's a small, but nice-to-have performance increase from disabling
alpha transparency in the terminal.
Also, the display server sets DISPLAY=... to the shmem endpoint for the
compositor, so if getenv("DISPLAY") returns a pointer, you can assume
you are in a graphical environment, instead of having to rely on things
like arguments. Good for those applications that want to be able to run
both full-screen and windowed.
* Patched crt0 to support a pre_main
* pre_main sets up environment variables, can do other things later,
but then just jumps to main with the same arguments.
* Updated a bunch of apps to pass environment variables around.
- libc functions not implemented yet
- see `env` for an example of reading variables
- see `esh` for an example of how to set and maintain variables for
sending to other applications
Both of the above will be the basis for the libc implementation.
* Remove old login background [unused]
* Remove glock (graphical lock) [outdated]
* Have toolchain/activate set pkg-config variables
XXX: You will have unset PKG_CONFIG_LIBDIR to configure native
software if you have activated the toolchain! Otherwise, your
pkgconfig information will be incorrect.
* Fixed a bug in the compositor where we would give window stack order 0
to applications that didn't ask for it because depths were assigned by
wid which starts at 0. Make it start at 1 instead, no chance of an app
getting the wrong stack order (this shoudn't have any effect on how
things work with a login app, since it grabs wid 0; but if you boot
directly into a non-login environment, minor timing issues can do odd
things.)
The compositor itself still needs work, but the compositing engine
within now does full blitting and is faster than the old method.
Transparency is now supported properly, though telling the compositor to
use it on a window will degrade performance. One terminal is usually
okay, and everything runs faster than it did before; two terminals is
pushing it; three will make you very sad. The stacking logic has also
been updated. Presumably, alpha blitting for transparent windows could
be done with SIMD instructions and be extremely fast.
All graphics libraries have also been updated to (hopefully) work
properly with alpha bits.
You can log out by exiting the terminal for now, this will later be "by
exiting the wallpaper application" or something to that effect, and will
be triggered by an on-screen button or keybinding.
[ci skip]
* Also cleaning up some kernel logging options here.
* You can log in as local or root with passwords local and toor
* Graphical sessions are still buggy, so don't kill that terminal.
* Fresh new wallpaper as a PNG from gnome-look:
http://gnome-look.org/content/show.php/Echo?content=137142
(By user hyperdude111, released as "do whatever you want")
* Terminal bug fix for --geometry option, which was derping on height
vs. width.
* Compositor bug fix for wallpaper app not showing up at the bottom.
Fixed by doing a better job of reordering the windows on a REORDER
call (which we weren't actually doing).
* Also some minor updates to the toolchain in general.
* Replacing the old bitmap wallpaper (not the actual wallpaper, but the
terminal one) with a fresh new wallpaper as a PNG.
* A minor bug has been fixed in bim's write_file method
* The VL Gothic fonts have been updated (and the proportional version of
the font is now included)
* The README and TODO have both been updated to reflect current plans.
:tabp and :tabn will switch between them.
:q will try to (fully) close the current tab, :q! will force it.
:qall will try to close all tabs; maybe I'll :qall! later.
- Write support!
- The widths of characters is now determined with freetype ;-;
I really wish wcwidth() was a real thing, but it's not.
This is a sacrifice that had to be made.
If you are building FOR Linux -rather than toaru- you might need to
poke at some things to make sure it builds, but in my experience it is
working just fine (and IMEs now work properly).
[ci skip]
It's an editor, but it is incomplete. For example, write is not
supported yet, so you can open existing files and make modifications,
but you can not save them. Use it as a fun little scratchpad, I guess.
\033[1003z will stuff them into stdin like 80,24.
This is a hack, just like the "disable local echo" hack used for
passwords and it should, ideally, be replaced with a proper system as
defined in POSIX for terminal control, but for, it works, and that's
pretty cool because it means `ls` can stop being stupid.
* Some applications now support UTF-8 text through the use of a very
simple decoder.
* The terminal uses a slow, but accurate method to determine the width
of a character the first time it is printed to the screen. Characters
are now stored in the terminal in two bytes, rather than one, and may
in the future be increased to 3 or 4 bytes to ensure support for
Unicode supplemental planes.
* A simple font-fallback method is employed in the applications that
support unicode that will make use of the VL Gothic fonts if the
DejaVu font does not have a character. No guarantees are made for
support of writing systems other than extended Latin and Japanese.
* Finally bring syscall.h up to speed and include all syscalls in the
syscall module of the C library.
* Remove the third-party obfuscated C demos (we have nyancat, good
enough)
* Fix userspace apps to build without complaining about undeclared
strtok_r by disable __STRICT_ANSI__
* Fix .eh_frame by including the proper stuff with libgcc.
- Can now register a userspace file descriptor as the output for kernel
print statements through kprintf()
- Can set logging levels for debug print messages, which are separate
from kernel log events and meant to be more readily visible. Log
events are recorded in a buffer to be viewed later, though nothing
actually using logging at the moment.
- Serial output is disabled by default now. You can enable it yourself
by appending the logtoserial argument to the kernel on boot.
This is an automated system by which we boot qemu headless and use the
serial line to capture output from a testing application that is started
on bootup, running with the VGA terminal shell. This might be expanded
to boot to the graphical display within VNC and perform more advanced
tests with the Python shim using a VNC module for Python; we'll see.
All graphics library commands now take a gfx_context_t pointer, which
points to a simple datastructure describing a rendering context (width,
height, depth, total size, front buffer, backbuffer; where backbuffer =
front buffer when not in double-buffering mode, thus we always render to
backbuffer except on a flip). This may have caused a minor speed
reduction, but I don't really care as it's far more important that we
support multiple graphics contexts.
TODO:
- Shared Memory Fonts library (there are a couple of apps that use these
so-called "shmem fonts" on their own; we need a dedicated library for
them)
- Break off "TTK" GUI toolkit into its own library. Since it's just a
callback-based button framework, this shouldn't be too hard right now.
Also, with the previous tick, I'll be able to put labels on controls
and start using text in more places.
We know longer accept DAMAGE and REDRAW commands. Instead, we just loop
and redraw everything anyway (efficiently, mind you). Pipes still have
issues when closed and various other different things.
Still need to pass sizes around to shm_* functions as a pointer rather
than the actual size so we can retreive sizes; additionally, *p = 0
should mean "we don't want to create this buffer, we only want to
access it if it exists".
It doesn't even need one; eventually, we'll have window management and
you'll just close the app. It should technically just sit in a loop
endlessly after rendering (or waitforsignal, which we don't have yet).