Skip to content
This repository has been archived by the owner on Aug 31, 2021. It is now read-only.

Commit

Permalink
[[ Bug 22829 ]] Make 'working screenrect' return the safe area on iOS
Browse files Browse the repository at this point in the history
  • Loading branch information
livecodepanos committed Oct 20, 2020
1 parent d1188fb commit 45786f4
Show file tree
Hide file tree
Showing 16 changed files with 57 additions and 28 deletions.
2 changes: 1 addition & 1 deletion engine/src/desktop-dc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ uint16_t MCScreenDC::platform_getheight(void)
return t_viewport . height;
}

bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *& r_displays, uint32_t &r_count)
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *& r_displays, uint32_t &r_count, Boolean p_safe_area)
{
bool t_success;
t_success = true;
Expand Down
2 changes: 1 addition & 1 deletion engine/src/desktop-dc.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class MCScreenDC: public MCUIDC

virtual uint16_t platform_getwidth(void);
virtual uint16_t platform_getheight(void);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area = false);
virtual void platform_boundrect(MCRectangle &rect, Boolean title, Window_mode m, Boolean resizable);

virtual void resetcursors();
Expand Down
2 changes: 1 addition & 1 deletion engine/src/em-dc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ MCScreenDC::platform_getwindowgeometry(Window p_window,
* Display management
* ================================================================ */

bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count)
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area)
{
MCDisplay *t_display = nil;
if (!MCMemoryNew(t_display))
Expand Down
2 changes: 1 addition & 1 deletion engine/src/em-dc.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ class MCScreenDC: public MCUIDC

/* ---------- Display management */

virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area = false);

/* ---------- Event loop */
virtual Boolean wait(real64_t p_duration,
Expand Down
2 changes: 1 addition & 1 deletion engine/src/exec-interface2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1933,7 +1933,7 @@ void MCInterfaceSetTool(MCExecContext& ctxt, MCStringRef p_value)
void MCInterfaceGetScreenRect(MCExecContext& ctxt, bool p_working, bool p_effective, MCRectangle& r_value)
{
const MCDisplay *t_displays;
MCscreen -> getdisplays(t_displays, p_effective);
MCscreen -> getdisplays(t_displays, p_effective, true);

if (t_displays)
{
Expand Down
2 changes: 1 addition & 1 deletion engine/src/lnxdc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ bool MCScreenDC::apply_partial_struts(MCDisplay *p_displays, uint32_t p_display_
}

// IM-2014-01-29: [[ HiDPI ]] Placeholder method for Linux HiDPI support
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_display_count)
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_display_count, Boolean p_safe_area)
{
return device_getdisplays(p_effective, r_displays, r_display_count);
}
Expand Down
2 changes: 1 addition & 1 deletion engine/src/lnxdc.h
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ class MCScreenDC : public MCUIDC
// IM-2014-01-29: [[ HiDPI ]] Update device_* methods to platform-specific logical coord based methods
virtual uint16_t platform_getwidth(void);
virtual uint16_t platform_getheight(void);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area = false);
virtual bool platform_getwindowgeometry(Window w, MCRectangle &drect);
virtual void platform_boundrect(MCRectangle &rect, Boolean title, Window_mode m, Boolean resizable);
virtual void platform_querymouse(int16_t &r_x, int16_t &r_y);
Expand Down
2 changes: 1 addition & 1 deletion engine/src/mblandroiddc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ Window MCScreenDC::getroot()
}

