summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibGUI/Window.cpp
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-07-24 22:49:48 +0200
committerAndreas Kling <kling@serenityos.org>2021-07-25 14:39:25 +0200
commit143443e0b6412cd7f5a702e5b190bea60da733fe (patch)
tree5d1490936ab7a056db804c4ba5ffd22558afa429 /Userland/Libraries/LibGUI/Window.cpp
parent24b5295b3038dc0b7a49367476b5b8594268163d (diff)
downloadserenity-143443e0b6412cd7f5a702e5b190bea60da733fe.zip
LibGfx: Make Gfx::Bitmap::set_nonvolatile() report allocation failure
Making a bitmap non-volatile after being volatile may fail to allocate physical pages after the kernel stole the old pages in a purge. This is different from the pages being purged, but reallocated. In that case, they are simply replaced with zero-fill-on-demand pages as if they were freshly allocated.
Diffstat (limited to 'Userland/Libraries/LibGUI/Window.cpp')
-rw-r--r--Userland/Libraries/LibGUI/Window.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp
index fe37f5ef0d..e0c7068d30 100644
--- a/Userland/Libraries/LibGUI/Window.cpp
+++ b/Userland/Libraries/LibGUI/Window.cpp
@@ -410,8 +410,9 @@ void Window::handle_multi_paint_event(MultiPaintEvent& event)
m_back_store = create_backing_store(event.window_size());
VERIFY(m_back_store);
} else if (m_double_buffering_enabled) {
- bool still_has_pixels = m_back_store->bitmap().set_nonvolatile();
- if (!still_has_pixels) {
+ bool was_purged = false;
+ bool bitmap_has_memory = m_back_store->bitmap().set_nonvolatile(was_purged);
+ if (!bitmap_has_memory || was_purged) {
m_back_store = create_backing_store(event.window_size());
VERIFY(m_back_store);
created_new_backing_store = true;
@@ -1015,7 +1016,9 @@ void Window::notify_state_changed(Badge<WindowServerConnection>, bool minimized,
if (minimized || occluded) {
store->bitmap().set_volatile();
} else {
- if (!store->bitmap().set_nonvolatile()) {
+ bool was_purged = false;
+ bool bitmap_has_memory = store->bitmap().set_nonvolatile(was_purged);
+ if (!bitmap_has_memory || was_purged) {
store = nullptr;
update();
}