From c6418981503ea9b168a9944c49ffbe3c382ea572 Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Fri, 24 Jun 2005 18:02:01 +0000 Subject: [PATCH] implemented client/server side support for BScreen::GetDeviceInfo() and WaitForRetrace(), and (only client side) support for Bscreen::ProposeMode() git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13266 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/app/ServerProtocol.h | 2 + src/kits/interface/PrivateScreen.cpp | 36 ++++++++++++++++-- src/servers/app/ServerApp.cpp | 37 +++++++++++++++++++ .../app/drawing/AccelerantHWInterface.cpp | 11 ++++++ .../app/drawing/AccelerantHWInterface.h | 1 + src/servers/app/drawing/HWInterface.h | 1 + src/servers/app/drawing/ViewHWInterface.cpp | 7 ++++ src/servers/app/drawing/ViewHWInterface.h | 1 + 8 files changed, 92 insertions(+), 4 deletions(-) diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index 907691c4ed..3debc723fa 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -130,6 +130,7 @@ enum { // Screen methods AS_SCREEN_GET_MODE, AS_SCREEN_SET_MODE, + AS_PROPOSE_MODE, AS_GET_MODE_LIST, AS_SCREEN_GET_COLORMAP, @@ -138,6 +139,7 @@ enum { AS_SET_DESKTOP_COLOR, AS_GET_RETRACE_SEMAPHORE, + AS_GET_ACCELERANT_INFO, // Global function call defs AS_SET_UI_COLORS, diff --git a/src/kits/interface/PrivateScreen.cpp b/src/kits/interface/PrivateScreen.cpp index d8ca367f40..5c9f97d001 100644 --- a/src/kits/interface/PrivateScreen.cpp +++ b/src/kits/interface/PrivateScreen.cpp @@ -261,10 +261,27 @@ BPrivateScreen::SetDesktopColor(rgb_color color, uint32 workspace, bool makeDefa status_t -BPrivateScreen::ProposeMode(display_mode *target, const display_mode *low, const display_mode *high) +BPrivateScreen::ProposeMode(display_mode *target, + const display_mode *low, const display_mode *high) { - // TODO: Implement - return B_ERROR; + // We can't return B_BAD_VALUE here, because it's used to indicate + // that the mode returned is supported, but it doesn't fall + // within the limit (see ProposeMode() documentation) + if (target == NULL || low == NULL || high == NULL) + return B_ERROR; + + BPrivate::AppServerLink link; + link.StartMessage(AS_PROPOSE_MODE); + link.Attach(ID()); + int32 reply; + status_t status = B_ERROR; + if (link.FlushWithReply(reply) == B_OK && reply == SERVER_TRUE) { + link.Read(target); + // The status is important here. See documentation + link.Read(&status); + } + + return status; } @@ -345,7 +362,18 @@ BPrivateScreen::SetMode(uint32 workspace, display_mode *mode, bool makeDefault) status_t BPrivateScreen::GetDeviceInfo(accelerant_device_info *info) { - // TODO: Implement + if (info == NULL) + return B_BAD_VALUE; + + BPrivate::AppServerLink link; + link.StartMessage(AS_GET_ACCELERANT_INFO); + link.Attach(ID()); + int32 code; + if (link.FlushWithReply(code) == B_OK && code == SERVER_TRUE) { + link.Read(info); + return B_OK; + } + return B_ERROR; } diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index ae4bf468f8..a9214ab047 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -1948,6 +1948,43 @@ status_t ret = B_ERROR; root->Unlock(); break; } + + case AS_GET_ACCELERANT_INFO: + { + STRACE(("ServerApp %s: get accelerant info\n", fSignature.String())); + + // We aren't using the screen_id for now... + screen_id id; + link.Read(&id); + + accelerant_device_info accelerantInfo; + // TODO: I wonder if there should be a "desktop" lock... + if (gDesktop->GetHWInterface()->GetDeviceInfo(&accelerantInfo) == B_OK) { + fLink.StartMessage(SERVER_TRUE); + fLink.Attach(accelerantInfo); + } else + fLink.StartMessage(SERVER_FALSE); + + fLink.Flush(); + + break; + } + + case AS_GET_RETRACE_SEMAPHORE: + { + STRACE(("ServerApp %s: get retrace semaphore\n", fSignature.String())); + + // We aren't using the screen_id for now... + screen_id id; + link.Read(&id); + + sem_id semaphore = gDesktop->GetHWInterface()->RetraceSemaphore(); + fLink.StartMessage(SERVER_TRUE); + fLink.Attach(semaphore); + fLink.Flush(); + + break; + } default: printf("ServerApp %s received unhandled message code offset %s\n", diff --git a/src/servers/app/drawing/AccelerantHWInterface.cpp b/src/servers/app/drawing/AccelerantHWInterface.cpp index 2c4b64d6f7..735ed919b5 100644 --- a/src/servers/app/drawing/AccelerantHWInterface.cpp +++ b/src/servers/app/drawing/AccelerantHWInterface.cpp @@ -558,6 +558,17 @@ AccelerantHWInterface::ProposeMode(display_mode *candidate, const display_mode * return fAccProposeDisplayMode(candidate, &this_low, &this_high); } +// RetraceSemaphore +sem_id +AccelerantHWInterface::RetraceSemaphore() +{ + accelerant_retrace_semaphore AccelerantRetraceSemaphore = (accelerant_retrace_semaphore)fAccelerantHook(B_ACCELERANT_RETRACE_SEMAPHORE, NULL); + if (!AccelerantRetraceSemaphore) + return B_UNSUPPORTED; + + return AccelerantRetraceSemaphore(); +} + // WaitForRetrace status_t AccelerantHWInterface::WaitForRetrace(bigtime_t timeout = B_INFINITE_TIMEOUT) diff --git a/src/servers/app/drawing/AccelerantHWInterface.h b/src/servers/app/drawing/AccelerantHWInterface.h index e3e6479bc6..645fc30a2d 100644 --- a/src/servers/app/drawing/AccelerantHWInterface.h +++ b/src/servers/app/drawing/AccelerantHWInterface.h @@ -42,6 +42,7 @@ virtual status_t ProposeMode(display_mode *candidate, const display_mode *low, const display_mode *high); +virtual sem_id RetraceSemaphore(); virtual status_t WaitForRetrace(bigtime_t timeout = B_INFINITE_TIMEOUT); virtual status_t SetDPMSMode(const uint32 &state); diff --git a/src/servers/app/drawing/HWInterface.h b/src/servers/app/drawing/HWInterface.h index a7805e61d5..df0bdf276f 100644 --- a/src/servers/app/drawing/HWInterface.h +++ b/src/servers/app/drawing/HWInterface.h @@ -51,6 +51,7 @@ class HWInterface : public MultiLocker { const display_mode *low, const display_mode *high) = 0; + virtual sem_id RetraceSemaphore() = 0; virtual status_t WaitForRetrace(bigtime_t timeout = B_INFINITE_TIMEOUT) = 0; virtual status_t SetDPMSMode(const uint32 &state) = 0; diff --git a/src/servers/app/drawing/ViewHWInterface.cpp b/src/servers/app/drawing/ViewHWInterface.cpp index 7308512992..89ca1d8516 100644 --- a/src/servers/app/drawing/ViewHWInterface.cpp +++ b/src/servers/app/drawing/ViewHWInterface.cpp @@ -643,6 +643,13 @@ ViewHWInterface::DPMSCapabilities() return BScreen().DPMSCapabilites(); } +// RetraceSemaphore +sem_id +ViewHWInterface::RetraceSemaphore() +{ + return -1; +} + // WaitForRetrace status_t ViewHWInterface::WaitForRetrace(bigtime_t timeout = B_INFINITE_TIMEOUT) diff --git a/src/servers/app/drawing/ViewHWInterface.h b/src/servers/app/drawing/ViewHWInterface.h index 32261b5901..d88ace4daf 100644 --- a/src/servers/app/drawing/ViewHWInterface.h +++ b/src/servers/app/drawing/ViewHWInterface.h @@ -42,6 +42,7 @@ class ViewHWInterface : public HWInterface { const display_mode *low, const display_mode *high); + virtual sem_id RetraceSemaphore(); virtual status_t WaitForRetrace(bigtime_t timeout = B_INFINITE_TIMEOUT); virtual status_t SetDPMSMode(const uint32 &state);