Merge branch 'bilelmoussaoui/use-notify' into 'main'

cleanup: Use explicit notify for properties

See merge request GNOME/libmks!37
This commit is contained in:
Christian Hergert 2023-08-31 17:26:40 +00:00
commit c92f5c0a4a
5 changed files with 170 additions and 68 deletions

View File

@ -56,6 +56,19 @@ enum {
static GParamSpec *properties [N_PROPS]; static GParamSpec *properties [N_PROPS];
static void
mks_keyboard_set_modifiers (MksKeyboard *self,
MksKeyboardModifier modifiers)
{
g_assert (MKS_IS_KEYBOARD (self));
if (self->modifiers != modifiers)
{
self->modifiers = modifiers;
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_MODIFIERS]);
}
}
static void static void
mks_keyboard_keyboard_notify_cb (MksKeyboard *self, mks_keyboard_keyboard_notify_cb (MksKeyboard *self,
GParamSpec *pspec, GParamSpec *pspec,
@ -68,10 +81,7 @@ mks_keyboard_keyboard_notify_cb (MksKeyboard *self,
g_assert (MKS_QEMU_IS_KEYBOARD (keyboard)); g_assert (MKS_QEMU_IS_KEYBOARD (keyboard));
if (strcmp (pspec->name, "modifiers") == 0) if (strcmp (pspec->name, "modifiers") == 0)
{ mks_keyboard_set_modifiers (self, mks_qemu_keyboard_get_modifiers (keyboard));
self->modifiers = mks_qemu_keyboard_get_modifiers (keyboard);
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_MODIFIERS]);
}
MKS_EXIT; MKS_EXIT;
} }
@ -82,6 +92,7 @@ mks_keyboard_set_keyboard (MksKeyboard *self,
{ {
g_assert (MKS_IS_KEYBOARD (self)); g_assert (MKS_IS_KEYBOARD (self));
g_assert (!keyboard || MKS_QEMU_IS_KEYBOARD (keyboard)); g_assert (!keyboard || MKS_QEMU_IS_KEYBOARD (keyboard));
g_assert (self->keyboard == NULL);
if (g_set_object (&self->keyboard, keyboard)) if (g_set_object (&self->keyboard, keyboard))
{ {
@ -90,7 +101,7 @@ mks_keyboard_set_keyboard (MksKeyboard *self,
G_CALLBACK (mks_keyboard_keyboard_notify_cb), G_CALLBACK (mks_keyboard_keyboard_notify_cb),
self, self,
G_CONNECT_SWAPPED); G_CONNECT_SWAPPED);
self->modifiers = mks_qemu_keyboard_get_modifiers (keyboard); mks_keyboard_set_modifiers (self, mks_qemu_keyboard_get_modifiers (keyboard));
} }
} }

View File

@ -37,6 +37,8 @@ struct _MksMouse
MksQemuMouse *mouse; MksQemuMouse *mouse;
double last_known_x; double last_known_x;
double last_known_y; double last_known_y;
guint is_absolute: 1;
}; };
struct _MksMouseClass struct _MksMouseClass
@ -54,14 +56,53 @@ enum {
static GParamSpec *properties [N_PROPS]; static GParamSpec *properties [N_PROPS];
static void
mks_mouse_set_is_absolute (MksMouse *self,
gboolean is_absolute)
{
g_assert (MKS_IS_MOUSE (self));
if (self->is_absolute != is_absolute)
{
self->is_absolute = is_absolute;
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_IS_ABSOLUTE]);
}
}
static void
mks_mouse_mouse_notify_cb (MksMouse *self,
GParamSpec *pspec,
MksQemuMouse *mouse)
{
MKS_ENTRY;
g_assert (MKS_IS_MOUSE (self));
g_assert (pspec != NULL);
g_assert (MKS_QEMU_IS_MOUSE (mouse));
if (strcmp (pspec->name, "is-absolute") == 0)
mks_mouse_set_is_absolute (self, mks_qemu_mouse_get_is_absolute (mouse));
MKS_EXIT;
}
static void static void
mks_mouse_set_mouse (MksMouse *self, mks_mouse_set_mouse (MksMouse *self,
MksQemuMouse *mouse) MksQemuMouse *mouse)
{ {
g_assert (MKS_IS_MOUSE (self)); g_assert (MKS_IS_MOUSE (self));
g_assert (MKS_QEMU_IS_MOUSE (mouse)); g_assert (MKS_QEMU_IS_MOUSE (mouse));
g_assert (self->mouse == NULL);
g_set_object (&self->mouse, mouse); if (g_set_object (&self->mouse, mouse))
{
g_signal_connect_object (self->mouse,
"notify",
G_CALLBACK (mks_mouse_mouse_notify_cb),
self,
G_CONNECT_SWAPPED);
mks_mouse_set_is_absolute (self, mks_qemu_mouse_get_is_absolute (mouse));
}
} }
static gboolean static gboolean
@ -156,10 +197,7 @@ mks_mouse_get_is_absolute (MksMouse *self)
{ {
g_return_val_if_fail (MKS_IS_MOUSE (self), FALSE); g_return_val_if_fail (MKS_IS_MOUSE (self), FALSE);
if (self->mouse) return self->is_absolute;
return mks_qemu_mouse_get_is_absolute (self->mouse);
return FALSE;
} }
static gboolean static gboolean

