mirror of https://github.com/AxioDL/boo.git
BooObject: Remove destructorLock()
Now that we have the fencing and atomic operations in place to ensure access to data on other threads will always occur before the use of delete, we can remove the destructor lock. This will be useful for making ObjToken's move assignment operator noexcept.
This commit is contained in:
parent
4d91a1b3c3
commit
84f62a0f2c
|
@ -1,8 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <mutex>
|
|
||||||
#include "nxstl/mutex"
|
|
||||||
|
|
||||||
namespace boo {
|
namespace boo {
|
||||||
|
|
||||||
|
@ -13,12 +11,10 @@ protected:
|
||||||
virtual ~IObj() = default;
|
virtual ~IObj() = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual std::unique_lock<std::recursive_mutex> destructorLock() = 0;
|
|
||||||
void increment() { m_refCount.fetch_add(1, std::memory_order_relaxed); }
|
void increment() { m_refCount.fetch_add(1, std::memory_order_relaxed); }
|
||||||
void decrement() {
|
void decrement() {
|
||||||
if (m_refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) {
|
if (m_refCount.fetch_sub(1, std::memory_order_release) == 1) {
|
||||||
std::atomic_thread_fence(std::memory_order_acquire);
|
std::atomic_thread_fence(std::memory_order_acquire);
|
||||||
auto lk = destructorLock();
|
|
||||||
delete this;
|
delete this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include "AudioVoiceEngine.hpp"
|
#include "AudioVoiceEngine.hpp"
|
||||||
#include "logvisor/logvisor.hpp"
|
|
||||||
#include "boo/IApplication.hpp"
|
#include "boo/IApplication.hpp"
|
||||||
#include "../CFPointer.hpp"
|
#include "../CFPointer.hpp"
|
||||||
|
|
||||||
|
@ -7,8 +6,7 @@
|
||||||
#include <CoreMIDI/CoreMIDI.h>
|
#include <CoreMIDI/CoreMIDI.h>
|
||||||
#include <CoreAudio/HostTime.h>
|
#include <CoreAudio/HostTime.h>
|
||||||
|
|
||||||
#include <mutex>
|
#include <logvisor/logvisor.hpp>
|
||||||
#include <condition_variable>
|
|
||||||
|
|
||||||
namespace boo {
|
namespace boo {
|
||||||
static logvisor::Module Log("boo::AQS");
|
static logvisor::Module Log("boo::AQS");
|
||||||
|
|
|
@ -21,9 +21,6 @@ AudioSubmix*& AudioSubmix::_getHeadPtr(BaseAudioVoiceEngine* head) { return head
|
||||||
std::unique_lock<std::recursive_mutex> AudioSubmix::_getHeadLock(BaseAudioVoiceEngine* head) {
|
std::unique_lock<std::recursive_mutex> AudioSubmix::_getHeadLock(BaseAudioVoiceEngine* head) {
|
||||||
return std::unique_lock<std::recursive_mutex>{head->m_dataMutex};
|
return std::unique_lock<std::recursive_mutex>{head->m_dataMutex};
|
||||||
}
|
}
|
||||||
std::unique_lock<std::recursive_mutex> AudioSubmix::destructorLock() {
|
|
||||||
return std::unique_lock<std::recursive_mutex>{m_head->m_dataMutex};
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AudioSubmix::_isDirectDependencyOf(AudioSubmix* send) { return m_sendGains.find(send) != m_sendGains.cend(); }
|
bool AudioSubmix::_isDirectDependencyOf(AudioSubmix* send) { return m_sendGains.find(send) != m_sendGains.cend(); }
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "boo/audiodev/IAudioSubmix.hpp"
|
#include "boo/audiodev/IAudioSubmix.hpp"
|
||||||
#include <list>
|
|
||||||
#include <vector>
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <list>
|
||||||
|
#include <mutex>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <vector>
|
||||||
#include "Common.hpp"
|
#include "Common.hpp"
|
||||||
|
|
||||||
#if __SSE__
|
#if __SSE__
|
||||||
|
@ -80,7 +81,6 @@ class AudioSubmix : public ListNode<AudioSubmix, BaseAudioVoiceEngine*, IAudioSu
|
||||||
public:
|
public:
|
||||||
static AudioSubmix*& _getHeadPtr(BaseAudioVoiceEngine* head);
|
static AudioSubmix*& _getHeadPtr(BaseAudioVoiceEngine* head);
|
||||||
static std::unique_lock<std::recursive_mutex> _getHeadLock(BaseAudioVoiceEngine* head);
|
static std::unique_lock<std::recursive_mutex> _getHeadLock(BaseAudioVoiceEngine* head);
|
||||||
std::unique_lock<std::recursive_mutex> destructorLock() override;
|
|
||||||
|
|
||||||
AudioSubmix(BaseAudioVoiceEngine& root, IAudioSubmixCallback* cb, int busId, bool mainOut);
|
AudioSubmix(BaseAudioVoiceEngine& root, IAudioSubmixCallback* cb, int busId, bool mainOut);
|
||||||
~AudioSubmix() override;
|
~AudioSubmix() override;
|
||||||
|
|
|
@ -18,9 +18,6 @@ AudioVoice*& AudioVoice::_getHeadPtr(BaseAudioVoiceEngine* head) { return head->
|
||||||
std::unique_lock<std::recursive_mutex> AudioVoice::_getHeadLock(BaseAudioVoiceEngine* head) {
|
std::unique_lock<std::recursive_mutex> AudioVoice::_getHeadLock(BaseAudioVoiceEngine* head) {
|
||||||
return std::unique_lock<std::recursive_mutex>{head->m_dataMutex};
|
return std::unique_lock<std::recursive_mutex>{head->m_dataMutex};
|
||||||
}
|
}
|
||||||
std::unique_lock<std::recursive_mutex> AudioVoice::destructorLock() {
|
|
||||||
return std::unique_lock<std::recursive_mutex>{m_head->m_dataMutex};
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioVoice::_setPitchRatio(double ratio, bool slew) {
|
void AudioVoice::_setPitchRatio(double ratio, bool slew) {
|
||||||
if (m_dynamicRate) {
|
if (m_dynamicRate) {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <soxr.h>
|
#include <soxr.h>
|
||||||
#include <list>
|
#include <mutex>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include "boo/audiodev/IAudioVoice.hpp"
|
#include "boo/audiodev/IAudioVoice.hpp"
|
||||||
#include "AudioMatrix.hpp"
|
#include "AudioMatrix.hpp"
|
||||||
#include "Common.hpp"
|
|
||||||
#include "AudioVoiceEngine.hpp"
|
#include "AudioVoiceEngine.hpp"
|
||||||
|
#include "Common.hpp"
|
||||||
|
|
||||||
struct AudioUnitVoiceEngine;
|
struct AudioUnitVoiceEngine;
|
||||||
struct VSTVoiceEngine;
|
struct VSTVoiceEngine;
|
||||||
|
@ -64,7 +64,6 @@ protected:
|
||||||
public:
|
public:
|
||||||
static AudioVoice*& _getHeadPtr(BaseAudioVoiceEngine* head);
|
static AudioVoice*& _getHeadPtr(BaseAudioVoiceEngine* head);
|
||||||
static std::unique_lock<std::recursive_mutex> _getHeadLock(BaseAudioVoiceEngine* head);
|
static std::unique_lock<std::recursive_mutex> _getHeadLock(BaseAudioVoiceEngine* head);
|
||||||
std::unique_lock<std::recursive_mutex> destructorLock() override;
|
|
||||||
|
|
||||||
~AudioVoice() override;
|
~AudioVoice() override;
|
||||||
void resetSampleRate(double sampleRate) override;
|
void resetSampleRate(double sampleRate) override;
|
||||||
|
|
|
@ -3,14 +3,15 @@
|
||||||
/* Private header for managing shader data
|
/* Private header for managing shader data
|
||||||
* binding lifetimes through rendering cycle */
|
* binding lifetimes through rendering cycle */
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <vector>
|
|
||||||
#include <mutex>
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <thread>
|
|
||||||
#include <mutex>
|
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
#include <mutex>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
#include <thread>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "boo/graphicsdev/IGraphicsDataFactory.hpp"
|
#include "boo/graphicsdev/IGraphicsDataFactory.hpp"
|
||||||
#include "boo/graphicsdev/IGraphicsCommandQueue.hpp"
|
#include "boo/graphicsdev/IGraphicsCommandQueue.hpp"
|
||||||
#include "../Common.hpp"
|
#include "../Common.hpp"
|
||||||
|
@ -63,9 +64,6 @@ struct BaseGraphicsData : ListNode<BaseGraphicsData, GraphicsDataFactoryHead*> {
|
||||||
auto* head = getHead<T>();
|
auto* head = getHead<T>();
|
||||||
return head ? head->countForward() : 0;
|
return head ? head->countForward() : 0;
|
||||||
}
|
}
|
||||||
std::unique_lock<std::recursive_mutex> destructorLock() override {
|
|
||||||
return std::unique_lock<std::recursive_mutex>{m_head->m_dataMutex};
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit BaseGraphicsData(GraphicsDataFactoryHead& head __BooTraceArgs)
|
explicit BaseGraphicsData(GraphicsDataFactoryHead& head __BooTraceArgs)
|
||||||
: ListNode<BaseGraphicsData, GraphicsDataFactoryHead*>(&head) __BooTraceInitializer {}
|
: ListNode<BaseGraphicsData, GraphicsDataFactoryHead*>(&head) __BooTraceInitializer {}
|
||||||
|
@ -131,9 +129,6 @@ struct BaseGraphicsPool : ListNode<BaseGraphicsPool, GraphicsDataFactoryHead*> {
|
||||||
auto* head = getHead<T>();
|
auto* head = getHead<T>();
|
||||||
return head ? head->countForward() : 0;
|
return head ? head->countForward() : 0;
|
||||||
}
|
}
|
||||||
std::unique_lock<std::recursive_mutex> destructorLock() override {
|
|
||||||
return std::unique_lock<std::recursive_mutex>{m_head->m_dataMutex};
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit BaseGraphicsPool(GraphicsDataFactoryHead& head __BooTraceArgs)
|
explicit BaseGraphicsPool(GraphicsDataFactoryHead& head __BooTraceArgs)
|
||||||
: ListNode<BaseGraphicsPool, GraphicsDataFactoryHead*>(&head) __BooTraceInitializer {}
|
: ListNode<BaseGraphicsPool, GraphicsDataFactoryHead*>(&head) __BooTraceInitializer {}
|
||||||
|
@ -158,10 +153,6 @@ struct GraphicsDataNode : ListNode<GraphicsDataNode<NodeCls, DataCls>, ObjToken<
|
||||||
return std::unique_lock<std::recursive_mutex>{head->m_head->m_dataMutex};
|
return std::unique_lock<std::recursive_mutex>{head->m_head->m_dataMutex};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_lock<std::recursive_mutex> destructorLock() override {
|
|
||||||
return std::unique_lock<std::recursive_mutex>{base::m_head->m_head->m_dataMutex};
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit GraphicsDataNode(const ObjToken<DataCls>& data)
|
explicit GraphicsDataNode(const ObjToken<DataCls>& data)
|
||||||
: ListNode<GraphicsDataNode<NodeCls, DataCls>, ObjToken<DataCls>, NodeCls>(data) {}
|
: ListNode<GraphicsDataNode<NodeCls, DataCls>, ObjToken<DataCls>, NodeCls>(data) {}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,20 @@
|
||||||
#include "../win/Win32Common.hpp"
|
#include "../win/Win32Common.hpp"
|
||||||
#include "logvisor/logvisor.hpp"
|
|
||||||
#include "boo/graphicsdev/D3D.hpp"
|
#include "boo/graphicsdev/D3D.hpp"
|
||||||
#include "boo/IGraphicsContext.hpp"
|
#include "boo/IGraphicsContext.hpp"
|
||||||
#include "Common.hpp"
|
#include "Common.hpp"
|
||||||
#include <vector>
|
|
||||||
#include <thread>
|
|
||||||
#include <mutex>
|
|
||||||
#include <condition_variable>
|
|
||||||
#include <d3dcompiler.h>
|
|
||||||
#include <comdef.h>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <condition_variable>
|
||||||
#include <forward_list>
|
#include <forward_list>
|
||||||
#include "xxhash/xxhash.h"
|
#include <mutex>
|
||||||
|
#include <thread>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <d3dcompiler.h>
|
||||||
|
#include <comdef.h>
|
||||||
|
|
||||||
|
#include <logvisor/logvisor.hpp>
|
||||||
|
|
||||||
#undef min
|
#undef min
|
||||||
#undef max
|
#undef max
|
||||||
|
|
|
@ -2,22 +2,22 @@
|
||||||
#include "boo/graphicsdev/glew.h"
|
#include "boo/graphicsdev/glew.h"
|
||||||
#include "boo/IApplication.hpp"
|
#include "boo/IApplication.hpp"
|
||||||
#include "Common.hpp"
|
#include "Common.hpp"
|
||||||
#include <thread>
|
|
||||||
#include <condition_variable>
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <unordered_map>
|
#include <condition_variable>
|
||||||
#include <unordered_set>
|
#include <mutex>
|
||||||
#include "xxhash/xxhash.h"
|
#include <thread>
|
||||||
#include "glslang/Public/ShaderLang.h"
|
|
||||||
#include "glslang/Include/Types.h"
|
#include <glslang/Public/ShaderLang.h>
|
||||||
#include "StandAlone/ResourceLimits.h"
|
#include <glslang/Include/Types.h>
|
||||||
|
#include <StandAlone/ResourceLimits.h>
|
||||||
|
|
||||||
|
#include <logvisor/logvisor.hpp>
|
||||||
|
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
#include "../win/WinCommon.hpp"
|
#include "../win/WinCommon.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "logvisor/logvisor.hpp"
|
|
||||||
|
|
||||||
#undef min
|
#undef min
|
||||||
#undef max
|
#undef max
|
||||||
|
|
||||||
|
|
|
@ -1060,9 +1060,6 @@ struct VulkanDescriptorPool : ListNode<VulkanDescriptorPool, VulkanDataFactoryIm
|
||||||
|
|
||||||
~VulkanDescriptorPool() { vk::DestroyDescriptorPool(m_head->m_ctx->m_dev, m_descPool, nullptr); }
|
~VulkanDescriptorPool() { vk::DestroyDescriptorPool(m_head->m_ctx->m_dev, m_descPool, nullptr); }
|
||||||
|
|
||||||
std::unique_lock<std::recursive_mutex> destructorLock() override {
|
|
||||||
return std::unique_lock<std::recursive_mutex>{m_head->m_dataMutex};
|
|
||||||
}
|
|
||||||
static std::unique_lock<std::recursive_mutex> _getHeadLock(VulkanDataFactoryImpl* factory) {
|
static std::unique_lock<std::recursive_mutex> _getHeadLock(VulkanDataFactoryImpl* factory) {
|
||||||
return std::unique_lock<std::recursive_mutex>{factory->m_dataMutex};
|
return std::unique_lock<std::recursive_mutex>{factory->m_dataMutex};
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,13 @@
|
||||||
#include "IHIDDevice.hpp"
|
#include "IHIDDevice.hpp"
|
||||||
#include "boo/inputdev/DeviceToken.hpp"
|
#include "boo/inputdev/DeviceToken.hpp"
|
||||||
#include "boo/inputdev/DeviceBase.hpp"
|
#include "boo/inputdev/DeviceBase.hpp"
|
||||||
#include <thread>
|
|
||||||
#include <mutex>
|
|
||||||
#include <condition_variable>
|
|
||||||
#include <cstring>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <mutex>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
#ifndef WIN32_LEAN_AND_MEAN
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
#define WIN32_LEAN_AND_MEAN 1
|
#define WIN32_LEAN_AND_MEAN 1
|
||||||
|
|
|
@ -1,12 +1,19 @@
|
||||||
#include "boo/graphicsdev/Metal.hpp"
|
#include "boo/graphicsdev/Metal.hpp"
|
||||||
#include "CocoaCommon.hpp"
|
#include "CocoaCommon.hpp"
|
||||||
|
|
||||||
|
#include "boo/IApplication.hpp"
|
||||||
|
#include "boo/IGraphicsContext.hpp"
|
||||||
|
#include "boo/IWindow.hpp"
|
||||||
|
#include "boo/audiodev/IAudioVoiceEngine.hpp"
|
||||||
|
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#import <AppKit/AppKit.h>
|
#import <AppKit/AppKit.h>
|
||||||
#import <CoreVideo/CVDisplayLink.h>
|
#import <CoreVideo/CVDisplayLink.h>
|
||||||
#include "boo/IApplication.hpp"
|
|
||||||
#include "boo/IWindow.hpp"
|
#include <logvisor/logvisor.hpp>
|
||||||
#include "boo/IGraphicsContext.hpp"
|
|
||||||
#include "boo/audiodev/IAudioVoiceEngine.hpp"
|
|
||||||
#include "logvisor/logvisor.hpp"
|
|
||||||
|
|
||||||
#if !__has_feature(objc_arc)
|
#if !__has_feature(objc_arc)
|
||||||
#error ARC Required
|
#error ARC Required
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
#include "boo/IApplication.hpp"
|
|
||||||
#include "logvisor/logvisor.hpp"
|
|
||||||
#include "nxstl/thread"
|
#include "nxstl/thread"
|
||||||
#include "nxstl/condition_variable"
|
#include "nxstl/condition_variable"
|
||||||
|
#include "nxstl/mutex"
|
||||||
|
|
||||||
|
#include "boo/IApplication.hpp"
|
||||||
#include "boo/graphicsdev/NX.hpp"
|
#include "boo/graphicsdev/NX.hpp"
|
||||||
#include <limits.h>
|
|
||||||
|
#include <climits>
|
||||||
|
|
||||||
|
#include <logvisor/logvisor.hpp>
|
||||||
|
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,9 @@ PFN_GetScaleFactorForMonitor MyGetScaleFactorForMonitor = nullptr;
|
||||||
#include "boo/graphicsdev/Vulkan.hpp"
|
#include "boo/graphicsdev/Vulkan.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
DWORD g_mainThreadId = 0;
|
DWORD g_mainThreadId = 0;
|
||||||
std::mutex g_nwmt;
|
std::mutex g_nwmt;
|
||||||
std::condition_variable g_nwcv;
|
std::condition_variable g_nwcv;
|
||||||
|
|
|
@ -14,6 +14,9 @@
|
||||||
#endif
|
#endif
|
||||||
#include "boo/graphicsdev/GL.hpp"
|
#include "boo/graphicsdev/GL.hpp"
|
||||||
|
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
extern DWORD g_mainThreadId;
|
extern DWORD g_mainThreadId;
|
||||||
extern std::mutex g_nwmt;
|
extern std::mutex g_nwmt;
|
||||||
extern std::condition_variable g_nwcv;
|
extern std::condition_variable g_nwcv;
|
||||||
|
|
|
@ -12,16 +12,16 @@
|
||||||
#include <X11/extensions/XInput2.h>
|
#include <X11/extensions/XInput2.h>
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
#include <GL/glxext.h>
|
#include <GL/glxext.h>
|
||||||
#include <locale>
|
|
||||||
|
|
||||||
#include <dbus/dbus.h>
|
#include <dbus/dbus.h>
|
||||||
DBusConnection* RegisterDBus(const char* appName, bool& isFirst);
|
DBusConnection* RegisterDBus(const char* appName, bool& isFirst);
|
||||||
|
|
||||||
#include <signal.h>
|
#include <condition_variable>
|
||||||
|
#include <csignal>
|
||||||
|
#include <locale>
|
||||||
|
#include <mutex>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <mutex>
|
|
||||||
#include <condition_variable>
|
|
||||||
|
|
||||||
#include "XlibCommon.hpp"
|
#include "XlibCommon.hpp"
|
||||||
#include <X11/cursorfont.h>
|
#include <X11/cursorfont.h>
|
||||||
|
|
|
@ -11,16 +11,16 @@
|
||||||
#include <X11/Xlib-xcb.h>
|
#include <X11/Xlib-xcb.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <limits.h>
|
#include <climits>
|
||||||
#include <unistd.h>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
#include <thread>
|
#include <unistd.h>
|
||||||
#include <mutex>
|
|
||||||
#include <condition_variable>
|
|
||||||
|
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
#include <X11/extensions/XInput2.h>
|
#include <X11/extensions/XInput2.h>
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <X11/extensions/Xrandr.h>
|
#include <X11/extensions/Xrandr.h>
|
||||||
#include "logvisor/logvisor.hpp"
|
#include <logvisor/logvisor.hpp>
|
||||||
|
|
||||||
#include "XlibCommon.hpp"
|
#include "XlibCommon.hpp"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue