[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [PATCH v5] ui/gtk: New -display gtk option 'full-screen-on-monitor'.
From: |
Romli, Khairul Anuar |
Subject: |
RE: [PATCH v5] ui/gtk: New -display gtk option 'full-screen-on-monitor'. |
Date: |
Wed, 28 Jul 2021 03:19:40 +0000 |
Hi Gerd,
Could you add comment or review on this patch?
Thank You.
Best Regards,
Khairul
> -----Original Message-----
> From: Markus Armbruster <armbru@redhat.com>
> Sent: Thursday, July 8, 2021 11:49 PM
> To: Khor, Swee Aun <swee.aun.khor@intel.com>
> Cc: qemu-devel@nongnu.org; Romli, Khairul Anuar
> <khairul.anuar.romli@intel.com>; Mazlan, Hazwan Arif
> <hazwan.arif.mazlan@intel.com>; Kasireddy, Vivek
> <vivek.kasireddy@intel.com>; kraxel@redhat.com; eblake@redhat.com
> Subject: Re: [PATCH v5] ui/gtk: New -display gtk option 'full-screen-on-
> monitor'.
>
> "Khor, Swee Aun" <swee.aun.khor@intel.com> writes:
>
> > This lets user select monitor number to display QEMU in full screen
> > with -display gtk,full-screen-on-monitor=<value>.
>
> The part from here ...
>
> > v2:
> > - https://patchew.org/QEMU/20210617020609.18089-1-
> swee.aun.khor@intel.com/.
> > - Added documentation for new member.
> > - Renamed member name from monitor-num to monitor.
> >
> > v3:
> > - Changed commit message subject.
> > - Cleaned up signed-off format.
> > - Renamed member name from monitor to full-screen-on-monitor to make
> clear this option automatically enables full screen.
> > - Added more detail documentation to specify full-screen-on-monitor
> option index started from 1.
> > - Added code to check windows has been launched successfully at specified
> monitor.
> >
> > v4:
> > - Used PRId64 format specifier for int64_t variable in warn_report().
> >
> > v5:
> > - Removed gdk_screen and gdk_monitor variables as it used once only.
> > - Fixed issue where v3 and v4 doesn't showing up in
> https://patchew.org/QEMU/.
>
> ... to here should go ...
>
> > Signed-off-by: Khor Swee Aun <swee.aun.khor@intel.com>
> > ---
>
> ... here. If nothing else needs to be improved, I hope the maintainer can
> take
> care of this one for you.
>
> > qapi/ui.json | 10 +++++++---
> > qemu-options.hx | 2 +-
> > ui/gtk.c | 30 ++++++++++++++++++++++++++++++
> > 3 files changed, 38 insertions(+), 4 deletions(-)
> >
> > diff --git a/qapi/ui.json b/qapi/ui.json index 1052ca9c38..d775c29534
> > 100644
> > --- a/qapi/ui.json
> > +++ b/qapi/ui.json
> > @@ -1035,13 +1035,17 @@
> > # assuming the guest will resize the display to match
> > # the window size then. Otherwise it defaults to "off".
> > # Since 3.1
> > -#
> > +# @full-screen-on-monitor: Monitor number to display QEMU in full
> screen.
> > +# Monitor number started from index 1. If total
> > number
> > +# of monitors is 3, possible values for this
> > option are
> > +# 1, 2 or 3.
>
> This is silently ignored unless 'full-screen': true. Correct?
>
> > # Since: 2.12
> > #
> > ##
> > { 'struct' : 'DisplayGTK',
> > - 'data' : { '*grab-on-hover' : 'bool',
> > - '*zoom-to-fit' : 'bool' } }
> > + 'data' : { '*grab-on-hover' : 'bool',
> > + '*zoom-to-fit' : 'bool',
> > + '*full-screen-on-monitor' : 'int' } }
> >
> > ##
> > # @DisplayEGLHeadless:
> > diff --git a/qemu-options.hx b/qemu-options.hx index
> > 14258784b3..29836db663 100644
> > --- a/qemu-options.hx
> > +++ b/qemu-options.hx
> > @@ -1787,7 +1787,7 @@ DEF("display", HAS_ARG,
> QEMU_OPTION_display,
> > " [,window_close=on|off][,gl=on|core|es|off]\n"
> > #endif
> > #if defined(CONFIG_GTK)
> > - "-display gtk[,grab_on_hover=on|off][,gl=on|off]|\n"
> > + "-display gtk[,grab-on-hover=on|off][,gl=on|off][,full-screen-on-
> monitor=<value>]\n"
>
> Suggest full-screen-on-monitor=<number>.
>
> > #endif
> > #if defined(CONFIG_VNC)
> > "-display vnc=<display>[,<optargs>]\n"
> > diff --git a/ui/gtk.c b/ui/gtk.c
> > index 98046f577b..4da904a024 100644
> > --- a/ui/gtk.c
> > +++ b/ui/gtk.c
> > @@ -2189,6 +2189,8 @@ static void gtk_display_init(DisplayState *ds,
> DisplayOptions *opts)
> > GdkDisplay *window_display;
> > GtkIconTheme *theme;
> > char *dir;
> > + int monitor_n;
> > + bool monitor_status = false;
> >
> > if (!gtkinit) {
> > fprintf(stderr, "gtk initialization failed\n"); @@ -2268,6
> > +2270,34 @@ static void gtk_display_init(DisplayState *ds, DisplayOptions
> *opts)
> > gtk_menu_item_activate(GTK_MENU_ITEM(s->grab_on_hover_item));
> > }
> > gd_clipboard_init(s);
> > +
> > + if (opts->u.gtk.has_full_screen_on_monitor) {
> > + monitor_n = gdk_display_get_n_monitors(window_display);
> > +
> > + if (opts->u.gtk.full_screen_on_monitor <= monitor_n &&
> > + opts->u.gtk.full_screen_on_monitor > 0) {
> > + gtk_window_fullscreen_on_monitor(GTK_WINDOW(s->window),
> > + gdk_display_get_default_screen(window_display),
> > + opts->u.gtk.full_screen_on_monitor - 1);
> > +
> > + if (gdk_display_get_monitor(window_display,
> > + opts->u.gtk.full_screen_on_monitor
> > + - 1) != NULL) {
> > + monitor_status = true;
> > + }
> > + }
> > + if (monitor_status == false) {
> > + /*
> > + * Calling GDK API to read the number of monitors again in case
> > + * monitor added or removed since last read.
> > + */
> > + monitor_n = gdk_display_get_n_monitors(window_display);
> > + warn_report("Failed to enable full screen on monitor %" PRId64
> > ". "
> > + "Current total number of monitors is %d, "
> > + "please verify full-screen-on-monitor option
> > value.",
> > + opts->u.gtk.full_screen_on_monitor,
> > + monitor_n);
>
> I wonder whether the warning should be an error, but that's for the
> maintainer to decide.
>
> > + }
> > + }
> > }
> >
> > static void early_gtk_display_init(DisplayOptions *opts)
>
> Ignorant question: are monitors renumbered when a monitor goes away?
>
> Example: we have three monitors A, B, C, numbered 0, 1, 2 (GTK monitor
> numbers start with 0). Now monitor B goes away. I figure monitor A
> remains number 0. What about C? Does its number change from 2 to 1?
>
> I still believe numbering monitors 1, 2, 3 instead of 0, 1, 2 in QMP is a bad
> idea. The unnecessary difference to GTK's monitor numbers is bound to
> confuse. But I'm not the maintainer here.
>
> The code to guard against and detect errors looks highly questionable to me.
> Let me explain.
>
> This is the actual work:
>
> gtk_window_fullscreen_on_monitor(GTK_WINDOW(s->window),
> gdk_display_get_default_screen(window_display),
> opts->u.gtk.full_screen_on_monitor - 1);
>
> The function's documentation advises:
>
> Note that you shouldn't assume the window is definitely full screen
> afterward.
>
> You can track the fullscreen state via the "window-state-event"
> signal on GtkWidget.
>
> https://developer.gnome.org/gtk3/stable/GtkWindow.html#gtk-window-
> fullscreen-on-monitor
>
> You don't follow this advice. Instead you do:
>
> 1. Guard the actual work with "the monitor with the requested number
> exists". This guard is unreliable, because monitors can go away
> between the guard and the actual work.
>
> 2. Check whether the monitor with the requested number still exists
> after the actual work. This is also unreliable, because the monitor
> can go away between the guard and the actual work, and come back
> between the actual work and the check.
>
> The code to handle the error looks questionable, too. The number of
> monitors reported in the error message can be misleading. Say the user
> asked for monitor 2, and the guard found only 1. A second monitor appears
> between the guard and the error reporting. Now the current number of
> monitors reported in the error has nothing to do with the actual error.
>
> Is there any particular reason not to use the function the way its
> documentation advises?