Skip to content

Commit 64a0c06

Browse files
committed
Fix tooltips by reverting the entire transparency code to that of 132
Not the best workaround, but I'm not exactly smart.
1 parent 3a717e5 commit 64a0c06

19 files changed

+321
-180
lines changed

gfx/webrender_bindings/RenderCompositor.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ void RenderCompositor::GetWindowVisibility(WindowVisibility* aVisibility) {
247247
if (!widget) {
248248
return;
249249
}
250+
aVisibility->size_mode = ToWrWindowSizeMode(widget->GetWindowSizeMode());
250251
aVisibility->is_fully_occluded = widget->GetWindowIsFullyOccluded();
251252
#endif
252253
}

gfx/webrender_bindings/WebRenderTypes.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,22 @@ static inline wr::SyntheticItalics DegreesToSyntheticItalics(float aDegrees) {
887887
return synthetic_italics;
888888
}
889889

890+
static inline wr::WindowSizeMode ToWrWindowSizeMode(nsSizeMode aSizeMode) {
891+
switch (aSizeMode) {
892+
case nsSizeMode_Normal:
893+
return wr::WindowSizeMode::Normal;
894+
case nsSizeMode_Minimized:
895+
return wr::WindowSizeMode::Minimized;
896+
case nsSizeMode_Maximized:
897+
return wr::WindowSizeMode::Maximized;
898+
case nsSizeMode_Fullscreen:
899+
return wr::WindowSizeMode::Fullscreen;
900+
default:
901+
MOZ_ASSERT_UNREACHABLE("Tried to convert invalid size mode.");
902+
return wr::WindowSizeMode::Invalid;
903+
}
904+
}
905+
890906
static inline wr::APZScrollGeneration ToWrAPZScrollGeneration(
891907
const mozilla::APZScrollGeneration& aGeneration) {
892908
return wr::APZScrollGeneration(aGeneration.Raw());

gfx/wr/webrender/src/composite.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,15 +1112,27 @@ impl Default for CompositorCapabilities {
11121112
}
11131113
}
11141114

1115+
#[repr(C)]
1116+
#[derive(Copy, Clone, Debug)]
1117+
pub enum WindowSizeMode {
1118+
Normal,
1119+
Minimized,
1120+
Maximized,
1121+
Fullscreen,
1122+
Invalid,
1123+
}
1124+
11151125
#[repr(C)]
11161126
#[derive(Copy, Clone, Debug)]
11171127
pub struct WindowVisibility {
1128+
pub size_mode: WindowSizeMode,
11181129
pub is_fully_occluded: bool,
11191130
}
11201131

