blob: 893f038043e5242f5b9dd76218d4fe22c1b97b0a [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_GFX_X_CONNECTION_H_
#define UI_GFX_X_CONNECTION_H_
#include <list>
#include <queue>
#include "base/component_export.h"
#include "ui/gfx/x/event.h"
#include "ui/gfx/x/extension_manager.h"
#include "ui/gfx/x/xproto.h"
namespace x11 {
// Represents a socket to the X11 server.
class COMPONENT_EXPORT(X11) Connection : public XProto,
public ExtensionManager {
public:
class Delegate {
public:
virtual bool ShouldContinueStream() const = 0;
virtual void DispatchXEvent(x11::Event* event) = 0;
protected:
virtual ~Delegate() = default;
};
// Gets or creates the singleton connection.
static Connection* Get();
explicit Connection();
~Connection();
Connection(const Connection&) = delete;
Connection(Connection&&) = delete;
XDisplay* display() const { return display_; }
xcb_connection_t* XcbConnection();
uint32_t extended_max_request_length() const {
return extended_max_request_length_;
}
const Setup* setup() const { return setup_.get(); }
const Screen* default_screen() const { return default_screen_; }
const Depth* default_root_depth() const { return default_root_depth_; }
const VisualType* default_root_visual() const { return defualt_root_visual_; }
template <typename T>
T GenerateId() {
return static_cast<T>(xcb_generate_id(XcbConnection()));
}
// Write all requests to the socket.
void Flush();
// Flush and block until the server has responded to all requests.
void Sync();
// Read all responses from the socket without blocking.
void ReadResponses();
// Are there any events, errors, or replies already buffered?
bool HasPendingResponses() const;
// Dispatch any buffered events, errors, or replies.
void Dispatch(Delegate* delegate);
// Access the event buffer. Clients can add, delete, or modify events.
std::list<Event>& events() { return events_; }
private:
friend class FutureBase;
struct Request {
Request(unsigned int sequence, FutureBase::ResponseCallback callback);
Request(Request&& other);
~Request();
const unsigned int sequence;
FutureBase::ResponseCallback callback;
};
void AddRequest(unsigned int sequence, FutureBase::ResponseCallback callback);
bool HasNextResponse() const;
XDisplay* const display_;
uint32_t extended_max_request_length_ = 0;
std::unique_ptr<Setup> setup_;
const Screen* default_screen_ = nullptr;
const Depth* default_root_depth_ = nullptr;
const VisualType* defualt_root_visual_ = nullptr;
std::list<Event> events_;
std::queue<Request> requests_;
};
} // namespace x11
#endif // UI_GFX_X_CONNECTION_H_