Add VirtViewerDisplay::selectable property

This property will be set when the display can be selected to be
"enabled" and shown (this can involve creating/connecting an
additional guest monitor, and may need guest agent cooperation for
example).
This commit is contained in:
Marc-André Lureau 2012-07-17 16:31:44 +02:00
parent 37c30a4569
commit 6f9c7a624e
3 changed files with 41 additions and 0 deletions

View File

@ -47,6 +47,7 @@ static void virt_viewer_display_spice_send_keys(VirtViewerDisplay *display,
static GdkPixbuf *virt_viewer_display_spice_get_pixbuf(VirtViewerDisplay *display);
static void virt_viewer_display_spice_release_cursor(VirtViewerDisplay *display);
static void virt_viewer_display_spice_close(VirtViewerDisplay *display G_GNUC_UNUSED);
static gboolean virt_viewer_display_spice_selectable(VirtViewerDisplay *display);
static void
virt_viewer_display_spice_finalize(GObject *obj)
@ -70,6 +71,7 @@ virt_viewer_display_spice_class_init(VirtViewerDisplaySpiceClass *klass)
dclass->get_pixbuf = virt_viewer_display_spice_get_pixbuf;
dclass->release_cursor = virt_viewer_display_spice_release_cursor;
dclass->close = virt_viewer_display_spice_close;
dclass->selectable = virt_viewer_display_spice_selectable;
g_type_class_add_private(klass, sizeof(VirtViewerDisplaySpicePrivate));
}
@ -279,6 +281,20 @@ virt_viewer_display_spice_close(VirtViewerDisplay *display G_GNUC_UNUSED)
{
}
static gboolean
virt_viewer_display_spice_selectable(VirtViewerDisplay *self)
{
gboolean agent_connected;
SpiceMainChannel *mainc;
mainc = get_main(self);
g_object_get(mainc,
"agent-connected", &agent_connected,
NULL);
return agent_connected;
}
/*
* Local variables:

View File

@ -80,6 +80,7 @@ enum {
PROP_ZOOM_LEVEL,
PROP_SHOW_HINT,
PROP_SESSION,
PROP_SELECTABLE,
};
static void
@ -167,6 +168,13 @@ virt_viewer_display_class_init(VirtViewerDisplayClass *class)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(object_class,
PROP_SELECTABLE,
g_param_spec_boolean("selectable",
"Selectable",
"Selectable",
FALSE,
G_PARAM_READABLE));
g_signal_new("display-pointer-grab",
G_OBJECT_CLASS_TYPE(object_class),
@ -302,6 +310,9 @@ virt_viewer_display_get_property(GObject *object,
case PROP_SESSION:
g_value_set_object(value, virt_viewer_display_get_session(display));
break;
case PROP_SELECTABLE:
g_value_set_boolean(value, virt_viewer_display_get_selectable(display));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -601,6 +612,18 @@ void virt_viewer_display_release_cursor(VirtViewerDisplay *self)
klass->release_cursor(self);
}
gboolean virt_viewer_display_get_selectable(VirtViewerDisplay *self)
{
VirtViewerDisplayClass *klass;
g_return_val_if_fail(VIRT_VIEWER_IS_DISPLAY(self), FALSE);
klass = VIRT_VIEWER_DISPLAY_GET_CLASS(self);
if (klass->selectable)
return klass->selectable(self);
return TRUE;
}
void virt_viewer_display_close(VirtViewerDisplay *self)
{

View File

@ -77,6 +77,7 @@ struct _VirtViewerDisplayClass {
void (*release_cursor)(VirtViewerDisplay *display);
void (*close)(VirtViewerDisplay *display);
gboolean (*selectable)(VirtViewerDisplay *display);
/* signals */
void (*display_pointer_grab)(VirtViewerDisplay *display);
@ -118,6 +119,7 @@ void virt_viewer_display_release_cursor(VirtViewerDisplay *display);
void virt_viewer_display_close(VirtViewerDisplay *display);
void virt_viewer_display_set_enabled(VirtViewerDisplay *display, gboolean enabled);
gboolean virt_viewer_display_get_selectable(VirtViewerDisplay *display);
G_END_DECLS