From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58298) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WrQ8k-0004CZ-Nx for qemu-devel@nongnu.org; Mon, 02 Jun 2014 07:10:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WrQ8g-0004FS-Sh for qemu-devel@nongnu.org; Mon, 02 Jun 2014 07:10:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:7431) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WrQ8g-0004F0-Jz for qemu-devel@nongnu.org; Mon, 02 Jun 2014 07:10:50 -0400 Date: Mon, 2 Jun 2014 12:10:44 +0100 From: "Daniel P. Berrange" Message-ID: <20140602111044.GD28039@redhat.com> References: <1401706713-24909-1-git-send-email-kraxel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1401706713-24909-1-git-send-email-kraxel@redhat.com> Subject: Re: [Qemu-devel] [PATCH] gtk: cleanup backend dependencies Reply-To: "Daniel P. Berrange" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gerd Hoffmann Cc: qemu-devel@nongnu.org, Anthony Liguori , Richard Henderson 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 > #include > #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 :|