[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] ui/gtk: a new array param monitor to specify the target disp
From: |
Dongwon Kim |
Subject: |
[PATCH 2/2] ui/gtk: a new array param monitor to specify the target displays |
Date: |
Tue, 31 May 2022 13:23:27 -0700 |
New integer array parameter, 'monitor' is for specifying the target
displays where individual QEMU windows are placed upon launching.
The array contains a series of numbers representing the monitor where
QEMU windows are placed.
Numbers in the array are mapped to QEMU windows like,
[1st detached window, 2nd detached window,.... Main window]
Usage example: -display gtk,monitor.0=0,monitor.1=1.....
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>
---
qapi/ui.json | 7 ++++++-
qemu-options.hx | 2 +-
ui/gtk.c | 32 +++++++++++++++++++++++++++++++-
3 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/qapi/ui.json b/qapi/ui.json
index 11a827d10f..94546cfe84 100644
--- a/qapi/ui.json
+++ b/qapi/ui.json
@@ -1195,12 +1195,17 @@
# 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 individual QEMU window is placed in case
+# there are multiple of them
+# 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 a664baaa18..c2523ae0da 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1943,7 +1943,7 @@ 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.<order>=<value>][,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 abfcf48547..fcd0e08c16 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -2304,6 +2304,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 n_gfx_vcs = 0;
int i;
char *dir;
@@ -2384,7 +2388,33 @@ static void gtk_display_init(DisplayState *ds,
DisplayOptions *opts)
n_gfx_vcs++;
}
}
- if (opts->has_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) {
+ for (; i < s->nb_vcs; i++) {
+ 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++;
+ break;
+ }
+ }
+ }
+ }
+ if (!opts->u.gtk.has_monitor &&
+ opts->has_full_screen &&
opts->full_screen) {
gtk_menu_item_activate(GTK_MENU_ITEM(s->full_screen_item));
}
--
2.30.2