[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH 3/9] ui/gtk: reset visible flag when window is minimized
From: |
Dongwon Kim |
Subject: |
[RFC PATCH 3/9] ui/gtk: reset visible flag when window is minimized |
Date: |
Tue, 20 Jun 2023 17:43:49 -0700 |
Add a callback for window-state-event that resets vc->gfx.visible when
associated window is minimized or restored.
In case of virtio-gpu blob scanout, if the window is minimized before
the rendering event for the last guest scanout frame is finished, it cancels
the draw submission and unblocks the pipeline to prevent a permanent lockup.
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Daniel P. Berrangé <berrange@redhat.com>
Cc: Markus Armbruster <armbru@redhat.com>
Cc: Philippe Mathieu-Daudé <philmd@linaro.org>
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Vivek Kasireddy <vivek.kasireddy@intel.com>
Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
ui/gtk.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/ui/gtk.c b/ui/gtk.c
index ff4a5c58ea..f9096aea14 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1419,6 +1419,35 @@ static gboolean gd_tab_window_close(GtkWidget *widget,
GdkEvent *event,
return TRUE;
}
+static gboolean gd_window_state_event(GtkWidget *widget, GdkEvent *event,
+ void *opaque)
+{
+ VirtualConsole *vc = opaque;
+
+ if (!vc) {
+ return TRUE;
+ }
+
+ if (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED) {
+ vc->gfx.visible = false;
+ gd_set_ui_size(vc, 0, 0);
+ if (vc->gfx.guest_fb.dmabuf &&
+ vc->gfx.guest_fb.dmabuf->draw_submitted) {
+ vc->gfx.guest_fb.dmabuf->draw_submitted = false;
+ graphic_hw_gl_block(vc->gfx.dcl.con, false);
+ }
+ } else {
+ GdkWindow *window;
+ window = gtk_widget_get_window(vc->gfx.drawing_area);
+ gd_set_ui_size(vc, gdk_window_get_width(window),
+ gdk_window_get_height(window));
+
+ vc->gfx.visible = true;
+ }
+
+ return TRUE;
+}
+
static gboolean gd_win_grab(void *opaque)
{
VirtualConsole *vc = opaque;
@@ -1460,6 +1489,9 @@ static void gd_menu_untabify(GtkMenuItem *item, void
*opaque)
g_signal_connect(vc->window, "delete-event",
G_CALLBACK(gd_tab_window_close), vc);
+ g_signal_connect(vc->window, "window-state-event",
+ G_CALLBACK(gd_window_state_event), vc);
+
gtk_widget_show_all(vc->window);
if (qemu_console_is_graphic(vc->gfx.dcl.con)) {
@@ -2498,6 +2530,11 @@ static void gtk_display_init(DisplayState *ds,
DisplayOptions *opts)
}
vc = gd_vc_find_current(s);
+
+ g_signal_connect(s->window, "window-state-event",
+ G_CALLBACK(gd_window_state_event),
+ vc);
+
gtk_widget_set_sensitive(s->view_menu, vc != NULL);
#ifdef CONFIG_VTE
gtk_widget_set_sensitive(s->copy_item,
--
2.34.1
- [RFC PATCH 0/9] ui: guest displays multiple connectors suppport and hotplug in, Dongwon Kim, 2023/06/20
- [RFC PATCH 1/9] ui/gtk: skip drawing guest scanout when associated VC is invisible, Dongwon Kim, 2023/06/20
- [RFC PATCH 3/9] ui/gtk: reset visible flag when window is minimized,
Dongwon Kim <=
- [RFC PATCH 2/9] ui/gtk: set the ui size to 0 when invisible, Dongwon Kim, 2023/06/20
- [RFC PATCH 4/9] ui/gtk: Disable the scanout when a detached tab is closed, Dongwon Kim, 2023/06/20
- [RFC PATCH 5/9] ui/gtk: Factor out tab window creation into a separate function, Dongwon Kim, 2023/06/20
- [RFC PATCH 7/9] ui/gtk: unblock gl if draw submitted already or fence is not yet signaled, Dongwon Kim, 2023/06/20
- [RFC PATCH 6/9] ui/gtk: Add a new parameter to assign connectors/monitors to GFX VCs, Dongwon Kim, 2023/06/20
- [RFC PATCH 8/9] ui/gtk: skip drawing if any of ctx/surface/image don't exist, Dongwon Kim, 2023/06/20
- [RFC PATCH 9/9] ui/gtk: skip refresh/rendering if VC is invisible, Dongwon Kim, 2023/06/20