View File

@ -76,8 +76,8 @@ enum {
static GParamSpec *properties [N_PROPS]; static GParamSpec *properties [N_PROPS];
static void static void
_mks_screen_set_width (MksScreen *self, mks_screen_set_width (MksScreen *self,
guint width) guint width)
{ {
g_assert (MKS_IS_SCREEN (self)); g_assert (MKS_IS_SCREEN (self));
@ -89,8 +89,8 @@ _mks_screen_set_width (MksScreen *self,
} }
static void static void
_mks_screen_set_height (MksScreen *self, mks_screen_set_height (MksScreen *self,
guint height) guint height)
{ {
g_assert (MKS_IS_SCREEN (self)); g_assert (MKS_IS_SCREEN (self));
@ -102,8 +102,8 @@ _mks_screen_set_height (MksScreen *self,
} }
static void static void
_mks_screen_set_number (MksScreen *self, mks_screen_set_number (MksScreen *self,
guint number) guint number)
{ {
g_assert (MKS_IS_SCREEN (self)); g_assert (MKS_IS_SCREEN (self));
@ -114,6 +114,26 @@ _mks_screen_set_number (MksScreen *self,
} }
} }
static void
mks_screen_set_type (MksScreen *self,
const char *type)
{
MksScreenKind kind;
g_assert (MKS_IS_SCREEN (self));
kind = MKS_SCREEN_KIND_TEXT;
if (strcmp (type, "Graphic") == 0)
kind = MKS_SCREEN_KIND_GRAPHIC;
if (kind != self->kind)
{
self->kind = kind;
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_KIND]);
}
}
static void static void
mks_screen_console_notify_cb (MksScreen *self, mks_screen_console_notify_cb (MksScreen *self,
GParamSpec *pspec, GParamSpec *pspec,
@ -126,29 +146,13 @@ mks_screen_console_notify_cb (MksScreen *self,
if (strcmp (pspec->name, "label") == 0) if (strcmp (pspec->name, "label") == 0)
_mks_device_set_name (MKS_DEVICE (self), mks_qemu_console_get_label (console)); _mks_device_set_name (MKS_DEVICE (self), mks_qemu_console_get_label (console));
else if (strcmp (pspec->name, "width") == 0) else if (strcmp (pspec->name, "width") == 0)
_mks_screen_set_width (self, mks_qemu_console_get_width (console)); mks_screen_set_width (self, mks_qemu_console_get_width (console));
else if (strcmp (pspec->name, "height") == 0) else if (strcmp (pspec->name, "height") == 0)
_mks_screen_set_height (self, mks_qemu_console_get_height (console)); mks_screen_set_height (self, mks_qemu_console_get_height (console));
else if (strcmp (pspec->name, "number") == 0) else if (strcmp (pspec->name, "number") == 0)
_mks_screen_set_number (self, mks_qemu_console_get_head (console)); mks_screen_set_number (self, mks_qemu_console_get_head (console));
else if (strcmp (pspec->name, "type") == 0) else if (strcmp (pspec->name, "type") == 0)
{ mks_screen_set_type (self, mks_qemu_console_get_type_ ((console)));
const char *type;
if ((type = mks_qemu_console_get_type_ ((console))))
{
MksScreenKind kind = MKS_SCREEN_KIND_TEXT;
if (strcmp (type, "Graphic") == 0)
kind = MKS_SCREEN_KIND_GRAPHIC;
if (kind != self->kind)
{
self->kind = kind;
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_KIND]);
}
}
}
} }
static void static void
@ -163,8 +167,6 @@ mks_screen_set_console (MksScreen *self,
if (g_set_object (&self->console, console)) if (g_set_object (&self->console, console))
{ {
const char *type;
_mks_device_set_name (MKS_DEVICE (self), mks_qemu_console_get_label (console)); _mks_device_set_name (MKS_DEVICE (self), mks_qemu_console_get_label (console));
self->console_notify_handler = self->console_notify_handler =
@ -174,15 +176,10 @@ mks_screen_set_console (MksScreen *self,
self, self,
G_CONNECT_SWAPPED); G_CONNECT_SWAPPED);
if ((type = mks_qemu_console_get_type_ ((console)))) mks_screen_set_type (self, mks_qemu_console_get_type_ ((console)));
{ mks_screen_set_width (self, mks_qemu_console_get_width (console));
if (strcmp (type, "Graphic") == 0) mks_screen_set_height (self, mks_qemu_console_get_height (console));
self->kind = MKS_SCREEN_KIND_GRAPHIC; mks_screen_set_number (self, mks_qemu_console_get_head (console));
}
self->width = mks_qemu_console_get_width (console);
self->height = mks_qemu_console_get_height (console);
self->number = mks_qemu_console_get_head (console);
} }
} }

