Hyprland/src/helpers/Monitor.hpp

188 lines
6 KiB
C++
Raw Normal View History

2022-03-17 16:56:33 +01:00
#pragma once
#include "../defines.hpp"
2022-03-17 18:25:16 +01:00
#include <deque>
#include "WLClasses.hpp"
2022-07-23 15:48:08 +02:00
#include <vector>
2022-03-19 13:54:24 +01:00
#include <array>
2022-07-23 15:48:08 +02:00
#include <memory>
#include <xf86drmMode.h>
#include "Timer.hpp"
2023-07-19 20:09:49 +02:00
#include "Region.hpp"
2023-08-11 17:37:52 +02:00
#include <optional>
2024-04-22 19:21:03 +02:00
#include "signal/Signal.hpp"
// Enum for the different types of auto directions, e.g. auto-left, auto-up.
enum class eAutoDirs {
DIR_AUTO_UP,
DIR_AUTO_DOWN,
DIR_AUTO_LEFT,
DIR_AUTO_RIGHT
};
2023-08-11 17:37:52 +02:00
struct SMonitorRule {
eAutoDirs autoDir;
2023-08-11 17:37:52 +02:00
std::string name = "";
Vector2D resolution = Vector2D(1280, 720);
Vector2D offset = Vector2D(0, 0);
float scale = 1;
float refreshRate = 60;
bool disabled = false;
wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL;
std::string mirrorOf = "";
bool enable10bit = false;
drmModeModeInfo drmMode = {};
std::optional<int> vrr;
};
2022-09-13 15:25:42 +02:00
class CMonitor;
// Class for wrapping the wlr state
class CMonitorState {
public:
CMonitorState(CMonitor* owner);
~CMonitorState();
wlr_output_state* wlr();
void clear();
// commit() will also clear()
bool commit();
bool test();
private:
wlr_output_state m_state = {0};
CMonitor* m_pOwner;
};
2022-07-27 12:32:00 +02:00
class CMonitor {
public:
2023-04-07 13:18:40 +02:00
CMonitor();
~CMonitor();
Vector2D vecPosition = Vector2D(-1, -1); // means unset
Vector2D vecXWaylandPosition = Vector2D(-1, -1); // means unset
Vector2D vecSize = Vector2D(0, 0);
Vector2D vecPixelSize = Vector2D(0, 0);
Vector2D vecTransformedSize = Vector2D(0, 0);
2022-03-17 16:56:33 +01:00
bool primary = false;
2022-03-17 16:56:33 +01:00
uint64_t ID = -1;
PHLWORKSPACE activeWorkspace = nullptr;
PHLWORKSPACE activeSpecialWorkspace = nullptr;
float setScale = 1; // scale set by cfg
float scale = 1; // real scale
2022-03-17 16:56:33 +01:00
std::string szName = "";
std::string szDescription = "";
std::string szShortDescription = "";
2022-03-17 16:56:33 +01:00
Vector2D vecReservedTopLeft = Vector2D(0, 0);
Vector2D vecReservedBottomRight = Vector2D(0, 0);
drmModeModeInfo customDrmMode = {};
2022-03-17 18:25:16 +01:00
CMonitorState state;
2022-03-17 18:25:16 +01:00
// WLR stuff
wlr_damage_ring damage;
wlr_output* output = nullptr;
float refreshRate = 60;
int framesToSkip = 0;
int forceFullFrames = 0;
bool noFrameSchedule = false;
bool scheduledRecalc = false;
wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL;
float xwaylandScale = 1.f;
std::array<float, 9> projMatrix = {0};
std::optional<Vector2D> forceSize;
2024-05-03 18:58:40 +02:00
wlr_output_mode* currentMode = nullptr;
bool dpmsStatus = true;
bool vrrActive = false; // this can be TRUE even if VRR is not active in the case that this display does not support it.
bool enabled10bit = false; // as above, this can be TRUE even if 10 bit failed.
bool createdByUser = false;
uint32_t drmFormat = DRM_FORMAT_INVALID;
bool isUnsafeFallback = false;
bool pendingFrame = false; // if we schedule a frame during rendering, reschedule it after
bool renderingActive = false;
wl_event_source* renderTimer = nullptr; // for RAT
bool RATScheduled = false;
CTimer lastPresentationTimer;
SMonitorRule activeMonitorRule;
2023-08-11 17:37:52 +02:00
WP<CMonitor> self;
2022-09-13 15:25:42 +02:00
// mirroring
CMonitor* pMirrorOf = nullptr;
2022-09-13 15:25:42 +02:00
std::vector<CMonitor*> mirrors;
// for tearing
PHLWINDOWREF solitaryClient;
struct {
bool canTear = false;
bool nextRenderTorn = false;
bool activelyTearing = false;
bool busy = false;
bool frameScheduledWhileBusy = false;
} tearingState;
2024-04-22 19:21:03 +02:00
struct {
CSignal destroy;
CSignal connect;
CSignal disconnect;
2024-04-29 02:28:26 +02:00
CSignal dpmsChanged;
CSignal modeChanged;
2024-04-22 19:21:03 +02:00
} events;
std::array<std::vector<PHLLSREF>, 4> m_aLayerSurfaceLayers;
2022-03-17 18:25:16 +01:00
DYNLISTENER(monitorFrame);
DYNLISTENER(monitorDestroy);
2022-11-19 17:28:04 +01:00
DYNLISTENER(monitorStateRequest);
DYNLISTENER(monitorDamage);
2023-04-07 18:25:56 +02:00
DYNLISTENER(monitorNeedsFrame);
2023-04-12 22:40:51 +02:00
DYNLISTENER(monitorCommit);
DYNLISTENER(monitorBind);
2022-03-18 22:35:51 +01:00
2022-07-27 12:32:00 +02:00
// methods
void onConnect(bool noRule);
void onDisconnect(bool destroy = false);
void addDamage(const pixman_region32_t* rg);
void addDamage(const CRegion* rg);
void addDamage(const CBox* box);
void setMirror(const std::string&);
bool isMirror();
bool matchesStaticSelector(const std::string& selector) const;
float getDefaultScale();
void changeWorkspace(const PHLWORKSPACE& pWorkspace, bool internal = false, bool noMouseMove = false, bool noFocus = false);
void changeWorkspace(const int& id, bool internal = false, bool noMouseMove = false, bool noFocus = false);
void setSpecialWorkspace(const PHLWORKSPACE& pWorkspace);
void setSpecialWorkspace(const int& id);
void moveTo(const Vector2D& pos);
Vector2D middle();
void updateMatrix();
int64_t activeWorkspaceID();
int64_t activeSpecialWorkspaceID();
CBox logicalBox();
void updateGlobal();
bool m_bEnabled = false;
bool m_bRenderingInitPassed = false;
2022-07-27 12:32:00 +02:00
2022-03-18 22:35:51 +01:00
// For the list lookup
2022-07-27 12:32:00 +02:00
bool operator==(const CMonitor& rhs) {
2022-03-18 22:35:51 +01:00
return vecPosition == rhs.vecPosition && vecSize == rhs.vecSize && szName == rhs.szName;
}
2022-09-13 15:25:42 +02:00
private:
void setupDefaultWS(const SMonitorRule&);
int findAvailableDefaultWS();
2022-09-25 20:07:48 +02:00
};