Re: [PATCH] remote-viewer: Allow toggling shared clipboard

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi

26.02.2019 15:42, Marc-André Lureau пишет:
Hi

On Tue, Feb 26, 2019 at 1:19 PM Aleksei Nikiforov
<darktemplar@xxxxxxxxxx> wrote:

Signed-off-by: Aleksei Nikiforov <darktemplar@xxxxxxxxxx>

looks good overall,

please update the man page for the new key


Should I add a small description for share-clipboard configuration key in CONFIGURATION section of remote-viewer(1) man page, or do you mean something else?

---
  src/resources/ui/virt-viewer.ui | 11 +++++++++++
  src/virt-viewer-app.c           | 25 +++++++++++++++++++++++++
  src/virt-viewer-app.h           |  3 +++
  src/virt-viewer-session-spice.c | 32 ++++++++++++++++++++++++++++++--
  src/virt-viewer-session.h       |  2 ++
  src/virt-viewer-window.c        | 28 ++++++++++++++++++++++++++++
  6 files changed, 99 insertions(+), 2 deletions(-)

diff --git a/src/resources/ui/virt-viewer.ui b/src/resources/ui/virt-viewer.ui
index e9609ec..1eccd35 100644
--- a/src/resources/ui/virt-viewer.ui
+++ b/src/resources/ui/virt-viewer.ui
@@ -42,6 +42,17 @@
                              <signal name="activate" handler="virt_viewer_window_menu_file_screenshot" swapped="no"/>
                            </object>
                          </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menu-file-share-clipboard">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="accel_path">&lt;virt-viewer&gt;/file/share-clipboard</property>
+                            <property name="label" translatable="yes">Share clipboard</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="virt_viewer_window_menu_file_share_clipboard" swapped="no"/>
+                          </object>
+                        </child>

I'd rather have it under "Preferences" dialog (it's not an "action").


I'll try to rework it and return with result when done.

                          <child>
                            <object class="GtkMenuItem" id="menu-file-usb-device-selection">
                              <property name="visible">True</property>
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index e0e6e63..6b50e5f 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -2571,6 +2571,31 @@ 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 = 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);
+}
+
  /*
   * Local variables:
   *  c-indent-level: 4
diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h
index 16b1c8c..962226b 100644
--- a/src/virt-viewer-app.h
+++ b/src/virt-viewer-app.h
@@ -99,6 +99,9 @@ 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);
+
  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 fdc7004..2e8b6a8 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -62,7 +62,8 @@ enum {
      PROP_MAIN_WINDOW
  };

-
+static gboolean virt_viewer_session_spice_get_share_clipboard(VirtViewerSession* session);
+static void virt_viewer_session_spice_set_share_clipboard(VirtViewerSession* session, gboolean value);
  static void virt_viewer_session_spice_close(VirtViewerSession *session);
  static gboolean virt_viewer_session_spice_open_fd(VirtViewerSession *session, int fd);
  static gboolean virt_viewer_session_spice_open_host(VirtViewerSession *session, const gchar *host, const gchar *port, const gchar *tlsport);
@@ -247,6 +248,8 @@ virt_viewer_session_spice_class_init(VirtViewerSessionSpiceClass *klass)
      oclass->constructed = virt_viewer_session_spice_constructed;

      dclass->close = virt_viewer_session_spice_close;
+    dclass->get_share_clipboard = virt_viewer_session_spice_get_share_clipboard;
+    dclass->set_share_clipboard = virt_viewer_session_spice_set_share_clipboard;
      dclass->open_fd = virt_viewer_session_spice_open_fd;
      dclass->open_host = virt_viewer_session_spice_open_host;
      dclass->open_uri = virt_viewer_session_spice_open_uri;
@@ -392,7 +395,9 @@ 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);
+
+    gboolean share_clipboard = virt_viewer_app_get_config_share_clipboard(virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self)));

In general we don't like mixing declarations and code, can you move it
before code?


Sure, I'll update it.

+    g_object_set(self->priv->gtk_session, "auto-clipboard", share_clipboard, NULL);

      virt_viewer_signal_connect_object(self->priv->session, "channel-new",
                                        G_CALLBACK(virt_viewer_session_spice_channel_new), self, 0);
@@ -629,6 +634,29 @@ virt_viewer_session_spice_open_uri(VirtViewerSession *session,
      return spice_session_connect(self->priv->session);
  }

+static gboolean
+virt_viewer_session_spice_get_share_clipboard(VirtViewerSession* session)
+{
+    VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session);
+
+    g_return_val_if_fail(self != NULL, TRUE); /* backwards-compatible default value */
+
+    gboolean value;

same


Sure.

+    g_object_get(self->priv->gtk_session, "auto-clipboard", &value, NULL);
+    return value;
+}
+
+static void
+virt_viewer_session_spice_set_share_clipboard(VirtViewerSession* session,
+                                              gboolean value)
+{
+    VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session);
+
+    g_return_if_fail(self != NULL);
+
+    g_object_set(self->priv->gtk_session, "auto-clipboard", value, NULL);
+}
+
  static gboolean
  virt_viewer_session_spice_open_fd(VirtViewerSession *session,
                                    int fd)
