diff --git a/Kore/Backends/System/Android/Sources/kinc/backend/window.c.h b/Kore/Backends/System/Android/Sources/kinc/backend/window.c.h
index 2eeb18f..e1faa7d 100644
--- a/Kore/Backends/System/Android/Sources/kinc/backend/window.c.h
+++ b/Kore/Backends/System/Android/Sources/kinc/backend/window.c.h
@@ -49,6 +49,8 @@ void kinc_window_show(int window_index) {}
void kinc_window_hide(int window_index) {}
+void kinc_window_set_foreground(int window_index) {}
+
void kinc_window_set_title(int window_index, const char *title) {}
int kinc_window_create(kinc_window_options_t *win, kinc_framebuffer_options_t *frame) {
diff --git a/Kore/Backends/System/Emscripten/Sources/kinc/backend/window.c.h b/Kore/Backends/System/Emscripten/Sources/kinc/backend/window.c.h
index 3f1220c..9982f3e 100644
--- a/Kore/Backends/System/Emscripten/Sources/kinc/backend/window.c.h
+++ b/Kore/Backends/System/Emscripten/Sources/kinc/backend/window.c.h
@@ -63,6 +63,8 @@ void kinc_window_show(int window_index) {}
void kinc_window_hide(int window_index) {}
+void kinc_window_set_foreground(int window_index) {}
+
// TODO: change browser title.
void kinc_window_set_title(int window_index, const char *title) {}
diff --git a/Kore/Backends/System/Linux/Sources/kinc/backend/funcs.h b/Kore/Backends/System/Linux/Sources/kinc/backend/funcs.h
index cf66fb8..2982339 100644
--- a/Kore/Backends/System/Linux/Sources/kinc/backend/funcs.h
+++ b/Kore/Backends/System/Linux/Sources/kinc/backend/funcs.h
@@ -29,6 +29,7 @@ struct linux_procs {
int (*window_display)(int window_index);
void (*window_show)(int window_index);
void (*window_hide)(int window_index);
+ void (*window_set_foreground)(int window_index);
void (*window_set_title)(int window_index, const char *title);
void (*window_change_mode)(int window_index, kinc_window_mode_t mode);
kinc_window_mode_t (*window_get_mode)(int window_index);
diff --git a/Kore/Backends/System/Linux/Sources/kinc/backend/linuxunit.c b/Kore/Backends/System/Linux/Sources/kinc/backend/linuxunit.c
index e86e33d..111fba3 100644
--- a/Kore/Backends/System/Linux/Sources/kinc/backend/linuxunit.c
+++ b/Kore/Backends/System/Linux/Sources/kinc/backend/linuxunit.c
@@ -59,6 +59,7 @@ void kinc_linux_init_procs() {
procs.window_resize = kinc_wayland_window_resize;
procs.window_show = kinc_wayland_window_show;
procs.window_hide = kinc_wayland_window_hide;
+ procs.window_set_foreground = kinc_wayland_window_set_foreground;
procs.count_windows = kinc_wayland_count_windows;
procs.mouse_can_lock = kinc_wl_mouse_can_lock;
@@ -111,6 +112,7 @@ void kinc_linux_init_procs() {
procs.window_resize = kinc_x11_window_resize;
procs.window_show = kinc_x11_window_show;
procs.window_hide = kinc_x11_window_hide;
+ procs.window_set_foreground = kinc_x11_window_set_foreground;
procs.count_windows = kinc_x11_count_windows;
procs.display_init = kinc_x11_display_init;
diff --git a/Kore/Backends/System/Linux/Sources/kinc/backend/wayland/window.c.h b/Kore/Backends/System/Linux/Sources/kinc/backend/wayland/window.c.h
index bc49016..2c5d6c4 100644
--- a/Kore/Backends/System/Linux/Sources/kinc/backend/wayland/window.c.h
+++ b/Kore/Backends/System/Linux/Sources/kinc/backend/wayland/window.c.h
@@ -499,6 +499,10 @@ void kinc_wayland_window_hide(int window_index) {
kinc_log(KINC_LOG_LEVEL_ERROR, "Wayland does not support hiding windows.");
}
+void kinc_wayland_window_set_foreground(int window_index) {
+ kinc_log(KINC_LOG_LEVEL_ERROR, "Wayland does not support activating windows.");
+}
+
kinc_window_mode_t kinc_wayland_window_get_mode(int window_index) {
return wl_ctx.windows[window_index].mode;
}
diff --git a/Kore/Backends/System/Linux/Sources/kinc/backend/window.c.h b/Kore/Backends/System/Linux/Sources/kinc/backend/window.c.h
index 47df1af..262cd26 100644
--- a/Kore/Backends/System/Linux/Sources/kinc/backend/window.c.h
+++ b/Kore/Backends/System/Linux/Sources/kinc/backend/window.c.h
@@ -80,6 +80,10 @@ void kinc_window_hide(int window_index) {
procs.window_hide(window_index);
}
+void kinc_window_set_foreground(int window_index) {
+ procs.window_set_foreground(window_index);
+}
+
void kinc_window_set_title(int window_index, const char *title) {
procs.window_set_title(window_index, title);
}
diff --git a/Kore/Backends/System/Linux/Sources/kinc/backend/x11/window.c.h b/Kore/Backends/System/Linux/Sources/kinc/backend/x11/window.c.h
index fb8ada0..748b0cc 100644
--- a/Kore/Backends/System/Linux/Sources/kinc/backend/x11/window.c.h
+++ b/Kore/Backends/System/Linux/Sources/kinc/backend/x11/window.c.h
@@ -13,6 +13,7 @@ struct MwmHints {
#define MWM_HINTS_DECORATIONS (1L << 1)
void kinc_x11_window_set_title(int window_index, const char *title);
+void kinc_x11_window_set_foreground(int window_index);
void kinc_x11_window_change_mode(int window_index, kinc_window_mode_t mode);
int kinc_x11_window_create(kinc_window_options_t *win, kinc_framebuffer_options_t *frame) {
@@ -145,6 +146,16 @@ void kinc_x11_window_hide(int window_index) {
xlib.XUnmapWindow(x11_ctx.display, window->window);
}
+void kinc_x11_window_set_foreground(int window_index) {
+ struct kinc_x11_window *window = &x11_ctx.windows[window_index];
+ if (window->window == None) {
+ return;
+ }
+ xlib.XRaiseWindow(x11_ctx.display, window->window);
+ xlib.XSetInputFocus(x11_ctx.display, window->window, RevertToParent, CurrentTime);
+ xlib.XFlush(x11_ctx.display);
+}
+
kinc_window_mode_t kinc_x11_window_get_mode(int window_index) {
return x11_ctx.windows[window_index].mode;
}
diff --git a/Kore/Backends/System/Wasm/Sources/kinc/backend/window.c.h b/Kore/Backends/System/Wasm/Sources/kinc/backend/window.c.h
index 3f1220c..9982f3e 100644
--- a/Kore/Backends/System/Wasm/Sources/kinc/backend/window.c.h
+++ b/Kore/Backends/System/Wasm/Sources/kinc/backend/window.c.h
@@ -63,6 +63,8 @@ void kinc_window_show(int window_index) {}
void kinc_window_hide(int window_index) {}
+void kinc_window_set_foreground(int window_index) {}
+
// TODO: change browser title.
void kinc_window_set_title(int window_index, const char *title) {}
diff --git a/Kore/Backends/System/Windows/Sources/kinc/backend/window.c.h b/Kore/Backends/System/Windows/Sources/kinc/backend/window.c.h
index b22d623..a3d1357 100644
--- a/Kore/Backends/System/Windows/Sources/kinc/backend/window.c.h
+++ b/Kore/Backends/System/Windows/Sources/kinc/backend/window.c.h
@@ -392,6 +392,11 @@ void kinc_window_hide(int window_index) {
UpdateWindow(windows[window_index].handle);
}
+void kinc_window_set_foreground(int window_index) {
+ SetForegroundWindow(windows[window_index].handle);
+ SetFocus(windows[window_index].handle);
+}
+
void kinc_window_set_title(int window_index, const char *title) {
wchar_t buffer[1024];
MultiByteToWideChar(CP_UTF8, 0, title, -1, buffer, 1024);
diff --git a/Kore/Backends/System/iOS/Sources/kinc/backend/window.c.h b/Kore/Backends/System/iOS/Sources/kinc/backend/window.c.h
index f564d95..25c0c0d 100644
--- a/Kore/Backends/System/iOS/Sources/kinc/backend/window.c.h
+++ b/Kore/Backends/System/iOS/Sources/kinc/backend/window.c.h
@@ -41,6 +41,8 @@ void kinc_window_show(int window) {}
void kinc_window_hide(int window) {}
+void kinc_window_set_foreground(int window) {}
+
void kinc_window_set_title(int window, const char *title) {}
int kinc_window_create(kinc_window_options_t *win, kinc_framebuffer_options_t *frame) {
diff --git a/Kore/Backends/System/macOS/Sources/kinc/backend/window.c.h b/Kore/Backends/System/macOS/Sources/kinc/backend/window.c.h
index e4b0de2..71127a4 100644
--- a/Kore/Backends/System/macOS/Sources/kinc/backend/window.c.h
+++ b/Kore/Backends/System/macOS/Sources/kinc/backend/window.c.h
@@ -46,6 +46,8 @@ void kinc_window_show(int window) {}
void kinc_window_hide(int window) {}
+void kinc_window_set_foreground(int window) {}
+
void kinc_window_set_title(int window, const char *title) {}
int kinc_window_create(kinc_window_options_t *win, kinc_framebuffer_options_t *frame) {
diff --git a/Kore/Sources/kinc/window.h b/Kore/Sources/kinc/window.h
index 966053b..8905b2b 100644
--- a/Kore/Sources/kinc/window.h
+++ b/Kore/Sources/kinc/window.h
@@ -139,6 +139,11 @@ KINC_FUNC void kinc_window_show(int window);
///
KINC_FUNC void kinc_window_hide(int window);
+///
+/// Brings a window to the foreground and sets focus to it.
+///
+KINC_FUNC void kinc_window_set_foreground(int window);
+
///
/// Sets the title of a window.
///
diff --git a/Sources/main.cpp b/Sources/main.cpp
index 809df8e..5ca5a9e 100644
--- a/Sources/main.cpp
+++ b/Sources/main.cpp
@@ -2708,7 +2708,7 @@ namespace {
void runt_window_set_foreground(const FunctionCallbackInfo &args) {
HandleScope scope(args.GetIsolate());
int windowId = args[0]->ToInt32(isolate->GetCurrentContext()).ToLocalChecked()->Value();
- // kinc_window_set_foreground(windowId); // TODO: add to Kore
+ kinc_window_set_foreground(windowId);
}
#define SET_FUNCTION_FAST(object, name, fn)\
@@ -4038,7 +4038,7 @@ int kickstart(int argc, char **argv) {
start_runt(snapshot_found ? NULL : code);
- #ifdef WITH_NETWORKING
+ #ifdef WITH_VIEWPORT
if (viewport_server_mode) {
kinc_log(KINC_LOG_LEVEL_INFO, "Initializing viewport server: %dx%d, shmem=%s",
viewport_width, viewport_height, viewport_shmem_name);