View File

@ -106,6 +106,9 @@ struct _MksSession
*/ */
MksQemuObject *vm_object; MksQemuObject *vm_object;
MksQemuVM *vm; MksQemuVM *vm;
char *name;
char *uuid;
}; };
static void static void
@ -164,6 +167,26 @@ mks_session_add_device (MksSession *self,
g_list_store_append (self->devices, device); g_list_store_append (self->devices, device);
} }
static void
mks_session_set_name (MksSession *self,
const char *name)
{
g_assert (MKS_IS_SESSION (self));
if (g_set_str (&self->name, name))
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_NAME]);
}
static void
mks_session_set_uuid (MksSession *self,
const char *uuid)
{
g_assert (MKS_IS_SESSION (self));
if (g_set_str (&self->uuid, uuid))
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_UUID]);
}
static void static void
mks_session_vm_notify_cb (MksSession *self, mks_session_vm_notify_cb (MksSession *self,
GParamSpec *pspec, GParamSpec *pspec,
@ -173,11 +196,10 @@ mks_session_vm_notify_cb (MksSession *self,
g_assert (pspec != NULL); g_assert (pspec != NULL);
g_assert (MKS_QEMU_IS_VM (vm)); g_assert (MKS_QEMU_IS_VM (vm));
if (0) {} if (strcmp (pspec->name, "name") == 0)
else if (strcmp (pspec->name, "name") == 0) mks_session_set_name (self, mks_qemu_vm_get_name (vm));
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_NAME]);
else if (strcmp (pspec->name, "uuid") == 0) else if (strcmp (pspec->name, "uuid") == 0)
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_UUID]); mks_session_set_uuid (self, mks_qemu_vm_get_uuid (vm));
} }
static void static void
@ -200,9 +222,8 @@ mks_session_set_vm (MksSession *self,
G_CALLBACK (mks_session_vm_notify_cb), G_CALLBACK (mks_session_vm_notify_cb),
self, self,
G_CONNECT_SWAPPED); G_CONNECT_SWAPPED);
mks_session_set_name (self, mks_qemu_vm_get_name (vm));
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_NAME]); mks_session_set_uuid (self, mks_qemu_vm_get_uuid (vm));
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_UUID]);
} }
static void static void
@ -286,6 +307,8 @@ mks_session_dispose (GObject *object)
g_clear_object (&self->object_manager); g_clear_object (&self->object_manager);
g_clear_object (&self->vm); g_clear_object (&self->vm);
g_clear_object (&self->vm_object); g_clear_object (&self->vm_object);
g_clear_pointer (&self->name, g_free);
g_clear_pointer (&self->uuid, g_free);
G_OBJECT_CLASS (mks_session_parent_class)->dispose (object); G_OBJECT_CLASS (mks_session_parent_class)->dispose (object);
} }
@ -682,10 +705,7 @@ mks_session_get_uuid (MksSession *self)
{ {
g_return_val_if_fail (MKS_IS_SESSION (self), NULL); g_return_val_if_fail (MKS_IS_SESSION (self), NULL);
if (self->vm != NULL) return self->uuid;
return mks_qemu_vm_get_uuid (self->vm);
return NULL;
} }
/** /**
@ -699,10 +719,7 @@ mks_session_get_name (MksSession *self)
{ {
g_return_val_if_fail (MKS_IS_SESSION (self), NULL); g_return_val_if_fail (MKS_IS_SESSION (self), NULL);
if (self->vm != NULL) return self->name;
return mks_qemu_vm_get_name (self->vm);
return NULL;
} }
/** /**

View File

@ -35,6 +35,7 @@ struct _MksTouchable
{ {
MksDevice parent_instance; MksDevice parent_instance;
MksQemuMultiTouch *touch; MksQemuMultiTouch *touch;
int max_slots;
}; };
struct _MksTouchableClass struct _MksTouchableClass
@ -53,14 +54,55 @@ enum {
static GParamSpec *properties [N_PROPS]; static GParamSpec *properties [N_PROPS];
static void
mks_touchable_set_max_slots (MksTouchable *self,
int max_slots)
{
g_assert (MKS_IS_TOUCHABLE (self));
// Per INPUT_EVENT_SLOTS_MIN / INPUT_EVENT_SLOTS_MAX in QEMU
g_assert (max_slots >= 0 && max_slots <= 10);
if (self->max_slots != max_slots)
{
self->max_slots = max_slots;
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_MAX_SLOTS]);
}
}
static void
mks_touchable_touch_notify_cb (MksTouchable *self,
GParamSpec *pspec,
MksQemuMultiTouch *touch)
{
MKS_ENTRY;
g_assert (MKS_IS_TOUCHABLE (self));
g_assert (pspec != NULL);
g_assert (MKS_QEMU_IS_MULTI_TOUCH (touch));
if (strcmp (pspec->name, "max-slots") == 0)
mks_touchable_set_max_slots (self, mks_qemu_multi_touch_get_max_slots (touch));
MKS_EXIT;
}
static void static void
mks_touchable_set_touch (MksTouchable *self, mks_touchable_set_touch (MksTouchable *self,
MksQemuMultiTouch *touch) MksQemuMultiTouch *touch)
{ {
g_assert (MKS_IS_TOUCHABLE (self)); g_assert (MKS_IS_TOUCHABLE (self));
g_assert (!touch || MKS_QEMU_IS_MULTI_TOUCH (touch)); g_assert (!touch || MKS_QEMU_IS_MULTI_TOUCH (touch));
g_assert (self->touch == NULL);
g_set_object (&self->touch, touch); if (g_set_object (&self->touch, touch))
{
g_signal_connect_object (self->touch,
"notify",
G_CALLBACK (mks_touchable_touch_notify_cb),
self,
G_CONNECT_SWAPPED);
mks_touchable_set_max_slots (self, mks_qemu_multi_touch_get_max_slots (touch));
}
} }
static gboolean static gboolean
@ -133,7 +175,7 @@ mks_touchable_class_init (MksTouchableClass *klass)
*/ */
properties [PROP_MAX_SLOTS] = properties [PROP_MAX_SLOTS] =
g_param_spec_int ("max-slots", NULL, NULL, g_param_spec_int ("max-slots", NULL, NULL,
0, G_MAXINT, 0, 0, 10, 0,
(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
g_object_class_install_properties (object_class, N_PROPS, properties); g_object_class_install_properties (object_class, N_PROPS, properties);
@ -309,8 +351,5 @@ mks_touchable_get_max_slots (MksTouchable *self)
{ {
g_return_val_if_fail (MKS_IS_TOUCHABLE (self), 0); g_return_val_if_fail (MKS_IS_TOUCHABLE (self), 0);
if (self->touch) return self->max_slots;
return mks_qemu_multi_touch_get_max_slots (self->touch);
return 0;
} }