diff --git a/lib/mks-screen-private.h b/lib/mks-screen-private.h index 49b8dac..065a1ef 100644 --- a/lib/mks-screen-private.h +++ b/lib/mks-screen-private.h @@ -23,16 +23,11 @@ #include +#include "mks-qemu.h" #include "mks-screen.h" G_BEGIN_DECLS -void _mks_screen_new (GDBusConnection *connection, - const char *object_path, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -MksScreen *_mks_screen_new_finish (GAsyncResult *result, - GError **error); +MksDevice *_mks_screen_new (MksQemuObject *object); G_END_DECLS diff --git a/lib/mks-screen.c b/lib/mks-screen.c index 9efd552..36401df 100644 --- a/lib/mks-screen.c +++ b/lib/mks-screen.c @@ -32,6 +32,7 @@ struct _MksScreen { MksDevice parent_instance; + MksQemuObject *console_object; MksQemuConsole *console; gulong console_notify_handler; @@ -86,6 +87,19 @@ _mks_screen_set_height (MksScreen *self, } } +static void +_mks_screen_set_number (MksScreen *self, + guint number) +{ + g_assert (MKS_IS_SCREEN (self)); + + if (self->number != number) + { + self->number = number; + g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_NUMBER]); + } +} + static void mks_screen_console_notify_cb (MksScreen *self, GParamSpec *pspec, @@ -101,6 +115,8 @@ mks_screen_console_notify_cb (MksScreen *self, _mks_screen_set_width (self, mks_qemu_console_get_width (console)); else if (strcmp (pspec->name, "height") == 0) _mks_screen_set_height (self, mks_qemu_console_get_height (console)); + else if (strcmp (pspec->name, "number") == 0) + _mks_screen_set_number (self, mks_qemu_console_get_head (console)); } static void @@ -109,12 +125,16 @@ mks_screen_set_console (MksScreen *self, { g_assert (MKS_IS_SCREEN (self)); g_assert (!console || MKS_QEMU_IS_CONSOLE (console)); - g_assert (self->console == NULL); + + if (self->console != NULL) + return; if (g_set_object (&self->console, console)) { const char *type; + _mks_device_set_name (MKS_DEVICE (self), mks_qemu_console_get_label (console)); + self->console_notify_handler = g_signal_connect_object (console, "notify", @@ -145,6 +165,7 @@ mks_screen_dispose (GObject *object) g_clear_object (&self->console); } + g_clear_object (&self->console_object); g_clear_object (&self->keyboard); g_clear_object (&self->mouse); @@ -190,21 +211,6 @@ mks_screen_get_property (GObject *object, } } -static void -mks_screen_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - MksScreen *self = MKS_SCREEN (object); - - switch (prop_id) - { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - } -} - static void mks_screen_class_init (MksScreenClass *klass) { @@ -212,7 +218,6 @@ mks_screen_class_init (MksScreenClass *klass) object_class->dispose = mks_screen_dispose; object_class->get_property = mks_screen_get_property; - object_class->set_property = mks_screen_set_property; properties [PROP_KEYBOARD] = g_param_spec_object ("keyboard", NULL, NULL, @@ -253,71 +258,31 @@ mks_screen_init (MksScreen *self) { } -static void -mks_screen_new_cb (GObject *object, - GAsyncResult *result, - gpointer user_data) +MksDevice * +_mks_screen_new (MksQemuObject *object) { - g_autoptr(MksQemuConsole) console = NULL; - g_autoptr(GError) error = NULL; - g_autoptr(GTask) task = user_data; - MksScreen *self; - - g_assert (G_IS_ASYNC_RESULT (result)); - g_assert (G_IS_TASK (task)); - - self = g_task_get_source_object (task); - console = mks_qemu_console_proxy_new_finish (result, &error); - - g_assert (MKS_IS_SCREEN (self)); - g_assert (!console || MKS_QEMU_IS_CONSOLE (console)); - - mks_screen_set_console (self, console); - - if (error) - g_task_return_error (task, g_steal_pointer (&error)); - else - g_task_return_pointer (task, g_object_ref (self), g_object_unref); -} - -void -_mks_screen_new (GDBusConnection *connection, - const char *object_path, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - g_autoptr(GTask) task = NULL; g_autoptr(MksScreen) self = NULL; + g_autolist(GDBusInterface) interfaces = NULL; - g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); - g_return_if_fail (object_path != NULL); - g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable)); + g_return_val_if_fail (MKS_QEMU_IS_OBJECT (object), NULL); self = g_object_new (MKS_TYPE_SCREEN, NULL); - task = g_task_new (self, cancellable, callback, user_data); - g_task_set_source_tag (task, _mks_screen_new); + self->console_object = g_object_ref (object); - mks_qemu_console_proxy_new (connection, - G_DBUS_PROXY_FLAGS_NONE, - "org.qemu", - object_path, - cancellable, - mks_screen_new_cb, - g_steal_pointer (&task)); -} + interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object)); -MksScreen * -_mks_screen_new_finish (GAsyncResult *result, - GError **error) -{ - MksScreen *ret; + for (const GList *iter = interfaces; iter; iter = iter->next) + { + GDBusInterface *iface = iter->data; - g_return_val_if_fail (G_IS_TASK (result), NULL); - ret = g_task_propagate_pointer (G_TASK (result), error); - g_return_val_if_fail (!ret || MKS_IS_SCREEN (ret), NULL); + if (MKS_QEMU_IS_CONSOLE (iface)) + mks_screen_set_console (self, MKS_QEMU_CONSOLE (iface)); + } - return ret; + if (self->console == NULL) + return NULL; + + return MKS_DEVICE (g_steal_pointer (&self)); } /** diff --git a/lib/mks-session.c b/lib/mks-session.c index 69f65bf..63b7df8 100644 --- a/lib/mks-session.c +++ b/lib/mks-session.c @@ -24,6 +24,7 @@ #include "mks-device.h" #include "mks-read-only-list-model-private.h" #include "mks-qemu.h" +#include "mks-screen-private.h" #include "mks-session.h" /** @@ -144,13 +145,23 @@ mks_session_set_connection (MksSession *self, g_assert (self->connection == NULL); if (connection == NULL) - { - g_critical ("%s created without a GDBusConnection, this cannot work.", - G_OBJECT_TYPE_NAME (self)); - return; - } + g_critical ("%s created without a GDBusConnection, this cannot work.", + G_OBJECT_TYPE_NAME (self)); + else + self->connection = g_object_ref (connection); +} - self->connection = g_object_ref (connection); +static void +mks_session_add_device (MksSession *self, + MksDevice *device) +{ + g_assert (MKS_IS_SESSION (self)); + g_assert (!device || MKS_IS_DEVICE (device)); + + if (device == NULL) + return; + + g_list_store_append (self->devices, device); } static void @@ -213,6 +224,8 @@ mks_session_object_manager_object_added_cb (MksSession *self, if (MKS_QEMU_IS_VM (iface)) mks_session_set_vm (self, object, MKS_QEMU_VM (iface)); + else if (MKS_QEMU_IS_CONSOLE (iface)) + mks_session_add_device (self, _mks_screen_new (object)); } }