// IM-2014-01-31: [[ HiDPI ]] Refactor to return display rects in logical coords and include pixel scale
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count)
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area)
{
bool t_success;
t_success = true;
Expand Down
2 changes: 1 addition & 1 deletion engine/src/mbldc.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ class MCScreenDC: public MCUIDC

virtual uint16_t platform_getwidth(void);
virtual uint16_t platform_getheight(void);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area = false);
virtual bool platform_displayinfocacheable(void);
virtual bool platform_getwindowgeometry(Window w, MCRectangle &drect);
virtual void platform_boundrect(MCRectangle &rect, Boolean title, Window_mode m, Boolean resizable);
Expand Down
1 change: 1 addition & 0 deletions engine/src/mbliphoneapp.h
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,7 @@ UIView *MCIPhoneGetView(void);
UIView *MCIPhoneGetRootView(void);
UIView *MCIPhoneGetDisplayView(void);
CGRect MCIPhoneGetViewBounds(void);
CGRect MCIPhoneGetWorkAreaBounds(void);
CGRect MCIPhoneGetScreenBounds(void);
void MCIPhoneActivateKeyboard(void);
void MCIPhoneDeactivateKeyboard(void);
Expand Down
44 changes: 35 additions & 9 deletions engine/src/mbliphoneapp.mm
Original file line number Diff line number Diff line change
Expand Up @@ -957,13 +957,38 @@ - (CGRect)fetchScreenBounds
CGRect t_viewport;
t_viewport = [[UIScreen mainScreen] bounds];

// MW-2014-10-02: [[ iOS 8 Support ]] iOS 8 already takes into account orientation when returning the bounds.
if (MCmajorosversion < 800 && UIInterfaceOrientationIsLandscape([self fetchOrientation]))
return CGRectMake(0.0f, 0.0f, t_viewport . size . height, t_viewport . size . width);

return t_viewport;
}

- (CGRect)fetchWorkAreaBounds
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
if (@available(iOS 11.0, *))
{
if (m_status != kMCIPhoneApplicationStatusStartup)
{
CGRect t_viewport;
t_viewport = [[UIScreen mainScreen] bounds];

UIWindow *t_window = [[UIApplication sharedApplication] windows][0];
CGFloat t_top_padding = t_window.safeAreaInsets.top;
CGFloat t_bottom_padding = t_window.safeAreaInsets.bottom;

CGFloat t_status_bar_size;
if (m_status_bar_hidden || (MCmajorosversion >= 700 && !m_status_bar_solid)|| ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && m_status_bar_style == UIStatusBarStyleBlackTranslucent))
t_status_bar_size = 0.0f;
else
t_status_bar_size = 20.0f;

return CGRectMake(0.0f, t_top_padding + t_status_bar_size, t_viewport . size . width, t_viewport . size . height - t_top_padding - t_bottom_padding - t_status_bar_size);
}
else
return self.fetchViewBounds;
}
#endif
return self.fetchViewBounds;
}

- (CGRect)fetchViewBounds
{
CGRect t_viewport;
Expand All @@ -978,11 +1003,7 @@ - (CGRect)fetchViewBounds
t_status_bar_size = 0.0f;
else
t_status_bar_size = 20.0f;

// MM-2014-09-26: [[ iOS 8 Support ]] iOS 8 already takes into account orientation when returning the bounds.
if (MCmajorosversion < 800 && UIInterfaceOrientationIsLandscape([self fetchOrientation]))
return CGRectMake(0.0f, t_status_bar_size, t_viewport . size . height, t_viewport . size . width - t_status_bar_size);


return CGRectMake(0.0f, t_status_bar_size, t_viewport . size . width, t_viewport . size . height - t_status_bar_size);
}

Expand Down Expand Up @@ -1864,6 +1885,11 @@ CGRect MCIPhoneGetViewBounds(void)
return [[MCIPhoneApplication sharedApplication] fetchViewBounds];
}

CGRect MCIPhoneGetWorkAreaBounds(void)
{
return [[MCIPhoneApplication sharedApplication] fetchWorkAreaBounds];
}

CGRect MCIPhoneGetScreenBounds(void)
{
return [[MCIPhoneApplication sharedApplication] fetchScreenBounds];
Expand Down
8 changes: 5 additions & 3 deletions engine/src/mbliphonedc.mm
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ bool MCIPhoneIsOnScriptFiber(void)
}

