> On Jun 13, 2015, at 3:25 PM, Phil Rosenberg <p.d.rosenb...@gmail.com> wrote: > > Okay, well if you need any help or testing let me know. > > Something that I haven't seen up to now (but maybe I never looked hard > enough) is a spec sheet for how to write a driver, I.e. What events should a > buffer deal with and in what way. Given the effort I've just been through > with rewriting wxWidgets driver and what you are going through with the > windows driver, perhaps we should write it, and then we can refer to it and > if we wish to tidy the core-driver interface in the future it will be a > useful reference. >
Absolutely. Writing a driver should not be this hard. I think getting things documented might clear some of the problems between what we think is happening and what is really happening. > Phil > From: Jim Dishaw > Sent: 13/06/2015 19:11 > To: Phil Rosenberg > Cc: Alan W. Irwin; PLplot development list > Subject: Re: [Plplot-devel] Bug fix to plbuf.c > > >> On Jun 13, 2015, at 1:13 PM, Phil Rosenberg <p.d.rosenb...@gmail.com> wrote: >> >> Hmmm >> Then hmmmm some more >> Followed by an ummm or two. >> >> As you say Jim, clearly things are more complicated than I realised. I'm not >> sure what the requirements really are here now. Now you have brought this up >> I can imagine the issues associated with entering the message loop after an >> eop. >> >> In terms of dealing with it, I'm not at my computer right now, but I think >> probably a bop_forced function which forces a bop irrespective of where we >> are in the page cycle would work. But I'm not sure if that might have some >> potential subtle effects elsewhere so it is a bit of a hack really. Perhaps >> instead it would be better to assess what is being done in a bop and ensure >> those actions end up in the buffer so a bop event is not required. > > I think that is a good approach for reasons beyond this issue, but a BOP and > EOP of some type is still required to support the drivers adequately (e.g > double buffering, printing from the windows API). > > The solution I'm going to test is one where the driver does not enter into a > wait for input state on a redraw event from the callback. > >> Phil >> From: Jim Dishaw >> Sent: 13/06/2015 17:55 >> To: Alan W. Irwin >> Cc: PLplot development list >> Subject: Re: [Plplot-devel] Bug fix to plbuf.c >> >> >>>> On Jun 13, 2015, at 12:03 PM, Jim Dishaw <j...@dishaw.org> wrote: >>>> >>>> >>>>> On Jun 11, 2015, at 12:29 AM, Jim Dishaw <j...@dishaw.org> wrote: >>>>> >>>>> >>>>> On Jun 10, 2015, at 11:30 PM, Alan W. Irwin <ir...@beluga.phys.uvic.ca> >>>>> wrote: >>> <snip> >>>>> Just to confirm that I just now played a lot with resizing of >>>>> >>>>> examples/c/x01c -dev xwin >>>>> >>>>> for 5.10.0, 5.11.0, and git master tip (including your recent commit), >>>>> and I found no specific string issues for any of those cases. So it >>>>> appears hard (at least with this example) to demonstrate a rendering >>>>> bug due to this issue that you just fixed, but your fix seems logical >>>>> to me (now) and certainly does not introduce any bad string rendering >>>>> that I can spot. >>>>> >>>>> However, when doing those checks I did notice other resizing issues >>>>> that do need to be addressed. >>>>> >>>>> 1. As a resize is occurring (typically by dragging one edge or one >>>>> corner of the GUI to make the whole thing smaller or larger) sometimes >>>>> the displayed GUI is a scaled plot and sometimes it is black (which is >>>>> OK). But on some occasions when I stop resizing (by releasing the >>>>> mouse button) the result remains black for 5.11.0 and the master tip >>>>> version (which is not OK). But 5.10.0 is fine in this regard. So this >>>>> issue is a regression introduced into PLplot between 5.10.0 and 5.11.0 >>>>> and probably due to the flurry of changes you and Phil made in plbuf >>>>> before we released 5.11.0. >>>> >>>>> >>>>> Please verify the good result for 5.10.0 and bad result for 5.11.0, >>>>> git bisect to figure out what commit has caused the issue, and then >>>>> make the appropriate plbuf fix to get rid of this regression. >>>> >>>> I think this problem is the plP_eop() that was inserted in the >>>> plRemakePlot() to make sure the BOP would perform as expected. For the >>>> GUI drivers this will trigger another wait for input, which ends up >>>> blocking redraw messages. I will verify by using git bisect. >>> >>> I ran git bisect and the regression was introduced in the commit >>> 1e402417c1f3e87c391fe428f936153c2a10e8cc >>> >>> Author: Phil Rosenberg <p.d.rosenb...@gmail.com> >>> Date: Fri Feb 27 17:12:03 2015 +0000 >>> >>> Fixed bug in rdbuf_di. >>> >>> Save cursubpage on replot >>> call plP_eop() on replot which ensures that the first plP_bop() call >>> actually does something. >>> >>> If I comment out the plP_eop() that was added to plbuf.c in that commit, >>> the xwin driver does not exhibit the problematic behavior. I will >>> investigate further on working on a patch. I know why it is causing a >>> problem, but it isn’t obvious to me how it gets to that point. >> >> I found the cause of the problem and the plP_eop() is not acting in a way >> that neither Phil nor I expected. Phil put the plP_eop() in to make sure >> that the BOP will do something and I thought that will always to lead to the >> keypress bug. In reality the plP_eop() does something only half the time. >> >> 1) Plot starts >> 2) At BOP, the page_status is set to AT_BOP >> 3) While drawing, the page_status is set to DRAWING >> 4) At EOP, the page_status is set to AT_EOP (the EOP is not put into the >> buffer) >> 5) The driver enters into a loop waiting for messages >> 6) Driver receives a resize message >> 7) plRemakePlot is called >> 8) plRemakPlot() calls plP_eop() >> 9) plP_eop() does nothing because it exits immediately because the >> page_status is AT_EOP >> 10) The plot buffer is replayed >> 11) At BOP, the page_status is set to AT_BOP >> 12) While drawing, the page_status is set to DRAWING >> 13) No EOP is generated because it is not in the buffer, thus the >> page_status is unchanged >> 14) Control returns the message loop >> 15) Another resize message is received >> 16) plRemakePlot is called >> 17) plRemakePlot() calls plP_eop() >> 18) plP_eop() does not exit immediately this time because page_state is >> DRAWING >> 19) plP_eop() calls the driver EOP handler >> 20) The driver enters into a new loop waiting for messages >> 21) User has to do an action (e.g. keypress) to exit the new message loop. >> This blocks many messages because the windowing system still considers the >> window to be processing a resize. >> 22) Once the new message loop exits, the driver EOP handler exits. >> 23) Goto step 10. >> >> Just putting the EOP into the plot buffer won’t fix the problem because a >> new message loop will be called, which will block messages. >> >> I agree with Phil’s point about the need to call plP_eop(). Some drivers >> may need the EOP handler to work correctly (e.g. double buffering). The way >> the code is structured, the plP_eop() is only doing something 50% of the >> time. >> >> I’m not sure the best way to fix this. I think the interactive GUI drivers >> might need to be modified to check if they are already waiting. One thing >> that makes this tricky is the strip chart function. As it is currently >> written, it does not generate an EOP until the end. Thus, it cannot be >> resized while plotting. Plus, when resized, the entire strip chart is >> replayed (though I see Phil has made some commits so wxWidgets might be >> smarter). >> >> I’m going to experiment on some different approaches and see what works best. >>
------------------------------------------------------------------------------
_______________________________________________ Plplot-devel mailing list Plplot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/plplot-devel