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 21:05:35 +01:00
parent f3e8ed4d48
commit f609f4fa64
2 changed files with 54 additions and 15 deletions

View File

@ -51,11 +51,13 @@ RemoteHWInterface::RemoteHWInterface(const char* target)
fEventStream(NULL),
fCallbackLocker("callback locker")
{
fDisplayMode.virtual_width = 640;
fDisplayMode.virtual_height = 480;
fDisplayMode.space = B_RGB32;
memset(&fFallbackMode, 0, sizeof(fFallbackMode));
fFallbackMode.virtual_width = 640;
fFallbackMode.virtual_height = 480;
fFallbackMode.space = B_RGB32;
_FillDisplayModeTiming(fFallbackMode);
fCurrentMode = fClientMode = fFallbackMode;
if (sscanf(fTarget, "%" B_SCNu16, &fListenPort) != 1) {
fInitStatus = B_BAD_VALUE;
@ -265,8 +267,11 @@ RemoteHWInterface::_EventThread()
}
fIsConnected = true;
fDisplayMode.virtual_width = width;
fDisplayMode.virtual_height = height;
fClientMode.virtual_width = width;
fClientMode.virtual_height = height;
_FillDisplayModeTiming(fClientMode);
_NotifyScreenChanged();
break;
break;
}
@ -336,9 +341,10 @@ RemoteHWInterface::_Disconnect()
status_t
RemoteHWInterface::SetMode(const display_mode& mode)
{
// The display mode depends on the screen resolution of the client, we
// don't allow to change it.
return B_UNSUPPORTED;
TRACE("set mode: %" B_PRIu16 " %" B_PRIu16 "\n", mode.virtual_width,
mode.virtual_height);
fCurrentMode = mode;
return B_OK;
}
@ -348,8 +354,19 @@ RemoteHWInterface::GetMode(display_mode* mode)
if (mode == NULL || !ReadLock())
return;
*mode = fDisplayMode;
*mode = fCurrentMode;
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);
display_mode* modes = new(std::nothrow) display_mode[1];
display_mode* modes = new(std::nothrow) display_mode[2];
if (modes == NULL)
return B_NO_MEMORY;
modes[0] = fDisplayMode;
modes[0] = fFallbackMode;
modes[1] = fClientMode;
*_modes = modes;
*_count = 1;
*_count = 2;
return B_OK;
}
@ -399,6 +418,7 @@ status_t
RemoteHWInterface::GetPixelClockLimits(display_mode* mode, uint32* low,
uint32* high)
{
TRACE("get pixel clock limits unsupported\n");
return B_UNSUPPORTED;
}
@ -406,6 +426,7 @@ RemoteHWInterface::GetPixelClockLimits(display_mode* mode, uint32* low,
status_t
RemoteHWInterface::GetTimingConstraints(display_timing_constraints* constraints)
{
TRACE("get timing constraints unsupported\n");
return B_UNSUPPORTED;
}
@ -414,7 +435,9 @@ status_t
RemoteHWInterface::ProposeMode(display_mode* candidate, const display_mode* low,
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;
}
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;
}

View File

@ -36,6 +36,7 @@ virtual EventStream* CreateEventStream();
virtual status_t SetMode(const 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 GetFrameBufferConfig(
@ -103,13 +104,16 @@ static status_t _NewConnectionCallback(void *cookie,
void _Disconnect();
void _FillDisplayModeTiming(display_mode &mode);
const char* fTarget;
status_t fInitStatus;
bool fIsConnected;
uint32 fProtocolVersion;
uint32 fConnectionSpeed;
display_mode fDisplayMode;
display_mode fFallbackMode;
display_mode fCurrentMode;
display_mode fClientMode;
uint16 fListenPort;
BNetEndpoint* fListenEndpoint;