Hi On Thu, Mar 7, 2019 at 12:36 PM Aleksei Nikiforov <darktemplar@xxxxxxxxxx> wrote: > > 04.03.2019 19:38, Marc-André Lureau пишет: > > On Mon, Mar 4, 2019 at 3:39 PM Aleksei Nikiforov <darktemplar@xxxxxxxxxx> wrote: > >> > >> Signed-off-by: Aleksei Nikiforov <darktemplar@xxxxxxxxxx> > > > > Reviewed-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> > > > > Thanks. Is anything else needed from me to merge it? Or will someone > merge it some time later? pushed, thanks > > >> --- > >> man/remote-viewer.pod | 3 + > >> src/resources/ui/virt-viewer-preferences.ui | 16 +++- > >> src/virt-viewer-app.c | 93 +++++++++++++++++++++ > >> src/virt-viewer-app.h | 6 ++ > >> src/virt-viewer-session-spice.c | 9 +- > >> 5 files changed, 125 insertions(+), 2 deletions(-) > >> > >> diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod > >> index 4b683cf..ed76af5 100644 > >> --- a/man/remote-viewer.pod > >> +++ b/man/remote-viewer.pod > >> @@ -360,6 +360,9 @@ The monitor-mapping must contain ids of all displays from 1 to the last > >> desired display id, e.g. "monitor-mapping=3:3" is invalid because mappings > >> for displays 1 and 2 are not specified. > >> > >> +Configuration key B<share-clipboard> contains a boolean value. If it's "true", > >> +then clipboard is shared with guests if clipboard sharing is supported by used protocol. > >> + > >> =head1 EXAMPLES > >> > >> To connect to SPICE server on host "makai" with port 5900 > >> diff --git a/src/resources/ui/virt-viewer-preferences.ui b/src/resources/ui/virt-viewer-preferences.ui > >> index f9738c5..0b88da4 100644 > >> --- a/src/resources/ui/virt-viewer-preferences.ui > >> +++ b/src/resources/ui/virt-viewer-preferences.ui > >> @@ -61,7 +61,7 @@ > >> <property name="visible">True</property> > >> <property name="can_focus">False</property> > >> <property name="border_width">6</property> > >> - <property name="n_rows">2</property> > >> + <property name="n_rows">3</property> > >> <property name="n_columns">2</property> > >> <property name="column_spacing">12</property> > >> <property name="row_spacing">6</property> > >> @@ -91,6 +91,20 @@ > >> <property name="bottom_attach">2</property> > >> </packing> > >> </child> > >> + <child> > >> + <object class="GtkCheckButton" id="cbshareclipboard"> > >> + <property name="label" translatable="yes">Share clipboard</property> > >> + <property name="visible">True</property> > >> + <property name="can_focus">True</property> > >> + <property name="receives_default">False</property> > >> + <property name="draw_indicator">True</property> > >> + </object> > >> + <packing> > >> + <property name="right_attach">2</property> > >> + <property name="top_attach">2</property> > >> + <property name="bottom_attach">3</property> > >> + </packing> > >> + </child> > >> <child> > >> <object class="GtkFileChooserButton" id="fcsharefolder"> > >> <property name="visible">True</property> > >> diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c > >> index 2684263..da8cfa9 100644 > >> --- a/src/virt-viewer-app.c > >> +++ b/src/virt-viewer-app.c > >> @@ -157,6 +157,7 @@ struct _VirtViewerAppPrivate { > >> guint remove_smartcard_accel_key; > >> GdkModifierType remove_smartcard_accel_mods; > >> gboolean quit_on_disconnect; > >> + gboolean supports_share_clipboard; > >> }; > >> > >> > >> @@ -176,6 +177,8 @@ enum { > >> PROP_UUID, > >> PROP_VM_UI, > >> PROP_VM_RUNNING, > >> + PROP_CONFIG_SHARE_CLIPBOARD, > >> + PROP_SUPPORTS_SHARE_CLIPBOARD, > >> }; > >> > >> void > >> @@ -1588,6 +1591,14 @@ virt_viewer_app_get_property (GObject *object, guint property_id, > >> g_value_set_boolean(value, priv->vm_running); > >> break; > >> > >> + case PROP_CONFIG_SHARE_CLIPBOARD: > >> + g_value_set_boolean(value, virt_viewer_app_get_config_share_clipboard(self)); > >> + break; > >> + > >> + case PROP_SUPPORTS_SHARE_CLIPBOARD: > >> + g_value_set_boolean(value, virt_viewer_app_get_supports_share_clipboard(self)); > >> + break; > >> + > >> default: > >> G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); > >> } > >> @@ -1650,6 +1661,14 @@ virt_viewer_app_set_property (GObject *object, guint property_id, > >> priv->vm_running = g_value_get_boolean(value); > >> break; > >> > >> + case PROP_CONFIG_SHARE_CLIPBOARD: > >> + virt_viewer_app_set_config_share_clipboard(self, g_value_get_boolean(value)); > >> + break; > >> + > >> + case PROP_SUPPORTS_SHARE_CLIPBOARD: > >> + virt_viewer_app_set_supports_share_clipboard(self, g_value_get_boolean(value)); > >> + break; > >> + > >> default: > >> G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); > >> } > >> @@ -1867,6 +1886,9 @@ virt_viewer_app_on_application_startup(GApplication *app) > >> gtk_accel_map_add_entry("<virt-viewer>/view/zoom-in", GDK_KEY_plus, GDK_CONTROL_MASK); > >> gtk_accel_map_add_entry("<virt-viewer>/send/secure-attention", GDK_KEY_End, GDK_CONTROL_MASK | GDK_MOD1_MASK); > >> > >> + // Restore initial state of config-share-clipboard property from config and notify about it > >> + virt_viewer_app_set_config_share_clipboard(self, virt_viewer_app_get_config_share_clipboard(self)); > >> + > >> if (!virt_viewer_app_start(self, &error)) { > >> if (error && !g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) > >> virt_viewer_app_simple_message_dialog(self, error->message); > >> @@ -2061,6 +2083,24 @@ virt_viewer_app_class_init (VirtViewerAppClass *klass) > >> FALSE, > >> G_PARAM_READWRITE | > >> G_PARAM_STATIC_STRINGS)); > >> + > >> + g_object_class_install_property(object_class, > >> + PROP_CONFIG_SHARE_CLIPBOARD, > >> + g_param_spec_boolean("config-share-clipboard", > >> + "Share clipboard", > >> + "Indicates whether to share clipboard", > >> + TRUE, /* backwards-compatible default value */ > >> + G_PARAM_READWRITE | > >> + G_PARAM_STATIC_STRINGS)); > >> + > >> + g_object_class_install_property(object_class, > >> + PROP_SUPPORTS_SHARE_CLIPBOARD, > >> + g_param_spec_boolean("supports-share-clipboard", > >> + "Support for share clipboard", > >> + "Indicates whether to support for clipboard sharing is available", > >> + FALSE, > >> + G_PARAM_READWRITE | > >> + G_PARAM_STATIC_STRINGS)); > >> } > >> > >> void > >> @@ -2559,6 +2599,14 @@ virt_viewer_app_get_preferences(VirtViewerApp *self) > >> preferences = GTK_WIDGET(gtk_builder_get_object(builder, "preferences")); > >> self->priv->preferences = preferences; > >> > >> + g_object_bind_property(self, > >> + "config-share-clipboard", > >> + gtk_builder_get_object(builder, "cbshareclipboard"), > >> + "active", > >> + G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE); > >> + > >> + g_object_set (gtk_builder_get_object(builder, "cbshareclipboard"), > >> + "sensitive", virt_viewer_app_get_supports_share_clipboard(self), NULL); > >> g_object_set (gtk_builder_get_object(builder, "cbsharefolder"), > >> "sensitive", can_share_folder, NULL); > >> g_object_set (gtk_builder_get_object(builder, "cbsharefolderro"), > >> @@ -2663,6 +2711,51 @@ gboolean virt_viewer_app_get_session_cancelled(VirtViewerApp *self) > >> return self->priv->cancelled; > >> } > >> > >> +gboolean virt_viewer_app_get_config_share_clipboard(VirtViewerApp *self) > >> +{ > >> + VirtViewerAppPrivate *priv = self->priv; > >> + > >> + GError *error = NULL; > >> + gboolean share_clipboard; > >> + > >> + share_clipboard = g_key_file_get_boolean(priv->config, > >> + "virt-viewer", "share-clipboard", &error); > >> + > >> + if (error) { > >> + share_clipboard = TRUE; /* backwards-compatible default value */ > >> + g_clear_error(&error); > >> + } > >> + > >> + return share_clipboard; > >> +} > >> + > >> +void virt_viewer_app_set_config_share_clipboard(VirtViewerApp *self, gboolean enable) > >> +{ > >> + VirtViewerAppPrivate *priv = self->priv; > >> + > >> + g_key_file_set_boolean(priv->config, > >> + "virt-viewer", "share-clipboard", enable); > >> + g_object_notify(G_OBJECT(self), "config-share-clipboard"); > >> +} > >> + > >> +gboolean virt_viewer_app_get_supports_share_clipboard(VirtViewerApp *self) > >> +{ > >> + g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE); > >> + > >> + return self->priv->supports_share_clipboard; > >> +} > >> + > >> +void virt_viewer_app_set_supports_share_clipboard(VirtViewerApp *self, gboolean enable) > >> +{ > >> + g_return_if_fail(VIRT_VIEWER_IS_APP(self)); > >> + > >> + if (self->priv->supports_share_clipboard == enable) > >> + return; > >> + > >> + self->priv->supports_share_clipboard = enable; > >> + g_object_notify(G_OBJECT(self), "supports-share-clipboard"); > >> +} > >> + > >> /* > >> * Local variables: > >> * c-indent-level: 4 > >> diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h > >> index 0321229..a39395f 100644 > >> --- a/src/virt-viewer-app.h > >> +++ b/src/virt-viewer-app.h > >> @@ -99,6 +99,12 @@ void virt_viewer_app_show_preferences(VirtViewerApp *app, GtkWidget *parent); > >> void virt_viewer_app_set_menus_sensitive(VirtViewerApp *self, gboolean sensitive); > >> gboolean virt_viewer_app_get_session_cancelled(VirtViewerApp *self); > >> > >> +gboolean virt_viewer_app_get_config_share_clipboard(VirtViewerApp *self); > >> +void virt_viewer_app_set_config_share_clipboard(VirtViewerApp *self, gboolean enable); > >> + > >> +gboolean virt_viewer_app_get_supports_share_clipboard(VirtViewerApp *self); > >> +void virt_viewer_app_set_supports_share_clipboard(VirtViewerApp *self, gboolean enable); > >> + > >> G_END_DECLS > >> > >> #endif /* VIRT_VIEWER_APP_H */ > >> diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c > >> index 93b52a1..8841b8d 100644 > >> --- a/src/virt-viewer-session-spice.c > >> +++ b/src/virt-viewer-session-spice.c > >> @@ -401,7 +401,14 @@ create_spice_session(VirtViewerSessionSpice *self) > >> spice_set_session_option(self->priv->session); > >> > >> self->priv->gtk_session = spice_gtk_session_get(self->priv->session); > >> - g_object_set(self->priv->gtk_session, "auto-clipboard", TRUE, NULL); > >> + > >> + g_object_set(virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self)), > >> + "supports-share-clipboard", TRUE, > >> + NULL); > >> + > >> + g_object_bind_property(virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self)), "config-share-clipboard", > >> + self->priv->gtk_session, "auto-clipboard", > >> + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); > >> > >> virt_viewer_signal_connect_object(self->priv->session, "channel-new", > >> G_CALLBACK(virt_viewer_session_spice_channel_new), self, 0); > >> -- > >> 2.19.2 > >> > >> _______________________________________________ > >> virt-tools-list mailing list > >> virt-tools-list@xxxxxxxxxx > >> https://www.redhat.com/mailman/listinfo/virt-tools-list _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list