bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#1450: w32_reset_fringes


From: martin rudalics
Subject: bug#1450: w32_reset_fringes
Date: Sat, 29 Nov 2008 12:43:21 +0100
User-agent: Thunderbird 2.0.0.16 (Windows/20080708)

> A further datapoint: both the above as well as (setq default-frame-alist
> '((minibuffer))) also induce a crash in GNU Emacs 23.0.60.16
> (i686-pc-linux-gnu, GTK+ Version 2.12.9) of 2008-11-20 on escher

I attached a fairly secure and minimally invasive patch.
Could you try it?

Thanks, martin.
*** frame.h.~1.145.~    2008-11-14 07:21:31.062500000 +0100
--- frame.h     2008-11-29 12:27:15.156250000 +0100
***************
*** 1115,1120 ****
--- 1115,1121 ----
                                           Lisp_Object component,
                                           Lisp_Object subclass);
  
+ extern Lisp_Object delete_frame P_ ((Lisp_Object, Lisp_Object));
  
  #endif /* HAVE_WINDOW_SYSTEM */
  
*** frame.c.~1.399.~    2008-11-29 12:04:07.515625000 +0100
--- frame.c     2008-11-29 12:26:53.468750000 +0100
***************
*** 1322,1341 ****
  
  extern Lisp_Object Qrun_hook_with_args;
  
! DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "",
!        doc: /* Delete FRAME, permanently eliminating it from use.
! If omitted, FRAME defaults to the selected frame.
! A frame may not be deleted if its minibuffer is used by other frames.
! Normally, you may not delete a frame if all other frames are invisible,
! but if the second optional argument FORCE is non-nil, you may do so.
! 
! This function runs `delete-frame-functions' before actually deleting the
! frame, unless the frame is a tooltip.
! The functions are run with one arg, the frame to be deleted.
! But FORCE inhibits this too.  */)
! /* FORCE is non-nil when handling a disconnected terminal.  */
!      (frame, force)
!      Lisp_Object frame, force;
  {
    struct frame *f;
    struct frame *sf = SELECTED_FRAME ();
--- 1322,1330 ----
  
  extern Lisp_Object Qrun_hook_with_args;
  
! Lisp_Object
! delete_frame (frame, force)
!      register Lisp_Object frame, force;
  {
    struct frame *f;
    struct frame *sf = SELECTED_FRAME ();
***************
*** 1360,1371 ****
    if (NILP (force) && !other_visible_frames (f))
      error ("Attempt to delete the sole visible or iconified frame");
  
- #if 0
    /* This is a nice idea, but x_connection_closed needs to be able
       to delete the last frame, if it is gone.  */
!   if (NILP (XCDR (Vframe_list)))
      error ("Attempt to delete the only frame");
- #endif
  
    /* Does this frame have a minibuffer, and is it the surrogate
       minibuffer for any other frame?  */
--- 1349,1358 ----
    if (NILP (force) && !other_visible_frames (f))
      error ("Attempt to delete the sole visible or iconified frame");
  
    /* This is a nice idea, but x_connection_closed needs to be able
       to delete the last frame, if it is gone.  */
!   if (NILP (XCDR (Vframe_list)) && !EQ (force, Qnoelisp))
      error ("Attempt to delete the only frame");
  
    /* Does this frame have a minibuffer, and is it the surrogate
       minibuffer for any other frame?  */
***************
*** 1386,1392 ****
                                   (FRAME_MINIBUF_WINDOW (XFRAME (this))))))
            {
              /* If we MUST delete this frame, delete the other first.  */
!             if (!NILP (force))
                Fdelete_frame (this, force);
              else
                error ("Attempt to delete a surrogate minibuffer frame");
--- 1373,1379 ----
                                   (FRAME_MINIBUF_WINDOW (XFRAME (this))))))
            {
              /* If we MUST delete this frame, delete the other first.  */
!             if (EQ (force, Qnoelisp))
                Fdelete_frame (this, force);
              else
                error ("Attempt to delete a surrogate minibuffer frame");
***************
*** 1634,1639 ****
--- 1621,1645 ----
  
    return Qnil;
  }
+ 
+ DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "",
+        doc: /* Delete FRAME, permanently eliminating it from use.
+ If omitted, FRAME defaults to the selected frame.
+ A frame may not be deleted if its minibuffer is used by other frames.
+ Normally, you may not delete a frame if all other frames are invisible,
+ but if the second optional argument FORCE is non-nil, you may do so.
+ 
+ This function runs `delete-frame-functions' before actually deleting the
+ frame, unless the frame is a tooltip.
+ The functions are run with one arg, the frame to be deleted.
+ But FORCE inhibits this too.  */)
+ /* FORCE is non-nil when handling a disconnected terminal.  */
+      (frame, force)
+      Lisp_Object frame, force;
+ {
+   return delete_frame (frame, !NILP (force) ? Qt : Qnil);
+ }
+ 
  
  /* Return mouse position in character cell units.  */
  
*** terminal.c.~1.13.~  2008-11-29 12:04:07.843750000 +0100
--- terminal.c  2008-11-29 12:23:14.406250000 +0100
***************
*** 256,262 ****
    struct terminal **tp;
    Lisp_Object tail, frame;
  
!   /* Protect against recursive calls.  Fdelete_frame calls the
       delete_terminal_hook when we delete our last frame.  */
    if (!terminal->name)
      return;
--- 256,262 ----
    struct terminal **tp;
    Lisp_Object tail, frame;
  
!   /* Protect against recursive calls.  delete_frame calls the
       delete_terminal_hook when we delete our last frame.  */
    if (!terminal->name)
      return;
***************
*** 270,276 ****
        if (FRAME_LIVE_P (f) && f->terminal == terminal)
          {
          /* Maybe this should pass Qnoelisp rather than Qt?  */
!           Fdelete_frame (frame, Qt);
          }
      }
  
--- 270,276 ----
        if (FRAME_LIVE_P (f) && f->terminal == terminal)
          {
          /* Maybe this should pass Qnoelisp rather than Qt?  */
!           delete_frame (frame, Qnoelisp);
          }
      }

reply via email to

[Prev in Thread] Current Thread [Next in Thread]