Skip to content
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ set(advanced-scene-switcher_HEADERS
src/headers/macro-condition-source.hpp
src/headers/macro-condition-streaming.hpp
src/headers/macro-condition-video.hpp
src/headers/macro-condition-virt-desktop.hpp
src/headers/macro-condition-window.hpp
src/headers/macro.hpp
src/headers/macro-selection.hpp
Expand Down Expand Up @@ -176,6 +177,7 @@ set(advanced-scene-switcher_SOURCES
src/macro-condition-source.cpp
src/macro-condition-streaming.cpp
src/macro-condition-video.cpp
src/macro-condition-virt-desktop.cpp
src/macro-condition-window.cpp
src/macro.cpp
src/macro-selection.cpp
Expand Down
4 changes: 4 additions & 0 deletions data/locale/en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,10 @@ AdvSceneSwitcher.condition.idle.entry="No keyboard or mouse inputs for {{duratio
AdvSceneSwitcher.condition.pluginState="Plugin state"
AdvSceneSwitcher.condition.pluginState.state.sceneSwitched="Automated scene change was triggered in this interval"
AdvSceneSwitcher.condition.pluginState.entry="{{condition}}"
AdvSceneSwitcher.condition.virtDesktop="Virtual desktop"
AdvSceneSwitcher.condition.virtDesktop.notAvailable="Not availbale"
AdvSceneSwitcher.condition.virtDesktop.entry.line1="Active virtual desktop is {{virtDesktops}}"
AdvSceneSwitcher.condition.virtDesktop.entry.line2="Current: {{currentDesktop}}"
AdvSceneSwitcher.condition.interval="Interval"
AdvSceneSwitcher.condition.interval.entry="{{duration}} have passed"
AdvSceneSwitcher.condition.counter="Count"
Expand Down
51 changes: 51 additions & 0 deletions src/headers/macro-condition-virt-desktop.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#pragma once
#include "macro.hpp"
#include <QWidget>
#include <QComboBox>

class MacroConditionVirtDesktop : public MacroCondition {
public:
bool CheckCondition();
bool Save(obs_data_t *obj);
bool Load(obs_data_t *obj);
std::string GetId() { return id; };
static std::shared_ptr<MacroCondition> Create()
{
return std::make_shared<MacroConditionVirtDesktop>();
}
long _desktop = 0;

private:
static bool _registered;
static const std::string id;
};

class MacroConditionVirtDesktopEdit : public QWidget {
Q_OBJECT

public:
MacroConditionVirtDesktopEdit(
QWidget *parent,
std::shared_ptr<MacroConditionVirtDesktop> cond = nullptr);
void UpdateEntryData();
static QWidget *Create(QWidget *parent,
std::shared_ptr<MacroCondition> cond)
{
return new MacroConditionVirtDesktopEdit(
parent,
std::dynamic_pointer_cast<MacroConditionVirtDesktop>(
cond));
}

private slots:
void DesktopChanged(int value);
void UpdateCurrentDesktop();

protected:
QComboBox *_virtDesktops;
QLabel *_currentDesktop;
std::shared_ptr<MacroConditionVirtDesktop> _entryData;

private:
bool _loading = true;
};
2 changes: 2 additions & 0 deletions src/headers/platform-funcs.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ std::pair<int, int> getCursorPos();
int secondsSinceLastInput();
void GetProcessList(QStringList &processes);
bool isInFocus(const QString &executable);
bool GetCurrentVirtualDesktop(long &desktop);
bool GetVirtualDesktopCount(long &ndesktops);
64 changes: 64 additions & 0 deletions src/linux/advanced-scene-switcher-nix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -393,3 +393,67 @@ int secondsSinceLastInput()

return idle_time;
}

bool GetCurrentVirtualDesktop(long &desktop)
{
Atom type;
long unsigned nitems;
long unsigned int bytes = 0;
int format = 0;
unsigned char *data;
Window root;
Atom request;
Display *display = disp();

//TODO check for _NET_CURRENT_DESKTOP
if (!ewmhIsSupported()) {
return false;
}

request = XInternAtom(display, "_NET_CURRENT_DESKTOP", False);
root = XDefaultRootWindow(display);

int status = XGetWindowProperty(display, root, request, 0L, 1L, false,
XA_CARDINAL, &type, &format, &nitems,
&bytes, &data);

if (status == Success && nitems > 0) {
desktop = *((long *)data);
} else {
desktop = -1;
}
free(data);
return desktop != -1;
}

bool GetVirtualDesktopCount(long &ndesktops)
{
Atom type;
long unsigned nitems;
long unsigned int bytes = 0;
int format = 0;
unsigned char *data;
Window root;
Atom request;
Display *display = disp();

//TODO check for _NET_NUMBER_OF_DESKTOPS
if (!ewmhIsSupported()) {
return false;
}

request = XInternAtom(display, "_NET_NUMBER_OF_DESKTOPS", False);
root = XDefaultRootWindow(display);

int status = XGetWindowProperty(display, root, request, 0L, 1L, false,
XA_CARDINAL, &type, &format, &nitems,
&bytes, &data);

if (status == Success && nitems > 0) {
ndesktops = *((long *)data);
} else {
ndesktops = 0;
}
free(data);
return ndesktops != 0;
}
113 changes: 113 additions & 0 deletions src/macro-condition-virt-desktop.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#include "headers/macro-condition-edit.hpp"
#include "headers/macro-condition-virt-desktop.hpp"
#include "headers/utility.hpp"
#include "headers/advanced-scene-switcher.hpp"

const std::string MacroConditionVirtDesktop::id = "virtual_desktop";

bool MacroConditionVirtDesktop::_registered = MacroConditionFactory::Register(
MacroConditionVirtDesktop::id,
{MacroConditionVirtDesktop::Create,
MacroConditionVirtDesktopEdit::Create,
"AdvSceneSwitcher.condition.virtDesktop"});

bool MacroConditionVirtDesktop::CheckCondition()
{
long curDesktop;
GetCurrentVirtualDesktop(curDesktop);
return _desktop == curDesktop;
}

bool MacroConditionVirtDesktop::Save(obs_data_t *obj)
{
MacroCondition::Save(obj);
obs_data_set_int(obj, "desktop", static_cast<int>(_desktop));
return true;
}

bool MacroConditionVirtDesktop::Load(obs_data_t *obj)
{
MacroCondition::Load(obj);
_desktop = obs_data_get_int(obj, "desktop");
return true;
}

static void populateVirtualDesktopSelection(QComboBox *list)
{
long count;
GetVirtualDesktopCount(count);

for (long i = 0; i < count; i++) {
list->addItem(std::to_string(i).c_str());
}
}

MacroConditionVirtDesktopEdit::MacroConditionVirtDesktopEdit(
QWidget *parent, std::shared_ptr<MacroConditionVirtDesktop> entryData)
: QWidget(parent)
{
_currentDesktop = new QLabel();
_currentDesktop->setTextInteractionFlags(Qt::TextSelectableByMouse);
_virtDesktops = new QComboBox();
QWidget::connect(_virtDesktops, SIGNAL(currentIndexChanged(int)), this,
SLOT(DesktopChanged(int)));
populateVirtualDesktopSelection(_virtDesktops);

QVBoxLayout *mainLayout = new QVBoxLayout;
QHBoxLayout *line1Layout = new QHBoxLayout;
QHBoxLayout *line2Layout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{virtDesktops}}", _virtDesktops},
{"{{currentDesktop}}", _currentDesktop},
};
placeWidgets(
obs_module_text(
"AdvSceneSwitcher.condition.virtDesktop.entry.line1"),
line1Layout, widgetPlaceholders);
placeWidgets(
obs_module_text(
"AdvSceneSwitcher.condition.virtDesktop.entry.line2"),
line2Layout, widgetPlaceholders);
mainLayout->addLayout(line1Layout);
mainLayout->addLayout(line2Layout);
setLayout(mainLayout);

