qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH v3 2/2] ui/gtk: a new array param monitor to specify the targ


From: Markus Armbruster
Subject: Re: [PATCH v3 2/2] ui/gtk: a new array param monitor to specify the target displays
Date: Thu, 30 Jun 2022 17:19:26 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux)

Dongwon Kim <dongwon.kim@intel.com> writes:

> New integer array parameter, 'monitor' is for specifying the target
> monitors where individual GTK windows are placed upon launching.
>
> Monitor numbers in the array are associated with virtual consoles
> in the order of [VC0, VC1, VC2 ... VCn].
>
> Every GTK window containing each VC will be placed in the region
> of corresponding monitors.
>
> Usage: -display gtk,monitor.<id of VC>=<target monitor>,..
>        ex)-display gtk,monitor.0=1,monitor.1=0
>
> v3: - Revised commit message
>     - Rewrote desription of the new parameter (Markus Armbruster)
>     - Replaced unnecessary 'for' loop with 'if' condition
>       (Markus Armbruster)

Again, patch history ...
> Cc: Daniel P. Berrangé <berrange@redhat.com>
> Cc: Markus Armbruster <armbru@redhat.com>
> Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Cc: Vivek Kasireddy <vivek.kasireddy@intel.com>
> Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
> ---

... goes here.

>  qapi/ui.json    |  9 ++++++++-
>  qemu-options.hx |  3 ++-
>  ui/gtk.c        | 31 +++++++++++++++++++++++++++++--
>  3 files changed, 39 insertions(+), 4 deletions(-)
>
> diff --git a/qapi/ui.json b/qapi/ui.json
> index 413371d5e8..7b4c098bb4 100644
> --- a/qapi/ui.json
> +++ b/qapi/ui.json
> @@ -1195,12 +1195,19 @@
>  #               assuming the guest will resize the display to match
>  #               the window size then.  Otherwise it defaults to "off".
>  #               Since 3.1
> +# @monitor:     Array of numbers, each of which represents physical
> +#               monitor where GTK window containing a given VC will be
> +#               placed. Each monitor number in the array will be
> +#               associated with a virtual-console starting from VC0.

Drop the hyphen in "virtual-console".

Is the term "virtual console" obvious?  Gerd?

> +#
> +#               since 7.1
>  #
>  # Since: 2.12
>  ##
>  { 'struct'  : 'DisplayGTK',
>    'data'    : { '*grab-on-hover' : 'bool',
> -                '*zoom-to-fit'   : 'bool'  } }
> +                '*zoom-to-fit'   : 'bool',
> +                '*monitor'       : ['uint16']  } }
>  
>  ##
>  # @DisplayEGLHeadless:
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 377d22fbd8..aabdfb0636 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1938,7 +1938,8 @@ DEF("display", HAS_ARG, QEMU_OPTION_display,
>  #endif
>  #if defined(CONFIG_GTK)
>      "-display gtk[,full-screen=on|off][,gl=on|off][,grab-on-hover=on|off]\n"
> -    "            [,show-cursor=on|off][,window-close=on|off]\n"
> +    "            [,monitor.<id of VC>=<monitor number>][,show-cursor=on|off]"
> +    "            [,window-close=on|off]\n"
>  #endif
>  #if defined(CONFIG_VNC)
>      "-display vnc=<display>[,<optargs>]\n"
> diff --git a/ui/gtk.c b/ui/gtk.c
> index e6878c3209..935176e614 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -2316,6 +2316,10 @@ static void gtk_display_init(DisplayState *ds, 
> DisplayOptions *opts)
>      GtkDisplayState *s = g_malloc0(sizeof(*s));
>      GdkDisplay *window_display;
>      GtkIconTheme *theme;
> +    GtkWidget *win;
> +    GdkRectangle dest;
> +    uint16List *mon;
> +    int n_mon;
>      int i;
>      char *dir;
>  
> @@ -2393,10 +2397,33 @@ static void gtk_display_init(DisplayState *ds, 
> DisplayOptions *opts)
>              gtk_menu_item_activate(GTK_MENU_ITEM(s->untabify_item));
>          }
>      }
> -    if (opts->has_full_screen &&
> -        opts->full_screen) {
> +
> +    if (opts->u.gtk.has_monitor) {
> +        i = 0;
> +        n_mon = gdk_display_get_n_monitors(window_display);
> +        for (mon = opts->u.gtk.monitor; mon; mon = mon->next) {
> +            if (mon->value < n_mon && i < s->nb_vcs) {
> +                win = s->vc[i].window ? s->vc[i].window : s->window;
> +                if (opts->has_full_screen && opts->full_screen) {
> +                    gtk_window_fullscreen_on_monitor(
> +                        GTK_WINDOW(win),
> +                        gdk_display_get_default_screen(window_display),
> +                        mon->value);
> +                } else {
> +                    gdk_monitor_get_geometry(
> +                        gdk_display_get_monitor(window_display, mon->value),
> +                        &dest);
> +                    gtk_window_move(GTK_WINDOW(win),
> +                                    dest.x, dest.y);
> +                }
> +                i++;
> +            }
> +        }
> +    } else if (opts->has_full_screen &&
> +               opts->full_screen) {

I'd join these two lines, like

       } else if (opts->has_full_screen && opts->full_screen) {

or even exploit the fact that a opts->full_screen is false when absent

       } else if (opts->full_screen) {

>          gtk_menu_item_activate(GTK_MENU_ITEM(s->full_screen_item));
>      }
> +
>      if (opts->u.gtk.has_grab_on_hover &&
>          opts->u.gtk.grab_on_hover) {
>          gtk_menu_item_activate(GTK_MENU_ITEM(s->grab_on_hover_item));




reply via email to

[Prev in Thread] Current Thread [Next in Thread]