Commit Graph

235 Commits

Author SHA1 Message Date
Christian Hergert
204271fafd lib: add pixman format conversion to cairo format 2023-02-10 17:32:09 -08:00
Christian Hergert
35d99a50b1 lib: stub out success for various RPCs 2023-02-10 17:21:33 -08:00
Christian Hergert
56e9997919 lib: connect asynchronously to socketpair peer
Because the other side is doing AUTHENTICATION_SERVER, which really it
has no business doing any flags, we have to connect asynchronously or we'd
block because it doesn't yet have our FD to communicate with.

So connect asynchronously, return our FD, and then process from there.

This is somewhat annoying because it means you can't connect your
object until the otherside already sees our connection. We delay message
processing to help with that though.
2023-02-10 17:13:05 -08:00
Christian Hergert
b601d253aa tools: add mks tool for testing
Mostly so I can test the paintable implementation as I go.
2023-02-10 16:30:23 -08:00
Christian Hergert
bcf65d7374 lib: add mks_session_ref_screen()
This is just a helper to get the first screen.
2023-02-10 16:29:57 -08:00
Christian Hergert
084edf38eb lib: fix params to socketpair() 2023-02-10 16:29:38 -08:00
Christian Hergert
ed03ea5148 lib: move PaintableListener into MksPaintable
The goal here is to keep the MksPaintableListener inside of MksPaintable
so that we don't have to create API between the two. Additionally, the
MksPaintable can own it's own G-DBus connection as we don't want to share
them for updates with anything else (as they can have large data chunks
coming across).
2023-02-10 16:14:51 -08:00
Christian Hergert
07158dfa07 lib: add a framebuffer paintable
This is intended to be the software fallback path where we have to take
Update() and Scanout() method invocations from the Qemu instance. It
implements paintable and tries to reuse a backing texture until a threshold
has been met at which point it does a full redraw.

The backing texture is reused between snapshots to increase the chance that
we may skip a followup VRAM upload to the GPU. The damage rectangles will
be re-uploaded each frame. There is some opportunity to optimize that
last part by keeping them around and adding a secondary damage region.

Of course, we would still want things to go the MksDmabufTexture path
when possible.
2023-02-10 12:47:35 -08:00
Christian Hergert
8abd0b22cf build: keep sources list near other sources 2023-02-10 12:44:50 -08:00
Christian Hergert
81d4c9639c lib: create scaffolding for DMA-BUF texture
This will eventually be used with two copies of the texture, and then
swap between them.
2023-02-10 10:37:07 -08:00
Christian Hergert
ed27fc97d8 build: fix various GObject Introspection notation 2023-02-10 10:29:29 -08:00
Christian Hergert
629cfd0e28 lib: add mks_screen_attach()
This is ultimately going to give us back a paintable, but it's only in
partial state right now. We need to figure out the right semantics for
ownership between the listener/paintable/screen/etc.

We may want the widget to be the owner of everything (and keep the
painable/listener internal API) which is likely the most convenient from
an object ownership standpoint.
2023-02-09 17:32:00 -08:00
Christian Hergert
5e75216318 lib: stub internal listener skeleton
This is an org.qemu.Listener using the gdbus-codegen generated skeleton as
the parent type.

What will probably happen here, is that we create a MksPaintable which is
given to the listener to call internal API upon.

The paintable code will be a bit more complex than originally anticipated
in that we are going to need to do our own tessellation so that we get
damage regions which are not the whole widget. Very similar to what I did
in the GdkMacosTile for gdk/macos/.
2023-02-09 17:30:38 -08:00
Christian Hergert
c9aa3a1a03 lib: add missing D-Bus annotations for UnixFDList 2023-02-09 17:28:25 -08:00
Christian Hergert
9bb71b8ea8 lib: add MksScreenAttributes and mks_screen_configure()
MksScreenAttributes is an opaque type with setters so that we can
potentially extend it in the future without ABI issues.

Furthermore, this adds a configure API for both sync and async to
MksScreen.

