On 16.01.20 02:12, Philippe Mathieu-Daudé wrote: > The GdkMonitor was introduced in GTK+ 3.22: > https://developer.gnome.org/gdk3/stable/api-index-3-22.html#api-index-3.22 > > If we build with older GTK+, the build fails: > > CC ui/gtk.o > qemu/ui/gtk.c: In function ‘gd_vc_gfx_init’: > qemu/ui/gtk.c:1973:5: error: unknown type name ‘GdkMonitor’ > GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win); > ^ > qemu/ui/gtk.c:1973:27: error: implicit declaration of function > ‘gdk_display_get_monitor_at_window’ [-Werror=implicit-function-declaration] > GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win); > ^ > qemu/ui/gtk.c:1973:5: error: nested extern declaration of > ‘gdk_display_get_monitor_at_window’ [-Werror=nested-externs] > GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win); > ^ > qemu/ui/gtk.c:1973:27: error: initialization makes pointer from integer > without a cast [-Werror=int-conversion] > GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win); > ^ > qemu/ui/gtk.c:2035:28: error: implicit declaration of function > ‘gdk_monitor_get_refresh_rate’ [-Werror=implicit-function-declaration] > refresh_rate_millihz = gdk_monitor_get_refresh_rate(monitor); > ^ > qemu/ui/gtk.c:2035:5: error: nested extern declaration of > ‘gdk_monitor_get_refresh_rate’ [-Werror=nested-externs] > refresh_rate_millihz = gdk_monitor_get_refresh_rate(monitor); > ^ > cc1: all warnings being treated as errors > qemu/rules.mak:69: recipe for target 'ui/gtk.o' failed > make: *** [ui/gtk.o] Error 1 > > We only use the GdkMonitor API to get the monitor refresh rate. > > GTK+ provides convenient definition in <gdk/gdkversionmacros.h> > (already include by <gdk/gdk.h>) to check which API are available. > > Extract this code as a new gd_refresh_rate_millihz() function, > and check GDK_VERSION_3_22 is defined before calling its API. > If it is not defined, return 0. This is safe and fixes our build > failure. > > Fixes: c4c00922cc (display/gtk: get proper refreshrate) > Signed-off-by: Philippe Mathieu-Daudé <phi...@redhat.com> > --- > Sorry I missed that, I only tested Nikola's patch on my workstation > which runs Fedora 30: > > $ pkg-config --modversion gtk+-3.0 > 3.24.11 > > If Gerd acks this patch, we might consider having it directly > applied as a build fix. > --- > ui/gtk.c | 23 ++++++++++++++++++----- > 1 file changed, 18 insertions(+), 5 deletions(-) > > diff --git a/ui/gtk.c b/ui/gtk.c > index 7355d34fcf..d18892d1de 100644 > --- a/ui/gtk.c > +++ b/ui/gtk.c > @@ -1961,6 +1961,23 @@ static GtkWidget > *gd_create_menu_machine(GtkDisplayState *s) > return machine_menu; > } > > +/* > + * If available, return the refresh rate of the display in milli-Hertz, > + * else return 0. > + */ > +static int gd_refresh_rate_millihz(GtkDisplayState *s) > +{ > +#ifdef GDK_VERSION_3_22 > + GdkDisplay *dpy = gtk_widget_get_display(s->window); > + GdkWindow *win = gtk_widget_get_window(s->window); > + GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win); > + > + return gdk_monitor_get_refresh_rate(monitor); > +#else > + return 0; > +#endif > +} > + > static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc, > QemuConsole *con, int idx, > GSList *group, GtkWidget *view_menu) > @@ -1968,10 +1985,6 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, > VirtualConsole *vc, > bool zoom_to_fit = false; > int refresh_rate_millihz; > > - GdkDisplay *dpy = gtk_widget_get_display(s->window); > - GdkWindow *win = gtk_widget_get_window(s->window); > - GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win); > - > vc->label = qemu_console_get_label(con); > vc->s = s; > vc->gfx.scale_x = 1.0; > @@ -2032,7 +2045,7 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, > VirtualConsole *vc, > vc->gfx.kbd = qkbd_state_init(con); > vc->gfx.dcl.con = con; > > - refresh_rate_millihz = gdk_monitor_get_refresh_rate(monitor); > + refresh_rate_millihz = gd_refresh_rate_millihz(s); > if (refresh_rate_millihz) { > vc->gfx.dcl.update_interval = MILLISEC_PER_SEC / > refresh_rate_millihz; > } >
This (as well as c4c00922cc) gives qemu-system-x86_64: Gdk: gdk_window_get_origin: assertion 'GDK_IS_WINDOW (window)' failed on startup under gtk 3.22.30 (mate 1.20.1). Jan