From 06234f650ab35da27489ed71fee67d024391f80d Mon Sep 17 00:00:00 2001
From: tadam <tadam>
Subject: [PATCH] Provide fvwm_KeycodeToKeysym() to handle XKeycodeToKeysym()
 deprecation

X are deprecating XKeycodeToKeysym() in favour of XkbKeycodeToKeysym() --
however, older XServers will obviously not have access to XKB, so we have to
conditionally use the newer method only when it's available.

Origin: backport, https://github.com/ThomasAdam/fvwm/commit/06234f650ab35da27489ed71fee67d024391f80d.patch
Last-Update: 2013-02-02
---
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
 
--- a/configure.ac
+++ b/configure.ac
@@ -537,7 +537,11 @@
                [$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS])
 fi
 
-# ********* xinerama
+# Silently look for X11/XKBlib.h
+AH_TEMPLATE([HAVE_X11_XKBLIB_H],[Define if Xkb extension is used.])
+AC_CHECK_HEADER(X11/XKBlib.h, AC_DEFINE(HAVE_X11_XKBLIB_H))
+
+# ********* xineramA
 problem_xinerama=""
 
 AC_ARG_ENABLE(xinerama,
@@ -1657,6 +1661,14 @@
 #define fvwm_lstat(x,y) -1
 #endif
 
+#ifdef HAVE_X11_XKBLIB_H
+#include <X11/XKBlib.h>
+#define fvwm_KeycodeToKeysym(d, k, g, l) \
+	(XkbKeycodeToKeysym((d), (k), (g), (l)))
+#else
+#define fvwm_KeycodeToKeysym(d, k, x, i) (XKeycodeToKeysym((d), (k), (i)))
+#endif
+
 ])
 
 # mainly for fvwm-config
--- a/fvwm/builtins.c
+++ b/fvwm/builtins.c
@@ -3853,7 +3853,7 @@
 
 	for (m = 0; m <= 8; ++m)
 	{
-		KeySym ks = XKeycodeToKeysym(dpy, *keycode, m);
+		KeySym ks = fvwm_KeycodeToKeysym(dpy, *keycode, 0, m);
 		if (ks == keysym)
 		{
 			switch (m)
--- a/fvwm/events.c
+++ b/fvwm/events.c
@@ -2508,7 +2508,7 @@
 	/* Here's a real hack - some systems have two keys with the
 	 * same keysym and different keycodes. This converts all
 	 * the cases to one keycode. */
-	kc = XKeysymToKeycode(dpy, XKeycodeToKeysym(dpy, te->xkey.keycode, 0));
+	kc = XKeysymToKeycode(dpy, fvwm_KeycodeToKeysym(dpy, te->xkey.keycode, 0, 0));
 
 	/* Check if there is something bound to the key */
 
--- a/libs/Bindings.c
+++ b/libs/Bindings.c
@@ -180,8 +180,8 @@
 		     m <= maxmods && tkeysym != NoSymbol; m++)
 		{
 			if (BIND_IS_MOUSE_BINDING(type) ||
-			    STROKE_CODE(BIND_IS_STROKE_BINDING(type) ||)
-			    (tkeysym = XKeycodeToKeysym(dpy, i, m)) == keysym)
+			    STROKE_CODE(BIND_IS_STROKE_BINDING(type)) ||
+			    (tkeysym = fvwm_KeycodeToKeysym(dpy, i, 0, m)) == keysym)
 			{
 				unsigned int add_modifiers = 0;
 				unsigned int bind_mask = 1;
--- a/modules/FvwmIconBox/FvwmIconBox.c
+++ b/modules/FvwmIconBox/FvwmIconBox.c
@@ -2445,7 +2445,7 @@
 
   XDisplayKeycodes(dpy, &kmin, &kmax);
   for (i=kmin; i<=kmax; i++)
-    if (XKeycodeToKeysym(dpy, i, 0) == keysym)
+    if (fvwm_KeycodeToKeysym(dpy, i, 0, 0) == keysym)
       {
 	k = (struct keyfunc *)safemalloc(sizeof(struct keyfunc));
 	memset(k, 0, sizeof(struct keyfunc));
@@ -3421,7 +3421,7 @@
 
   tmp = KeyActions;
   event.xkey.keycode =
-    XKeysymToKeycode(dpy,XKeycodeToKeysym(dpy,event.xkey.keycode,0));
+    XKeysymToKeycode(dpy,fvwm_KeycodeToKeysym(dpy,event.xkey.keycode,0,0));
   while (tmp != NULL){
     if (tmp->keycode == event.xkey.keycode){
       MySendFvwmPipe(fd, tmp->action, item->id);
--- a/modules/FvwmIconMan/readconfig.c
+++ b/modules/FvwmIconMan/readconfig.c
@@ -753,7 +753,7 @@
 
   XDisplayKeycodes(theDisplay, &min, &max);
   for (i=min; i<=max; i++) {
-    if (XKeycodeToKeysym(theDisplay, i, 0) == keysym) {
+    if (fvwm_KeycodeToKeysym(theDisplay, i, 0, 0) == keysym) {
       if (!func) {
 	func = parse_function_list(action);
 	if (!func) {
--- a/modules/FvwmIconMan/x.c
+++ b/modules/FvwmIconMan/x.c
@@ -245,8 +245,8 @@
        * the cases to one keycode. */
       theEvent.xkey.keycode =
 	XKeysymToKeycode (theDisplay,
-			  XKeycodeToKeysym(theDisplay,
-					   theEvent.xkey.keycode,0));
+			  fvwm_KeycodeToKeysym(theDisplay,
+					   theEvent.xkey.keycode,0,0));
       modifier = (theEvent.xkey.state & MODS_USED);
       ConsoleDebug (X11, "\tKeyPress: %d\n", theEvent.xkey.keycode);
 
--- a/modules/FvwmScript/FvwmScript.c
+++ b/modules/FvwmScript/FvwmScript.c
@@ -973,7 +973,7 @@
       find = False;
       XLookupString(&event.xkey, (char *)buf, sizeof(buf), &ks, NULL);
       event.xkey.keycode =
-	XKeysymToKeycode(dpy,XKeycodeToKeysym(dpy,event.xkey.keycode,0));
+	XKeysymToKeycode(dpy,fvwm_KeycodeToKeysym(dpy,event.xkey.keycode,0,0));
 
       /* check for bindings defined by the Key instruction */
 	  tmp.res_class = tmp.res_name = "root";
@@ -1452,7 +1452,7 @@
   /* Compute the Shift-Tab keysym */
   {
     KeyCode tab = XKeysymToKeycode(dpy, XK_Tab);
-    shift_tab_ks = XKeycodeToKeysym(dpy, tab, ShiftMask);
+    shift_tab_ks = fvwm_KeycodeToKeysym(dpy, tab, 0, ShiftMask);
   }
 
   /* Construction des boutons et de la fenetre */
