Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
czyt1988 committed Nov 2, 2023
1 parent 7327d66 commit f378019
Show file tree
Hide file tree
Showing 11 changed files with 2,226 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
#include "FramelessWindowConverter.h"
#include "FramelessWindowConverter_p.h"

using namespace FWC;

FramelessWindowConverter::FramelessWindowConverter() : d_ptr(FramelessWindowConverterPrivate::create(this)),
windowHandle(0), minimumWindowWidth(-1), minimumWindowHeight(-1) ,maximumWindowWidth(-1), maximumWindowHeight(-1)
{

}

FramelessWindowConverter::~FramelessWindowConverter()
{
delete d_ptr;
}

void FramelessWindowConverter::convertWindowToFrameless(unsigned long long inWindowHandle, std::function<void(void)> inReleaseMouseGrab)
{
bIsFramless = true;
windowHandle = inWindowHandle;
setReleaseMouseGrab(inReleaseMouseGrab);
d_ptr->convertToFrameless();
}

void FramelessWindowConverter::toggleWindowFrameAfterConversion()
{
bIsFramless = !bIsFramless;
if(bIsFramless) d_ptr->convertToWindowWithFrame();
else d_ptr->convertToFrameless();
}

bool FramelessWindowConverter::getIsFrameless()
{
return bIsFramless;
}

void FramelessWindowConverter::setEnableResizing(bool inEnableResizing) { bEnableResizing = inEnableResizing; }
bool FramelessWindowConverter::getEnableResizing() { return bEnableResizing; }

bool FramelessWindowConverter::filterNativeEvents(void *message, long *result)
{
if(bIsFramless)
return d_ptr->filterNativeEvent(message, result);
else return false;
}

void FramelessWindowConverter::setShouldPerformWindowDrag(std::function<bool(int,int)> inShouldPerformWindowDrag)
{
if(inShouldPerformWindowDrag != nullptr) shouldPerformWindowDrag = inShouldPerformWindowDrag;
else shouldPerformWindowDrag = [](int, int ) { return true; };
}

void FramelessWindowConverter::setReleaseMouseGrab(std::function<void(void)> inReleaseMouseGrab)
{
if(inReleaseMouseGrab != nullptr) releaseMouseGrab = inReleaseMouseGrab;
else releaseMouseGrab = []() {};
}

void FramelessWindowConverter::minimizeWindow()
{
d_ptr->minimizeWindow();
}

void FramelessWindowConverter::maximizeWindow()
{
d_ptr->maximizeWindow();
}

void FramelessWindowConverter::closeWindow()
{
d_ptr->closeWindow();
}

void FramelessWindowConverter::restoreWindow()
{
d_ptr->restoreWindow();
}

void FramelessWindowConverter::toggleFullscreen()
{
d_ptr->toggleFullscreen();
}

void FramelessWindowConverter::hideForTranslucency()
{
d_ptr->hideForTranslucency();
}

void FramelessWindowConverter::showForTranslucency()
{
d_ptr->showForTranslucency();
}

void FramelessWindowConverter::setEnableShadow(bool inEnableShadow)
{
bHasShadow = inEnableShadow;
d_ptr->setEnableShadow();
}

bool FramelessWindowConverter::getHasShadow()
{
return bHasShadow;
}

void FramelessWindowConverter::setBorderWidth(int inBorderWidth) { borderWidth = inBorderWidth; }
int FramelessWindowConverter::getBorderWidth() { return borderWidth; }

int FramelessWindowConverter::getMinimumWindowWidth() { return minimumWindowWidth; }
int FramelessWindowConverter::getMinimumWindowHeight() { return minimumWindowHeight; }
int FramelessWindowConverter::getMaximumWindowWidth() { return maximumWindowWidth; }
int FramelessWindowConverter::getMaximumWindowHeight() { return maximumWindowHeight; }

void FramelessWindowConverter::setMinimumWindowWidth(int inWidth) { minimumWindowWidth = inWidth; }
void FramelessWindowConverter::setMinimumWindowHeight(int inHeight) { minimumWindowHeight = inHeight; }
void FramelessWindowConverter::setMaximumWindowWidth(int inWidth) { maximumWindowWidth = inWidth; }
void FramelessWindowConverter::setMaximumWindowHeight(int inHeight) { maximumWindowHeight = inHeight; }

void FramelessWindowConverter::setMinMaxWindowSizes(int inMinWidth, int inMinHeight, int inMaxWidth, int inMaxHeight)
{
minimumWindowWidth = inMinWidth;
minimumWindowHeight = inMinHeight;
maximumWindowWidth = inMaxWidth;
maximumWindowHeight = inMaxHeight;
}

