Add temp vars for window position and size

This commit is contained in:
WarmUpTill 2026-05-17 20:01:04 +02:00
parent 20c276f4ea
commit ee1d0136d9
5 changed files with 101 additions and 0 deletions

View File

@ -2287,6 +2287,14 @@ AdvSceneSwitcher.tempVar.scene.position="Position in scenes list"
AdvSceneSwitcher.tempVar.window.window="Window title"
AdvSceneSwitcher.tempVar.window.window.description="The window title of the matching window."
AdvSceneSwitcher.tempVar.window.windowX="Window X position"
AdvSceneSwitcher.tempVar.window.windowX.description="The X position (left edge) of the matching window in screen coordinates."
AdvSceneSwitcher.tempVar.window.windowY="Window Y position"
AdvSceneSwitcher.tempVar.window.windowY.description="The Y position (top edge) of the matching window in screen coordinates."
AdvSceneSwitcher.tempVar.window.windowWidth="Window width"
AdvSceneSwitcher.tempVar.window.windowWidth.description="The width of the matching window in pixels."
AdvSceneSwitcher.tempVar.window.windowHeight="Window height"
AdvSceneSwitcher.tempVar.window.windowHeight.description="The height of the matching window in pixels."
AdvSceneSwitcher.tempVar.window.windowClass="Window class"
AdvSceneSwitcher.tempVar.window.windowClass.description="The window class of the matching window."
AdvSceneSwitcher.tempVar.window.windowText="Window text"

View File

@ -352,6 +352,41 @@ std::optional<std::string> GetTextInWindow(const std::string &)
return {};
}
std::optional<WindowGeometry> GetWindowGeometry(const std::string &title)
{
auto display = disp();
if (!display) {
return {};
}
for (auto window : getTopLevelWindows()) {
if (getWindowName(window) != title) {
continue;
}
XWindowAttributes attrs;
if (!XGetWindowAttributes(display, window, &attrs)) {
return {};
}
int x = 0;
int y = 0;
Window child;
XTranslateCoordinates(display, window,
DefaultRootWindow(display), 0, 0, &x, &y,
&child);
WindowGeometry geo;
geo.x = x;
geo.y = y;
geo.width = attrs.width;
geo.height = attrs.height;
return geo;
}
return {};
}
static void getProcessListProcps(QStringList &processes)
{
#ifdef PROCPS_AVAILABLE

View File

@ -11,11 +11,20 @@ namespace advss {
enum class HotkeyType;
struct WindowGeometry {
int x = 0;
int y = 0;
int width = 0;
int height = 0;
};
EXPORT std::vector<std::string> GetWindowList();
EXPORT std::string GetCurrentWindowTitle();
EXPORT bool IsFullscreen(const std::string &title);
EXPORT bool IsMaximized(const std::string &title);
EXPORT std::optional<std::string> GetTextInWindow(const std::string &window);
EXPORT std::optional<WindowGeometry>
GetWindowGeometry(const std::string &title);
EXPORT int SecondsSinceLastInput();
EXPORT QStringList GetProcessList();
EXPORT std::string GetForegroundProcessName();

View File

@ -345,6 +345,26 @@ bool IsFullscreen(const std::string &title)
return false;
}
std::optional<WindowGeometry> GetWindowGeometry(const std::string &title)
{
HWND hwnd = getHWNDfromTitle(title);
if (!hwnd) {
return {};
}
RECT rect;
if (!GetWindowRect(hwnd, &rect)) {
return {};
}
WindowGeometry geo;
geo.x = rect.left;
geo.y = rect.top;
geo.width = rect.right - rect.left;
geo.height = rect.bottom - rect.top;
return geo;
}
QStringList GetProcessList()
{
QStringList processes;

View File

@ -107,6 +107,15 @@ void MacroConditionWindow::SetVariableValueBasedOnMatch(
const std::string &matchWindow)
{
SetTempVarValue("window", matchWindow);
const auto geo = GetWindowGeometry(matchWindow);
if (geo) {
SetTempVarValue("windowX", std::to_string(geo->x));
SetTempVarValue("windowY", std::to_string(geo->y));
SetTempVarValue("windowWidth", std::to_string(geo->width));
SetTempVarValue("windowHeight", std::to_string(geo->height));
}
#ifdef _WIN32
SetTempVarValue("windowClass",
GetWindowClassByWindowTitle(matchWindow));
@ -201,6 +210,26 @@ void MacroConditionWindow::SetupTempVars()
obs_module_text("AdvSceneSwitcher.tempVar.window.window"),
obs_module_text(
"AdvSceneSwitcher.tempVar.window.window.description"));
AddTempvar(
"windowX",
obs_module_text("AdvSceneSwitcher.tempVar.window.windowX"),
obs_module_text(
"AdvSceneSwitcher.tempVar.window.windowX.description"));
AddTempvar(
"windowY",
obs_module_text("AdvSceneSwitcher.tempVar.window.windowY"),
obs_module_text(
"AdvSceneSwitcher.tempVar.window.windowY.description"));
AddTempvar(
"windowWidth",
obs_module_text("AdvSceneSwitcher.tempVar.window.windowWidth"),
obs_module_text(
"AdvSceneSwitcher.tempVar.window.windowWidth.description"));
AddTempvar(
"windowHeight",
obs_module_text("AdvSceneSwitcher.tempVar.window.windowHeight"),
obs_module_text(
"AdvSceneSwitcher.tempVar.window.windowHeight.description"));
#ifdef _WIN32
AddTempvar(
"windowClass",