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

Make 'working screenrect' to return the safe area on iOS #7455

Open
wants to merge 1 commit into
base: develop-9.6
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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
39 changes: 30 additions & 9 deletions engine/src/mbliphoneapp.mm
Original file line number Diff line number Diff line change
Expand Up @@ -957,13 +957,33 @@ - (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, *))
{
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);
}
#endif
return self.fetchViewBounds;
}

- (CGRect)fetchViewBounds
{
CGRect t_viewport;
Expand All @@ -978,11 +998,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 +1880,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
8 changes: 4 additions & 4 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)
if (s_displays == nil || p_safe_area)
{
/* 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