Subject: bug#25818: 25.2; frame moved off display does not return (OS X)

From: [email-masked] (Charles A. Roelli)
Date: Sun, 26 Feb 2017 20:42:37 +0100

On Sun, Feb 26 2017 at 05:45:40 pm, martin rudalics wrote:

>>> See also https://debbugs.gnu.org/cgi/bugreport.cgi?bug=18801.  It's
>>> possible that the problem was introduced from 24.3 to 24.4.
>>
>> I built 24.3 and 24.4 from source, and it is correct that a regression
>> with Emacs' handling of the window system in OS X happened between those
>> two releases.
>>
>> The form I suggested to show the issue,
> [...]
>> works correctly on 24.3 but not on 24.4 (24.4 has the same behavior as
>> 25.1 and 25.2, detailed in my first message).  I guess the regression
>> would be in src/nsterm.m, or maybe src/nsfns.m.
>
> So something seems to have happened that Emacs fell into the same trap
> as other applications (which, in my understanding, is that the frame
> gets displayed on another, probably non-existent, monitor).  I'm afraid
> that my only suggestion is to bisect the sources until you've found the
> culprit.
>
> (I suppose you verified that the value returned by ‘display-pixel-width’
> is the same in 24.3 and 24.4.)

No, I did not; thanks for the reminder.  In 24.3, with a second monitor
plugged in, (display-pixel-width) returns 1280, i.e. the width only of
my primary monitor.  In 24.4, in the same situation,
(display-pixel-width) returns 2330 = (+ 1280 1050).  Second monitor is
1050 pixels wide.

In both the case of 24.3 and 24.4 with no external monitor attached,
(display-pixel-width) returns 1280.

So it seems that the code for `display-pixel-width' (or code that it
calls) was changed between those releases, maybe to support multiple
monitors.

I notice now that when running the test form on 24.3, the created frame
never actually leaves the visible portion of the screen.  For example,
when the code calls (sleep-for 1) with the frame supposedly being
offscreen according to its frame parameters (right before step 2), the
frame is in reality maybe 50 pixels left of the screen's right edge.
This is with just one monitor.  When I run the example with two
monitors, the frame just spills into the second monitor but does not go
further (since 24.3 does not seem to give correct values for
`display-pixel-width' with multiple monitors).

So it seems like there used to be code in Emacs that prevented a frame
from programmatically leaving the screen area in OS X.  For example, in
24.3, if I call (modify-frame-parameters nil '((left . 10000))), the
frame is put, as above, about 50 pixels left of the screen's right edge.