134 lines
3.9 KiB
Python
134 lines
3.9 KiB
Python
# source: https://github.com/Opticos/GWSL-Source/blob/master/blur.py,
|
|
# https://www.cnblogs.com/zhiyiYo/p/14659981.html ,
|
|
# https://github.com/ifwe/digsby/blob/master/digsby/src/gui/vista.py
|
|
import platform
|
|
import ctypes
|
|
|
|
|
|
if platform.system() == 'Windows':
|
|
from ctypes.wintypes import DWORD, BOOL, HRGN, HWND
|
|
|
|
user32 = ctypes.windll.user32
|
|
dwm = ctypes.windll.dwmapi
|
|
|
|
|
|
class ACCENTPOLICY(ctypes.Structure):
|
|
_fields_ = [
|
|
("AccentState", ctypes.c_uint),
|
|
("AccentFlags", ctypes.c_uint),
|
|
("GradientColor", ctypes.c_uint),
|
|
("AnimationId", ctypes.c_uint)
|
|
]
|
|
|
|
|
|
class WINDOWCOMPOSITIONATTRIBDATA(ctypes.Structure):
|
|
_fields_ = [
|
|
("Attribute", ctypes.c_int),
|
|
("Data", ctypes.POINTER(ctypes.c_int)),
|
|
("SizeOfData", ctypes.c_size_t)
|
|
]
|
|
|
|
|
|
class DWM_BLURBEHIND(ctypes.Structure):
|
|
_fields_ = [
|
|
('dwFlags', DWORD),
|
|
('fEnable', BOOL),
|
|
('hRgnBlur', HRGN),
|
|
('fTransitionOnMaximized', BOOL)
|
|
]
|
|
|
|
|
|
class MARGINS(ctypes.Structure):
|
|
_fields_ = [("cxLeftWidth", ctypes.c_int),
|
|
("cxRightWidth", ctypes.c_int),
|
|
("cyTopHeight", ctypes.c_int),
|
|
("cyBottomHeight", ctypes.c_int)
|
|
]
|
|
|
|
|
|
SetWindowCompositionAttribute = user32.SetWindowCompositionAttribute
|
|
SetWindowCompositionAttribute.argtypes = (HWND, WINDOWCOMPOSITIONATTRIBDATA)
|
|
SetWindowCompositionAttribute.restype = ctypes.c_int
|
|
|
|
|
|
def ExtendFrameIntoClientArea(hwnd):
|
|
margins = MARGINS(-1, -1, -1, -1)
|
|
dwm.DwmExtendFrameIntoClientArea(hwnd, ctypes.byref(margins))
|
|
|
|
|
|
def Win7Blur(hwnd, Acrylic):
|
|
if not Acrylic:
|
|
DWM_BB_ENABLE = 0x01
|
|
bb = DWM_BLURBEHIND()
|
|
bb.dwFlags = DWM_BB_ENABLE
|
|
bb.fEnable = 1
|
|
bb.hRgnBlur = 1
|
|
dwm.DwmEnableBlurBehindWindow(hwnd, ctypes.byref(bb))
|
|
else:
|
|
ExtendFrameIntoClientArea(hwnd)
|
|
|
|
|
|
def HEXtoRGBAint(HEX: str):
|
|
alpha = HEX[7:]
|
|
blue = HEX[5:7]
|
|
green = HEX[3:5]
|
|
red = HEX[1:3]
|
|
|
|
gradient_color = alpha + blue + green + red
|
|
return int(gradient_color, base=16)
|
|
|
|
|
|
def blur(hwnd, hex_color=False, acrylic=False, dark=False):
|
|
accent = ACCENTPOLICY()
|
|
accent.AccentState = 3 # Default window Blur #ACCENT_ENABLE_BLURBEHIND
|
|
|
|
gradient_color = 0
|
|
|
|
if hex_color:
|
|
gradient_color = HEXtoRGBAint(hex_color)
|
|
accent.AccentFlags = 2 # Window Blur With Accent Color #ACCENT_ENABLE_TRANSPARENTGRADIENT
|
|
|
|
if acrylic:
|
|
accent.AccentState = 4 # UWP but LAG #ACCENT_ENABLE_ACRYLICBLURBEHIND
|
|
if not hex_color: # UWP without color is translucent
|
|
accent.AccentFlags = 2
|
|
gradient_color = HEXtoRGBAint('#12121240') # placeholder color
|
|
|
|
accent.GradientColor = gradient_color
|
|
|
|
data = WINDOWCOMPOSITIONATTRIBDATA()
|
|
data.Attribute = 19 # WCA_ACCENT_POLICY
|
|
data.SizeOfData = ctypes.sizeof(accent)
|
|
data.Data = ctypes.cast(ctypes.pointer(accent), ctypes.POINTER(ctypes.c_int))
|
|
|
|
SetWindowCompositionAttribute(int(hwnd), data)
|
|
|
|
if dark:
|
|
data.Attribute = 26 # WCA_USEDARKMODECOLORS
|
|
SetWindowCompositionAttribute(int(hwnd), data)
|
|
|
|
|
|
def BlurLinux(WID): # may not work in all distros (working in Deepin)
|
|
import os
|
|
|
|
c = "xprop -f _KDE_NET_WM_BLUR_BEHIND_REGION 32c -set _KDE_NET_WM_BLUR_BEHIND_REGION 0 -id " + str(WID)
|
|
os.system(c)
|
|
|
|
|
|
def GlobalBlur(hwnd, hex_color=False, acrylic=False, dark=False):
|
|
release = platform.release()
|
|
system = platform.system()
|
|
|
|
if system == 'Windows':
|
|
if release == 'Vista':
|
|
Win7Blur(hwnd, acrylic)
|
|
else:
|
|
release = int(float(release))
|
|
if release == 10 or release == 8 or release == 11:
|
|
blur(hwnd, hex_color, acrylic, dark)
|
|
else:
|
|
Win7Blur(hwnd, acrylic)
|
|
|
|
if system == 'Linux':
|
|
BlurLinux(hwnd)
|