fix: 修复了一些已知问题;

Description:

Log:
This commit is contained in:
mikigo 2023-12-21 13:45:07 +08:00
parent 0df41b502d
commit 4249f2465e
3 changed files with 44 additions and 19 deletions

View File

@ -220,6 +220,7 @@ class _GlobalConfig:
PyPI_URL = "https://pypi.org/project/youqu"
LETMEGO_DEBUG = True
DTK_DISPLAY = False
GlobalConfig = _GlobalConfig()

View File

@ -14,10 +14,10 @@ import dbus
from setting.globalconfig import GlobalConfig
from src import logger
from src.cmdctl import CmdCtl
from src.shortcut import ShortCut
from src.custom_exception import ApplicationStartError
from src.custom_exception import GetWindowInformation
from src.custom_exception import NoSetReferencePoint
from src.shortcut import ShortCut
from src.wayland_wininfo import WaylandWindowInfo
@ -41,8 +41,8 @@ class ButtonCenter:
self.pause = pause
self.config_path = config_path
self.retry = retry
if GlobalConfig.IS_WAYLAND:
self.wayland_info_obj = WaylandWindowInfo()
# if GlobalConfig.IS_WAYLAND:
# self.wwininfo = WaylandWindowInfo()
def window_info(self):
"""
@ -71,9 +71,10 @@ class ButtonCenter:
raise ApplicationStartError(f"{self.app_name, exc}") from exc
elif GlobalConfig.IS_WAYLAND:
if hasattr(self.wayland_info_obj.library, "GetAllWindowStatesList"):
self.wwininfo = WaylandWindowInfo()
if hasattr(self.wwininfo.library, "GetAllWindowStatesList"):
for _ in range(self.retry + 1):
info = self.wayland_info_obj.window_info().get(self.app_name)
info = self.wwininfo.window_info().get(self.app_name)
if info is None:
sleep(1)
else:
@ -89,7 +90,7 @@ class ButtonCenter:
dbus.Interface(proxy_object, "org.kde.KWin").WindowMove()
sleep(self.pause)
ShortCut.esc()
return self.wayland_info_obj._window_info()
return self.wwininfo._window_info()
return None
def window_location_and_sizes(self):
@ -113,7 +114,8 @@ class ButtonCenter:
window_height = re.findall(r"Height.*:\s(\d+)", app_window_info)[0]
window_x, window_y = result
else:
if hasattr(self.wayland_info_obj.library, "GetAllWindowStatesList"):
self.wwininfo = WaylandWindowInfo()
if hasattr(self.wwininfo.library, "GetAllWindowStatesList"):
app_window_info = self.window_info()
window_x, window_y, window_width, window_height = app_window_info.get("location")
else:
@ -144,7 +146,8 @@ class ButtonCenter:
result = re.findall(re_pattern, self.window_info())
window_x, window_y = result
else:
if hasattr(self.wayland_info_obj.library, "GetAllWindowStatesList"):
self.wwininfo = WaylandWindowInfo()
if hasattr(self.wwininfo.library, "GetAllWindowStatesList"):
window_x, window_y, window_width, window_height = app_window_info.get("location")
else:
window_x, window_y, window_width, window_height = app_window_info.get("wininfo")
@ -164,7 +167,8 @@ class ButtonCenter:
window_width = re.findall(r"Width.*:\s(\d+)", app_window_info)[0]
window_height = re.findall(r"Height.*:\s(\d+)", app_window_info)[0]
else:
if hasattr(self.wayland_info_obj.library, "GetAllWindowStatesList"):
self.wwininfo = WaylandWindowInfo()
if hasattr(self.wwininfo.library, "GetAllWindowStatesList"):
window_x, window_y, window_width, window_height = app_window_info.get("location")
else:
window_x, window_y, window_width, window_height = app_window_info.get("wininfo")
@ -584,7 +588,7 @@ class ButtonCenter:
).strip()
return len([i for i in app_id.split("\n") if i])
else:
info = self.wayland_info_obj.window_info().get(self.app_name)
info = self.wwininfo.window_info().get(self.app_name)
if isinstance(info, dict):
return 1
elif isinstance(info, list):
@ -605,7 +609,7 @@ class ButtonCenter:
return [i for i in app_id.split("\n") if i]
raise ApplicationStartError(app_id)
else:
info = self.wayland_info_obj.window_info().get(self.app_name)
info = self.wwininfo.window_info().get(self.app_name)
if isinstance(info, dict):
return info.get("window_id")
elif isinstance(info, list):
@ -643,7 +647,7 @@ class ButtonCenter:
except Exception as exc:
raise ApplicationStartError(f"{app_name, exc}") from exc
else:
info = self.wayland_info_obj.window_info().get(self.app_name)
info = self.wwininfo.window_info().get(self.app_name)
if isinstance(info, dict):
return info.get("window_id")
elif isinstance(info, list):

View File

@ -5,6 +5,7 @@
# SPDX-License-Identifier: GPL-2.0-only
import os
from time import sleep
from setting.globalconfig import GlobalConfig
@ -72,15 +73,22 @@ class WaylandWindowInfo:
def __init__(self):
self.library = ctypes.cdll.LoadLibrary(f"/usr/lib/{machine()}-linux-gnu/libdtkwmjack.so")
if not GlobalConfig.DTK_DISPLAY:
self.init_dtk_display()
GlobalConfig.DTK_DISPLAY = True
def init_dtk_display(self):
self.library.InitDtkWmDisplay()
def destory_dtk_display(self):
self.library.DestoryDtkWmDisplay()
def _window_info(self):
"""窗口信息"""
self.library.InitDtkWmDisplay()
self.library.GetWindowFromPoint.restype = ctypes.c_int
wid = self.library.GetWindowFromPoint()
self.library.GetWindowState.restype = ctypes.POINTER(WindowStructure)
ws = self.library.GetWindowState(wid)
self.library.DestoryDtkWmDisplay()
window_info = ws.contents.Geometry
resourceName = ws.contents.resourceName.decode("utf-8")
if not resourceName:
@ -97,11 +105,18 @@ class WaylandWindowInfo:
def window_info(self):
"""窗口信息"""
self.library.InitDtkWmDisplay()
self.library.GetAllWindowStatesList.restype = ctypes.POINTER(dtk_array)
_e = None
for _ in range(3):
try:
get_all_window_states_list = self.library.GetAllWindowStatesList()
self.library.DestoryDtkWmDisplay()
range_index = get_all_window_states_list.contents.size / 544
break
except ValueError as e:
_e = e
sleep(1)
else:
raise ValueError(_e)
res = {}
for i in range(int(range_index)):
window_info = get_all_window_states_list.contents.data[i]
@ -133,4 +148,9 @@ class WaylandWindowInfo:
if __name__ == '__main__':
WaylandWindowInfo().window_info()
wwininfo = WaylandWindowInfo()
wwininfo.library.InitDtkWmDisplay()
for i in range(100):
print(wwininfo.window_info())
sleep(1)
wwininfo.library.DestoryDtkWmDisplay()