Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make it possible to add a title to context menu #26067

Merged
merged 1 commit into from Mar 31, 2020
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Make it possible to add a title to context menu

  • Loading branch information
paulrouget committed Mar 31, 2020
commit 0b489a0135034bca275c065647b1198846bb425c
@@ -53,7 +53,7 @@ support/hololens/ARM64/
support/hololens/ServoApp/x64/
support/hololens/ServoApp/ARM/
support/hololens/ServoApp/ARM64/
support/hololens/ServoApp/Generated\ Files
support/hololens/ServoApp/Generated Files/
support/hololens/ServoApp/BundleArtifacts/
support/hololens/ServoApp/support/
support/hololens/ServoApp/Debug/
@@ -157,7 +157,7 @@ pub enum EmbedderMsg {
/// Show dialog to user
Prompt(PromptDefinition, PromptOrigin),
/// Show a context menu to the user
ShowContextMenu(IpcSender<ContextMenuResult>, Vec<String>),
ShowContextMenu(IpcSender<ContextMenuResult>, Option<String>, Vec<String>),
/// Whether or not to allow a pipeline to load a url.
AllowNavigationRequest(PipelineId, ServoUrl),
/// Whether or not to allow script to open a new tab/browser
@@ -521,7 +521,7 @@ where
Err(()) => error!("Error running devtools server"),
}
},
EmbedderMsg::ShowContextMenu(sender, _) => {
EmbedderMsg::ShowContextMenu(sender, ..) => {
let _ = sender.send(ContextMenuResult::Ignored);
}
}
@@ -105,7 +105,7 @@ pub trait HostTrait {
/// Ask for string
fn prompt_input(&self, msg: String, default: String, trusted: bool) -> Option<String>;
/// Show context menu
fn show_context_menu(&self, items: Vec<String>);
fn show_context_menu(&self, title: Option<String>, items: Vec<String>);
/// Page starts loading.
/// "Reload button" should be disabled.
/// "Stop button" should be enabled.
@@ -579,15 +579,17 @@ impl ServoGlue {
EmbedderMsg::AllowUnload(sender) => {
let _ = sender.send(true);
},
EmbedderMsg::ShowContextMenu(sender, items) => {
EmbedderMsg::ShowContextMenu(sender, title, items) => {
if self.context_menu_sender.is_some() {
warn!(
"Trying to show a context menu when a context menu is already active"
);
let _ = sender.send(ContextMenuResult::Ignored);
} else {
self.context_menu_sender = Some(sender);
self.callbacks.host_callbacks.show_context_menu(items);
self.callbacks
.host_callbacks
.show_context_menu(title, items);
}
},
EmbedderMsg::Prompt(definition, origin) => {
@@ -230,7 +230,8 @@ pub struct CHostCallbacks {
trusted: bool,
) -> *const c_char,
pub on_devtools_started: extern "C" fn(result: CDevtoolsServerState, port: c_uint),
pub show_context_menu: extern "C" fn(items_list: *const *const c_char, items_size: u32),
pub show_context_menu:
extern "C" fn(title: *const c_char, items_list: *const *const c_char, items_size: u32),
}

/// Servo options
@@ -903,15 +904,19 @@ impl HostTrait for HostCallbacks {
}
}

fn show_context_menu(&self, items: Vec<String>) {
fn show_context_menu(&self, title: Option<String>, items: Vec<String>) {
debug!("show_context_menu");
let size = items.len() as u32;
let items_size = items.len() as u32;
let cstrs: Vec<CString> = items
.into_iter()
.map(|i| CString::new(i).expect("Can't create string"))
.collect();
let ptrs: Vec<*const c_char> = cstrs.iter().map(|cstr| cstr.as_ptr()).collect();
(self.0.show_context_menu)(ptrs.as_ptr(), size);
// let _ = cstrs; // Don't drop these too early
let items: Vec<*const c_char> = cstrs.iter().map(|cstr| cstr.as_ptr()).collect();
let title = title.map(|s| CString::new(s).expect("Can't create string"));
let title_ptr = title
.as_ref()
.map(|cstr| cstr.as_ptr())
.unwrap_or(std::ptr::null());
(self.0.show_context_menu)(title_ptr, items.as_ptr(), items_size);
}
}
@@ -67,12 +67,17 @@ void prompt_alert(const char *message, bool trusted) {
sServo->Delegate().OnServoPromptAlert(char2hstring(message), trusted);
}

void show_context_menu(const char *const *items_list, uint32_t items_size) {
void show_context_menu(const char *title, const char *const *items_list,
uint32_t items_size) {
std::optional<hstring> opt_title = {};
if (title != nullptr) {
opt_title = char2hstring(title);
}
std::vector<winrt::hstring> items;
for (uint32_t i = 0; i < items_size; i++) {
items.push_back(char2hstring(items_list[i]));
}
sServo->Delegate().OnServoShowContextMenu(items);
sServo->Delegate().OnServoShowContextMenu(opt_title, items);
}

void on_devtools_started(Servo::DevtoolsServerState result,
@@ -105,7 +105,8 @@ class ServoDelegate {
virtual void OnServoMediaSessionMetadata(hstring, hstring, hstring) = 0;
virtual void OnServoMediaSessionPlaybackStateChange(int) = 0;
virtual void OnServoPromptAlert(hstring, bool) = 0;
virtual void OnServoShowContextMenu(std::vector<hstring>) = 0;
virtual void OnServoShowContextMenu(std::optional<hstring>,
std::vector<hstring>) = 0;
virtual Servo::PromptResult OnServoPromptOkCancel(hstring, bool) = 0;
virtual Servo::PromptResult OnServoPromptYesNo(hstring, bool) = 0;
virtual std::optional<hstring> OnServoPromptInput(hstring, hstring, bool) = 0;
@@ -564,9 +564,10 @@ void ServoControl::OnServoDevtoolsStarted(bool success,
});
}

void ServoControl::OnServoShowContextMenu(std::vector<winrt::hstring> items) {
void ServoControl::OnServoShowContextMenu(std::optional<hstring> title,
std::vector<winrt::hstring> items) {
RunOnUIThread([=] {
MessageDialog msg{L"Menu"};
MessageDialog msg{title.value_or(L"Menu")};
for (auto i = 0; i < items.size(); i++) {
UICommand cmd{items[i], [=](auto) {
RunOnGLThread([=] {
@@ -117,7 +117,8 @@ struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {
winrt::hstring);
virtual void OnServoMediaSessionPlaybackStateChange(int);
virtual void OnServoPromptAlert(winrt::hstring, bool);
virtual void OnServoShowContextMenu(std::vector<winrt::hstring>);
virtual void OnServoShowContextMenu(std::optional<winrt::hstring>,
std::vector<winrt::hstring>);
virtual servo::Servo::PromptResult OnServoPromptOkCancel(winrt::hstring,
bool);
virtual servo::Servo::PromptResult OnServoPromptYesNo(winrt::hstring, bool);
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.