[gtk-vnc] Refactor keymap handling to cope with multiple GDK backends
- From: Daniel P. Berrange <dberrange src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk-vnc] Refactor keymap handling to cope with multiple GDK backends
- Date: Thu, 13 Jan 2011 16:37:40 +0000 (UTC)
commit 881ec575e463c52cf7098a0e3d65b3baf178d0e8
Author: Daniel P. Berrange <berrange redhat com>
Date: Thu Jan 13 16:16:32 2011 +0000
Refactor keymap handling to cope with multiple GDK backends
In GTK3 it is possible to have multiple GDK backends present.
The vncdisplaykeymap code needs a minor refactoring to cope
with this enhancement. The refactoring also trivially maintains
GTK2 compat
src/vncdisplaykeymap.c | 187 +++++++++++++++++++++++++++---------------------
1 files changed, 104 insertions(+), 83 deletions(-)
---
diff --git a/src/vncdisplaykeymap.c b/src/vncdisplaykeymap.c
index 4ad4732..0ab9bc1 100644
--- a/src/vncdisplaykeymap.c
+++ b/src/vncdisplaykeymap.c
@@ -54,7 +54,7 @@ static struct {
static unsigned int ref_count_for_untranslated_keys = 0;
-#if defined(GDK_WINDOWING_X11)
+#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
#include <X11/XKBlib.h>
#include <stdbool.h>
@@ -69,15 +69,39 @@ static unsigned int ref_count_for_untranslated_keys = 0;
/* Xorg Cygwin aka XWin (offset + mangled XT keycodes) */
#include "vncdisplaykeymap_xorgxwin2rfb.c"
-#ifndef GDK_DISPLAY
-#define GDK_DISPLAY() GDK_DISPLAY_XDISPLAY(gdk_display_get_default())
+/* Gtk2 compat */
+#ifndef GDK_IS_X11_DISPLAY
+#define GDK_IS_X11_DISPLAY(dpy) 1
#endif
+#endif
+
+#ifdef GDK_WINDOWING_WIN32
+/* Win32 native virtual keycodes */
+#include "vncdisplaykeymap_win322rfb.c"
+
+/* Gtk2 compat */
+#ifndef GDK_IS_WIN32_DISPLAY
+#define GDK_IS_WIN32_DISPLAY(dpy) 1
+#endif
+#endif
+
+#ifdef GDK_WINDOWING_QUARTZ
+/* OS-X native keycodes */
+#include "vncdisplaykeymap_osx2rfb.c"
+
+/* Gtk2 compat */
+#ifndef GDK_IS_QUARTZ_DISPLAY
+#define GDK_IS_QUARTZ_DISPLAY(dpy) 1
+#endif
+#endif
+
+#ifdef GDK_WINDOWING_X11
#define STRPREFIX(a,b) (strncmp((a),(b),strlen((b))) == 0)
-static gboolean check_for_xwin(void)
+static gboolean check_for_xwin(GdkDisplay *dpy)
{
- char *vendor = ServerVendor(GDK_DISPLAY());
+ char *vendor = ServerVendor(gdk_x11_display_get_xdisplay(dpy));
if (strstr(vendor, "Cygwin/X"))
return TRUE;
@@ -85,12 +109,13 @@ static gboolean check_for_xwin(void)
return FALSE;
}
-static gboolean check_for_xquartz(void)
+static gboolean check_for_xquartz(GdkDisplay *dpy)
{
int nextensions;
int i;
gboolean match = FALSE;
- char **extensions = XListExtensions(GDK_DISPLAY(), &nextensions);
+ char **extensions = XListExtensions(gdk_x11_display_get_xdisplay(dpy),
+ &nextensions);
for (i = 0 ; extensions != NULL && i < nextensions ; i++) {
if (strcmp(extensions[i], "Apple-WM") == 0 ||
strcmp(extensions[i], "Apple-DRI") == 0)
@@ -101,98 +126,94 @@ static gboolean check_for_xquartz(void)
return match;
}
+#endif
const guint16 const *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
{
- XkbDescPtr desc;
- const gchar *keycodes = NULL;
-
- /* There is no easy way to determine what X11 server
- * and platform & keyboard driver is in use. Thus we
- * do best guess heuristics.
- *
- * This will need more work for people with other
- * X servers..... patches welcomed.
- */
-
- desc = XkbGetKeyboard(GDK_DISPLAY(), XkbGBN_AllComponentsMask,
- XkbUseCoreKbd);
- if (desc) {
- if (desc->names) {
- keycodes = gdk_x11_get_xatom_name(desc->names->keycodes);
- if (!keycodes)
- g_warning("could not lookup keycode name");
+ GdkDisplay *dpy = gdk_display_get_default();
+
+#ifdef GDK_WINDOWING_X11
+ if (GDK_IS_X11_DISPLAY(dpy)) {
+ XkbDescPtr desc;
+ const gchar *keycodes = NULL;
+
+ /* There is no easy way to determine what X11 server
+ * and platform & keyboard driver is in use. Thus we
+ * do best guess heuristics.
+ *
+ * This will need more work for people with other
+ * X servers..... patches welcomed.
+ */
+
+ desc = XkbGetKeyboard(gdk_x11_display_get_xdisplay(dpy),
+ XkbGBN_AllComponentsMask,
+ XkbUseCoreKbd);
+ if (desc) {
+ if (desc->names) {
+ keycodes = gdk_x11_get_xatom_name(desc->names->keycodes);
+ if (!keycodes)
+ g_warning("could not lookup keycode name");
+ }
+ XkbFreeClientMap(desc, XkbGBN_AllComponentsMask, True);
}
- XkbFreeClientMap(desc, XkbGBN_AllComponentsMask, True);
- }
- if (check_for_xwin()) {
- VNC_DEBUG("Using xwin keycode mapping");
- *maplen = G_N_ELEMENTS(keymap_xorgxwin2rfb);
- return keymap_xorgxwin2rfb;
- } else if (check_for_xquartz()) {
- VNC_DEBUG("Using xquartz keycode mapping");
- *maplen = G_N_ELEMENTS(keymap_xorgxquartz2rfb);
- return keymap_xorgxquartz2rfb;
- } else if (keycodes && STRPREFIX(keycodes, "evdev_")) {
- VNC_DEBUG("Using evdev keycode mapping");
- *maplen = G_N_ELEMENTS(keymap_xorgevdev2rfb);
- return keymap_xorgevdev2rfb;
- } else if (keycodes && STRPREFIX(keycodes, "xfree86_")) {
- VNC_DEBUG("Using xfree86 keycode mapping");
- *maplen = G_N_ELEMENTS(keymap_xorgkbd2rfb);
- return keymap_xorgkbd2rfb;
- } else {
- g_warning("Unknown keycode mapping '%s'.\n"
- "Please report to gtk-vnc-list gnome org\n"
- "including the following information:\n"
- "\n"
- " - Operating system\n"
- " - GTK build\n"
- " - X11 Server\n"
- " - xprop -root\n"
- " - xdpyinfo\n",
- keycodes);
- return NULL;
+ if (check_for_xwin(dpy)) {
+ VNC_DEBUG("Using xwin keycode mapping");
+ *maplen = G_N_ELEMENTS(keymap_xorgxwin2rfb);
+ return keymap_xorgxwin2rfb;
+ } else if (check_for_xquartz(dpy)) {
+ VNC_DEBUG("Using xquartz keycode mapping");
+ *maplen = G_N_ELEMENTS(keymap_xorgxquartz2rfb);
+ return keymap_xorgxquartz2rfb;
+ } else if (keycodes && STRPREFIX(keycodes, "evdev_")) {
+ VNC_DEBUG("Using evdev keycode mapping");
+ *maplen = G_N_ELEMENTS(keymap_xorgevdev2rfb);
+ return keymap_xorgevdev2rfb;
+ } else if (keycodes && STRPREFIX(keycodes, "xfree86_")) {
+ VNC_DEBUG("Using xfree86 keycode mapping");
+ *maplen = G_N_ELEMENTS(keymap_xorgkbd2rfb);
+ return keymap_xorgkbd2rfb;
+ } else {
+ g_warning("Unknown keycode mapping '%s'.\n"
+ "Please report to gtk-vnc-list gnome org\n"
+ "including the following information:\n"
+ "\n"
+ " - Operating system\n"
+ " - GDK build\n"
+ " - X11 Server\n"
+ " - xprop -root\n"
+ " - xdpyinfo\n",
+ keycodes);
+ return NULL;
+ }
}
-}
-
-#elif defined(GDK_WINDOWING_WIN32)
-/* Win32 native virtual keycodes */
-#include "vncdisplaykeymap_win322rfb.c"
-
-const guint16 const *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
-{
- VNC_DEBUG("Using Win32 virtual keycode mapping");
- *maplen = sizeof(keymap_win322rfb);
- return keymap_win322rfb;
-}
-
-#elif defined(GDK_WINDOWING_QUARTZ)
-/* OS-X native keycodes */
-#include "vncdisplaykeymap_osx2rfb.c"
-
-const guint16 const *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
-{
- VNC_DEBUG("Using OS-X virtual keycode mapping");
- *maplen = sizeof(keymap_osx2rfb);
- return keymap_osx2rfb;
-}
+#endif
+#ifdef GDK_WINDOWING_WIN32
+ if (GDK_IS_WIN32_DISPLAY(dpy)) {
+ VNC_DEBUG("Using Win32 virtual keycode mapping");
+ *maplen = sizeof(keymap_win322rfb);
+ return keymap_win322rfb;
+ }
+#endif
-#else
+#ifdef GDK_WINDOWING_QUARTZ
+ if (GDK_IS_QUARTZ_DISPLAY(dpy)) {
+ VNC_DEBUG("Using OS-X virtual keycode mapping");
+ *maplen = sizeof(keymap_osx2rfb);
+ return keymap_osx2rfb;
+ }
+#endif
-const guint16 const *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
-{
g_warning("Unsupported GDK Windowing platform.\n"
+ "Disabling extended keycode tables.\n"
"Please report to gtk-vnc-list gnome org\n"
"including the following information:\n"
"\n"
" - Operating system\n"
- " - GTK Windowing system build\n");
+ " - GDK Windowing system build\n");
return NULL;
}
-#endif
guint16 vnc_display_keymap_gdk2rfb(const guint16 const *keycode_map,
size_t keycode_maplen,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]