]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix focus handling for embedded frames.
authorDavid Benjamin <davidben@mit.edu>
Sat, 7 Jan 2012 07:02:06 +0000 (15:02 +0800)
committerChong Yidong <cyd@gnu.org>
Sat, 7 Jan 2012 07:02:06 +0000 (15:02 +0800)
* xfns.c (Fx_focus_frame): Use it for embedded frames.

* xterm.c (x_embed_request_focus): New function.

* xterm.h: Add prototype.

Fixes: debbugs:9977
src/ChangeLog
src/xfns.c
src/xterm.c
src/xterm.h

index 9e236b25785a852fdbf5a43c90c26197b9ee3438..468e73c190b46da5f81f09c5dbe6cb85afacf0fe 100644 (file)
@@ -1,3 +1,11 @@
+2012-01-07  David Benjamin  <davidben@mit.edu>  (tiny change)
+
+       * xterm.c (x_embed_request_focus): New function.
+
+       * xterm.h: Add prototype.
+
+       * xfns.c (Fx_focus_frame): Use it for embedded frames (Bug#9977).
+
 2012-01-05  Glenn Morris  <rgm@gnu.org>
 
        * emacs.c (emacs_copyright): Update short copyright year to 2012.
index 6f44b05fa6c351ec8dac8cab037eee2dde552eaf..f00335b5d03d4f37237ded0aa392d1504337c4d0 100644 (file)
@@ -3519,9 +3519,21 @@ FRAME nil means use the selected frame.  */)
 
   BLOCK_INPUT;
   x_catch_errors (dpy);
-  XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
-                 RevertToParent, CurrentTime);
-  x_ewmh_activate_frame (f);
+
+  if (FRAME_X_EMBEDDED_P (f))
+    {
+      /* For Xembedded frames, normally the embedder forwards key
+        events.  See XEmbed Protocol Specification at
+        http://freedesktop.org/wiki/Specifications/xembed-spec  */
+      xembed_request_focus (f);
+    }
+  else
+    {
+      XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                     RevertToParent, CurrentTime);
+      x_ewmh_activate_frame (f);
+    }
+
   x_uncatch_errors ();
   UNBLOCK_INPUT;
 
index 73bafbda2fad240f7186e924491bf259868b6f23..4b34d6344ac3eaf394906036ee88ed3ed26a0e75 100644 (file)
@@ -8981,6 +8981,18 @@ x_lower_frame (struct frame *f)
     }
 }
 
+/* Request focus with XEmbed */
+
+void
+xembed_request_focus (FRAME_PTR f)
+{
+  /* See XEmbed Protocol Specification at
+     http://freedesktop.org/wiki/Specifications/xembed-spec  */
+  if (f->async_visible)
+    xembed_send_message (f, CurrentTime,
+                        XEMBED_REQUEST_FOCUS, 0, 0, 0);
+}
+
 /* Activate frame with Extended Window Manager Hints */
 
 void
index c77f386a2addf8659fb4692bb43b02625a13c27e..86daa7bd27e61a7864614e5c6e0117f85cb4bb3a 100644 (file)
@@ -967,6 +967,7 @@ extern void x_clear_errors (Display *);
 extern void x_set_window_size (struct frame *, int, int, int);
 extern void x_set_mouse_position (struct frame *, int, int);
 extern void x_set_mouse_pixel_position (struct frame *, int, int);
+extern void xembed_request_focus (struct frame *);
 extern void x_ewmh_activate_frame (struct frame *);
 extern void x_make_frame_visible (struct frame *);
 extern void x_make_frame_invisible (struct frame *);