[Spice-devel] [PATCH 1/2] Add ability to get SpiceDisplay resolution

Marc-André Lureau mlureau at redhat.com
Mon Nov 4 19:16:19 CET 2013



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

ack

> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 


More information about the Spice-devel mailing list