Hi, I'm in the middle of several tasks here. I'll get back to this soon. Thanks for sending the suggestion.
Best, Scuri Em qui, 27 de jun de 2019 às 09:12, Simon Orde < [email protected]> escreveu: > I downloaded the source code for IUP 3.26 and 3.27 from SourceForge to see > if I could work out what was going wrong. I haven’t been able to work out > why sometimes IUP scripts cause the application to close – even, in some > cases, if it’s not running under a Lua debugger. But I have spotted some > behaviour that looks clearly wrong to me, which I believe can be easily > fixed, and which if fixed should solve the problem. In both 3.2.6 and > 3.2.7 there is one and only call to PostQuitMessage and only one place > where the WM_QUIT message is mentioned (and for that matter, only one place > where ‘GetMessage’ is called), and it’s in the file iupwin_loop.c. The > 3.2.6 and 3.2.7 versions of this file are identical. > > > > I believe that the following 3 small changes would fix the problem: > > > > (1) Insert this line to the top of iupwin_loop.c (at say line 26): “static > UINT win_quit_msg_id = 0;” > > (2) The IupExitLoop function currently looks like this: > > > > void IupExitLoop(void) > > { > > char* exit_loop = IupGetGlobal("EXITLOOP"); > > if (win_main_loop > 1 || !exit_loop || iupStrBoolean(exit_loop)) > > PostQuitMessage(0); > > } > > > > … and should be changed to this: > > > > void IupExitLoop(void) > > { > > if (win_quit_msg_id == 0) > > win_quit_msg_id = ::RegisterWindowMessage("IUP Quit Message"); > > > > char* exit_loop = IupGetGlobal("EXITLOOP"); > > if (win_main_loop > 1 || !exit_loop || iupStrBoolean(exit_loop)) > > PostMessage(NULL, win_quit_msg_id, 0, 0L); > > } > > > > > > (3) The winLoopProcessMessage function currently looks like this: > > > > static int winLoopProcessMessage(MSG* msg) > > { > > if (msg->message == WM_QUIT) /* IUP_CLOSE returned in a callback or > IupHide in a popup dialog or all dialogs closed */ > > return IUP_CLOSE; > > else > > { > > TranslateMessage(msg); > > DispatchMessage(msg); > > return IUP_DEFAULT; > > } > > } > > > > … and should be changed to this: > > > > static int winLoopProcessMessage(MSG* msg) > > { > > if (win_quit_msg_id == 0) > > { > > win_quit_msg_id = ::RegisterWindowMessage("IUP Quit Message"); > > if (win_quit_msg_id == 0) > > return IUP_CLOSE; > > } > > > > if (msg->message == win_quit_msg_id) /* IUP_CLOSE returned in a > callback or IupHide in a popup dialog or all dialogs closed */ > > return IUP_CLOSE; > > else > > { > > TranslateMessage(msg); > > DispatchMessage(msg); > > return IUP_DEFAULT; > > } > > } > > > > > > That’s it – except that there are a couple of comments in the same file /* > WM_QUIT */ that can simply be removed. The code in each case is fine as it > is and does not need to be changed. Probably you should define “IUP Quit > Message” (or whatever your preferred string is) as a constant string at the > top of the file, for greater robustness. > > > > Theoretically you could use WM_USER + ? as the message id, but it’s more > robust to use a registered message. That way you can be 100% sure that > there won’t be a conflict with any application-defined messages, which > there could be if you took the WM_USER approach. > > > > The Windows documentation says that the PostQuitMessage function > “Indicates to the system that a thread has made a request to terminate > (quit)”. That is clearly not the case here, so PostQuitMessage should not > be used. > > > > Any thoughts anyone? Scuri? > > > > Simon > > > > > > > *From:* Antonio Scuri [mailto:[email protected]] > *Sent:* 24 June 2019 6:27 PM > *To:* IUP discussion list. > *Subject:* Re: [Iup-users] FW: IUP crash in Debug Mode > > > > > Is there any way I can stop it doing that? > > > > No > > > > > Has IUP always posted WM_QUIT messages? > > > > I think Yes > > > > > I wasn’t clear from your reply what you think needs to be done. > > > > Actually neither I... > > > > > From my point-of-view, I don’t want IUP to ever close down my > application in any circumstances. > > > > Yes, it wasn't meant to do that. When you are showing an IUP dialog the > iup.MainLoop will hold the execution until a WM_QUIT message is posted. The > same happens when iup.Popup is called, but in this case there is a > secondary message loop, when the quit message is posted it returns to the > mainloop. The idea, and it works when not debugging, is that IUP receive > the quit message, and returns the control to the application just like a > secondary message loop. > > > > The problem is that your application loop is intercepting our quit > message in debug, apparently because of the message pump process. Notice > that IUP has its own way to message pump by using IupLoopStep. We use that > to implement the Lua debugger in the IupLuaScripterDlg predefined dialog. > > > > To be more specific and not being, I think something in the message pump > should be changed, but I'm not sure what. > > > > Best, > > Scuri > > > > > _______________________________________________ > Iup-users mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/iup-users >
_______________________________________________ Iup-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/iup-users
