Skip to content

Commit

Permalink
input-capture: fix nullptr reference when Hyprland don't have input c…
Browse files Browse the repository at this point in the history
…apture protocol & cleanup
  • Loading branch information
3l0w committed Feb 5, 2025
1 parent 331405a commit 6398455
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 37 deletions.
6 changes: 4 additions & 2 deletions src/core/PortalManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ SOutput::SOutput(SP<CCWlOutput> output_) : output(output_) {
refreshRate = refresh;
width = width_;
height = height_;
Debug::log(LOG, "??? {} {}", flags, refresh);
});
output->setGeometry(
[this](CCWlOutput* r, int32_t x_, int32_t y_, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char* make, const char* model, int32_t transform_) {
Expand All @@ -31,7 +30,10 @@ SOutput::SOutput(SP<CCWlOutput> output_) : output(output_) {
y = y_;
});
output->setScale([this](CCWlOutput* r, uint32_t factor_) { scale = factor_; });
output->setDone([](CCWlOutput* r) { g_pPortalManager->m_sPortals.inputCapture->zonesChanged(); });
output->setDone([](CCWlOutput* r) {
if (g_pPortalManager->m_sPortals.inputCapture != nullptr)
g_pPortalManager->m_sPortals.inputCapture->zonesChanged();
});
}

CPortalManager::CPortalManager() {
Expand Down
4 changes: 2 additions & 2 deletions src/portals/InputCapture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ void CInputCapturePortal::zonesChanged() {
if (!sessionValid(value->sessionHandle))
continue;
disable(value->sessionHandle);
if (!value->zoneChanged())
if (!value->zonesChanged())
continue;

std::unordered_map<std::string, sdbus::Variant> options;
Expand All @@ -441,7 +441,7 @@ void CInputCapturePortal::zonesChanged() {
}
}

bool CInputCapturePortal::SSession::zoneChanged() {
bool CInputCapturePortal::SSession::zonesChanged() {
eis->resetPointer();
return true;
}
Expand Down
62 changes: 31 additions & 31 deletions src/portals/InputCapture.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,28 +22,12 @@ class CInputCapturePortal {
public:
CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr);

dbUasv onCreateSession(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::string parentWindow,
std::unordered_map<std::string, sdbus::Variant> options);
dbUasv onGetZones(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
dbUasv onSetPointerBarriers(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts,
std::vector<std::unordered_map<std::string, sdbus::Variant>> barriers, uint32_t zoneSet);
dbUasv onEnable(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
dbUasv onDisable(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
dbUasv onRelease(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
sdbus::UnixFd onConnectToEIS(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
void zonesChanged();

void onForceRelease();
void onMotion(double x, double y, double dx, double dy);
void onKeymap(int32_t fd, uint32_t size);
void onKey(uint32_t key, bool pressed);
void onModifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group);
void onButton(uint32_t button, bool pressed);
void onAxis(bool axis, double value);
void onAxisValue120(bool axis, int32_t value120);
void onAxisStop(bool axis);
void onFrame();

void zonesChanged();
private:
struct {
SP<CCHyprlandInputCaptureManagerV1> manager;
} m_sState;

struct SSession {
std::string appid;
Expand All @@ -63,7 +47,7 @@ class CInputCapturePortal {
bool activate(double x, double y, uint32_t borderId);
bool deactivate();
bool disable();
bool zoneChanged();
bool zonesChanged();

void motion(double dx, double dy);
void key(uint32_t key, bool pressed);
Expand All @@ -78,11 +62,6 @@ class CInputCapturePortal {
uint32_t isColliding(double px, double py, double nx, double ny);
};

private:
struct {
SP<CCHyprlandInputCaptureManagerV1> manager;
} m_sState;

std::unordered_map<std::string, const std::shared_ptr<SSession>> sessions;
//
std::unique_ptr<sdbus::IObject> m_pObject;
Expand All @@ -94,9 +73,30 @@ class CInputCapturePortal {
const sdbus::InterfaceName INTERFACE_NAME = sdbus::InterfaceName{"org.freedesktop.impl.portal.InputCapture"};
const sdbus::ObjectPath OBJECT_PATH = sdbus::ObjectPath{"/org/freedesktop/portal/desktop"};

bool sessionValid(sdbus::ObjectPath sessionHandle);
dbUasv onCreateSession(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::string parentWindow,
std::unordered_map<std::string, sdbus::Variant> options);
dbUasv onGetZones(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
dbUasv onSetPointerBarriers(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts,
std::vector<std::unordered_map<std::string, sdbus::Variant>> barriers, uint32_t zoneSet);
dbUasv onEnable(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
dbUasv onDisable(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
dbUasv onRelease(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
sdbus::UnixFd onConnectToEIS(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);

void onForceRelease();
void onMotion(double x, double y, double dx, double dy);
void onKeymap(int32_t fd, uint32_t size);
void onKey(uint32_t key, bool pressed);
void onModifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group);
void onButton(uint32_t button, bool pressed);
void onAxis(bool axis, double value);
void onAxisValue120(bool axis, int32_t value120);
void onAxisStop(bool axis);
void onFrame();

bool sessionValid(sdbus::ObjectPath sessionHandle);

void activate(sdbus::ObjectPath sessionHandle, double x, double y, uint32_t borderId);
void deactivate(sdbus::ObjectPath sessionHandle);
void disable(sdbus::ObjectPath sessionHandle);
void activate(sdbus::ObjectPath sessionHandle, double x, double y, uint32_t borderId);
void deactivate(sdbus::ObjectPath sessionHandle);
void disable(sdbus::ObjectPath sessionHandle);
};
2 changes: 0 additions & 2 deletions src/shared/Eis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,6 @@ Keymap EmulatedInputServer::openKeymap() {
return _keymap;
}

//TODO: remove and re-add devices when monitors change (see: mutter/meta-input-capture-session.c:1107)

void EmulatedInputServer::clearPointer() {
if (!client.pointer)
return;
Expand Down

0 comments on commit 6398455

Please sign in to comment.