We want to avoid any static files that are shared between multiple
programs but are not part of SHL. These make the build-process just more
complex.
Move log.[ch] to SHL so we have a known context.
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Major overhaul of the build system. This introduces symbol-versioning for
all exported libraries. Please note that none of these libraries is
stable, yet!
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
EV_ONESHOT will remove idle sources once they have been processed and
EV_SINGLE will only register the source if it hasn't been registered, yet.
For source removal EV_ONESHOT has no effect but EV_SINGLE causes all
events with this cb+data combination to be removed.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If we autoselect a VT and the current VT is unused, use it. This is
similar to the behavior of Weston and X-Server.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If we run in listen mode, we are supposed to take over a seat. If a seat
supports VTs (like kernel VTs or kmscon cdev fake VTs) we assume that
there is some manager for these VTs (the one who created them). Therefore,
there is no need to run kmscon in listen mode on these seats. Instead, you
should run kmscon in default mode on these seats.
We enforce this limitation because if the VT-master on those seats dies
and causes a HUP, they have no way to notify us when they startup again.
Therefore, this kind of setup is broken. Furthermore, no-one would every
want such setups.
Instead use the startup mechanism of the VT/seat-manager to start kmscon
in default mode on those seats.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If no VT name is explicitly given, we need to use VT_OPENQRY to find one.
This used to work until we switched to supporting fake-VTs. Fix this again
to work like it used to.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If the controlling TTY (in our case the VT) signals us a HUP, we should
consider it closed and forward that to the caller. This does normally not
happen on real VTs, however, on fake-VTs this happens if the parent goes
away.
We forward the HUP to the controlling subsystem which then has to deal
with it. But more importantly, we disable the fd so we don't hog the CPU
by unconditionally flushing the queue.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This helper returns the VT type. This will allow external users to see
whether we have real VTs or whether we don't.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
K_OFF is not available on older kernels and it is currently discussed
whether it should be replaced on newer kernels. Therefore, set K_RAW
before trying K_OFF and then ignore errors if K_OFF cannot be set.
Reported-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If there is already a kmscon instance running that provides fake-VTs, then
lets use it. This allows stacking kmscon processes and is very useful for
debugging.
Also other applications that use uterm can now run inside of kmscon
without any other special configuration.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We need to correctly put input devices asleep only if we really disable
the VT. If our callbacks fail and prevent the VT-switch, we must keep the
input devices awake. Otherwise, we will lose control over the
sleep-states.
Also correctly put the device asleep during shutdown.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If we cannot immediately perform a VT switch away from our application, we
might want to retry this shortly after. Therefore, we can now call
uterm_vt_retry() which then performs any outstanding VT-switches.
To avoid unexpected behavior, we limit this to a 2-3 second delay.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If the user presses some keys to switch VTs and the target VT is our VT
(which is already active in this case), we shouldn't do anything. Calling
VT_ACTIVATE doesn't particularly hurt, but it doesn't get us anything
here so skip it.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If we deactivate our VT and the target-VT is already active (probably
because we opened the _current_ VT during uterm-vt creation), we shouldn't
do anything but simply close the VT.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If we want to run as client under user-space fake-VT implementations like
kmscon-cdev, we need to be able to catch those signals from
userspace-daemons. Therefore, do not check whether the signals were
generated by the kernel.
This doesn't affect security in any way as non-priviledged processes
aren't allowed to send signals, anyway. Moreover, this increases
debugability of VT layers a lot as we can fake these signals now.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We cannot use 'ret' in error paths, otherwise, we might return 0. This
might then cause instabilities as the objects weren't initialized
correctly.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We do not use the TTY for anything except VT functions. Hence, there is no
need to modify the TTY settings before using it.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
eloop does already block signals that we register callbacks for so we do
not have to block it manually here.
Note that the signal-handlers are registered _before_ doing the backend
initialization so we also avoid the previously fixed race-condition.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If we open a VT, we assume that we are the only user on it. Therefore, we
put it into graphics mode _once_ and keep it this way. Resetting it to
text mode is useless, as there is no other user and every VT has its own
modes.
This also fixes page-flip issues during VT-switches which caused the
text-mode fbdev layer to claim one vertical-sync for their own page-flip
only for us to override it immediately after it is done.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Instead of doing the backend initialization directly in uterm_vt code, we
now use fake_* helpers similar to real_* helpers.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If we dispatch VT-deactivation to child-processes, we might allow them to
abort the VT-switch, so the upper layer (uterm_vt) must also allow us to
abort the VT-switch.
During shutdown, we need to force the deactivation to guarantee that a VT
is inactive during shutdown.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We always assumed that the currently active VT is never the VT we open.
However, this is not true so schedule a VT-activation if this happens.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We must block the signals before setting the signal handlers to avoid
retrieving them asynchronously.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If we switch to a VT that has KBMODE set to K_OFF, we do not set it back
to K_OFF when leaving, instead, we set it to K_UNICODE. This allows
recovering when kmscon died by simply restarting kmscon.
There is really no need to let a VT stay in K_OFF! This causes the user to
be stuck at this VT and use the sysrq (if enabled) keys to recover.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
xkbcommon supports reporting multiple keysyms per key-event. There is no
keymap which uses this, yet. However, this feature is not meant to enhance
performance by reducing the number of calls into xkb, but instead multiple
keysyms are to be handled as one big keysym.
But there are no examples, yet, so we cannot actually perform any
conversions on them. But we can add the infrastructure for it.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
If multiple handlers are called on the same input-event, we must notify
handlers whether the event was already handled by a previous callback. We
push this decision to the handlers by allowing them to modify the
"handled" flag for an input event.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We now set KBMODE to K_OFF so we are totally independent of kernel input.
Instead, we handle VT switches with uterm-input now. This also allows us
to have full control of which keyboard input is parsed by us and which is
parsed by the kernel.
We still need to set a flag for uterm-input events that they were handled
to avoid having the TSM layer handle these events again.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This modifies the generic VT layer to register input-cbs for all VT types
and dispatch the event to the correct handler.
This will allow us to handle VT-switches for real VTs ourself instead of
relying on VT input.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This whole concept was broken from the beginning. With hotkey based
activation we have a much better debugging tool. This is still very
fragile, but better than nothing. And we are doing pretty well in error
recovery during hijacked VT switches so that's not as problematic as one
might think.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This adds a lot more verbose error messages to the whole real-VT handling
so we can debug this fragile system way better than before.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Two new helpers to activate or deactivate all VTs at once. They return the
total count of VT switches that are pending or an error code.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This is probably a copy&paste error from real_deactivate(). We should skip
real_activate() if we are _active_, not if we are _inactive_.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We used to activate fake-VTs directly after they were allocated. This is
not needed anymore as we can control them directly now.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This makes uterm_vt_(de)activate() forward the request to fake-VTs, too.
The fake-VTs directly forward it to the callbacks.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We used to return 0 if we don't know the VT id in real_deactivate().
However, the VT id is nowadays always known so we must return an error
instead.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
real_activate() has alsmost the same semantics as real_deactivate() so we
should also return -EINPROGRESS when we scheduled the VT switch. This
isn't used by kmscon currently, but may be used by other uterm users.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We really need to clean this up and allow parsing of grabs in conf.c
again. xkbcommon is now mandatory so we can fix all the input layers to
use it.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
The getty variants out there (including agetty) require an relative path
to the /dev directory as argument. This is really odd but we want to be
backwards-compatible to them so we allow this, too.
--vt now accepts:
* A positive number which is internally converted into /dev/ttyXY
* A string that does not start with '/' or '.' which is interpreted
relative to /dev as /dev/%s
* Everything else is interpreted as path
This option still selects only the TTY on seat0. On all other seats we do
not use controlling TTYs.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
VTs are only available on seat0 so this option does not affect other
seats. On seat0 it selects the VT that we run on. We do _not_ fall back to
another seat if it fails but disable this seat instead.
Reported-by: Matthew Monaco
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We really need xkbcommon-keysyms.h for building kmscon/uterm/TSM/etc.
However, the recent fix was ugly and didn't really help. Instead we copy
the keysyms file into external/xkbcommon/ so we can just include the real
xkbcommon files from any source but have a fallback in external/.
Hence, you can still build kmscon without xkbcommon with this fallback,
but this will be removed the first day when xkbcommon sees a public
release.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This moves the timers to SHL and removes the old static_misc header and
source. They are no longer needed.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Shl (Static helper library) is the new name of all static helpers in
kmscon that might be shared between different applications.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
We need a copy of xkbcommon-keysyms.h as long as xkbcommon is not included
in all major distributions. We _need_ this build-time dependency,
otherwise, we cannot build the other keyboard backends.
However, requiring xkbcommon as build-time dependency is not a solution as
no major distribution includes it.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
uterm_internal.h contains only input related content so we can rename it
and remove all the inclusions where it is not needed.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>