// IM-2014-01-30: [[ HiDPI ]] Refactor to return in logical coordinates, with addition of screen pixel scale
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count)
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area)
{
bool t_success;
t_success = true;
Expand All @@ -329,7 +329,10 @@ bool MCIPhoneIsOnScriptFiber(void)
t_displays[0].pixel_scale = MCIPhoneGetDeviceScale();

t_displays[0].viewport = MCRectangleFromCGRect(MCIPhoneGetScreenBounds());
t_displays[0].workarea = MCRectangleFromCGRect(MCIPhoneGetViewBounds());
if (p_safe_area)
t_displays[0].workarea = MCRectangleFromCGRect(MCIPhoneGetWorkAreaBounds());
else
t_displays[0].workarea = MCRectangleFromCGRect(MCIPhoneGetViewBounds());

if (p_effective)
t_displays[0].workarea.height -= s_current_keyboard_height;
Expand All @@ -345,7 +348,6 @@ bool MCIPhoneIsOnScriptFiber(void)
}
else
MCMemoryDeleteArray(t_displays);

return t_success;
}

Expand Down
6 changes: 3 additions & 3 deletions engine/src/uidc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -537,14 +537,14 @@ bool MCUIDC::s_display_info_effective = false;

// IM-2014-01-24: [[ HiDPI ]] Refactor to implement caching of display info in MCUIDC instead of subclasses
// IM-2014-01-24: [[ HiDPI ]] Change to use logical coordinates - device coordinate conversion no longer needed
uint4 MCUIDC::getdisplays(const MCDisplay *&r_displays, bool p_effective)
uint4 MCUIDC::getdisplays(const MCDisplay *&r_displays, bool p_effective, bool p_safe_area)
{
if (p_effective != s_display_info_effective || !platform_displayinfocacheable())
cleardisplayinfocache();

if (s_displays == nil)
{
/* UNCHECKED */ platform_getdisplays(p_effective, s_displays, s_display_count);
/* UNCHECKED */ platform_getdisplays(p_effective, s_displays, s_display_count, p_safe_area);
s_display_info_effective = p_effective;
}

Expand Down Expand Up @@ -584,7 +584,7 @@ bool MCUIDC::platform_displayinfocacheable(void)

//////////

bool MCUIDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count)
bool MCUIDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area)
{
return false;
}
Expand Down
4 changes: 2 additions & 2 deletions engine/src/uidc.h
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ class MCUIDC
uint2 getwidth();
uint2 getheight();

uint4 getdisplays(MCDisplay const *& p_displays, bool effective);
uint4 getdisplays(MCDisplay const *& p_displays, bool effective, bool p_safe_area = false);

// IM-2014-01-28: [[ HiDPI ]] Update the currently held display info, returning whether or not an changes have occurred
void updatedisplayinfo(bool &r_changed);
Expand Down Expand Up @@ -462,7 +462,7 @@ class MCUIDC

virtual uint16_t platform_getwidth(void);
virtual uint16_t platform_getheight(void);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area = false);
virtual bool platform_getwindowgeometry(Window w, MCRectangle &drect);
virtual void platform_boundrect(MCRectangle &rect, Boolean title, Window_mode m, Boolean resizable);
virtual void platform_querymouse(int16_t &r_x, int16_t &r_y);
Expand Down
2 changes: 1 addition & 1 deletion engine/src/w32dc.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ class MCScreenDC : public MCUIDC
// IM-2014-01-28: [[ HiDPI ]] Update device_* methods to platform-specific logical coord based methods
virtual uint16_t platform_getwidth(void);
virtual uint16_t platform_getheight(void);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count);
virtual bool platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area = false);
virtual bool platform_displayinfocacheable(void);
virtual bool platform_getwindowgeometry(Window w, MCRectangle &drect);
virtual void platform_boundrect(MCRectangle &rect, Boolean title, Window_mode m, Boolean resizable);
Expand Down
2 changes: 1 addition & 1 deletion engine/src/w32dce.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ static BOOL CALLBACK DescribeMonitorsCallback(HMONITOR p_monitor, HDC p_monitor_
}

// IM-2014-01-28: [[ HiDPI ]] Refactored to handle display info caching in MCUIDC superclass
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count)
bool MCScreenDC::platform_getdisplays(bool p_effective, MCDisplay *&r_displays, uint32_t &r_count, Boolean p_safe_area)
{
bool t_success;
t_success = true;
Expand Down

0 comments on commit 45786f4

Please sign in to comment.