diff mbox

gtk: cleanup backend dependencies

Message ID 1401706713-24909-1-git-send-email-kraxel@redhat.com
State New
Headers show

Commit Message

Gerd Hoffmann June 2, 2014, 10:58 a.m. UTC
Make configure detect gtk x11 and win32 backends.  Make gtk backend
specific code properly #ifdefed on the new CONFIG_GTK_{X11,WIN32}
config options.  Our gtk ui code should build fine on any platform
now.

This also fixes the linker failute due to the new XkbGetKeyboard call
added by commit 3158a3482b0093e41f2b2596fba50774ea31ae08.

Cc: Richard Henderson <rth@twiddle.net>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 configure | 15 +++++++++++++++
 ui/gtk.c  |  8 +++++---
 2 files changed, 20 insertions(+), 3 deletions(-)

Comments

Daniel P. Berrangé June 2, 2014, 11:10 a.m. UTC | #1
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
Daniel P. Berrangé June 2, 2014, 11:13 a.m. UTC | #2
On Mon, Jun 02, 2014 at 12:10:44PM +0100, Daniel P. Berrange wrote:
> 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

Correction - the setting of CONFIG_GTK_* stuff is not needed,
the addition of '-lX11' is still needed.


Regards,
Daniel
diff mbox

Patch

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
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
     } else if (gdk_keycode == 208) { /* Hiragana_Katakana */
         qemu_keycode = 0x70;
     } else if (gdk_keycode == 211) { /* backslash */
@@ -1822,7 +1824,7 @@  static void gd_create_menus(GtkDisplayState *s)
 
 static void gd_set_keycode_type(GtkDisplayState *s)
 {
-#ifndef _WIN32
+#ifdef CONFIG_GTK_X11
     char *keycodes = NULL;
     GdkDisplay *display = gtk_widget_get_display(s->window);
     Display *x11_display = gdk_x11_display_get_xdisplay(display);