When receiving SUB we now correctly write a reversed question mark into
the buffer. We still cancel the ongoing escape sequence, this worked even
without this patch.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This function is not needed at all. Instead, we should simply move one
character to the left on incoming backspace. There is no need to handle
auto-wrap on backspace.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Other emulators might ignore this. However, the easiest way to answer to
an enquiry is probably ACK.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
VTE now requires a new callback that is called when we want to send
messages to the pty etc. This is needed if we want to send messages as
responses to incoming data. Otherwise, we would have way too much overhead
assembling composed messages.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The VT220 defines some additional shortcuts to send escape codes with
ctrl+<num>. Implement these as aliases to the same well-defined shortcuts.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
F1-F4 are mapped to the keypad keys as these keys were not available on
VT220. F5 is special mapped and F6-F20 correspond to the same keys on the
keyboards for VT220.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
In line-feed/new-line mode the NL/.. codes generate a CR *and* a NL.
Otherwise, they only generate CRs.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
In cursor-key-mode reset we send the normal CSI sequences, again encoded
with C0 codes as C1 codes are nonsense in UTF8. In cursor-key-mode set we
use the SS3 codes instead.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Implement the basic editing keys that are used by several applications. We
use the 7bit CSI sequence to avoid UTF8 issues. Otherwise, we would have
to encode the C1 CSI 0x9b as UTF8 character which is also a 2 byte
sequence.
Besides INSERT, DELETE, PAGEUP and PAGEDOWN an VT220 also had SELECT and
FIND keys which we do not implement as they are not present on modern
keyboards.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This adds support for colored and bold characters. This also adds the
infrastrucure for background colors and underlined characters, however,
these are not properly implemented, yet.
The color codes are similar to xterm and optimized on black backgrounds.
So they are not too bright or shiny.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This is a convenient macro to check whether a given set of modifiers is
enabled on the given input event.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Print keysym even if we have a UCS4 representation. This makes debugging
keyboard issues much easier. Also increase buffer size to 32 as there are
many symbols longer than 16 characters.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Bind the console at vte creation instead of dynamically during runtime.
There is no need to rebind a console so remove this complexity.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We now have a video device for each seat so we only need to launch the UI
when the video device is registered.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We need to correctly increase the refcnt. We currently increase it only
when it was 0 before due to a very subtle bug as we missed the "return".
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This is a small regression whereby starting kmscon with e.g. Caps Lock
already on, will not be reflected in the modifier mask. It's not
currently possible with xkbcommon.
Signed-off-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Use the new API in kbd_dev_process_key.
This introduces a regression whereby repeating key events are sent for
modifier keys. This is a currently a limitation in xkbcommon.
Signed-off-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The new xkb types correspond quite closely to our own types, which now
become thin wrappers.
Signed-off-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The libxkbcommon API as been revamped completely, making all of the
current code redundant and non-working. This commit removes all of the
old xkb_desc handling before using the new API.
After this commit, kmscon will no longer link to against the old
lixkbcommon; please update to a new package or compile from the
"master" branch from:
git://anongit.freedesktop.org/xorg/lib/libxkbcommon
[ This commit also adds a missing kbd_desc_new, which was declared but
not copied over from the old files. ]
Signed-off-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Both dumb and xkb don't actually need the kbd_dev for that. The dumb
backend already omits the "dev".
Signed-off-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The members of the array returned from get_all_seats are strdup'd as
well.
Signed-off-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Each session needs a virtual terminal where it operates. Therefore,
allocate one VT per seat so we can react on events on that seat.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If we allocate multiple VTs in a single process, then we share the same
signals which are used to acknowledge VT switches. Instead of blindly
calling the user-callbacks, we need to check first which VT is currently
active to forward the signal only if we are the active VT.
Otherwise, all VTs we allocate share a single logical VT.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
When the monitor notifies us about an hoptplug event, then we need to poll
the current video device. Otherwise, we might miss hotplugged monitors.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Each seat now collects all input devices that are associated to that seat.
When multi-session support is added, then we can even share them between
the sessions.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We need a single graphics card on a seat to run kmscon. Therefore, wait
for the first DRM device that appears and make it the current graphics
device for the seat. We do not support multiple graphics cards per seat
but this may be added in the future.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
When running multiple sessions on multiple seats, we need to allocate
multiple VTs, too. Therefore, we now create a VT master connection in the
main application which we can later use to allocate new VTs for each
session.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
When emulating the VT layer we need to pass our own data to the internal
callbacks. We currently pass the user data which is really useless here.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The uterm VT API is designed to support new user-space implementations of
vt-master APIs. If we are on seat0 and CONFIG_VT is enabled, we use the
kernel VT API. In all other cases we currently simply fall back to a
non-op but will implement in the future dbus based APIs or similar to
support VT switching, that is multi-session, on all seats.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If the kernel has CONFIG_VT disabled we should avoid opening VTs and
instead rely on other mechanisms for virtual terminals.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We must _never_ take a reference to ourself in a constructor. Otherwise,
the refcnt will be >1 which means if the user calls *_unref() the object
will not get freed.
Therefore, do not add the counter object used for idle sources directly to
the event loop. Instead, add it when the first idle source is registered
and remove it when the last source is removed. This will slightly slow
down performance of idle-sources. However, the whole eloop is not
optimized for speed, yet, so we don't care for now.
Reported-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We do not maintain event caches so we must make sure that every event
source gets dispatched. If we call epoll_wait() and our buffer gets
filled everytime, then there might be an event source that does not get
dispatched because it is always above the buffer range. Therefore, we now
dynamically increase the cache size when it once gets filled up.
This gets critical if we handle thousands of clients or fds, however, our
use case is limited to some system resources and hence does not suffer
here.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
epoll has the great feature that the poll object is an fd itself. However,
if we want to use idle-sources, we couldn't add them to the epoll set.
Now, we use a counter source for all idle sources so if we add a single
event-loop as source to another event loop, the idle sources will get
dispatched correctly. Furthermore, we now longer block after handling idle
sources but instead now correctly run idle sources every next round
without sleeping for fd events in between.
Unregister idle sources to avoid hogging the CPU.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We forgot to actually store the pointer to the new counter object in the
\out variable. Fix this now.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Similar to counter callbacks we now call timer callbacks with 0 as
argument on errors and disable the timer source.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Instead of silently dropping read() errors we now disable the counter and
call the user-supplied callback with 0 as argument so they can react on
errors.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>