Add spice_display_get_monitor_config() to get the current configuration of the display. --- doc/reference/spice-gtk-sections.txt | 2 ++ gtk/channel-display.c | 2 +- gtk/channel-display.h | 9 ++++++++ gtk/map-file | 1 + gtk/spice-gtk-sym-file | 1 + gtk/spice-widget.c | 44 ++++++++++++++++++++++++++---------- gtk/spice-widget.h | 2 ++ 7 files changed, 48 insertions(+), 13 deletions(-) diff --git a/doc/reference/spice-gtk-sections.txt b/doc/reference/spice-gtk-sections.txt index 8d61aa9..9d8551b 100644 --- a/doc/reference/spice-gtk-sections.txt +++ b/doc/reference/spice-gtk-sections.txt @@ -146,6 +146,7 @@ SpiceAudioPrivate <TITLE>SpiceDisplayChannel</TITLE> SpiceDisplayChannel SpiceDisplayChannelClass +SpiceDisplayMonitorConfig <SUBSECTION Standard> SPICE_DISPLAY_CHANNEL SPICE_IS_DISPLAY_CHANNEL @@ -352,6 +353,7 @@ spice_display_set_grab_keys spice_display_get_grab_keys spice_display_send_keys spice_display_get_pixbuf +spice_display_get_monitor_config <SUBSECTION> SpiceGrabSequence spice_grab_sequence_new diff --git a/gtk/channel-display.c b/gtk/channel-display.c index a57453f..030679b 100644 --- a/gtk/channel-display.c +++ b/gtk/channel-display.c @@ -262,7 +262,7 @@ static void spice_display_channel_class_init(SpiceDisplayChannelClass *klass) /** * SpiceDisplayChannel:monitors: * - * Current monitors configuration. + * Current monitors configuration. An array of #SpiceDisplayMonitorConfig * * Since: 0.13 */ diff --git a/gtk/channel-display.h b/gtk/channel-display.h index 88e60d9..4a5428e 100644 --- a/gtk/channel-display.h +++ b/gtk/channel-display.h @@ -33,6 +33,15 @@ typedef struct _SpiceDisplayChannel SpiceDisplayChannel; typedef struct _SpiceDisplayChannelClass SpiceDisplayChannelClass; typedef struct _SpiceDisplayChannelPrivate SpiceDisplayChannelPrivate; +/** + * SpiceDisplayMonitorConfig: + * @id: the id of the monitor + * @surface_id: the surface id of the monitor + * @x: the position of the monitor on the x axis + * @y: the position of the monitor on the y axis + * @width: the width of the monitor + * @height: the height of the monitor + */ typedef struct _SpiceDisplayMonitorConfig SpiceDisplayMonitorConfig; struct _SpiceDisplayMonitorConfig { guint id; diff --git a/gtk/map-file b/gtk/map-file index 368b44f..d093f7c 100644 --- a/gtk/map-file +++ b/gtk/map-file @@ -32,6 +32,7 @@ spice_display_new_with_monitor; spice_display_paste_from_guest; spice_display_send_keys; spice_display_set_grab_keys; +spice_display_get_monitor_config; spice_error_get_type; spice_get_option_group; spice_grab_sequence_as_string; diff --git a/gtk/spice-gtk-sym-file b/gtk/spice-gtk-sym-file index 1574e07..8d3c9a0 100644 --- a/gtk/spice-gtk-sym-file +++ b/gtk/spice-gtk-sym-file @@ -9,6 +9,7 @@ spice_display_new_with_monitor spice_display_paste_from_guest spice_display_send_keys spice_display_set_grab_keys +spice_display_get_monitor_config spice_grab_sequence_as_string spice_grab_sequence_copy spice_grab_sequence_free diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c index d39ff59..8b5fa59 100644 --- a/gtk/spice-widget.c +++ b/gtk/spice-widget.c @@ -278,25 +278,47 @@ static gint get_display_id(SpiceDisplay *display) return d->channel_id; } -static void update_monitor_area(SpiceDisplay *display) +/** + * spice_display_get_monitor_config: + * @display: the display widget + * + * Gets the monitor configuration for the display, from which you can determine + * the current position and resolution of the monitor + * + * Returns (transfer none): the monitor configuration for the display + **/ +const SpiceDisplayMonitorConfig* spice_display_get_monitor_config(SpiceDisplay *display) { - SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display); - SpiceDisplayMonitorConfig *cfg, *c = NULL; - GArray *monitors = NULL; int i; + GArray *monitors = NULL; + SpiceDisplayPrivate *d = NULL; + SpiceDisplayMonitorConfig* c = NULL; - SPICE_DEBUG("update monitor area %d:%d", d->channel_id, d->monitor_id); - if (d->monitor_id < 0) - goto whole; + g_return_val_if_fail(SPICE_IS_DISPLAY(display), NULL); + + d = SPICE_DISPLAY_GET_PRIVATE(display); + g_return_val_if_fail(d->monitor_id >= 0, NULL); g_object_get(d->display, "monitors", &monitors, NULL); for (i = 0; monitors != NULL && i < monitors->len; i++) { - cfg = &g_array_index(monitors, SpiceDisplayMonitorConfig, i); + SpiceDisplayMonitorConfig *cfg = &g_array_index(monitors, + SpiceDisplayMonitorConfig, + i); if (cfg->id == d->monitor_id) { - c = cfg; - break; + c = cfg; + break; } } + + g_clear_pointer(&monitors, g_array_unref); + return c; +} + +static void update_monitor_area(SpiceDisplay *display) +{ + SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display); + const SpiceDisplayMonitorConfig *c = spice_display_get_monitor_config(display); + if (c == NULL) { SPICE_DEBUG("update monitor: no monitor %d", d->monitor_id); set_monitor_ready(display, false); @@ -318,11 +340,9 @@ static void update_monitor_area(SpiceDisplay *display) c->x, c->y, c->width, c->height, FALSE); update_area(display, c->x, c->y, c->width, c->height); - g_clear_pointer(&monitors, g_array_unref); return; whole: - g_clear_pointer(&monitors, g_array_unref); /* by display whole surface */ update_area(display, 0, 0, d->width, d->height); set_monitor_ready(display, true); diff --git a/gtk/spice-widget.h b/gtk/spice-widget.h index d239ed2..f7cfbf1 100644 --- a/gtk/spice-widget.h +++ b/gtk/spice-widget.h @@ -80,6 +80,8 @@ void spice_display_send_keys(SpiceDisplay *display, const guint *keyvals, int nkeyvals, SpiceDisplayKeyEvent kind); GdkPixbuf *spice_display_get_pixbuf(SpiceDisplay *display); +const SpiceDisplayMonitorConfig* spice_display_get_monitor_config(SpiceDisplay *display); + #ifndef SPICE_DISABLE_DEPRECATED SPICE_DEPRECATED_FOR(spice_gtk_session_copy_to_guest) void spice_display_copy_to_guest(SpiceDisplay *display); -- 1.8.3.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel