summaryrefslogtreecommitdiffstats
path: root/src/virt-viewer-display.c
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2012-02-07 17:04:57 +0000
committerDaniel P. Berrange <berrange@redhat.com>2012-02-08 13:23:48 +0000
commit50632ea038d87239092a3bed584680279e312d19 (patch)
treefc6f68838ef945a6692c0b17ccb5db3994af1756 /src/virt-viewer-display.c
parent3a8cdd901ff4efe52427950dd45a341521499fb0 (diff)
downloadvirt-viewer-50632ea038d87239092a3bed584680279e312d19.tar.gz
virt-viewer-50632ea038d87239092a3bed584680279e312d19.tar.xz
virt-viewer-50632ea038d87239092a3bed584680279e312d19.zip
Implement SPICE desktop resizing that takes account of zoom level
The standard SPICE widget guest resize implementation does not take into account the zoom level settings in virt-viewer, because it has no knowledge of this functionality. The guest resize can, however, be done by calling spice_main_set_display() directly. This allows virt-viewer to resize the guest taking into account zoom levels. ie, if virt-viewer is run with --zoom 50 and the window is resized to 400x300, then the guest agent should be told to set its resolution to 800x600
Diffstat (limited to 'src/virt-viewer-display.c')
-rw-r--r--src/virt-viewer-display.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c
index 1d2ade2..a62c289 100644
--- a/src/virt-viewer-display.c
+++ b/src/virt-viewer-display.c
@@ -26,6 +26,7 @@
#include <locale.h>
+#include "virt-viewer-session.h"
#include "virt-viewer-display.h"
#include "virt-viewer-util.h"
@@ -40,6 +41,7 @@ struct _VirtViewerDisplayPrivate
gboolean zoom;
gint nth_display;
gint show_hint;
+ VirtViewerSession *session;
};
static void virt_viewer_display_size_request(GtkWidget *widget,
@@ -75,6 +77,7 @@ enum {
PROP_ZOOM,
PROP_ZOOM_LEVEL,
PROP_SHOW_HINT,
+ PROP_SESSION,
};
static void
@@ -154,6 +157,15 @@ virt_viewer_display_class_init(VirtViewerDisplayClass *class)
0,
G_PARAM_READABLE));
+ g_object_class_install_property(object_class,
+ PROP_SESSION,
+ g_param_spec_object("session",
+ "Session",
+ "VirtSession",
+ VIRT_VIEWER_TYPE_SESSION,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
+
g_signal_new("display-pointer-grab",
G_OBJECT_CLASS_TYPE(object_class),
@@ -252,6 +264,11 @@ virt_viewer_display_set_property(GObject *object,
case PROP_NTH_DISPLAY:
priv->nth_display = g_value_get_int(value);
break;
+ case PROP_SESSION:
+ g_warn_if_fail(priv->session == NULL);
+ priv->session = g_value_dup_object(value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -280,6 +297,9 @@ virt_viewer_display_get_property(GObject *object,
case PROP_SHOW_HINT:
g_value_set_int(value, priv->show_hint);
break;
+ case PROP_SESSION:
+ g_value_set_object(value, virt_viewer_display_get_session(display));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -468,6 +488,13 @@ void virt_viewer_display_set_zoom_level(VirtViewerDisplay *display,
}
+guint virt_viewer_display_get_zoom_level(VirtViewerDisplay *display)
+{
+ VirtViewerDisplayPrivate *priv = display->priv;
+ return priv->zoom_level;
+}
+
+
void virt_viewer_display_set_zoom(VirtViewerDisplay *display,
gboolean zoom)
{
@@ -481,6 +508,14 @@ void virt_viewer_display_set_zoom(VirtViewerDisplay *display,
}
}
+
+gboolean virt_viewer_display_get_zoom(VirtViewerDisplay *display)
+{
+ VirtViewerDisplayPrivate *priv = display->priv;
+ return priv->zoom;
+}
+
+
void virt_viewer_display_send_keys(VirtViewerDisplay *display,
const guint *keyvals, int nkeyvals)
{
@@ -509,6 +544,13 @@ void virt_viewer_display_set_show_hint(VirtViewerDisplay *self, gint hint)
g_object_notify(G_OBJECT(self), "show-hint");
}
+VirtViewerSession* virt_viewer_display_get_session(VirtViewerDisplay *self)
+{
+ g_return_val_if_fail(VIRT_VIEWER_IS_DISPLAY(self), NULL);
+
+ return self->priv->session;
+}
+
/*
* Local variables:
* c-indent-level: 4