void FramelessWindowConverter::useTrafficLightsOnMacOS(bool inUseTrafficLights)
{
bUseTrafficLights = inUseTrafficLights;
}

bool FramelessWindowConverter::isUsingTrafficLightsOnMacOS()
{
return bUseTrafficLights;
}

void FramelessWindowConverter::setHiddenGreenTrafficLightOnMacOS(bool inHidden) { bHiddenGreen = inHidden; d_ptr->setHiddenGreenTrafficLightOnMacOS(inHidden); }
void FramelessWindowConverter::setHiddenRedTrafficLightOnMacOS(bool inHidden) { bHiddenRed = inHidden; d_ptr->setHiddenRedTrafficLightOnMacOS(inHidden); }
void FramelessWindowConverter::setHiddenYellowTrafficLightOnMacOS(bool inHidden) { bHiddenYellow = inHidden; d_ptr->setHiddenYellowTrafficLightOnMacOS(inHidden); }

bool FramelessWindowConverter::getHiddenGreenTrafficLightOnMacOS() { return bHiddenGreen; }
bool FramelessWindowConverter::getHiddenRedTrafficLightOnMacOS() { return bHiddenRed; }
bool FramelessWindowConverter::getHiddenYellowTrafficLightOnMacOS() { return bHiddenYellow; }

void FramelessWindowConverter::setEnabledGreenTrafficLightOnMacOS(bool inEnabled) { bEnabledGreen = inEnabled; d_ptr->setEnabledGreenTrafficLightOnMacOS(inEnabled); }
void FramelessWindowConverter::setEnabledRedTrafficLightOnMacOS(bool inEnabled) { bEnabledRed = inEnabled; d_ptr->setEnabledRedTrafficLightOnMacOS(inEnabled);}
void FramelessWindowConverter::setEnabledYellowTrafficLightOnMacOS(bool inEnabled) { bEnabledYellow = inEnabled; d_ptr->setEnabledYellowTrafficLightOnMacOS(inEnabled);}

bool FramelessWindowConverter::getEnabledGreenTrafficLightOnMacOS() { return bEnabledGreen; }
bool FramelessWindowConverter::getEnabledRedTrafficLightOnMacOS() { return bEnabledRed; }
bool FramelessWindowConverter::getEnabledYellowTrafficLightOnMacOS() { return bEnabledYellow; }

void FramelessWindowConverter::setHorizontalAlignmentOfTrafficLightsOnMacOS(bool inHorizontal) { bTrafficLightsAlignmentHorizontal = inHorizontal; d_ptr->setHorizontalAlignmentOfTrafficLightsOnMacOS(); }
bool FramelessWindowConverter::getHorizontalAlignmentOfTrafficLightsOnMacOS() { return bTrafficLightsAlignmentHorizontal; }

