Andreas Kling
4fef895eda
Rework WindowServer to use select() in its main event loop.
...
The system can finally idle without burning CPU. :^)
There are some issues with scheduling making the mouse cursor sloppy
and unresponsive that need to be dealt with.
2019-01-16 17:20:58 +01:00
Andreas Kling
f7ca6d254d
Tear out or duplicate what's unique for WindowServer from Widgets.
...
This turned into a huge refactoring that somehow also includes
making locks recursive/reentrant.
2019-01-16 16:03:50 +01:00
Andreas Kling
e655aebd70
Window: Update coding style.
2019-01-16 13:50:24 +01:00
Andreas Kling
9dd29f9aa9
Add a PTY multiplexer (/dev/ptmx) device.
...
When you open /dev/ptmx, you get a file descriptor pointing to one of the
available MasterPTY's. If none are available, you get an EBUSY.
This makes it possible to open multiple (up to 4) Terminals. :^)
To support this, I also added a CharacterDevice::open() that gets control
when VFS is opening a CharacterDevice. This is useful when we want to return
a custom FileDescriptor like we do here.
2019-01-16 13:39:32 +01:00
Andreas Kling
b46ae2bf09
Get rid of Vnode concept.
...
We already have an abstraction between Process and Inode/CharacterDevice/FIFO
and it's called FileDescriptor. :^)
2019-01-16 12:57:07 +01:00
Andreas Kling
310a5f4199
Let each MasterPTY create its slave.
2019-01-16 02:11:50 +01:00
Andreas Kling
9c51d9dfcd
Catch anyone trying to use a DoubleBuffer with interrupts disabled.
2019-01-16 01:58:11 +01:00
Andreas Kling
09ba129bcf
Use a CircularQueue for the PS/2 mouse driver.
2019-01-16 01:52:39 +01:00
Andreas Kling
8ad2dfb6e1
Rename FileDescriptor::has_data_available_for_reading() -> can_read().
2019-01-16 00:47:00 +01:00
Andreas Kling
a8baee4dcd
Tidy up memory map a bit and write out the general map in MemoryManager.
...
There was a bug that given enough supervisor page allocation, we would
eventually start dipping into the kmalloc range.
2019-01-16 00:44:09 +01:00
Andreas Kling
bd3e77cc16
Pass the process to CharacterDevice::read/write.
...
This is much nicer than grabbing directly at 'current' inside a read().
2019-01-16 00:20:38 +01:00
Andreas Kling
08bfe518f9
Rename CharacterDevice::has_data_available_for_reading() -> can_read().
2019-01-16 00:10:13 +01:00
Andreas Kling
10387beda7
Implement basic support for POSIX-style select().
...
Now we can block on both the PTY *and* the GUI event stream in Terminal.
2019-01-16 00:09:58 +01:00
Andreas Kling
46181cf023
Oops, finish WindowServer rename.
2019-01-15 21:46:15 +01:00
Andreas Kling
52c004eb53
Add internal locking to DoubleBuffer.
2019-01-15 21:43:38 +01:00
Andreas Kling
e42f090ed3
Rename WindowComposer -> WindowServer.
...
I keep referring to it as the windowing server anyway.
2019-01-15 21:16:04 +01:00
Andreas Kling
d0137f0e96
Terminal: optimize repaints a bunch.
...
We track dirty character cells + pending whole-terminal scrolls.
This drastically reduces the number of pixels pushed.
2019-01-15 10:23:15 +01:00
Andreas Kling
e452303c66
Allow character devices to block write attempts until there is more space.
2019-01-15 09:17:22 +01:00
Andreas Kling
49b63281a0
Make it possible for a process to switch controlling terminals.
...
Via the TIOCSCTTY and TIOCNOTTY ioctls.
2019-01-15 08:49:24 +01:00
Andreas Kling
10308c6434
Let's not require TERM=ansi for tgetent() to work.
2019-01-15 08:32:53 +01:00
Andreas Kling
6f61eb4a87
Slap an InterruptDisabler on gui$invalidate_window().
...
This is obviously not a permanent solution but it works now to allow
the windowing system to withstand invalidation spam.
2019-01-15 08:23:13 +01:00
Andreas Kling
14712ad9c5
Let's do dword-at-a-time memcpy() and memset() in userspace as well.
...
Also fix a dumb bug that showed up when I was memsetting something other
than zeroes.
2019-01-15 08:14:44 +01:00
Andreas Kling
a8e42bacf4
Minor Terminal tweaks.
2019-01-15 07:57:30 +01:00
Andreas Kling
d14ec951ea
Terminal: Add some inset and line spacing.
...
This is starting to feel vaguely usable! :^)
2019-01-15 07:39:51 +01:00
Andreas Kling
c24f543a57
Terminal: basic ANSI color support.
2019-01-15 07:30:24 +01:00
Andreas Kling
78696236d3
Add very basic KeyDown events to the GUI event stream.
...
The Terminal program now hosts an interactive shell. :^)
2019-01-15 06:51:00 +01:00
Andreas Kling
c0ef060a7c
Let's just assume we have 32MB of physical memory to work with.
...
I should eventually figure out the exact amount of memory but not now.
2019-01-15 06:48:36 +01:00
Andreas Kling
2f74c2f430
Add basic PTY support.
...
For now, there are four hard-coded PTYs: /dev/pt{m,s}[0123]
Use this in the Terminal to open a pty pair and spawn a shell.
2019-01-15 06:30:19 +01:00
Andreas Kling
ecb4ab0943
Add Terminal/.gitignore
2019-01-15 04:49:01 +01:00
Andreas Kling
dfff2996d2
Factor out individual glyph drawing into Painter::draw_glyph().
2019-01-15 04:44:47 +01:00
Andreas Kling
6d8043767e
Start working on a graphical Terminal program.
2019-01-15 04:30:55 +01:00
Andreas Kling
b673c1a77d
Build Painter & friends into LibC. Use it in the GUI test app.
2019-01-14 20:02:51 +01:00
Andreas Kling
bfef4afa6a
So long SDL stuff. You were a nice bootstrapping environment.
2019-01-14 15:30:37 +01:00
Andreas Kling
0c5ecd303c
Share GraphicsBitmaps between the windowing server and the client process.
...
This is pretty cool. :^)
GraphicsBitmaps are now mapped into both the server and the client address
space (usually at different addresses but that doesn't matter.)
Added a GUI syscall for getting a window's backing store, and another one
for invalidating a window so that the server redraws it.
2019-01-14 15:25:34 +01:00
Andreas Kling
b0e3f73375
Start refactoring the windowing system to use an event loop.
...
Userspace programs can now open /dev/gui_events and read a stream of GUI_Event
structs one at a time.
I was stuck on a stupid problem where we'd reenter Scheduler::yield() due to
having one of the has_data_available_for_reading() implementations using locks.
2019-01-14 14:42:49 +01:00
Andreas Kling
b4da4e8fbd
Always inline the locks.
2019-01-14 14:14:30 +01:00
Andreas Kling
11331e9639
Add Vector::take_first().
2019-01-14 02:49:30 +01:00
Andreas Kling
973ff14180
Make QtCreator stop complaining about the ASSERT macro.
2019-01-14 00:35:07 +01:00
Andreas Kling
e7b1101f62
TTY::write() should return the number of bytes written.
2019-01-14 00:19:03 +01:00
Andreas Kling
cc0be2e78a
Keep back and front painters around in WindowManager.
...
The internal state never changes in some meaningful way for these (at this time.)
2019-01-13 07:41:31 +01:00
Andreas Kling
0ead888821
gui$create_widget() shouldn't try to make button corners opaque.
2019-01-13 07:33:10 +01:00
Andreas Kling
9053027dc0
Flush the old and new cursor rects in a single rect.
2019-01-13 07:23:07 +01:00
Andreas Kling
8e96cba7ef
Make a nice bitmap cursor.
...
It's rendered as two CharacterBitmaps right now because I don't have a good
primitive for this and I wanted it right away. I should add 2-color bitmaps..
Also make a neat little effect where the cursor becomes inverted on press.
2019-01-13 07:17:12 +01:00
Andreas Kling
1d914cbd84
Minor GUI API things + make Button corners properly transparent.
2019-01-13 06:26:20 +01:00
Andreas Kling
f7261d7b26
Let's use the existing Rect and Color types in the GUI API.
...
Any type that doesn't depend on indirect data can probably be used here.
2019-01-13 05:31:07 +01:00
Andreas Kling
b2d86b7597
Add basic GUI API for creating labels and buttons.
2019-01-13 05:03:17 +01:00
Andreas Kling
17c7bf01a5
Fix Userland build.
2019-01-13 04:31:16 +01:00
Andreas Kling
8f8c8d1ca3
Start working on a GUI kernel API.
2019-01-13 02:02:34 +01:00
Andreas Kling
becc2c7fa5
Make GraphicsBitmaps be Region-backed when running in the kernel.
...
This is a lot better than having them in kmalloc memory. I'm gonna need
a way to keep track of which process owns which bitmap eventually,
maybe through some sort of resource keying system. We'll see.
2019-01-13 00:29:32 +01:00
Andreas Kling
e4cb9b2985
Have WindowManager::invalidate() unite dirty rects that intersect each other.
...
This is kinda primitive but it avoids double-draw when slowly dragging stuff.
2019-01-13 00:04:23 +01:00