-
Notifications
You must be signed in to change notification settings - Fork 310
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
11 changed files
with
2,226 additions
and
0 deletions.
There are no files selected for viewing
158 changes: 158 additions & 0 deletions
158
src/SARibbonBar/3rdparty/FramelessWindowConverter/FramelessWindowConverter.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; } |
123 changes: 123 additions & 0 deletions
123
src/SARibbonBar/3rdparty/FramelessWindowConverter/FramelessWindowConverter.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
19 changes: 19 additions & 0 deletions
19
src/SARibbonBar/3rdparty/FramelessWindowConverter/FramelessWindowConverter.pri
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.