mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-08 09:35:15 +00:00
The main changes are twofold: * Buffer flipping is now controlled by the m_screen_can_set_buffer flag in WSCompositor. This flag, in turn, is impacted by m_can_set_buffer flag, in WSScreen. m_can_set_buffer is set in the WSScreen constructor by checking the return value of fb_set_buffer. If the framebuffer supports this operation, it will succeed, and we record this fact. This information is then used by WSCompositor to set its own m_screen_can_set_buffer flag. * WSScreen now only requests a resolution change of the framebuffer. The driver itself is ultimately responsible for what resolution or mode is actually set, so WSScreen has to read the response from that request, and has no choice but to accept the answer. This allows the driver to choose a "close enough" value to what was requested, or simply ignore it. The result of this is that there is no special configuration necessary for WindowServer to work with reduced-capability framebuffer devices.
70 lines
1.7 KiB
C++
70 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include <AK/OwnPtr.h>
|
|
#include <AK/RefPtr.h>
|
|
#include <LibCore/CObject.h>
|
|
#include <LibCore/CTimer.h>
|
|
#include <LibDraw/DisjointRectSet.h>
|
|
#include <LibDraw/GraphicsBitmap.h>
|
|
|
|
class Painter;
|
|
class WSCursor;
|
|
|
|
enum class WallpaperMode {
|
|
Simple,
|
|
Tile,
|
|
Center,
|
|
Scaled,
|
|
Unchecked
|
|
};
|
|
|
|
class WSCompositor final : public CObject {
|
|
C_OBJECT(WSCompositor)
|
|
public:
|
|
static WSCompositor& the();
|
|
|
|
void compose();
|
|
void invalidate();
|
|
void invalidate(const Rect&);
|
|
|
|
void set_resolution(int desired_width, int desired_height);
|
|
|
|
bool set_wallpaper(const String& path, Function<void(bool)>&& callback);
|
|
String wallpaper_path() const { return m_wallpaper_path; }
|
|
|
|
void invalidate_cursor();
|
|
Rect current_cursor_rect() const;
|
|
|
|
private:
|
|
WSCompositor();
|
|
void init_bitmaps();
|
|
void flip_buffers();
|
|
void flush(const Rect&);
|
|
void draw_cursor();
|
|
void draw_geometry_label();
|
|
void draw_menubar();
|
|
void finish_setting_wallpaper(const String& path, NonnullRefPtr<GraphicsBitmap>&&);
|
|
|
|
unsigned m_compose_count { 0 };
|
|
unsigned m_flush_count { 0 };
|
|
CTimer m_compose_timer;
|
|
CTimer m_immediate_compose_timer;
|
|
bool m_flash_flush { false };
|
|
bool m_buffers_are_flipped { false };
|
|
bool m_screen_can_set_buffer { false };
|
|
|
|
RefPtr<GraphicsBitmap> m_front_bitmap;
|
|
RefPtr<GraphicsBitmap> m_back_bitmap;
|
|
OwnPtr<Painter> m_back_painter;
|
|
OwnPtr<Painter> m_front_painter;
|
|
|
|
DisjointRectSet m_dirty_rects;
|
|
|
|
Rect m_last_cursor_rect;
|
|
Rect m_last_geometry_label_rect;
|
|
|
|
String m_wallpaper_path;
|
|
WallpaperMode m_wallpaper_mode { WallpaperMode::Unchecked };
|
|
RefPtr<GraphicsBitmap> m_wallpaper;
|
|
};
|