11211132
impl Default for WindowVisibility {
11221133
fn default() -> Self {
11231134
WindowVisibility {
1135+
size_mode: WindowSizeMode::Normal,
11241136
is_fully_occluded: false,
11251137
}
11261138
}

widget/windows/CompositorWidgetChild.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ CompositorWidgetChild::CompositorWidgetChild(
2020
RefPtr<CompositorVsyncDispatcher> aVsyncDispatcher,
2121
RefPtr<CompositorWidgetVsyncObserver> aVsyncObserver,
2222
const CompositorWidgetInitData& aInitData)
23-
: mVsyncDispatcher(std::move(aVsyncDispatcher)),
24-
mVsyncObserver(std::move(aVsyncObserver)),
23+
: mVsyncDispatcher(aVsyncDispatcher),
24+
mVsyncObserver(aVsyncObserver),
2525
mCompositorWnd(nullptr),
2626
mWnd(reinterpret_cast<HWND>(
27-
aInitData.get_WinCompositorWidgetInitData().hWnd())) {
27+
aInitData.get_WinCompositorWidgetInitData().hWnd())),
28+
mTransparencyMode(
29+
aInitData.get_WinCompositorWidgetInitData().transparencyMode()),
30+
mRemoteBackbufferProvider() {
2831
MOZ_ASSERT(XRE_IsParentProcess());
2932
MOZ_ASSERT(!gfxPlatform::IsHeadless());
3033
MOZ_ASSERT(mWnd && ::IsWindow(mWnd));
@@ -34,7 +37,8 @@ CompositorWidgetChild::~CompositorWidgetChild() {}
3437

3538
bool CompositorWidgetChild::Initialize() {
3639
mRemoteBackbufferProvider = std::make_unique<remote_backbuffer::Provider>();
37-
if (!mRemoteBackbufferProvider->Initialize(mWnd, OtherPid())) {
40+
if (!mRemoteBackbufferProvider->Initialize(mWnd, OtherPid(),
41+
mTransparencyMode)) {
3842
return false;
3943
}
4044

@@ -62,8 +66,17 @@ bool CompositorWidgetChild::OnWindowResize(const LayoutDeviceIntSize& aSize) {
6266
return true;
6367
}
6468

65-
void CompositorWidgetChild::NotifyVisibilityUpdated(bool aIsFullyOccluded) {
66-
Unused << SendNotifyVisibilityUpdated(aIsFullyOccluded);
69+
void CompositorWidgetChild::OnWindowModeChange(nsSizeMode aSizeMode) {}
70+
71+
void CompositorWidgetChild::UpdateTransparency(TransparencyMode aMode) {
72+
mTransparencyMode = aMode;
73+
mRemoteBackbufferProvider->UpdateTransparencyMode(aMode);
74+
Unused << SendUpdateTransparency(aMode);
75+
}
76+
77+
void CompositorWidgetChild::NotifyVisibilityUpdated(nsSizeMode aSizeMode,
78+
bool aIsFullyOccluded) {
79+
Unused << SendNotifyVisibilityUpdated(aSizeMode, aIsFullyOccluded);
6780
};
6881

6982
void CompositorWidgetChild::ClearTransparentWindow() {

widget/windows/CompositorWidgetChild.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ class CompositorWidgetChild final : public PCompositorWidgetChild,
3333
void LeavePresentLock() override;
3434
void OnDestroyWindow() override;
3535
bool OnWindowResize(const LayoutDeviceIntSize& aSize) override;
36-
void NotifyVisibilityUpdated(bool aIsFullyOccluded) override;
37-
38-
void UpdateTransparency(TransparencyMode) override {}
36+
void OnWindowModeChange(nsSizeMode aSizeMode) override;
37+
void UpdateTransparency(TransparencyMode aMode) override;
38+
void NotifyVisibilityUpdated(nsSizeMode aSizeMode,
39+
bool aIsFullyOccluded) override;
3940
void ClearTransparentWindow() override;
4041

4142
mozilla::ipc::IPCResult RecvObserveVsync() override;
@@ -50,6 +51,7 @@ class CompositorWidgetChild final : public PCompositorWidgetChild,
5051
HWND mCompositorWnd;
5152

5253
HWND mWnd;
54+
TransparencyMode mTransparencyMode;
5355

5456
std::unique_ptr<remote_backbuffer::Provider> mRemoteBackbufferProvider;
5557
};

widget/windows/CompositorWidgetParent.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,25 @@ CompositorWidgetParent::CompositorWidgetParent(
3434
aOptions),
3535
mWnd(reinterpret_cast<HWND>(
3636
aInitData.get_WinCompositorWidgetInitData().hWnd())),
37-
mIsFullyOccluded(false) {
37+
mTransparencyMode(uint32_t(
38+
aInitData.get_WinCompositorWidgetInitData().transparencyMode())),
39+
mSizeMode(nsSizeMode_Normal),
40+
mIsFullyOccluded(false),
41+
mRemoteBackbufferClient() {
3842
MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_GPU);
3943
MOZ_ASSERT(mWnd && ::IsWindow(mWnd));
4044
}
4145

42-
CompositorWidgetParent::~CompositorWidgetParent() = default;
46+
CompositorWidgetParent::~CompositorWidgetParent() {}
4347

4448
bool CompositorWidgetParent::Initialize(
4549
const RemoteBackbufferHandles& aRemoteHandles) {
4650
mRemoteBackbufferClient = std::make_unique<remote_backbuffer::Client>();
47-
return mRemoteBackbufferClient->Initialize(aRemoteHandles);
51+
if (!mRemoteBackbufferClient->Initialize(aRemoteHandles)) {
52+
return false;
53+
}
54+
55+
return true;
4856
}
4957

5058
bool CompositorWidgetParent::PreRender(WidgetRenderingContext* aContext) {
@@ -134,12 +142,23 @@ mozilla::ipc::IPCResult CompositorWidgetParent::RecvLeavePresentLock() {
134142
return IPC_OK();
135143
}
136144

145+
mozilla::ipc::IPCResult CompositorWidgetParent::RecvUpdateTransparency(
146+
const TransparencyMode& aMode) {
147+
mTransparencyMode = uint32_t(aMode);
148+
return IPC_OK();
149+
}
150+
137151
mozilla::ipc::IPCResult CompositorWidgetParent::RecvNotifyVisibilityUpdated(
138-
const bool& aIsFullyOccluded) {
152+
const nsSizeMode& aSizeMode, const bool& aIsFullyOccluded) {
153+
mSizeMode = aSizeMode;
139154
mIsFullyOccluded = aIsFullyOccluded;
140155
return IPC_OK();
141156
}
142157

158+
nsSizeMode CompositorWidgetParent::GetWindowSizeMode() const {
159+
return mSizeMode;
160+
}
161+
143162
bool CompositorWidgetParent::GetWindowIsFullyOccluded() const {
144163
return mIsFullyOccluded;
145164
}

widget/windows/CompositorWidgetParent.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,17 @@ class CompositorWidgetParent final : public PCompositorWidgetParent,
4747

4848
bool HasGlass() const override;
4949

50-
//nsSizeMode GetWindowSizeMode() const override;
50+
nsSizeMode GetWindowSizeMode() const override;
5151
bool GetWindowIsFullyOccluded() const override;
5252

5353
mozilla::ipc::IPCResult RecvInitialize(
5454
const RemoteBackbufferHandles& aRemoteHandles) override;
5555
mozilla::ipc::IPCResult RecvEnterPresentLock() override;
5656
mozilla::ipc::IPCResult RecvLeavePresentLock() override;
57+
mozilla::ipc::IPCResult RecvUpdateTransparency(
58+
const TransparencyMode& aMode) override;
5759
mozilla::ipc::IPCResult RecvNotifyVisibilityUpdated(
58-
const bool& aIsFullyOccluded) override;
60+
const nsSizeMode& aSizeMode, const bool& aIsFullyOccluded) override;
5961
mozilla::ipc::IPCResult RecvClearTransparentWindow() override;
6062
void ActorDestroy(ActorDestroyReason aWhy) override;
6163

widget/windows/InProcessWinCompositorWidget.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ bool InProcessWinCompositorWidget::OnWindowResize(
7777
return true;
7878
}
7979

80+
void InProcessWinCompositorWidget::OnWindowModeChange(nsSizeMode aSizeMode) {}
81+
8082
bool InProcessWinCompositorWidget::PreRender(WidgetRenderingContext* aContext) {
8183
// This can block waiting for WM_SETTEXT to finish
8284
// Using PreRender is unnecessarily pessimistic because
@@ -275,10 +277,16 @@ void InProcessWinCompositorWidget::UpdateTransparency(TransparencyMode aMode) {
275277
}
276278

277279
void InProcessWinCompositorWidget::NotifyVisibilityUpdated(
278-
bool aIsFullyOccluded) {
280+
nsSizeMode aSizeMode, bool aIsFullyOccluded) {
281+
mSizeMode = aSizeMode;
279282
mIsFullyOccluded = aIsFullyOccluded;
280283
}
281284

285+
nsSizeMode InProcessWinCompositorWidget::GetWindowSizeMode() const {
286+
nsSizeMode sizeMode = mSizeMode;
287+
return sizeMode;
288+
}
289+
282290
bool InProcessWinCompositorWidget::GetWindowIsFullyOccluded() const {
283291
bool isFullyOccluded = mIsFullyOccluded;
284292
return isFullyOccluded;

widget/windows/InProcessWinCompositorWidget.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ class InProcessWinCompositorWidget final
4545
void LeavePresentLock() override;
4646
void OnDestroyWindow() override;
4747
bool OnWindowResize(const LayoutDeviceIntSize& aSize) override;
48+
void OnWindowModeChange(nsSizeMode aSizeMode) override;
4849
void UpdateTransparency(TransparencyMode aMode) override;
49-
void NotifyVisibilityUpdated(bool aIsFullyOccluded) override;
50+
void NotifyVisibilityUpdated(nsSizeMode aSizeMode,
51+
bool aIsFullyOccluded) override;
5052
void ClearTransparentWindow() override;
5153

5254
bool RedrawTransparentWindow();
@@ -62,7 +64,7 @@ class InProcessWinCompositorWidget final
6264

6365
bool HasGlass() const override;
6466

65-
//nsSizeMode GetWindowSizeMode() const override;
67+
nsSizeMode GetWindowSizeMode() const override;
6668
bool GetWindowIsFullyOccluded() const override;
6769

6870
void ObserveVsync(VsyncObserver* aObserver) override;
@@ -93,6 +95,7 @@ class InProcessWinCompositorWidget final
9395
}
9496

9597
// Visibility handling.
98+
mozilla::Atomic<nsSizeMode, MemoryOrdering::Relaxed> mSizeMode;
9699
mozilla::Atomic<bool, MemoryOrdering::Relaxed> mIsFullyOccluded;
97100

98101
RefPtr<gfxASurface> mTransparentSurface;

widget/windows/PCompositorWidget.ipdl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ parent:
3333

3434
sync EnterPresentLock();
3535
sync LeavePresentLock();
36-
async NotifyVisibilityUpdated(bool aIsFullyOccluded);
36+
async UpdateTransparency(TransparencyMode aMode);
37+
async NotifyVisibilityUpdated(nsSizeMode aSizeMode, bool aIsFullyOccluded);
3738
sync ClearTransparentWindow();
3839
async __delete__();
3940

widget/windows/PlatformWidgetTypes.ipdlh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct WinCompositorWidgetInitData
2121
WindowsHandle hWnd;
2222
uintptr_t widgetKey;
2323
TransparencyMode transparencyMode;
24+
nsSizeMode sizeMode;
2425
};
2526

2627
union CompositorWidgetInitData

widget/windows/RemoteBackbuffer.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,15 @@ class PresentableSharedImage {
253253
return true;
254254
}
255255

256-
bool PresentToWindow(HWND aWindowHandle,
256+
bool PresentToWindow(HWND aWindowHandle, TransparencyMode aTransparencyMode,
257257
Span<const IpcSafeRect> aDirtyRects) {
258-
if (::GetWindowLongPtrW(aWindowHandle, GWL_EXSTYLE) & WS_EX_LAYERED) {
258+
if (aTransparencyMode == TransparencyMode::Transparent) {
259+
// If our window is a child window or a child-of-a-child, the window
260+
// that needs to be updated is the top level ancestor of the tree
261+
HWND topLevelWindow = WinUtils::GetTopLevelHWND(aWindowHandle, true);
262+
MOZ_ASSERT(::GetWindowLongPtr(topLevelWindow, GWL_EXSTYLE) &
263+
WS_EX_LAYERED);
264+
259265
BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
260266
POINT srcPos = {0, 0};
261267
RECT clientRect = {};
@@ -281,7 +287,7 @@ class PresentableSharedImage {
281287
}
282288

283289
return !!::UpdateLayeredWindow(
284-
aWindowHandle, nullptr /*paletteDC*/, nullptr /*newPos*/, &winSize,
290+
topLevelWindow, nullptr /*paletteDC*/, nullptr /*newPos*/, &winSize,
285291
mDeviceContext, &srcPos, 0 /*colorKey*/, &bf, ULW_ALPHA);
286292
}
287293

@@ -382,7 +388,8 @@ Provider::~Provider() {
382388
}
383389
}
384390

385-
bool Provider::Initialize(HWND aWindowHandle, DWORD aTargetProcessId) {
391+
bool Provider::Initialize(HWND aWindowHandle, DWORD aTargetProcessId,
392+
TransparencyMode aTransparencyMode) {
386393
MOZ_ASSERT(aWindowHandle);
387394
MOZ_ASSERT(aTargetProcessId);
388395

@@ -434,7 +441,13 @@ bool Provider::Initialize(HWND aWindowHandle, DWORD aTargetProcessId) {
434441
PR_USER_THREAD, [](void* p) { static_cast<Provider*>(p)->ThreadMain(); },
435442
this, PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_JOINABLE_THREAD,
436443
0 /*default stack size*/);
437-
return !!mServiceThread;
444+
if (!mServiceThread) {
445+
return false;
446+
}
447+
448+
mTransparencyMode = uint32_t(aTransparencyMode);
449+
450+
return true;
438451
}
439452

440453
Maybe<RemoteBackbufferHandles> Provider::CreateRemoteHandles() {
@@ -444,6 +457,10 @@ Maybe<RemoteBackbufferHandles> Provider::CreateRemoteHandles() {
444457
ipc::FileDescriptor(mResponseReadyEvent)));
445458
}
446459

460+
void Provider::UpdateTransparencyMode(TransparencyMode aTransparencyMode) {
461+
mTransparencyMode = uint32_t(aTransparencyMode);
462+
}
463+
447464
void Provider::ThreadMain() {
448465
AUTO_PROFILER_REGISTER_THREAD("RemoteBackbuffer");
449466
NS_SetCurrentThreadName("RemoteBackbuffer");
@@ -558,7 +575,8 @@ void Provider::HandlePresentRequest(const PresentRequestData& aRequestData,
558575
}
559576

560577
if (!mBackbuffer->PresentToWindow(
561-
mWindowHandle, rectSpan.First(aRequestData.lenDirtyRects))) {
578+
mWindowHandle, GetTransparencyMode(),
579+
rectSpan.First(aRequestData.lenDirtyRects))) {
562580
return;
563581
}
564582

widget/windows/RemoteBackbuffer.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ class Provider {
3030
Provider();
3131
~Provider();
3232

33-
bool Initialize(HWND aWindowHandle, DWORD aTargetProcessId);
33+
bool Initialize(HWND aWindowHandle, DWORD aTargetProcessId,
34+
TransparencyMode aTransparencyMode);
3435

3536
Maybe<RemoteBackbufferHandles> CreateRemoteHandles();
3637

38+
void UpdateTransparencyMode(TransparencyMode aTransparencyMode);
39+
3740
Provider(const Provider&) = delete;
3841
Provider(Provider&&) = delete;
3942
Provider& operator=(const Provider&) = delete;
@@ -56,6 +59,10 @@ class Provider {
5659
bool mStopServiceThread;
5760
PRThread* mServiceThread;
5861
std::unique_ptr<PresentableSharedImage> mBackbuffer;
62+
mozilla::Atomic<uint32_t, MemoryOrdering::Relaxed> mTransparencyMode;
63+
TransparencyMode GetTransparencyMode() const {
64+
return TransparencyMode(uint32_t(mTransparencyMode));
65+
}
5966
};
6067

6168
class Client {

0 commit comments

Comments
 (0)