// Current virtual desktop position
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(UpdateCurrentDesktop()));
timer->start(1000);

_entryData = entryData;
UpdateEntryData();
_loading = false;
}

void MacroConditionVirtDesktopEdit::DesktopChanged(int value)
{
if (_loading || !_entryData) {
return;
}

std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_desktop = value;
}

void MacroConditionVirtDesktopEdit::UpdateEntryData()
{
if (!_entryData) {
return;
}

_virtDesktops->setCurrentIndex(_entryData->_desktop);
}

void MacroConditionVirtDesktopEdit::UpdateCurrentDesktop()
{
long curDesktop;
if (GetCurrentVirtualDesktop(curDesktop)) {
_currentDesktop->setText(QString::number(curDesktop));
} else {
_currentDesktop->setText(obs_module_text(
"AdvSceneSwitcher.condition.virtDesktop.notAvailable"));
}
}
10 changes: 10 additions & 0 deletions src/osx/advanced-scene-switcher-osx.mm
Original file line number Diff line number Diff line change
Expand Up @@ -281,3 +281,13 @@ bool isInFocus(const QString &executable)

return (equals || matches);
}

bool GetCurrentVirtualDesktop(long &desktop)
{
return false;
}

bool GetVirtualDesktopCount(long &ndesktops)
{
return false;
}
Loading