Allow the user to disallow a restore token

This commit is contained in:
vaxerski 2023-08-30 13:05:00 +02:00
parent 747988ed9d
commit 2c8eb43704
5 changed files with 89 additions and 39 deletions

View file

@ -86,10 +86,12 @@ int main(int argc, char* argv[]) {
// get the tabwidget // get the tabwidget
const auto TABWIDGET = (QTabWidget*)w.children()[1]->children()[0]; const auto TABWIDGET = (QTabWidget*)w.children()[1]->children()[0];
const auto ALLOWTOKENBUTTON = (QCheckBox*)w.children()[1]->children()[1];
const auto TAB1 = (QWidget*)TABWIDGET->children()[0]; const auto TAB1 = (QWidget*)TABWIDGET->children()[0];
const auto SCREENS_SCROLL_AREA_CONTENTS = (QWidget*)TAB1->findChild<QWidget*>("screens")->findChild<QScrollArea*>("scrollArea")->findChild<QWidget*>("scrollAreaWidgetContents"); const auto SCREENS_SCROLL_AREA_CONTENTS =
(QWidget*)TAB1->findChild<QWidget*>("screens")->findChild<QScrollArea*>("scrollArea")->findChild<QWidget*>("scrollAreaWidgetContents");
// add all screens // add all screens
const auto SCREENS = picker.screens(); const auto SCREENS = picker.screens();
@ -101,7 +103,9 @@ int main(int argc, char* argv[]) {
for (int i = 0; i < SCREENS.size(); ++i) { for (int i = 0; i < SCREENS.size(); ++i) {
const auto GEOMETRY = SCREENS[i]->geometry(); const auto GEOMETRY = SCREENS[i]->geometry();
QString text = QString::fromStdString(std::string("Screen " + std::to_string(i) + " at " + std::to_string(GEOMETRY.x()) + ", " + std::to_string(GEOMETRY.y()) + " (" + std::to_string(GEOMETRY.width()) + "x" + std::to_string(GEOMETRY.height()) + ") (") + SCREENS[i]->name().toStdString() + ")"); QString text = QString::fromStdString(std::string("Screen " + std::to_string(i) + " at " + std::to_string(GEOMETRY.x()) + ", " + std::to_string(GEOMETRY.y()) + " (" +
std::to_string(GEOMETRY.width()) + "x" + std::to_string(GEOMETRY.height()) + ") (") +
SCREENS[i]->name().toStdString() + ")");
QPushButton* button = new QPushButton(text, (QWidget*)SCREENS_SCROLL_AREA_CONTENTS); QPushButton* button = new QPushButton(text, (QWidget*)SCREENS_SCROLL_AREA_CONTENTS);
button->move(9, 5 + (BUTTON_HEIGHT + BUTTON_PAD) * i); button->move(9, 5 + (BUTTON_HEIGHT + BUTTON_PAD) * i);
button->resize(BUTTON_WIDTH, BUTTON_HEIGHT); button->resize(BUTTON_WIDTH, BUTTON_HEIGHT);
@ -110,6 +114,9 @@ int main(int argc, char* argv[]) {
ID = ID.substr(ID.find_last_of('(') + 1); ID = ID.substr(ID.find_last_of('(') + 1);
ID = ID.substr(0, ID.find_last_of(')')); ID = ID.substr(0, ID.find_last_of(')'));
std::cout << (ALLOWTOKENBUTTON->isChecked() ? "r" : "");
std::cout << "/";
std::cout << "screen:" << ID << "\n"; std::cout << "screen:" << ID << "\n";
pickerPtr->quit(); pickerPtr->quit();
return 0; return 0;
@ -119,7 +126,8 @@ int main(int argc, char* argv[]) {
SCREENS_SCROLL_AREA_CONTENTS->resize(SCREENS_SCROLL_AREA_CONTENTS->size().width(), 5 + (BUTTON_HEIGHT + BUTTON_PAD) * SCREENS.size()); SCREENS_SCROLL_AREA_CONTENTS->resize(SCREENS_SCROLL_AREA_CONTENTS->size().width(), 5 + (BUTTON_HEIGHT + BUTTON_PAD) * SCREENS.size());
// windows // windows
const auto WINDOWS_SCROLL_AREA_CONTENTS = (QWidget*)TAB1->findChild<QWidget*>("windows")->findChild<QScrollArea*>("scrollArea_2")->findChild<QWidget*>("scrollAreaWidgetContents_2"); const auto WINDOWS_SCROLL_AREA_CONTENTS =
(QWidget*)TAB1->findChild<QWidget*>("windows")->findChild<QScrollArea*>("scrollArea_2")->findChild<QWidget*>("scrollAreaWidgetContents_2");
// loop over them // loop over them
int windowIterator = 0; int windowIterator = 0;
@ -133,6 +141,9 @@ int main(int argc, char* argv[]) {
mainPickerPtr->windowIDs[button] = window.id; mainPickerPtr->windowIDs[button] = window.id;
QObject::connect(button, &QPushButton::clicked, [=]() { QObject::connect(button, &QPushButton::clicked, [=]() {
std::cout << (ALLOWTOKENBUTTON->isChecked() ? "r" : "");
std::cout << "/";
std::cout << "window:" << mainPickerPtr->windowIDs[button] << "\n"; std::cout << "window:" << mainPickerPtr->windowIDs[button] << "\n";
pickerPtr->quit(); pickerPtr->quit();
return 0; return 0;
@ -188,6 +199,9 @@ int main(int argc, char* argv[]) {
REGION = REGION.substr(REGION.find_first_of(' ') + 1); REGION = REGION.substr(REGION.find_first_of(' ') + 1);
const auto H = std::stoi(REGION); const auto H = std::stoi(REGION);
std::cout << (ALLOWTOKENBUTTON->isChecked() ? "r" : "");
std::cout << "/";
std::cout << "region:" << SCREEN_NAME << "@" << X - pScreen->geometry().x() << "," << Y - pScreen->geometry().y() << "," << W << "," << H << "\n"; std::cout << "region:" << SCREEN_NAME << "@" << X - pScreen->geometry().x() << "," << Y - pScreen->geometry().y() << "," << W << "," << H << "\n";
pickerPtr->quit(); pickerPtr->quit();
return 0; return 0;

View file

@ -66,7 +66,7 @@
<enum>QTabWidget::North</enum> <enum>QTabWidget::North</enum>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>1</number>
</property> </property>
<widget class="QWidget" name="screens"> <widget class="QWidget" name="screens">
<attribute name="title"> <attribute name="title">
@ -78,9 +78,12 @@
<x>9</x> <x>9</x>
<y>9</y> <y>9</y>
<width>461</width> <width>461</width>
<height>241</height> <height>201</height>
</rect> </rect>
</property> </property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="widgetResizable"> <property name="widgetResizable">
<bool>false</bool> <bool>false</bool>
</property> </property>
@ -115,9 +118,12 @@
<x>9</x> <x>9</x>
<y>9</y> <y>9</y>
<width>461</width> <width>461</width>
<height>241</height> <height>201</height>
</rect> </rect>
</property> </property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="widgetResizable"> <property name="widgetResizable">
<bool>false</bool> <bool>false</bool>
</property> </property>
@ -148,6 +154,22 @@
</attribute> </attribute>
</widget> </widget>
</widget> </widget>
<widget class="QCheckBox" name="checkBox">
<property name="geometry">
<rect>
<x>340</x>
<y>256</y>
<width>140</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>By selecting this, the application will be given a restore token that it can use to skip prompting you next time. Only select if you trust the application.</string>
</property>
<property name="text">
<string>Allow a restore token</string>
</property>
</widget>
</widget> </widget>
</widget> </widget>
<tabstops> <tabstops>

View file

@ -539,7 +539,7 @@ void CScreencopyPortal::onStart(sdbus::MethodCall& call) {
std::unordered_map<std::string, sdbus::Variant> options; std::unordered_map<std::string, sdbus::Variant> options;
if (PSESSION->persistMode != 0) { if (PSESSION->persistMode != 0 && PSESSION->selection.allowToken) {
// give them a token :) // give them a token :)
std::unordered_map<std::string, sdbus::Variant> mapData; std::unordered_map<std::string, sdbus::Variant> mapData;
@ -564,6 +564,8 @@ void CScreencopyPortal::onStart(sdbus::MethodCall& call) {
sdbus::Variant restoreData{mapData}; sdbus::Variant restoreData{mapData};
sdbus::Struct<std::string, uint32_t, sdbus::Variant> fullRestoreStruct{"hyprland", 3, restoreData}; sdbus::Struct<std::string, uint32_t, sdbus::Variant> fullRestoreStruct{"hyprland", 3, restoreData};
options["restore_data"] = sdbus::Variant{fullRestoreStruct}; options["restore_data"] = sdbus::Variant{fullRestoreStruct};
Debug::log(LOG, "[screencopy] Sent restore token to {}", PSESSION->sessionHandle.c_str());
} }
uint32_t type = 0; uint32_t type = 0;

View file

@ -49,14 +49,25 @@ SSelectionData promptForScreencopySelection() {
Debug::log(LOG, "[sc] Selection: {}", RETVAL); Debug::log(LOG, "[sc] Selection: {}", RETVAL);
if (RETVAL.find("screen:") == 0) { const auto FLAGS = RETVAL.substr(0, RETVAL.find_first_of('/'));
const auto SEL = RETVAL.substr(RETVAL.find_first_of('/') + 1);
for (auto& flag : FLAGS) {
if (flag == 'r') {
data.allowToken = true;
} else {
Debug::log(LOG, "[screencopy] unknown flag from share-picker: {}", flag);
}
}
if (SEL.find("screen:") == 0) {
data.type = TYPE_OUTPUT; data.type = TYPE_OUTPUT;
data.output = RETVAL.substr(7); data.output = SEL.substr(7);
data.output.pop_back(); data.output.pop_back();
} else if (RETVAL.find("window:") == 0) { } else if (SEL.find("window:") == 0) {
data.type = TYPE_WINDOW; data.type = TYPE_WINDOW;
uint32_t handleLo = std::stoull(RETVAL.substr(7)); uint32_t handleLo = std::stoull(SEL.substr(7));
data.windowHandle = nullptr; data.windowHandle = nullptr;
for (auto& e : g_pPortalManager->m_sHelpers.toplevel->m_vToplevels) { for (auto& e : g_pPortalManager->m_sHelpers.toplevel->m_vToplevels) {
@ -68,8 +79,8 @@ SSelectionData promptForScreencopySelection() {
} }
} }
} else if (RETVAL.find("region:") == 0) { } else if (SEL.find("region:") == 0) {
std::string running = RETVAL; std::string running = SEL;
running = running.substr(7); running = running.substr(7);
data.type = TYPE_GEOMETRY; data.type = TYPE_GEOMETRY;
data.output = running.substr(0, running.find_first_of('@')); data.output = running.substr(0, running.find_first_of('@'));

View file

@ -35,6 +35,7 @@ struct SSelectionData {
std::string output; std::string output;
zwlr_foreign_toplevel_handle_v1* windowHandle = nullptr; zwlr_foreign_toplevel_handle_v1* windowHandle = nullptr;
uint32_t x = 0, y = 0, w = 0, h = 0; // for TYPE_GEOMETRY uint32_t x = 0, y = 0, w = 0, h = 0; // for TYPE_GEOMETRY
bool allowToken = false;
}; };
struct wl_buffer; struct wl_buffer;