Skip to content

Commit

Permalink
xwm: Minor cleanup, add wrappers for basic types (#7856)
Browse files Browse the repository at this point in the history
  • Loading branch information
JassonCordones authored Sep 20, 2024
1 parent 9e98fb0 commit 4414cd0
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 40 deletions.
2 changes: 1 addition & 1 deletion src/xwayland/XDataSource.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#ifndef NO_XWAYLAND

#include "XDataSource.hpp"
#include "XWayland.hpp"
#include "../defines.hpp"
#include "XDataSource.hpp"

#include <fcntl.h>

Expand Down
13 changes: 6 additions & 7 deletions src/xwayland/XSurface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

#ifndef NO_XWAYLAND

#include "../Compositor.hpp"
#include <ranges>
#include "../Compositor.hpp"

CXWaylandSurface::CXWaylandSurface(uint32_t xID_, CBox geometry_, bool OR) : xID(xID_), geometry(geometry_), overrideRedirect(OR) {
xcb_res_query_client_ids_cookie_t client_id_cookie = {0};
Expand Down Expand Up @@ -196,12 +196,11 @@ void CXWaylandSurface::restackToTop() {

xcb_configure_window(g_pXWayland->pWM->connection, xID, XCB_CONFIG_WINDOW_STACK_MODE, values);

for (auto it = g_pXWayland->pWM->mappedSurfacesStacking.begin(); it != g_pXWayland->pWM->mappedSurfacesStacking.end(); ++it) {
if (*it == self) {
std::rotate(it, it + 1, g_pXWayland->pWM->mappedSurfacesStacking.end());
break;
}
}
auto& stack = g_pXWayland->pWM->mappedSurfacesStacking;
auto it = std::find(stack.begin(), stack.end(), self);

if (it != stack.end())
std::rotate(it, it + 1, stack.end());

g_pXWayland->pWM->updateClientList();

Expand Down
37 changes: 15 additions & 22 deletions src/xwayland/XWM.cpp
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
#include "helpers/math/Math.hpp"
#include <cstdint>
#ifndef NO_XWAYLAND

#include <ranges>
#include <fcntl.h>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <xcb/xcb_icccm.h>

#include "XWayland.hpp"
#include "../defines.hpp"
#include <unordered_map>
#include "../Compositor.hpp"
#include "../protocols/core/Seat.hpp"
#include "../managers/SeatManager.hpp"
#include "../protocols/XWaylandShell.hpp"
#include "../protocols/core/Compositor.hpp"
#include "../managers/SeatManager.hpp"
#include "../protocols/core/Seat.hpp"
#include <ranges>
#include <algorithm>
#include <fcntl.h>
#include <cstring>

#include <xcb/xcb_icccm.h>

#define XCB_EVENT_RESPONSE_TYPE_MASK 0x7f
#define INCR_CHUNK_SIZE (64 * 1024)
Expand Down Expand Up @@ -830,15 +831,15 @@ void CXWM::getRenderFormat() {
free(reply);
}

CXWM::CXWM() {
connection = xcb_connect_to_fd(g_pXWayland->pServer->xwmFDs[0], nullptr);
CXWM::CXWM() : connection(g_pXWayland->pServer->xwmFDs[0]) {

if (int ret = xcb_connection_has_error(connection); ret) {
Debug::log(ERR, "[xwm] Couldn't start, error {}", ret);
if (connection.hasError()) {
Debug::log(ERR, "[xwm] Couldn't start, error {}", connection.hasError());
return;
}

if (xcb_errors_context_new(connection, &errors)) {
CXCBErrorContext xcbErrCtx(connection);
if (!xcbErrCtx.isValid()) {
Debug::log(ERR, "[xwm] Couldn't allocate errors context");
return;
}
Expand Down Expand Up @@ -867,10 +868,7 @@ CXWM::CXWM() {
};
xcb_change_property(connection, XCB_PROP_MODE_REPLACE, screen->root, HYPRATOMS["_NET_SUPPORTED"], XCB_ATOM_ATOM, 32, sizeof(supported) / sizeof(*supported), supported);

xcb_flush(connection);

setActiveWindow(XCB_WINDOW_NONE);

initSelection();

listeners.newWLSurface = PROTO::compositor->events.newSurface.registerListener([this](std::any d) { onNewSurface(std::any_cast<SP<CWLSurfaceResource>>(d)); });
Expand All @@ -882,11 +880,6 @@ CXWM::CXWM() {
}

CXWM::~CXWM() {
if (errors)
xcb_errors_context_free(errors);

if (connection)
xcb_disconnect(connection);

if (eventSource)
wl_event_source_remove(eventSource);
Expand Down
62 changes: 52 additions & 10 deletions src/xwayland/XWM.hpp
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
#pragma once

#include "../helpers/signal/Signal.hpp"
#include "../helpers/memory/Memory.hpp"
#include "../helpers/WLListener.hpp"
#include "../macros.hpp"

#include "XDataSource.hpp"
#include "../helpers/WLListener.hpp"
#include "../helpers/memory/Memory.hpp"
#include "../helpers/signal/Signal.hpp"

#include <xcb/xcb.h>
#include <xcb/xcb_errors.h>
#include <xcb/composite.h>
#include <xcb/xfixes.h>
#include <xcb/res.h>
#include <xcb/xfixes.h>
#include <xcb/composite.h>
#include <xcb/xcb_errors.h>

struct wl_event_source;
class CXWaylandSurfaceResource;
Expand Down Expand Up @@ -58,6 +57,49 @@ struct SXSelection {
std::unique_ptr<SXTransfer> transfer;
};

class CXCBConnection {
public:
CXCBConnection(int fd) {
connection = xcb_connect_to_fd(fd, nullptr);
}

~CXCBConnection() {
if (connection)
xcb_disconnect(connection);
}

bool hasError() const {
return xcb_connection_has_error(connection);
}

operator xcb_connection_t*() const {
return connection;
}

private:
xcb_connection_t* connection = nullptr;
};

class CXCBErrorContext {
public:
explicit CXCBErrorContext(xcb_connection_t* connection) {
if (xcb_errors_context_new(connection, &errors) != 0)
errors = nullptr;
}

~CXCBErrorContext() {
if (errors)
xcb_errors_context_free(errors);
}

bool isValid() const {
return errors != nullptr;
}

private:
xcb_errors_context_t* errors = nullptr;
};

class CXWM {
public:
CXWM();
Expand Down Expand Up @@ -123,9 +165,9 @@ class CXWM {
void readProp(SP<CXWaylandSurface> XSURF, uint32_t atom, xcb_get_property_reply_t* reply);

//
xcb_connection_t* connection = nullptr;
xcb_errors_context_t* errors = nullptr;
xcb_screen_t* screen = nullptr;
CXCBConnection connection;
xcb_errors_context_t* errors = nullptr;
xcb_screen_t* screen = nullptr;

xcb_window_t wmWindow;

Expand Down

0 comments on commit 4414cd0

Please sign in to comment.