]> git.eshelyaron.com Git - emacs.git/commitdiff
On X, always make pointer visible when deleting frame (Bug#17609).
authorDmitry Antipov <dmantipov@yandex.ru>
Wed, 28 May 2014 08:00:10 +0000 (12:00 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Wed, 28 May 2014 08:00:10 +0000 (12:00 +0400)
* frame.c (frame_make_pointer_visible, frame_make_pointer_invisible):
Pass frame as arg.
* frame.h (frame_make_pointer_visible, frame_make_pointer_invisible):
Adjust prototypes.
* cmds.c (Fself_insert_command): Use SELECTED_FRAME.
* keyboard.c (gobble_input): If there is no terminal input error,
make sure the pointer is visible for all frames on this terminal.
* xterm.c (x_free_frame_resources): Always enable pointer visibility.

src/ChangeLog
src/cmds.c
src/frame.c
src/frame.h
src/keyboard.c
src/xterm.c

index b57aec9770ec0103f28a9b8cf857134e7dcb69ab..c1e29dd206c059514fd237fb8dbf04105536feb8 100644 (file)
@@ -1,3 +1,15 @@
+2014-05-28  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       On X, always make pointer visible when deleting frame (Bug#17609).
+       * frame.c (frame_make_pointer_visible, frame_make_pointer_invisible):
+       Pass frame as arg.
+       * frame.h (frame_make_pointer_visible, frame_make_pointer_invisible):
+       Adjust prototypes.
+       * cmds.c (Fself_insert_command): Use SELECTED_FRAME.
+       * keyboard.c (gobble_input): If there is no terminal input error,
+       make sure the pointer is visible for all frames on this terminal.
+       * xterm.c (x_free_frame_resources): Always enable pointer visibility.
+
 2014-05-28  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * data.c (Fzerop): Move to Elisp.
index 7459908828d4627ea4ebb083819fc6d8d1a3e1fa..b5aa69d63913c40f46a0e7043813874cf3bb7af0 100644 (file)
@@ -315,7 +315,7 @@ At the end, it runs `post-self-insert-hook'.  */)
     int val = internal_self_insert (character, XFASTINT (n));
     if (val == 2)
       nonundocount = 0;
-    frame_make_pointer_invisible ();
+    frame_make_pointer_invisible (SELECTED_FRAME ());
   }
 
   return Qnil;
index 08d0efb6ea2df7fc018dd13d1b7858c500467cb5..ece0537a2031fa8a5864156c8287bb7fdcc78b5c 100644 (file)
@@ -4373,16 +4373,11 @@ x_figure_window_size (struct frame *f, Lisp_Object parms, bool toolbar_p)
 #endif /* HAVE_WINDOW_SYSTEM */
 
 void
-frame_make_pointer_invisible (void)
+frame_make_pointer_invisible (struct frame *f)
 {
   if (! NILP (Vmake_pointer_invisible))
     {
-      struct frame *f;
-      if (!FRAMEP (selected_frame) || !FRAME_LIVE_P (XFRAME (selected_frame)))
-        return;
-
-      f = SELECTED_FRAME ();
-      if (f && !f->pointer_invisible
+      if (f && FRAME_LIVE_P (f) && !f->pointer_invisible
           && FRAME_TERMINAL (f)->toggle_invisible_pointer_hook)
         {
           f->mouse_moved = 0;
@@ -4393,17 +4388,11 @@ frame_make_pointer_invisible (void)
 }
 
 void
-frame_make_pointer_visible (void)
+frame_make_pointer_visible (struct frame *f)
 {
   /* We don't check Vmake_pointer_invisible here in case the
      pointer was invisible when Vmake_pointer_invisible was set to nil.  */
-  struct frame *f;
-
-  if (!FRAMEP (selected_frame) || !FRAME_LIVE_P (XFRAME (selected_frame)))
-    return;
-
-  f = SELECTED_FRAME ();
-  if (f && f->pointer_invisible && f->mouse_moved
+  if (f && FRAME_LIVE_P (f) && f->pointer_invisible && f->mouse_moved
       && FRAME_TERMINAL (f)->toggle_invisible_pointer_hook)
     {
       FRAME_TERMINAL (f)->toggle_invisible_pointer_hook (f, 0);
index ff696df9effdb10965988a64381981328ae6998a..c0c206d7c6a31544ac5c73981075d276cfc20301 100644 (file)
@@ -995,8 +995,8 @@ extern struct frame *make_frame_without_minibuffer (Lisp_Object,
 #endif /* HAVE_WINDOW_SYSTEM */
 extern bool window_system_available (struct frame *);
 extern void check_window_system (struct frame *);
-extern void frame_make_pointer_invisible (void);
-extern void frame_make_pointer_visible (void);
+extern void frame_make_pointer_invisible (struct frame *);
+extern void frame_make_pointer_visible (struct frame *);
 extern Lisp_Object delete_frame (Lisp_Object, Lisp_Object);
 
 extern Lisp_Object Vframe_list;
index 0308b7106d7818dbd0fc5102b190578fed7f0c40..e92c86b7dbf1b4f8d5ff47b76d15c7f8998fc4a5 100644 (file)
@@ -6877,6 +6877,20 @@ gobble_input (void)
              }
             }
 
+         /* If there was no error, make sure the pointer
+            is visible for all frames on this terminal.  */
+         if (nr >= 0)
+           {
+             Lisp_Object tail, frame;
+
+             FOR_EACH_FRAME (tail, frame)
+               {
+                 struct frame *f = XFRAME (frame);
+                 if (FRAME_TERMINAL (f) == t)
+                   frame_make_pointer_visible (f);
+               }
+           }
+
           if (hold_quit.kind != NO_EVENT)
             kbd_buffer_store_event (&hold_quit);
         }
@@ -6887,8 +6901,6 @@ gobble_input (void)
   if (err && !nread)
     nread = -1;
 
-  frame_make_pointer_visible ();
-
   return nread;
 }
 
index 0693d101f161760a811c19e5d3f3e9758d9d3f36..6ee764aeebc4ccc6ededb6660d247ab3e05daa65 100644 (file)
@@ -9233,6 +9233,10 @@ x_free_frame_resources (struct frame *f)
      commands to the X server.  */
   if (dpyinfo->display)
     {
+      /* Always exit with visible pointer to avoid weird issue
+        with Xfixes (Bug#17609).  */
+      FRAME_DISPLAY_INFO (f)->toggle_visible_pointer (f, 0);
+
       /* We must free faces before destroying windows because some
         font-driver (e.g. xft) access a window while finishing a
         face.  */