qemu-devel
[Top][All Lists]
Advanced

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

[PATCH v5] ui/gtk: New -display gtk option 'full-screen-on-monitor'.


From: Khor, Swee Aun
Subject: [PATCH v5] ui/gtk: New -display gtk option 'full-screen-on-monitor'.
Date: Fri, 25 Jun 2021 16:24:32 +0800

This lets user select monitor number to display QEMU in full screen
with -display gtk,full-screen-on-monitor=<value>.

v2:
 - 20210617020609.18089-1-swee.aun.khor@intel.com/">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/.

Signed-off-by: Khor Swee Aun <swee.aun.khor@intel.com>
---
 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.
 # 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"
 #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);
+        }
+    }
 }
 
 static void early_gtk_display_init(DisplayOptions *opts)
-- 
2.24.3




reply via email to

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