Tracker: Disallow background image on Desktop windows.

Custom background image is disallowed on the Desktop folder and Root
aka "Disks" folder. However, you may use a default background image.

We store the background image on the node, Desktop window and the
actual Desktop share the same node so we have to explicitly disallow
background images from showing on Desktop windows.

Make UpdateBackgroundImage() protected.

Remove unused BDeskWindow::UpdateDesktopBackgroundImages();

Handle all background image code in ContainerWindow. BPoseView calls
its window if targetted to update its background image.

Fixes Desktop background portion of #19947.

Change-Id: I4b104340b5a69807961b99bde7b0455d7d58065a
Reviewed-on: https://review.haiku-os.org/c/haiku/+/10392
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
John Scipione
2026-02-28 13:20:52 +00:00
committed by waddlesplash
parent 0c6100feb2
commit 1d20c1fb5c
7 changed files with 27 additions and 56 deletions
+1 -1
View File
@@ -384,7 +384,7 @@ BackgroundImage::Refresh(BackgroundImage* oldBackgroundImage,
} }
BackgroundImage* backgroundImage = GetBackgroundImage(fromNode, desktop); BackgroundImage* backgroundImage = GetBackgroundImage(fromNode, desktop);
if (backgroundImage != NULL && poseView->ViewMode() != kListMode) if (backgroundImage != NULL && poseView != NULL && poseView->ViewMode() != kListMode)
backgroundImage->Show(poseView, current_workspace()); backgroundImage->Show(poseView, current_workspace());
return backgroundImage; return backgroundImage;
+18 -30
View File
@@ -911,29 +911,7 @@ BContainerWindow::RestoreStateCommon()
if (fUsesLayout) if (fUsesLayout)
InitLayout(); InitLayout();
if (BootedInSafeMode()) UpdateBackgroundImage();
// don't pick up backgrounds in safe mode
return;
bool isDesktop = PoseView()->IsDesktopView();
WindowStateNodeOpener opener(this, false);
if (!TargetModel()->IsRoot() && opener.Node() != NULL) {
// don't pick up background image for root disks
// to do this, would have to have a unique attribute for the
// disks window that doesn't collide with the desktop
// for R4 this was not done to make things simpler
// the default image will still work though
fBackgroundImage = BackgroundImage::GetBackgroundImage(opener.Node(), isDesktop);
// look for background image info in the window's node
}
BNode defaultingNode;
if (fBackgroundImage == NULL && !isDesktop
&& DefaultStateSourceNode(kDefaultFolderTemplate, &defaultingNode)) {
// look for background image info in the source for defaults
fBackgroundImage = BackgroundImage::GetBackgroundImage(&defaultingNode, isDesktop);
}
} }
@@ -977,6 +955,9 @@ BContainerWindow::SwitchDirectory(const entry_ref* ref)
WindowStateNodeOpener opener(this, false); WindowStateNodeOpener opener(this, false);
opener.SetTo(&entry, false); opener.SetTo(&entry, false);
// Redraw the background image or erase it
UpdateBackgroundImage();
// Update pose view and set directory type // Update pose view and set directory type
PoseView()->SwitchDir(ref, opener.StreamNode()); PoseView()->SwitchDir(ref, opener.StreamNode());
@@ -1039,23 +1020,30 @@ BContainerWindow::UpdateTitle()
void void
BContainerWindow::UpdateBackgroundImage() BContainerWindow::UpdateBackgroundImage()
{ {
if (BootedInSafeMode()) if (BootedInSafeMode() || PoseView()->IsFilePanel())
return; return;
WindowStateNodeOpener opener(this, false); WindowStateNodeOpener opener(this, false);
if (!TargetModel()->IsRoot() && opener.Node() != NULL) { bool isDesktop = PoseView()->IsDesktopView();
bool isAllowed = !((TargetModel()->IsDesktop() && !isDesktop) || TargetModel()->IsRoot());
// look for background image info in the window's node
if (isAllowed && opener.Node() != NULL) {
// Don't pick up background image for Desktop window or root aka "Disks".
// To do this we would have to have a unique attribute for the root window
// that doesn't collide with the Desktop on BeOS R4.
// The default image will still work though.
fBackgroundImage = BackgroundImage::Refresh(fBackgroundImage, opener.Node(), fBackgroundImage = BackgroundImage::Refresh(fBackgroundImage, opener.Node(),
TargetModel()->IsDesktop(), PoseView()); isDesktop, PoseView());
} }
// look for background image info in the window's node // look for default background image info
BNode defaultingNode; BNode defaultingNode;
if (!fBackgroundImage && !TargetModel()->IsDesktop() if (fBackgroundImage == NULL && !isDesktop
&& DefaultStateSourceNode(kDefaultFolderTemplate, &defaultingNode)) { && DefaultStateSourceNode(kDefaultFolderTemplate, &defaultingNode)) {
// look for background image info in the source for defaults
fBackgroundImage = BackgroundImage::Refresh(fBackgroundImage, &defaultingNode, fBackgroundImage = BackgroundImage::Refresh(fBackgroundImage, &defaultingNode,
TargetModel()->IsDesktop(), PoseView()); isDesktop, PoseView());
} }
} }
+2 -2
View File
@@ -159,8 +159,6 @@ public:
bool SaveStateIsEnabled() const; bool SaveStateIsEnabled() const;
void SetSaveStateEnabled(bool); void SetSaveStateEnabled(bool);
void UpdateBackgroundImage();
static status_t GetLayoutState(BNode*, BMessage*); static status_t GetLayoutState(BNode*, BMessage*);
static status_t SetLayoutState(BNode*, const BMessage*); static status_t SetLayoutState(BNode*, const BMessage*);
// calls for inheriting window size, attribute layout, etc. // calls for inheriting window size, attribute layout, etc.
@@ -230,6 +228,8 @@ protected:
// these two virtuals control setting up a new folder that // these two virtuals control setting up a new folder that
// does not have any state settings yet with the default // does not have any state settings yet with the default
virtual void UpdateBackgroundImage();
virtual void AddMenus(); virtual void AddMenus();
virtual void AddShortcuts(); virtual void AddShortcuts();
// add equivalents of the menu shortcuts to the menuless // add equivalents of the menu shortcuts to the menuless
+3 -12
View File
@@ -487,7 +487,7 @@ BDeskWindow::CreatePoseView(Model* model)
void void
BDeskWindow::WorkspaceActivated(int32 workspace, bool state) BDeskWindow::WorkspaceActivated(int32 workspace, bool state)
{ {
if (fBackgroundImage) if (fBackgroundImage != NULL)
fBackgroundImage->WorkspaceActivated(PoseView(), workspace, state); fBackgroundImage->WorkspaceActivated(PoseView(), workspace, state);
} }
@@ -508,7 +508,7 @@ BDeskWindow::ScreenChanged(BRect frame, color_space space)
fOldFrame = frame; fOldFrame = frame;
ResizeTo(frame.Width(), frame.Height()); ResizeTo(frame.Width(), frame.Height());
if (fBackgroundImage) if (fBackgroundImage != NULL)
fBackgroundImage->ScreenChanged(frame, space); fBackgroundImage->ScreenChanged(frame, space);
PoseView()->CheckPoseVisibility(frameChanged ? &frame : 0); PoseView()->CheckPoseVisibility(frameChanged ? &frame : 0);
@@ -517,19 +517,10 @@ BDeskWindow::ScreenChanged(BRect frame, color_space space)
} }
void
BDeskWindow::UpdateDesktopBackgroundImages()
{
WindowStateNodeOpener opener(this, false);
fBackgroundImage = BackgroundImage::Refresh(fBackgroundImage,
opener.Node(), true, PoseView());
}
void void
BDeskWindow::Show() BDeskWindow::Show()
{ {
if (fBackgroundImage) if (fBackgroundImage != NULL)
fBackgroundImage->Show(PoseView(), current_workspace()); fBackgroundImage->Show(PoseView(), current_workspace());
PoseView()->CheckPoseVisibility(); PoseView()->CheckPoseVisibility();
-3
View File
@@ -65,9 +65,6 @@ public:
DesktopPoseView* PoseView() const; DesktopPoseView* PoseView() const;
void UpdateDesktopBackgroundImages();
// Desktop window has special background image handling
void SaveDesktopPoseLocations(); void SaveDesktopPoseLocations();
virtual bool ShouldHaveDraggableFolderIcon() { return false; }; virtual bool ShouldHaveDraggableFolderIcon() { return false; };
+2 -6
View File
@@ -2263,7 +2263,8 @@ BPoseView::MessageReceived(BMessage* message)
break; break;
case kRestoreBackgroundImage: case kRestoreBackgroundImage:
ContainerWindow()->UpdateBackgroundImage(); if (ContainerWindow() != NULL)
ContainerWindow()->MessageReceived(message);
break; break;
case B_META_MIME_CHANGED: case B_META_MIME_CHANGED:
@@ -8525,11 +8526,6 @@ BPoseView::SwitchDir(const entry_ref* newDirRef, AttributeStreamNode* node)
AdoptSystemColors(); AdoptSystemColors();
if (!IsDesktopView()) {
if (ContainerWindow() != NULL)
ContainerWindow()->UpdateBackgroundImage();
}
Invalidate(); Invalidate();
fLastKeyTime = 0; fLastKeyTime = 0;
+1 -2
View File
@@ -539,8 +539,7 @@ TTracker::MessageReceived(BMessage* message)
{ {
BDeskWindow* desktop = GetDeskWindow(); BDeskWindow* desktop = GetDeskWindow();
AutoLock<BWindow> lock(desktop); AutoLock<BWindow> lock(desktop);
desktop->UpdateDesktopBackgroundImages(); desktop->PostMessage(message, desktop);
desktop->PostMessage(message, desktop->PoseView());
break; break;
} }