qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] gtk: cleanup backend dependencies


From: Daniel P. Berrange
Subject: Re: [Qemu-devel] [PATCH] gtk: cleanup backend dependencies
Date: Mon, 2 Jun 2014 12:10:44 +0100
User-agent: Mutt/1.5.23 (2014-03-12)

On Mon, Jun 02, 2014 at 12:58:33PM +0200, Gerd Hoffmann wrote:
> diff --git a/configure b/configure
> index 0e516f9..b02f822 100755
> --- a/configure
> +++ b/configure
> @@ -1986,6 +1986,8 @@ fi
>  
>  if test "$gtk" != "no"; then
>      gtkpackage="gtk+-$gtkabi"
> +    gtkx11package="gtk+-x11-$gtkabi"
> +    gtkwin32package="gtk+-win32-$gtkabi"
>      if test "$gtkabi" = "3.0" ; then
>        gtkversion="3.0.0"
>      else
> @@ -1996,6 +1998,13 @@ if test "$gtk" != "no"; then
>          gtk_libs=`$pkg_config --libs $gtkpackage`
>          libs_softmmu="$gtk_libs $libs_softmmu"
>          gtk="yes"
> +        if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
> +            gtkx11="yes"
> +            gtk_libs="$gtk_libs -lX11"
> +        fi
> +        if $pkg_config --exists "$gtkwin32package >= $gtkversion"; then
> +            gtkwin32="yes"
> +        fi
>      elif test "$gtk" = "yes"; then
>          feature_not_found "gtk" "Install gtk2 or gtk3 devel"
>      else
> @@ -4459,6 +4468,12 @@ if test "$gtk" = "yes" ; then
>    echo "CONFIG_GTKABI=$gtkabi" >> $config_host_mak
>    echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
>  fi
> +if test "$gtkx11" = "yes" ; then
> +  echo "CONFIG_GTK_X11=y" >> $config_host_mak
> +fi
> +if test "$gtkwin32" = "yes" ; then
> +  echo "CONFIG_GTK_WIN32=y" >> $config_host_mak
> +fi
>  if test "$vte" = "yes" ; then
>    echo "CONFIG_VTE=y" >> $config_host_mak
>    echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak

None of this configure time detection is needed, as GTK already
defines macros in its header which let you check this eg you can
just do

 #ifdef GDK_WINDOWING_WIN32
 ...Windows stuf...
 #endif

 #ifdef GDK_WINDOWING_QUARTZ
 ...OS-X stuff...
 #endif
 

 #ifdef GDK_WINDOWING_X11
 ...Xorg stuf...
 #endif

This works for GTK 2 and 3 - we're using this in GTK-VNC for
a while now [1].

> diff --git a/ui/gtk.c b/ui/gtk.c
> index 9d06df3..773a987 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -68,7 +68,7 @@
>  #include "keymaps.h"
>  #include "sysemu/char.h"
>  #include "qom/object.h"
> -#ifndef _WIN32
> +#ifdef CONFIG_GTK_X11
>  #include <gdk/gdkx.h>
>  #include <X11/XKBlib.h>
>  #endif
> @@ -925,7 +925,7 @@ static gboolean gd_key_event(GtkWidget *widget, 
> GdkEventKey *key, void *opaque)
>      int gdk_keycode = key->hardware_keycode;
>      int i;
>  
> -#ifdef _WIN32
> +#ifdef CONFIG_GTK_WIN32
>      UINT qemu_keycode = MapVirtualKey(gdk_keycode, MAPVK_VK_TO_VSC);
>      switch (qemu_keycode) {
>      case 103:   /* alt gr */
> @@ -939,12 +939,14 @@ static gboolean gd_key_event(GtkWidget *widget, 
> GdkEventKey *key, void *opaque)
>          qemu_keycode = 0;
>      } else if (gdk_keycode < 97) {
>          qemu_keycode = gdk_keycode - 8;
> +#ifdef CONFIG_GTK_X11
>      } else if (gdk_keycode < 158) {
>          if (s->has_evdev) {
>              qemu_keycode = translate_evdev_keycode(gdk_keycode - 97);
>          } else {
>              qemu_keycode = translate_xfree86_keycode(gdk_keycode - 97);
>          }
> +#endif

With GTK3 you can have multiple backends compiled into the GTK library
so as well as using the #ifdef GDK_WINDOWING_X11 you should also check
whether the window system is the active backend using one of the
GDK_IS_*_DISPLAY() macros

eg With GTK3 you'd do

#ifdef GDK_WINDOWING_X11
    if (GDK_IS_X11_DISPLAY(dpy)) {
       ....Xorg stuff...
    }
#endif

#ifdef GDK_WINDOWING_WIN32
    if (GDK_IS_WIN32_DISPLAY(dpy)) {
       ...Windows stuff...
    }
#endif

The only painpoint is that the GDK_IS_*_DISPLAY macros don't exist
with GTK2, but with GTK2 you can only have 1 windowing system compiled
into the binary, so you can stub out those macros to no-ops that
evaluate true

eg

/* GTK2 compat */
#ifndef GDK_IS_X11_DISPLAY
#define GDK_IS_X11_DISPLAY(dpy) (dpy == dpy)
#endif
#ifndef GDK_IS_WIN32_DISPLAY
#define GDK_IS_WIN32_DISPLAY(dpy) (dpy == dpy)
#endif
#ifndef GDK_IS_QUARTZ_DISPLAY
#define GDK_IS_QUARTZ_DISPLAY(dpy) (dpy == dpy)
#endif



Regards,
Daniel

[1] https://git.gnome.org/browse/gtk-vnc/tree/src/vncdisplaykeymap.c
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|



reply via email to

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