Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions core/config/engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,15 @@ bool Engine::is_embedded_in_editor() const {
return embedded_in_editor;
}

void Engine::add_embedded_subwindow(const String &p_subwindow_title, int64_t p_parent_id) {
embedded_subwindows[p_subwindow_title] = p_parent_id;
}

int64_t Engine::get_embedded_subwindow(const String &p_subwindow_title) {
const int64_t *ret = embedded_subwindows.getptr(p_subwindow_title);
return ret ? *ret : 0;
}

Engine::Engine() {
singleton = this;
}
Expand Down
3 changes: 3 additions & 0 deletions core/config/engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ class Engine {
bool project_manager_hint = false;
bool extension_reloading = false;
bool embedded_in_editor = false;
HashMap<String, int64_t> embedded_subwindows;
bool recovery_mode_hint = false;

bool _print_header = true;
Expand Down Expand Up @@ -159,6 +160,8 @@ class Engine {
void set_frame_delay(uint32_t p_msec);
uint32_t get_frame_delay() const;

void add_embedded_subwindow(const String &p_subwindow_title, int64_t p_parent_id);
int64_t get_embedded_subwindow(const String &p_subwindow_title);
void add_singleton(const Singleton &p_singleton);
void get_singletons(List<Singleton> *p_singletons);
bool has_singleton(const StringName &p_name) const;
Expand Down
9 changes: 5 additions & 4 deletions editor/run/embedded_process.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ int EmbeddedProcess::get_embedded_pid() const {
return current_process_id;
}

void EmbeddedProcess::embed_process(OS::ProcessID p_pid) {
void EmbeddedProcess::embed_process(OS::ProcessID p_pid, const String &p_embedded_window) {
if (!window) {
return;
}
Expand All @@ -201,6 +201,7 @@ void EmbeddedProcess::embed_process(OS::ProcessID p_pid) {
reset();

current_process_id = p_pid;
current_embedded_window = p_embedded_window;
start_embedding_time = OS::get_singleton()->get_ticks_msec();
embedding_grab_focus = has_focus();
timer_update_embedded_process->start();
Expand All @@ -214,7 +215,7 @@ void EmbeddedProcess::embed_process(OS::ProcessID p_pid) {

void EmbeddedProcess::reset() {
if (current_process_id != 0 && embedding_completed) {
DisplayServer::get_singleton()->remove_embedded_process(current_process_id);
DisplayServer::get_singleton()->remove_embedded_process(current_process_id, current_embedded_window);
}
current_process_id = 0;
embedding_completed = false;
Expand All @@ -235,7 +236,7 @@ void EmbeddedProcess::request_close() {

void EmbeddedProcess::_try_embed_process() {
bool is_visible = is_visible_in_tree();
Error err = DisplayServer::get_singleton()->embed_process(window->get_window_id(), current_process_id, get_screen_embedded_window_rect(), is_visible, is_visible && application_has_focus && embedding_grab_focus);
Error err = DisplayServer::get_singleton()->embed_process(window->get_window_id(), current_process_id, current_embedded_window, get_screen_embedded_window_rect(), is_visible, is_visible && application_has_focus && embedding_grab_focus);
if (err == OK) {
embedding_completed = true;
queue_redraw();
Expand Down Expand Up @@ -294,7 +295,7 @@ void EmbeddedProcess::_update_embedded_process() {
last_updated_embedded_process_focused = focus;
}

DisplayServer::get_singleton()->embed_process(window->get_window_id(), current_process_id, get_screen_embedded_window_rect(), is_visible_in_tree(), must_grab_focus);
DisplayServer::get_singleton()->embed_process(window->get_window_id(), current_process_id, current_embedded_window, get_screen_embedded_window_rect(), is_visible_in_tree(), must_grab_focus);
emit_signal(SNAME("embedded_process_updated"));
}

Expand Down
5 changes: 3 additions & 2 deletions editor/run/embedded_process.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class EmbeddedProcessBase : public Control {
virtual bool is_embedding_completed() const = 0;
virtual bool is_embedding_in_progress() const = 0;
virtual bool is_process_focused() const = 0;
virtual void embed_process(OS::ProcessID p_pid) = 0;
virtual void embed_process(OS::ProcessID p_pid, const String &p_embedded_window) = 0;
virtual int get_embedded_pid() const = 0;
virtual void reset() = 0;
virtual void request_close() = 0;
Expand All @@ -87,6 +87,7 @@ class EmbeddedProcess : public EmbeddedProcessBase {
uint64_t last_application_focus_time = 0;
OS::ProcessID focused_process_id = 0;
OS::ProcessID current_process_id = 0;
String current_embedded_window;
bool embedding_grab_focus = false;
bool embedding_completed = false;
uint64_t start_embedding_time = 0;
Expand Down Expand Up @@ -116,8 +117,8 @@ class EmbeddedProcess : public EmbeddedProcessBase {
bool is_embedding_in_progress() const override;
bool is_embedding_completed() const override;
bool is_process_focused() const override;
void embed_process(OS::ProcessID p_pid) override;
int get_embedded_pid() const override;
void embed_process(OS::ProcessID p_pid, const String &p_embedded_window) override;
void reset() override;
void request_close() override;
void queue_update_embedded_process() override;
Expand Down
Loading