void FramelessWindowConverter::setUpperLeftXPositionOfTrafficLightsOnMacOS(int inXPos) { xPosOfTrafficLights = inXPos; d_ptr->setUpperLeftXPositionOfTrafficLightsOnMacOS(); }
void FramelessWindowConverter::setUpperLeftYPositionOfTrafficLightsOnMacOS(int inYPos) { yPosOfTrafficLights = inYPos; d_ptr->setUpperLeftYPositionOfTrafficLightsOnMacOS(); }
int FramelessWindowConverter::getUpperLeftXPositionOfTrafficLightsOnMacOS() { return xPosOfTrafficLights; }
int FramelessWindowConverter::getUpperLeftYPositionOfTrafficLightsOnMacOS() { return yPosOfTrafficLights; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
#ifndef WINDOWFRAME_H
#define WINDOWFRAME_H

#include <functional>

namespace FWC
{

class FramelessWindowConverter
{
public:
FramelessWindowConverter();
virtual ~FramelessWindowConverter();

virtual bool filterNativeEvents(void* message, long *result) final;

void convertWindowToFrameless(unsigned long long inWindowHandle, std::function<void(void)> releaseMouseGrab = [](){});

void toggleWindowFrameAfterConversion();
bool getIsFrameless();

inline unsigned long long getWindowHandle() { return windowHandle; }
inline std::function<bool(int,int)> getShouldPerformWindowDrag() { return shouldPerformWindowDrag; }

// Decide if the window should be dragged when a mouse click was detected at current mouse Position
// default inShouldPerformWindowDrag means you can click anywhere in the window to move it
void setShouldPerformWindowDrag(std::function<bool(int,int)> inShouldPerformWindowDrag);

// Release Mouse Grab to give the window manager control over it
inline std::function<void(void)> getReleaseMouseGrab() { return releaseMouseGrab; }
void setReleaseMouseGrab(std::function<void(void)> inReleaseMouseGrab);

// Border Width for resizing (default is 8 pixels)
void setBorderWidth(int inBorderWidth);
int getBorderWidth();
void setEnableResizing(bool inEnableResizing);
bool getEnableResizing();

// Minimum and maximum window sizes
int getMinimumWindowWidth();
int getMinimumWindowHeight();
int getMaximumWindowWidth();
int getMaximumWindowHeight();

void setMinimumWindowWidth(int inWidth);
void setMinimumWindowHeight(int inHeight);
void setMaximumWindowWidth(int inWidth);
void setMaximumWindowHeight(int inHeight);

void setMinMaxWindowSizes(int inMinWidth, int inMinHeight, int inMaxWidth, int inMaxHeight);

// Window control
void hideForTranslucency();
void showForTranslucency();
void minimizeWindow();
void maximizeWindow();
void restoreWindow();
void closeWindow();
void toggleFullscreen();

// Only works on macOS and Windows
void setEnableShadow(bool inEnableShadow);
bool getHasShadow();

// macOS settings
void useTrafficLightsOnMacOS(bool inUseTrafficLights);
bool isUsingTrafficLightsOnMacOS();

// Hide/Show or Enable/Disable individual traffic lights on macOS
void setHiddenGreenTrafficLightOnMacOS(bool inHidden);
void setHiddenRedTrafficLightOnMacOS(bool inHidden);
void setHiddenYellowTrafficLightOnMacOS(bool inHidden);
bool getHiddenGreenTrafficLightOnMacOS();
bool getHiddenRedTrafficLightOnMacOS();
bool getHiddenYellowTrafficLightOnMacOS();

void setEnabledGreenTrafficLightOnMacOS(bool inEnabled);
void setEnabledRedTrafficLightOnMacOS(bool inEnabled);
void setEnabledYellowTrafficLightOnMacOS(bool inEnabled);
bool getEnabledGreenTrafficLightOnMacOS();
bool getEnabledRedTrafficLightOnMacOS();
bool getEnabledYellowTrafficLightOnMacOS();

// Positions are relative to upper left window corner
void setHorizontalAlignmentOfTrafficLightsOnMacOS(bool inHorizontal);
bool getHorizontalAlignmentOfTrafficLightsOnMacOS();
void setUpperLeftXPositionOfTrafficLightsOnMacOS(int inXPos);
void setUpperLeftYPositionOfTrafficLightsOnMacOS(int inYPos);
int getUpperLeftXPositionOfTrafficLightsOnMacOS();
int getUpperLeftYPositionOfTrafficLightsOnMacOS();

private:
class FramelessWindowConverterPrivate* d_ptr;
unsigned long long windowHandle;
std::function<bool(int,int)> shouldPerformWindowDrag = [](int, int) { return true; };
std::function<void(void)> releaseMouseGrab;
int borderWidth = 8;
int minimumWindowWidth;
int minimumWindowHeight;
int maximumWindowWidth;
int maximumWindowHeight;
bool bUseTrafficLights = false;
bool bIsFramless = false;
bool bHasShadow = false;
bool bEnableResizing = true;

// macOS Settings
bool bHiddenGreen = false;
bool bHiddenRed = false;
bool bHiddenYellow = false;

bool bEnabledGreen = true;
bool bEnabledRed = true;
bool bEnabledYellow = true;

// Default is horizontal
bool bTrafficLightsAlignmentHorizontal = true;
int xPosOfTrafficLights = 7, yPosOfTrafficLights = 3;
};

}

#endif // WINDOWFRAME_H
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
win32:LIBS += -luser32
macx:LIBS += -framework ApplicationServices -framework Carbon -framework AppKit
unix:!macx:LIBS += -lX11 -lxcb -lX11-xcb

INCLUDEPATH += $$PWD/..

SOURCES += $$PWD/FramelessWindowConverter.cpp \
$$PWD/FramelessWindowConverter_p.cpp \
$$PWD/FramelessWindowConverterLinux.cpp \
$$PWD/FramelessWindowConverterWindows.cpp

HEADERS += \
$$PWD/FramelessWindowConverter.h \
$$PWD/FramelessWindowConverter_p.h \
$$PWD/FramelessWindowConverterLinux.h \
$$PWD/FramelessWindowConverterMacos.h \
$$PWD/FramelessWindowConverterWindows.h

OBJECTIVE_SOURCES += $$PWD/FramelessWindowConverterMacos.mm
Loading

0 comments on commit f378019

Please sign in to comment.