Pete Ware <ware(a)cis.ohio-state.edu> writes:
Gunnar Evermann
<Gunnar.Evermann(a)nats.informatik.uni-hamburg.de> writes:
> #else
> XtDestroyWidget (w);
> + XFlush (XtDisplay(w)); /* make sure the windows are really gone! */
> #endif /* EXTERNAL_WIDGET */
XtDestroyWidget() does not actually destroy the window. As I
remember, it marks the widget (and all children) as in the process of
being destroyed and puts it on a to-be-deleted list. When the
application returns to the main loop and all pending events are
handled, then the widget is actually deleted (phase 2). Destroying
the actual window is one of the last things done in phase 2.
--pete
Didier Verna <verna(a)inf.enst.fr> writes:
Gunnar Evermann
<Gunnar.Evermann(a)nats.informatik.uni-hamburg.de> writes:
> I'm still not convinced that it is a bug in the Xlib. Is
> XtDestroyWidgent() supposed to be synchronous?
yes.
Didier, new question: what do you mean by synchronous?
OK, I'm about ready to give about! :-) Apparently this patch is also
flawed. After reading Pete's mail and rereading the man page. I
thought: Oh, so I can crash my XEmacs now if I kill a frame from a
callback. and indeed I can:
C-x 5 2 & click on the 'close'-gadget in the upper left corner...
262 kill (getpid (), fatal_error_code);
(dbx) where
[1] _kill(0x0, 0xa, 0x0, 0x0, 0x6f82227c, 0xc3bdc), at 0x6f8072e0
=>[2] fatal_error_signal(sig = 10), line 262 in "emacs.c"
---- called from signal handler with signal 10 (SIGBUS) ------
[3] CallGetValuesHook(), at 0x6fb82478
[4] CallGetValuesHook(0xb2fc00, 0x7df600, 0xefffe694, 0x1, 0x6fbc3c90, 0x6fbc3c8c), at
0x6fb82420
<snip another 75 CallGetValuesHook stackframes >
c3c8c), at 0x6fb82420
[79] CallGetValuesHook(0x7dfa00, 0x7df600, 0xefffe694, 0x1, 0x6fbc3c90, 0x6fbc3c8c), at
0x6fb82420
[80] XtGetValues(0x7df600, 0xefffe694, 0x1, 0x6fbc3c90, 0x6fbc3c8c, 0xffffffff), at
0x6fb827cc
[81] x_set_frame_text_value(f = 0xb74000, value = 0xb4e200 "[21.0 "Finnish
Landrace" XEmacs Lucid]: *scratch*", Xt_resource_name = 0x42dfe4
"title", Xt_resource_encoding_name = 0x42dfec "titleEncoding"), line
657 in "frame-x.c"
[82] x_set_title_from_bufbyte(f = 0xb74000, name = 0xb4e200 "[21.0 "Finnish
Landrace" XEmacs Lucid]: *scratch*"), line 670 in "frame-x.c"
[83] update_frame_title(f = 0xb74000), line 2972 in "frame.c"
[84] redisplay_frame(f = 0xb74000, preemption_check = 0), line 5425 in
"redisplay.c"
[85] redisplay_device(d = 0x5efe00), line 5498 in "redisplay.c"
[86] redisplay_without_hooks(), line 5614 in "redisplay.c"
[87] redisplay(), line 5682 in "redisplay.c"
[88] Fnext_event(event = 11873420, prompt = 4628484), line 2238 in
"event-stream.c"
[89] Fcommand_loop_1(), line 570 in "cmdloop.c"
<snip rest of bt>
Ah, that's why XtDestroyWidget() needs two phases...
I guess through my patch I now have triggered the second one a bit two
early. :-(
So, can somebody tell me where to Flush/Sync?
Gunnar