qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@web.de>
To: "Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	qemu-devel@nongnu.org,
	"Daniel P . Berrangé" <berrange@redhat.com>
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Nikola Pavlica" <pavlica.nikola@gmail.com>
Subject: Re: [PATCH] ui/gtk: Get display refresh rate with GDK version 3.22 or later
Date: Sat, 8 Feb 2020 11:54:26 +0100	[thread overview]
Message-ID: <00874860-5ec7-505f-db6a-57f9cc6cae0f@web.de> (raw)
In-Reply-To: <20200116011217.2144-1-philmd@redhat.com>

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é <philmd@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


      parent reply	other threads:[~2020-02-08 10:57 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-16  1:12 [PATCH] ui/gtk: Get display refresh rate with GDK version 3.22 or later Philippe Mathieu-Daudé
2020-01-16  8:13 ` Gerd Hoffmann
2020-01-16 10:16 ` Daniel P. Berrangé
2020-01-16 10:20   ` Philippe Mathieu-Daudé
2020-02-08 10:54 ` Jan Kiszka [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=00874860-5ec7-505f-db6a-57f9cc6cae0f@web.de \
    --to=jan.kiszka@web.de \
    --cc=berrange@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=pavlica.nikola@gmail.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).