From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: martin rudalics Newsgroups: gmane.emacs.bugs Subject: bug#12310: crash in remember_mouse_glyph Date: Thu, 30 Aug 2012 10:32:11 +0200 Message-ID: <503F250B.7000303@gmx.at> References: <20120830.072750.114646404.wl@gnu.org> <503F1E30.9000301@gmx.at> <20120830.101626.242243060.wl@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------030603020103090701000106" X-Trace: ger.gmane.org 1346315589 24214 80.91.229.3 (30 Aug 2012 08:33:09 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 30 Aug 2012 08:33:09 +0000 (UTC) Cc: 12310@debbugs.gnu.org To: Werner LEMBERG Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Aug 30 10:33:09 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1T70BZ-0007ou-EQ for geb-bug-gnu-emacs@m.gmane.org; Thu, 30 Aug 2012 10:33:09 +0200 Original-Received: from localhost ([::1]:52767 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T70BT-0008Fv-0t for geb-bug-gnu-emacs@m.gmane.org; Thu, 30 Aug 2012 04:33:03 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:42066) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T70BP-0008Fo-F7 for bug-gnu-emacs@gnu.org; Thu, 30 Aug 2012 04:33:01 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T70BK-0000Xu-JW for bug-gnu-emacs@gnu.org; Thu, 30 Aug 2012 04:32:59 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:47547) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T70BK-0000Xq-GJ for bug-gnu-emacs@gnu.org; Thu, 30 Aug 2012 04:32:54 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1T70CQ-0007J5-A1 for bug-gnu-emacs@gnu.org; Thu, 30 Aug 2012 04:34:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: martin rudalics Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 30 Aug 2012 08:34:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 12310 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 12310-submit@debbugs.gnu.org id=B12310.134631562028057 (code B ref 12310); Thu, 30 Aug 2012 08:34:02 +0000 Original-Received: (at 12310) by debbugs.gnu.org; 30 Aug 2012 08:33:40 +0000 Original-Received: from localhost ([127.0.0.1]:57093 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1T70C3-0007IS-AD for submit@debbugs.gnu.org; Thu, 30 Aug 2012 04:33:40 -0400 Original-Received: from mailout-de.gmx.net ([213.165.64.23]:54865) by debbugs.gnu.org with smtp (Exim 4.72) (envelope-from ) id 1T70By-0007II-IQ for 12310@debbugs.gnu.org; Thu, 30 Aug 2012 04:33:37 -0400 Original-Received: (qmail invoked by alias); 30 Aug 2012 08:32:24 -0000 Original-Received: from 62-47-46-41.adsl.highway.telekom.at (EHLO [62.47.46.41]) [62.47.46.41] by mail.gmx.net (mp035) with SMTP; 30 Aug 2012 10:32:24 +0200 X-Authenticated: #14592706 X-Provags-ID: V01U2FsdGVkX1+fCw0M1wGf39dYqigSV7mQNb7U5Y82JwtcdeRDdZ 2/2aYi3OBNJz+Y In-Reply-To: <20120830.101626.242243060.wl@gnu.org> X-Y-GMX-Trusted: 0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:63602 Archived-At: This is a multi-part message in MIME format. --------------030603020103090701000106 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit > Indeed. I've forgotten to describe the symptoms if not running under > gdb, and they are the same (visible bell while moving the mouse or > pressing any key, but no reaction otherwise; I had to kill Emacs, or > it crashed after some time). Meanwhile could you try the patch I earlier sent to Sam. I'll attach it. Basically, it should help to find the bug earlier. martin --------------030603020103090701000106 Content-Type: text/plain; name="windowp.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="windowp.diff" bzr diff === modified file 'src/buffer.c' --- src/buffer.c 2012-08-24 04:37:57 +0000 +++ src/buffer.c 2012-08-25 13:16:19 +0000 @@ -1351,7 +1351,7 @@ A non-nil FLAG means mark the buffer modified. */) (Lisp_Object flag) { - Lisp_Object fn, buffer, window; + Lisp_Object fn, buffer; #ifdef CLASH_DETECTION /* If buffer becoming modified, lock the file. @@ -1401,8 +1401,7 @@ buffers without "modifying" buffers, or redisplay should be smarter about updating the `*' in mode lines. --gerd */ XSETBUFFER (buffer, current_buffer); - window = Fget_buffer_window (buffer, Qt); - if (WINDOWP (window)) + if (!NILP (Fget_buffer_window (buffer, Qt))) { ++update_mode_lines; current_buffer->prevent_redisplay_optimizations_p = 1; @@ -3195,7 +3194,7 @@ Lisp_Object window; window = Foverlay_get (overlay, Qwindow); - if (WINDOWP (window) && XWINDOW (window) != w) + if (WINDOW_LIVE_P (window) && XWINDOW (window) != w) continue; } @@ -3337,7 +3336,7 @@ if (endpos != pos && startpos != pos) continue; window = Foverlay_get (overlay, Qwindow); - if (WINDOWP (window) && XWINDOW (window) != w) + if (WINDOW_LIVE_P (window) && XWINDOW (window) != w) continue; if (startpos == pos && (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str))) @@ -3365,7 +3364,7 @@ if (endpos != pos && startpos != pos) continue; window = Foverlay_get (overlay, Qwindow); - if (WINDOWP (window) && XWINDOW (window) != w) + if (WINDOW_LIVE_P (window) && XWINDOW (window) != w) continue; if (startpos == pos && (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str))) === modified file 'src/editfns.c' --- src/editfns.c 2012-08-21 23:39:56 +0000 +++ src/editfns.c 2012-08-25 12:34:37 +0000 @@ -360,7 +360,7 @@ if (NILP (object)) XSETBUFFER (object, current_buffer); - else if (WINDOWP (object)) + else if (WINDOW_LIVE_P (object)) object = XWINDOW (object)->buffer; if (!BUFFERP (object)) === modified file 'src/frame.c' --- src/frame.c 2012-08-22 16:05:04 +0000 +++ src/frame.c 2012-08-25 13:14:31 +0000 @@ -951,7 +951,7 @@ || FRAME_ICONIFIED_P (XFRAME (f))) return f; } - else if (WINDOWP (minibuf)) + else if (WINDOW_LIVE_P (minibuf)) { if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf) || EQ (WINDOW_FRAME (XWINDOW (minibuf)), f) @@ -1010,7 +1010,7 @@ if (! FRAME_MINIBUF_ONLY_P (XFRAME (f))) prev = f; } - else if (WINDOWP (minibuf)) + else if (WINDOW_LIVE_P (minibuf)) { if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf) || EQ (WINDOW_FRAME (XWINDOW (minibuf)), f) @@ -2150,7 +2150,7 @@ set_term_frame_name (f, val); } - if (EQ (prop, Qminibuffer) && WINDOWP (val)) + if (EQ (prop, Qminibuffer) && WINDOW_LIVE_P (val)) { if (! MINI_WINDOW_P (XWINDOW (val))) error ("Surrogate minibuffer windows must be minibuffer windows"); === modified file 'src/keyboard.c' --- src/keyboard.c 2012-08-23 08:33:56 +0000 +++ src/keyboard.c 2012-08-25 12:34:33 +0000 @@ -3521,7 +3521,7 @@ frame = event->frame_or_window; if (CONSP (frame)) frame = XCAR (frame); - else if (WINDOWP (frame)) + else if (WINDOW_LIVE_P (frame)) frame = WINDOW_FRAME (XWINDOW (frame)); /* There are still some events that don't set this field. @@ -3738,7 +3738,7 @@ event.kind = HELP_EVENT; event.frame_or_window = frame; event.arg = object; - event.x = WINDOWP (window) ? window : frame; + event.x = WINDOW_LIVE_P (window) ? window : frame; event.y = help; event.code = pos; kbd_buffer_store_event (&event); @@ -4064,7 +4064,7 @@ clear_event (event); kbd_fetch_ptr = event + 1; - if (!WINDOWP (window)) + if (!WINDOW_LIVE_P (window)) window = Qnil; obj = Fcons (Qhelp_echo, list5 (frame, help, window, object, position)); @@ -4109,7 +4109,7 @@ frame = event->frame_or_window; if (CONSP (frame)) frame = XCAR (frame); - else if (WINDOWP (frame)) + else if (WINDOW_LIVE_P (frame)) frame = WINDOW_FRAME (XWINDOW (frame)); focus = FRAME_FOCUS_FRAME (XFRAME (frame)); @@ -5192,7 +5192,7 @@ ? window_from_coordinates (f, XINT (x), XINT (y), &part, 0) : Qnil; - if (WINDOWP (window)) + if (WINDOW_LIVE_P (window)) { /* It's a click in window WINDOW at frame coordinates (X,Y) */ struct window *w = XWINDOW (window); @@ -5621,7 +5621,7 @@ struct frame *f; int fuzz; - if (WINDOWP (event->frame_or_window)) + if (WINDOW_LIVE_P (event->frame_or_window)) f = XFRAME (XWINDOW (event->frame_or_window)->frame); else if (FRAMEP (event->frame_or_window)) f = XFRAME (event->frame_or_window); @@ -5789,7 +5789,7 @@ int symbol_num; int is_double; - if (WINDOWP (event->frame_or_window)) + if (WINDOW_LIVE_P (event->frame_or_window)) fr = XFRAME (XWINDOW (event->frame_or_window)->frame); else if (FRAMEP (event->frame_or_window)) fr = XFRAME (event->frame_or_window); @@ -9555,7 +9555,7 @@ read using the keymaps in the buffer clicked on, not the current buffer. If we're at the beginning of a key sequence, switch buffers. */ - if (WINDOWP (window) + if (WINDOW_LIVE_P (window) && BUFFERP (XWINDOW (window)->buffer) && XBUFFER (XWINDOW (window)->buffer) != current_buffer) { @@ -11249,7 +11249,7 @@ if (NILP (frame_or_window)) frame_or_window = selected_window; - if (WINDOWP (frame_or_window)) + if (WINDOW_LIVE_P (frame_or_window)) { struct window *w = decode_live_window (frame_or_window); === modified file 'src/keymap.c' --- src/keymap.c 2012-08-18 06:06:39 +0000 +++ src/keymap.c 2012-08-25 12:41:07 +0000 @@ -1559,7 +1559,7 @@ window = POSN_WINDOW (position); - if (WINDOWP (window) + if (WINDOW_LIVE_P (window) && BUFFERP (XWINDOW (window)->buffer) && XBUFFER (XWINDOW (window)->buffer) != current_buffer) { === modified file 'src/textprop.c' --- src/textprop.c 2012-08-17 21:12:11 +0000 +++ src/textprop.c 2012-08-25 13:05:53 +0000 @@ -584,7 +584,7 @@ if (NILP (object)) XSETBUFFER (object, current_buffer); - if (WINDOWP (object)) + if (WINDOW_LIVE_P (object)) { w = XWINDOW (object); object = w->buffer; === modified file 'src/w32inevt.c' --- src/w32inevt.c 2012-07-30 17:07:33 +0000 +++ src/w32inevt.c 2012-08-25 13:06:20 +0000 @@ -650,7 +650,7 @@ selected now, and the last mouse movement event was not in it. A minibuffer window will be selected iff it is active. */ - if (WINDOWP (mouse_window) + if (WINDOW_LIVE_P (mouse_window) && !EQ (mouse_window, last_mouse_window) && !EQ (mouse_window, selected_window)) { === modified file 'src/w32term.c' --- src/w32term.c 2012-08-18 01:42:52 +0000 +++ src/w32term.c 2012-08-25 13:10:02 +0000 @@ -3927,7 +3927,7 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg, struct input_event *emacs_event) { - if (! WINDOWP (bar->window)) + if (! WINDOW_LIVE_P (bar->window)) abort (); emacs_event->kind = SCROLL_BAR_CLICK_EVENT; @@ -4420,7 +4420,7 @@ selected now and last mouse movement event was not in it. Minibuffer window will be selected only when it is active. */ - if (WINDOWP (window) + if (WINDOW_LIVE_P (window) && !EQ (window, last_window) && !EQ (window, selected_window) /* For click-to-focus window managers === modified file 'src/window.c' --- src/window.c 2012-08-21 09:27:07 +0000 +++ src/window.c 2012-08-25 12:52:42 +0000 @@ -1969,7 +1969,7 @@ So don't clobber point in that buffer. */ if (! EQ (buf, XWINDOW (selected_window)->buffer) /* This line helps to fix Horsley's testbug.el bug. */ - && !(WINDOWP (BVAR (b, last_selected_window)) + && !(WINDOW_LIVE_P (BVAR (b, last_selected_window)) && w != XWINDOW (BVAR (b, last_selected_window)) && EQ (buf, XWINDOW (BVAR (b, last_selected_window))->buffer))) temp_set_point_both (b, @@ -1980,7 +1980,7 @@ marker_byte_position (w->pointm), BUF_ZV_BYTE (b))); - if (WINDOWP (BVAR (b, last_selected_window)) + if (WINDOW_LIVE_P (BVAR (b, last_selected_window)) && w == XWINDOW (BVAR (b, last_selected_window))) bset_last_selected_window (b, Qnil); } @@ -2205,7 +2205,7 @@ candidate_p = 0; else if (MINI_WINDOW_P (w) && (EQ (minibuf, Qlambda) - || (WINDOWP (minibuf) && !EQ (minibuf, window)))) + || (WINDOW_LIVE_P (minibuf) && !EQ (minibuf, window)))) { /* If MINIBUF is `lambda' don't consider any mini-windows. If it is a window, consider only that one. */ @@ -2215,7 +2215,7 @@ candidate_p = 1; else if (NILP (all_frames)) { - eassert (WINDOWP (owindow)); + eassert (WINDOW_LIVE_P (owindow)); candidate_p = EQ (w->frame, XWINDOW (owindow)->frame); } else if (EQ (all_frames, Qvisible)) @@ -2244,7 +2244,7 @@ && (FRAME_TERMINAL (XFRAME (w->frame)) == FRAME_TERMINAL (XFRAME (selected_frame))); } - else if (WINDOWP (all_frames)) + else if (WINDOW_LIVE_P (all_frames)) candidate_p = (EQ (FRAME_MINIBUF_WINDOW (f), all_frames) || EQ (XWINDOW (all_frames)->frame, w->frame) || EQ (XWINDOW (all_frames)->frame, FRAME_FOCUS_FRAME (f))); @@ -2348,7 +2348,7 @@ { if (EQ (XCAR (list), window)) { - if (WINDOWP (candidate)) + if (WINDOW_LIVE_P (candidate)) break; } else if (candidate_window_p (XCAR (list), window, minibuf, @@ -2356,7 +2356,7 @@ candidate = XCAR (list); } - if (WINDOWP (candidate)) + if (WINDOW_LIVE_P (candidate)) window = candidate; } @@ -2580,7 +2580,7 @@ or Qt otherwise. */ /* Pick a window to start with. */ - if (WINDOWP (obj)) + if (WINDOW_LIVE_P (obj)) window = obj; else if (f) window = FRAME_SELECTED_WINDOW (f); @@ -3321,7 +3321,7 @@ return Qt; } - if (WINDOWP (object)) + if (WINDOW_LIVE_P (object)) { struct window *w = XWINDOW (object); mark_window_display_accurate (object, 0); @@ -5562,7 +5562,7 @@ the current-selected-window. So we have to be careful which point of the current-buffer we copy into old_point. */ if (EQ (XWINDOW (data->current_window)->buffer, new_current_buffer) - && WINDOWP (selected_window) + && WINDOW_LIVE_P (selected_window) && EQ (XWINDOW (selected_window)->buffer, new_current_buffer) && !EQ (selected_window, data->current_window)) old_point = XMARKER (XWINDOW (data->current_window)->pointm)->charpos; @@ -6495,7 +6495,7 @@ void *user_data) { /* delete_frame may set FRAME_ROOT_WINDOW (f) to Qnil. */ - if (WINDOWP (FRAME_ROOT_WINDOW (f))) + if (WINDOW_VALID_P (FRAME_ROOT_WINDOW (f))) foreach_window_1 (XWINDOW (FRAME_ROOT_WINDOW (f)), fn, user_data); } @@ -6534,7 +6534,7 @@ freeze_window_start (struct window *w, void *freeze_p) { if (MINI_WINDOW_P (w) - || (WINDOWP (selected_window) /* Can be nil in corner cases. */ + || (WINDOW_LIVE_P (selected_window) /* Can be nil in corner cases. */ && (w == XWINDOW (selected_window) || (MINI_WINDOW_P (XWINDOW (selected_window)) && ! NILP (Vminibuf_scroll_window) === modified file 'src/xdisp.c' --- src/xdisp.c 2012-08-21 23:39:56 +0000 +++ src/xdisp.c 2012-08-25 13:16:16 +0000 @@ -2714,7 +2714,7 @@ /* Or show the region if we are in the mini-buffer and W is the window the mini-buffer refers to. */ || (MINI_WINDOW_P (XWINDOW (selected_window)) - && WINDOWP (minibuf_selected_window) + && WINDOW_LIVE_P (minibuf_selected_window) && w == XWINDOW (minibuf_selected_window)))) { ptrdiff_t markpos = marker_position (BVAR (current_buffer, mark)); @@ -10082,7 +10082,7 @@ Vdeactivate_mark = AREF (vector, 1); windows_or_buffers_changed = XFASTINT (AREF (vector, 2)); - if (WINDOWP (AREF (vector, 3))) + if (WINDOW_LIVE_P (AREF (vector, 3))) { struct window *w; Lisp_Object buffer, charpos, bytepos; @@ -10251,7 +10251,7 @@ resize_echo_area_exactly (void) { if (BUFFERP (echo_area_buffer[0]) - && WINDOWP (echo_area_window)) + && WINDOW_LIVE_P (echo_area_window)) { struct window *w = XWINDOW (echo_area_window); int resized_p; @@ -13057,7 +13057,8 @@ /* do_pending_window_change could change the selected_window due to frame resizing which makes the selected window too small. */ - if (WINDOWP (selected_window) && (w = XWINDOW (selected_window)) != sw) + if (WINDOW_LIVE_P (selected_window) + && (w = XWINDOW (selected_window)) != sw) { sw = w; reconsider_clip_changes (w, current_buffer); @@ -13336,7 +13337,7 @@ { do_pending_window_change (1); /* If selected_window changed, redisplay again. */ - if (WINDOWP (selected_window) + if (WINDOW_LIVE_P (selected_window) && (w = XWINDOW (selected_window)) != sw) goto retry; @@ -13647,7 +13648,8 @@ /* If we just did a pending size change, or have additional visible frames, or selected_window changed, redisplay again. */ if ((windows_or_buffers_changed && !pending) - || (WINDOWP (selected_window) && (w = XWINDOW (selected_window)) != sw)) + || (WINDOW_LIVE_P (selected_window) + && (w = XWINDOW (selected_window)) != sw)) goto retry; /* Clear the face and image caches. @@ -26358,7 +26360,7 @@ Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (XFRAME (w->frame)); /* Quickly resolve the easy cases. */ - if (!(WINDOWP (hlinfo->mouse_face_window) + if (!(WINDOW_LIVE_P (hlinfo->mouse_face_window) && XWINDOW (hlinfo->mouse_face_window) == w)) return 0; if (vpos < hlinfo->mouse_face_beg_row @@ -27660,7 +27662,7 @@ clear_mouse_face (hlinfo); /* Not on a window -> return. */ - if (!WINDOWP (window)) + if (!WINDOW_LIVE_P (window)) return; /* Reset help_echo_string. It will get recomputed below. */ === modified file 'src/xfaces.c' --- src/xfaces.c 2012-08-21 10:21:04 +0000 +++ src/xfaces.c 2012-08-25 13:09:58 +0000 @@ -4350,7 +4350,7 @@ matrices as invalid because they will reference faces freed above. This function is also called when a frame is destroyed. In this case, the root window of F is nil. */ - if (WINDOWP (f->root_window)) + if (WINDOW_VALID_P (f->root_window)) { clear_current_matrices (f); ++windows_or_buffers_changed; === modified file 'src/xterm.c' --- src/xterm.c 2012-08-18 01:42:52 +0000 +++ src/xterm.c 2012-08-25 13:09:51 +0000 @@ -4235,7 +4235,7 @@ if (scroll_bar_p && strcmp (action_name, end_action) == 0 - && WINDOWP (window_being_scrolled)) + && WINDOW_LIVE_P (window_being_scrolled)) { struct window *w; @@ -4512,7 +4512,7 @@ { struct scroll_bar *bar = (struct scroll_bar *) user_data; bar->dragging = Qnil; - if (WINDOWP (window_being_scrolled)) + if (WINDOW_LIVE_P (window_being_scrolled)) { x_send_scroll_bar_event (window_being_scrolled, scroll_bar_end_scroll, 0, 0); @@ -5557,7 +5557,7 @@ static void x_scroll_bar_handle_click (struct scroll_bar *bar, XEvent *event, struct input_event *emacs_event) { - if (! WINDOWP (bar->window)) + if (! WINDOW_LIVE_P (bar->window)) abort (); emacs_event->kind = SCROLL_BAR_CLICK_EVENT; @@ -6782,7 +6782,7 @@ /* Window will be selected only when it is not selected now and last mouse movement event was not in it. Minibuffer window will be selected only when it is active. */ - if (WINDOWP (window) + if (WINDOW_LIVE_P (window) && !EQ (window, last_window) && !EQ (window, selected_window) /* For click-to-focus window managers --------------030603020103090701000106--