Question about "the screen" property of stacks...
Paul Dupuis
paul at researchware.com
Thu Jul 11 13:30:13 EDT 2019
Sorry, one more question:
I assume since 'the screen of stack' is calculated dynamically, that in
a 'on desktopChanged' handler (triggered by a monitor being removed)
that looking at 'the screen of stack' for a stack on the now-removed
monitor would give you the closest remaining monitor?
On 7/11/2019 1:08 PM, Mark Waddingham via use-livecode wrote:
> On 2019-07-11 17:17, Paul Dupuis via use-livecode wrote:
>> The screen of stack X returns the number of the monitor (the line
>> number for the screenRects) that the stack/window is on.
>
>> If someone from the mothership can verify, I would be happy to open a
>> doc bug, update the dictionary, and generate a PR for an update to the
>> screen property Dictionary entry to clarify these two points.
>
> The engine compares the content rect (not effective!) of the stack to the
> working area of each screen and takes the screen with which it shares the
> most area (the intersection of the stack's rect and the working area rect
> of the screen is a rectangle - and its the area of that which is used).
>
> If the stack's rect has no intersection with any screen working area then
> it uses the screen which has the closest center point to the window's
> center
> point (by calculating the length of the line between the two points).
>
> Ties are by display index - the primary display is always first, the rest
> are in order as given by the OS to LC.
>
> To be completely unambiguous - here is the routine the engine uses (in
> the
> case asked, the p_rectangle would be the rect of the stack being
> interrogated):
>
> const MCDisplay *MCUIDC::getnearestdisplay(const MCRectangle&
> p_rectangle)
> {
> MCDisplay const *t_displays;
> uint4 t_display_count;
> uint4 t_home;
> uint4 t_max_area, t_max_distance;
> uint4 t_max_area_index, t_max_distance_index;
>
> t_display_count = MCscreen -> getdisplays(t_displays, false);
>
> t_max_area = 0;
> t_max_distance = MAXUINT4;
> t_max_distance_index = 0;
> for(uint4 t_display = 0; t_display < t_display_count; ++t_display)
> {
> MCRectangle t_workarea;
> t_workarea = t_displays[t_display] . workarea;
>
> MCRectangle t_intersection;
> uint4 t_area, t_distance;
> t_intersection = MCU_intersect_rect(p_rectangle, t_workarea);
> t_area = t_intersection . width * t_intersection . height;
>
> uint4 t_dx, t_dy;
> t_dx = (t_workarea . x + t_workarea . width / 2) -
> (p_rectangle . x + p_rectangle . width / 2);
> t_dy = (t_workarea . y + t_workarea . height / 2) -
> (p_rectangle . y + p_rectangle . height / 2);
> t_distance = t_dx * t_dx + t_dy * t_dy;
>
> if (t_area > t_max_area)
> {
> t_max_area = t_area;
> t_max_area_index = t_display;
> }
>
> if (t_distance < t_max_distance)
> {
> t_max_distance = t_distance;
> t_max_distance_index = t_display;
> }
> }
>
> if (t_max_area == 0)
> t_home = t_max_distance_index;
> else
> t_home = t_max_area_index;
>
> return &t_displays[t_home];
> }
>
> [ And yes - I just noticed that 't_max_distance' is a misnomer - it
> should really be
> t_min_distance! ]
>
> Hope this helps!
>
> Warmest Regards,
>
> Mark.
>
> P.S. The reason it works without a stack being open is because it is
> an entirely
> 'logical' operation based on the rect of the stack not effective rect.
>
More information about the use-livecode
mailing list