Currently, I get NOT_SUPPORTED back from Qemu, but I think that's because
I'm not even past the bootloader/EFI stage for tests.
2023-02-09 15:39:03 -08:00
Christian Hergert
0478d202f8 lib: add session weak pointer to devices
This is handy because it gives devices the ability to locate/coordinate
with other subsystems.
2023-02-09 12:54:48 -08:00
Christian Hergert
dac3fc284a lib: add MksPaintable
This is intended to be connected to a MksScreen and create a Listener to
get DMA-BUF scanout from Qemu.
2023-02-09 04:38:48 -08:00
Christian Hergert
96f3235897 lib: add MksMouse press, release, and motion API 2023-02-09 03:44:45 -08:00
Christian Hergert
8898636ac4 lib: add MksScreen:device-address
Can be handy when troubleshooting things, so wrap that too.
2023-02-09 03:21:43 -08:00
Christian Hergert
c35baef43e lib: add MksMouse:is-absolute property 2023-02-09 03:10:42 -08:00
Christian Hergert
76b74b0769 lib: add press and release MksKeyboard API
This currently wraps the internal layers. The real magic will happen in
a GtkWidget with event controllers to proxy things here.
2023-02-09 03:00:36 -08:00
Christian Hergert
4075f1c2ba lib: expose keyboard modifiers as flags property 2023-02-09 02:47:42 -08:00
Christian Hergert
65ee3e10ae tools: print keyboard/mouse info under screen 2023-02-09 02:29:32 -08:00
Christian Hergert
4d110d5791 lib: make MksDevice classes internal
We want to use the vfunc of the class to implement devices coming from a
Qemu object on D-Bus, but we don't want to expose that in public API.

Instead, we can keep the object instance and class internal but still
expose the subclasses as public API. We have to do old-style class
definitions to do that, but worth the ability to keep public API limited
so that we can make changes later.
2023-02-09 02:23:18 -08:00
Christian Hergert
ec09aaaa07 lib: add various include guards 2023-02-09 02:21:29 -08:00
Christian Hergert
ed5b34769a tools: fix ownership of devices listmodel 2023-02-09 02:20:54 -08:00
Christian Hergert
88df8b1780 tools: print devices connected to session 2023-02-09 01:37:10 -08:00
Christian Hergert
353a6d905d session: create MksScreen from GDBusObject
This uses the object manager object instead of the proxy directly to
create the MksScreen instances.

We might want to move the object initialization to MksDevice since it
is likely to be copied across a number of device types.
2023-02-09 01:36:54 -08:00
Christian Hergert
b976580e43 session: use GDBus object manager to track objects
This changes things to use the object manager to discover the VM instance.
We'll have to add support for other wrappers to use object managers so that
they can be added to the devices list as they are seen.
2023-02-09 01:14:47 -08:00
Christian Hergert
0af4760feb build: ensure access to enums from libmks_dep 2023-02-09 00:23:37 -08:00
Christian Hergert
169acba1bc screen: add MksScreen:number property
This correlates to "head" of the D-Bus interface, which makes for a
terribly non-descriptive property name.
2023-02-08 23:26:35 -08:00
Christian Hergert
d16440566b screen: add width and height properties
Keep them up to date when the underlying MksQemuConsole properties are
notified of having changed.
2023-02-08 23:21:06 -08:00
Christian Hergert
12edec8262 screen: add keyboard and mouse properties
Adds MksKeyboard and MksMouse types. Setup a MksScreenKind for the
MksScreen based on MksQemuConsole:type property. Currently the keyboard
and mouse are not wired up, but here for scoping out the properties.
2023-02-08 21:58:35 -08:00
Christian Hergert
0dd3cf39a2 build: include sources and headers for GIR 2023-02-08 20:25:08 -08:00
Christian Hergert
5d012259d9 initial commit
This library doesn't do much yet. It contains the scaffolding and the
rough shape of what I think the API should be in mks-types.h. Some of the
types have some skeleton implementation as well to hid the D-Bus API
behind those types.

The next steps are to fill out the other wrapper objects and see what
properties we should expose from the underlying D-Bus proxies.

Along with that, will be a GtkWidget which can have a number of properties
set on it to specify the MksScreen, MksKeyboard, and MksMouse devices. It
may make sense to attach the session + screen to the widget, so that it can
adapt to keyboard and mouse changes though.
2023-02-08 18:06:08 -08:00