diff --git a/src/virt-viewer-session.h b/src/virt-viewer-session.h
index 8ee4d8a..4f2914d 100644
--- a/src/virt-viewer-session.h
+++ b/src/virt-viewer-session.h
@@ -74,6 +74,8 @@ struct _VirtViewerSessionClass {
      void (* smartcard_insert) (VirtViewerSession* session);
      void (* smartcard_remove) (VirtViewerSession* session);
      const gchar* (* mime_type) (VirtViewerSession* session);
+    gboolean (* get_share_clipboard) (VirtViewerSession* session);
+    void (* set_share_clipboard) (VirtViewerSession* session, gboolean value);

      /* signals */
      void (*session_connected)(VirtViewerSession *session);
diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
index af3441f..4b77e2c 100644
--- a/src/virt-viewer-window.c
+++ b/src/virt-viewer-window.c
@@ -59,6 +59,7 @@ void virt_viewer_window_menu_help_guest_details(GtkWidget *menu, VirtViewerWindo
  void virt_viewer_window_menu_view_fullscreen(GtkWidget *menu, VirtViewerWindow *self);
  void virt_viewer_window_menu_send(GtkWidget *menu, VirtViewerWindow *self);
  void virt_viewer_window_menu_file_screenshot(GtkWidget *menu, VirtViewerWindow *self);
+void virt_viewer_window_menu_file_share_clipboard(GtkWidget *menu, VirtViewerWindow *self);
  void virt_viewer_window_menu_file_usb_device_selection(GtkWidget *menu, VirtViewerWindow *self);
  void virt_viewer_window_menu_file_smartcard_insert(GtkWidget *menu, VirtViewerWindow *self);
  void virt_viewer_window_menu_file_smartcard_remove(GtkWidget *menu, VirtViewerWindow *self);
@@ -233,6 +234,9 @@ virt_viewer_window_constructed(GObject *object)
      g_signal_connect(priv->app, "notify::enable-accel",
                       G_CALLBACK(rebuild_combo_menu), object);
      rebuild_combo_menu(NULL, NULL, object);
+
+    gboolean share_clipboard = virt_viewer_app_get_config_share_clipboard(priv->app);
+    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_builder_get_object(priv->builder, "menu-file-share-clipboard")), share_clipboard);
  }

  static void
@@ -325,6 +329,8 @@ virt_viewer_window_init (VirtViewerWindow *self)
      /* make sure they can be activated even if the menu item is not visible */
      g_signal_connect(gtk_builder_get_object(priv->builder, "menu-view-fullscreen"),
                       "can-activate-accel", G_CALLBACK(can_activate_cb), self);
+    g_signal_connect(gtk_builder_get_object(priv->builder, "menu-file-share-clipboard"),
+                     "can-activate-accel", G_CALLBACK(can_activate_cb), self);
      g_signal_connect(gtk_builder_get_object(priv->builder, "menu-file-smartcard-insert"),
                       "can-activate-accel", G_CALLBACK(can_activate_cb), self);
      g_signal_connect(gtk_builder_get_object(priv->builder, "menu-file-smartcard-remove"),
@@ -1003,6 +1009,25 @@ virt_viewer_window_menu_file_screenshot(GtkWidget *menu G_GNUC_UNUSED,
      gtk_widget_destroy(dialog);
  }

+G_MODULE_EXPORT void
+virt_viewer_window_menu_file_share_clipboard(GtkWidget *menu G_GNUC_UNUSED,
+                                             VirtViewerWindow *self)
+{
+    VirtViewerSession *session = virt_viewer_app_get_session(self->priv->app);
+    VirtViewerSessionClass *klass;
+
+    g_return_if_fail(session != NULL);
+
+    gboolean share_buffer = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu));
+
+    klass = VIRT_VIEWER_SESSION_GET_CLASS(session);
+    if (klass->set_share_clipboard) {
+        klass->set_share_clipboard(session, share_buffer);
+    }
+
+    virt_viewer_app_set_config_share_clipboard(self->priv->app, share_buffer);

By using app properties, you should be able to use
g_object_bind_property() which would eventually simplify the code. See
VirtViewerSession:share-folder prop & usage for an example of how
properties are bound from UI to spice-gtk.


Thanks. I'll try reworking this code.

+}
+
  G_MODULE_EXPORT void
  virt_viewer_window_menu_file_usb_device_selection(GtkWidget *menu G_GNUC_UNUSED,
                                                    VirtViewerWindow *self)
@@ -1347,6 +1372,9 @@ virt_viewer_window_set_menus_sensitive(VirtViewerWindow *self, gboolean sensitiv
      menu = GTK_WIDGET(gtk_builder_get_object(priv->builder, "menu-file-screenshot"));
      gtk_widget_set_sensitive(menu, sensitive);

+    menu = GTK_WIDGET(gtk_builder_get_object(priv->builder, "menu-file-share-clipboard"));
+    gtk_widget_set_sensitive(menu, sensitive);
+
      menu = GTK_WIDGET(gtk_builder_get_object(priv->builder, "menu-view-zoom"));
      gtk_widget_set_sensitive(menu, sensitive);

--
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




[Index of Archives]     [Linux Virtualization]     [KVM Development]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]     [Video 4 Linux]

  Powered by Linux