Skip to content

Commit 736a351

Browse files
committed
This works amazingly well
1 parent 631cdf7 commit 736a351

File tree

4 files changed

+60
-20
lines changed

4 files changed

+60
-20
lines changed

src/cascadia/TerminalApp/AdminWarningPlaceholder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ namespace winrt::TerminalApp::implementation
3030
{
3131
return _control;
3232
}
33+
winrt::hstring AdminWarningPlaceholder::Commandline() { return _cmdline; }
3334

3435
}

src/cascadia/TerminalApp/AdminWarningPlaceholder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace winrt::TerminalApp::implementation
1313
AdminWarningPlaceholder(const winrt::Microsoft::Terminal::Control::TermControl& control, const winrt::hstring& cmdline);
1414

1515
winrt::Windows::UI::Xaml::Controls::UserControl Control();
16+
winrt::hstring Commandline();
1617

1718
TYPED_EVENT(PrimaryButtonClicked, TerminalApp::AdminWarningPlaceholder, winrt::Windows::UI::Xaml::RoutedEventArgs);
1819
TYPED_EVENT(CancelButtonClicked, TerminalApp::AdminWarningPlaceholder, winrt::Windows::UI::Xaml::RoutedEventArgs);

src/cascadia/TerminalApp/TabManagement.cpp

Lines changed: 54 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ namespace winrt::TerminalApp::implementation
251251
// - existingConnection: optionally receives a connection from the outside world instead of attempting to create one
252252
void TerminalPage::_CreateNewTabWithProfileAndSettings(Microsoft::Terminal::Settings::Model::Profile profile, Microsoft::Terminal::Settings::Model::TerminalSettingsCreateResult settings, TerminalConnection::ITerminalConnection existingConnection)
253253
{
254-
bool doAdminWarning = true;;
254+
bool doAdminWarning = true;
255+
;
255256
const auto& cmdline{ settings.DefaultSettings().Commandline() };
256257
if (_isElevated())
257258
{
@@ -322,25 +323,8 @@ namespace winrt::TerminalApp::implementation
322323
if (doAdminWarning)
323324
{
324325
auto warningControl{ winrt::make_self<implementation::AdminWarningPlaceholder>(term, cmdline) };
325-
warningControl->PrimaryButtonClicked([weakThis = get_weak(), warningControl](auto&&, auto&&) {
326-
if (auto page{ weakThis.get() })
327-
{
328-
for (const auto& tab : page->_tabs)
329-
{
330-
if (const auto& tabImpl{ _GetTerminalTabImpl(tab) })
331-
{
332-
tabImpl->GetRootPane()->WalkTree([warningControl](std::shared_ptr<Pane> pane) -> bool {
333-
if (pane->GetUserControl() == *warningControl)
334-
{
335-
pane->ReplaceControl(warningControl->Control());
336-
return true;
337-
}
338-
return false;
339-
});
340-
}
341-
}
342-
}
343-
});
326+
warningControl->PrimaryButtonClicked({ get_weak(), &TerminalPage::_adminWarningPrimaryClicked });
327+
warningControl->CancelButtonClicked({ get_weak(), &TerminalPage::_adminWarningCancelClicked });
344328
controlToAdd = *warningControl;
345329
}
346330

@@ -357,6 +341,56 @@ namespace winrt::TerminalApp::implementation
357341
}
358342
}
359343

344+
void TerminalPage::_adminWarningPrimaryClicked(const TerminalApp::AdminWarningPlaceholder& sender,
345+
const winrt::Windows::UI::Xaml::RoutedEventArgs& /*args*/)
346+
{
347+
auto warningControl{ winrt::get_self<AdminWarningPlaceholder>(sender) };
348+
349+
for (const auto& tab : _tabs)
350+
{
351+
if (const auto& tabImpl{ _GetTerminalTabImpl(tab) })
352+
{
353+
tabImpl->GetRootPane()->WalkTree([warningControl](std::shared_ptr<Pane> pane) -> bool {
354+
if (pane->GetUserControl() == *warningControl)
355+
{
356+
pane->ReplaceControl(warningControl->Control());
357+
return true;
358+
}
359+
return false;
360+
});
361+
}
362+
}
363+
364+
auto allowedCommandlines{ ElevatedState::SharedInstance().AllowedCommandlines() };
365+
if (!allowedCommandlines)
366+
{
367+
allowedCommandlines = winrt::single_threaded_vector<winrt::hstring>();
368+
}
369+
allowedCommandlines.Append(warningControl->Commandline());
370+
ElevatedState::SharedInstance().AllowedCommandlines(allowedCommandlines);
371+
}
372+
373+
void TerminalPage::_adminWarningCancelClicked(const TerminalApp::AdminWarningPlaceholder& sender,
374+
const winrt::Windows::UI::Xaml::RoutedEventArgs& /*args*/)
375+
{
376+
auto warningControl{ winrt::get_self<AdminWarningPlaceholder>(sender) };
377+
378+
for (const auto& tab : _tabs)
379+
{
380+
if (const auto& tabImpl{ _GetTerminalTabImpl(tab) })
381+
{
382+
tabImpl->GetRootPane()->WalkTree([warningControl](std::shared_ptr<Pane> pane) -> bool {
383+
if (pane->GetUserControl() == *warningControl)
384+
{
385+
pane->Close();
386+
return true;
387+
}
388+
return false;
389+
});
390+
}
391+
}
392+
}
393+
360394
// Method Description:
361395
// - Get the icon of the currently focused terminal control, and set its
362396
// tab's icon to that icon.

src/cascadia/TerminalApp/TerminalPage.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,10 @@ namespace winrt::TerminalApp::implementation
363363

364364
winrt::Microsoft::Terminal::Settings::Model::Profile GetClosestProfileForDuplicationOfProfile(const winrt::Microsoft::Terminal::Settings::Model::Profile& profile) const noexcept;
365365

366+
void _adminWarningPrimaryClicked(const winrt::TerminalApp::AdminWarningPlaceholder& sender,
367+
const winrt::Windows::UI::Xaml::RoutedEventArgs& args);
368+
void _adminWarningCancelClicked(const winrt::TerminalApp::AdminWarningPlaceholder& sender,
369+
const winrt::Windows::UI::Xaml::RoutedEventArgs& args);
366370
#pragma region ActionHandlers
367371
// These are all defined in AppActionHandlers.cpp
368372
#define ON_ALL_ACTIONS(action) DECLARE_ACTION_HANDLER(action);

0 commit comments

Comments
 (0)