RemoteHWInterface: Use screen change listener to update mode.

This allows dynamic reconfiguration of the size of the virtual desktop
to the dimensions desired by the client.
This commit is contained in:
Michael Lotz
2017-11-21 22:18:17 +01:00
parent f3e8ed4d48
commit f609f4fa64
2 changed files with 54 additions and 15 deletions
@@ -51,11 +51,13 @@ RemoteHWInterface::RemoteHWInterface(const char* target)
fEventStream(NULL), fEventStream(NULL),
fCallbackLocker("callback locker") fCallbackLocker("callback locker")
{ {
fDisplayMode.virtual_width = 640; memset(&fFallbackMode, 0, sizeof(fFallbackMode));
fDisplayMode.virtual_height = 480; fFallbackMode.virtual_width = 640;
fDisplayMode.space = B_RGB32; fFallbackMode.virtual_height = 480;
fFallbackMode.space = B_RGB32;
_FillDisplayModeTiming(fFallbackMode);
fCurrentMode = fClientMode = fFallbackMode;
if (sscanf(fTarget, "%" B_SCNu16, &fListenPort) != 1) { if (sscanf(fTarget, "%" B_SCNu16, &fListenPort) != 1) {
fInitStatus = B_BAD_VALUE; fInitStatus = B_BAD_VALUE;
@@ -265,8 +267,11 @@ RemoteHWInterface::_EventThread()
} }
fIsConnected = true; fIsConnected = true;
fDisplayMode.virtual_width = width; fClientMode.virtual_width = width;
fDisplayMode.virtual_height = height; fClientMode.virtual_height = height;
_FillDisplayModeTiming(fClientMode);
_NotifyScreenChanged();
break;
break; break;
} }
@@ -336,9 +341,10 @@ RemoteHWInterface::_Disconnect()
status_t status_t
RemoteHWInterface::SetMode(const display_mode& mode) RemoteHWInterface::SetMode(const display_mode& mode)
{ {
// The display mode depends on the screen resolution of the client, we TRACE("set mode: %" B_PRIu16 " %" B_PRIu16 "\n", mode.virtual_width,
// don't allow to change it. mode.virtual_height);
return B_UNSUPPORTED; fCurrentMode = mode;
return B_OK;
} }
@@ -348,8 +354,19 @@ RemoteHWInterface::GetMode(display_mode* mode)
if (mode == NULL || !ReadLock()) if (mode == NULL || !ReadLock())
return; return;
*mode = fDisplayMode; *mode = fCurrentMode;
ReadUnlock(); ReadUnlock();
TRACE("get mode: %" B_PRIu16 " %" B_PRIu16 "\n", mode->virtual_width,
mode->virtual_height);
}
status_t
RemoteHWInterface::GetPreferredMode(display_mode* mode)
{
*mode = fClientMode;
return B_OK;
} }
@@ -384,13 +401,15 @@ RemoteHWInterface::GetModeList(display_mode** _modes, uint32* _count)
{ {
AutoReadLocker _(this); AutoReadLocker _(this);
display_mode* modes = new(std::nothrow) display_mode[1]; display_mode* modes = new(std::nothrow) display_mode[2];
if (modes == NULL) if (modes == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
modes[0] = fDisplayMode; modes[0] = fFallbackMode;
modes[1] = fClientMode;
*_modes = modes; *_modes = modes;
*_count = 1; *_count = 2;
return B_OK; return B_OK;
} }
@@ -399,6 +418,7 @@ status_t
RemoteHWInterface::GetPixelClockLimits(display_mode* mode, uint32* low, RemoteHWInterface::GetPixelClockLimits(display_mode* mode, uint32* low,
uint32* high) uint32* high)
{ {
TRACE("get pixel clock limits unsupported\n");
return B_UNSUPPORTED; return B_UNSUPPORTED;
} }
@@ -406,6 +426,7 @@ RemoteHWInterface::GetPixelClockLimits(display_mode* mode, uint32* low,
status_t status_t
RemoteHWInterface::GetTimingConstraints(display_timing_constraints* constraints) RemoteHWInterface::GetTimingConstraints(display_timing_constraints* constraints)
{ {
TRACE("get timing constraints unsupported\n");
return B_UNSUPPORTED; return B_UNSUPPORTED;
} }
@@ -414,7 +435,9 @@ status_t
RemoteHWInterface::ProposeMode(display_mode* candidate, const display_mode* low, RemoteHWInterface::ProposeMode(display_mode* candidate, const display_mode* low,
const display_mode* high) const display_mode* high)
{ {
return B_UNSUPPORTED; TRACE("propose mode: %" B_PRIu16 " %" B_PRIu16 "\n",
candidate->virtual_width, candidate->virtual_height);
return B_OK;
} }
@@ -555,3 +578,15 @@ RemoteHWInterface::CopyBackToFront(const BRect& frame)
{ {
return B_OK; return B_OK;
} }
void
RemoteHWInterface::_FillDisplayModeTiming(display_mode &mode)
{
mode.timing.pixel_clock
= (uint64_t)mode.virtual_width * mode.virtual_height * 60 / 1000;
mode.timing.h_display = mode.timing.h_sync_start = mode.timing.h_sync_end
= mode.timing.h_total = mode.virtual_width;
mode.timing.v_display = mode.timing.v_sync_start = mode.timing.v_sync_end
= mode.timing.v_total = mode.virtual_height;
}
@@ -36,6 +36,7 @@ virtual EventStream* CreateEventStream();
virtual status_t SetMode(const display_mode& mode); virtual status_t SetMode(const display_mode& mode);
virtual void GetMode(display_mode* mode); virtual void GetMode(display_mode* mode);
virtual status_t GetPreferredMode(display_mode* mode);
virtual status_t GetDeviceInfo(accelerant_device_info* info); virtual status_t GetDeviceInfo(accelerant_device_info* info);
virtual status_t GetFrameBufferConfig( virtual status_t GetFrameBufferConfig(
@@ -103,13 +104,16 @@ static status_t _NewConnectionCallback(void *cookie,
void _Disconnect(); void _Disconnect();
void _FillDisplayModeTiming(display_mode &mode);
const char* fTarget; const char* fTarget;
status_t fInitStatus; status_t fInitStatus;
bool fIsConnected; bool fIsConnected;
uint32 fProtocolVersion; uint32 fProtocolVersion;
uint32 fConnectionSpeed; uint32 fConnectionSpeed;
display_mode fDisplayMode; display_mode fFallbackMode;
display_mode fCurrentMode;
display_mode fClientMode;
uint16 fListenPort; uint16 fListenPort;
BNetEndpoint* fListenEndpoint; BNetEndpoint* fListenEndpoint;