Browse Source

workaround problem when unable to get input context

David Rose 17 years ago
parent
commit
81bef7355c
1 changed files with 35 additions and 22 deletions
  1. 35 22
      panda/src/glxdisplay/glxGraphicsWindow.cxx

+ 35 - 22
panda/src/glxdisplay/glxGraphicsWindow.cxx

@@ -699,13 +699,17 @@ open_window() {
   // nicer if we could support fancy IM's that want preedit callbacks,
   // etc., but that can wait until we have an X server that actually
   // supports these to test it on.
-  _ic = XCreateIC
-    (glx_pipe->get_im(),
-     XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
-     NULL);
-  if (_ic == (XIC)NULL) {
-    glxdisplay_cat.warning()
-      << "Couldn't create input context.\n";
+  XIM im = glx_pipe->get_im();
+  _ic = NULL;
+  if (im) {
+    _ic = XCreateIC
+      (im,
+       XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
+       NULL);
+    if (_ic == (XIC)NULL) {
+      glxdisplay_cat.warning()
+        << "Couldn't create input context.\n";
+    }
   }
 
   if (_properties.get_cursor_hidden()) {
@@ -1205,21 +1209,30 @@ void glxGraphicsWindow::
 handle_keystroke(XKeyEvent &event) {
   _input_devices[0].set_pointer_in_window(event.x, event.y);
 
-  // First, get the keystroke as a wide-character sequence.
-  static const int buffer_size = 256;
-  wchar_t buffer[buffer_size];
-  Status status;
-  int len = XwcLookupString(_ic, &event, buffer, buffer_size, NULL,
-                            &status);
-  if (status == XBufferOverflow) {
-    glxdisplay_cat.error()
-      << "Overflowed input buffer.\n";
-  }
-  
-  // Now each of the returned wide characters represents a
-  // keystroke.
-  for (int i = 0; i < len; i++) {
-    _input_devices[0].keystroke(buffer[i]);
+  if (_ic) {
+    // First, get the keystroke as a wide-character sequence.
+    static const int buffer_size = 256;
+    wchar_t buffer[buffer_size];
+    Status status;
+    int len = XwcLookupString(_ic, &event, buffer, buffer_size, NULL,
+                              &status);
+    if (status == XBufferOverflow) {
+      glxdisplay_cat.error()
+        << "Overflowed input buffer.\n";
+    }
+    
+    // Now each of the returned wide characters represents a
+    // keystroke.
+    for (int i = 0; i < len; i++) {
+      _input_devices[0].keystroke(buffer[i]);
+    }
+
+  } else {
+    // Without an input context, just get the ascii keypress.
+    ButtonHandle button = get_button(event);
+    if (button.has_ascii_equivalent()) {
+      _input_devices[0].keystroke(button.get_ascii_equivalent());
+    }
   }
 }