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:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user