1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
// This file is part of the 64k demo project.
// It implements platform-specific windowing and input using GLFW.
// Handles fullscreen toggling and native surface creation for WebGPU.
#include "platform.h"
#include "glfw3webgpu.h"
#include <GLFW/glfw3.h>
static GLFWwindow *window = nullptr;
static int windowed_x, windowed_y, windowed_w, windowed_h;
static bool g_is_fullscreen = false;
static void glfw_key_callback(GLFWwindow *cb_window, int key, int scancode,
int action, int mods) {
if (action == GLFW_PRESS) {
if (key == GLFW_KEY_ESCAPE || key == GLFW_KEY_Q) {
glfwSetWindowShouldClose(cb_window, GLFW_TRUE);
} else if (key == GLFW_KEY_F) {
platform_toggle_fullscreen();
}
}
}
void platform_init_window(bool fullscreen) {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
window = glfwCreateWindow(1280, 720, "demo64k", nullptr, nullptr);
glfwSetKeyCallback(window, glfw_key_callback);
g_is_fullscreen = fullscreen;
if (fullscreen) {
// Save current windowed mode dimensions before going fullscreen
glfwGetWindowPos(window, &windowed_x, &windowed_y);
glfwGetWindowSize(window, &windowed_w, &windowed_h);
GLFWmonitor *monitor = glfwGetPrimaryMonitor();
const GLFWvidmode *mode = glfwGetVideoMode(monitor);
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height,
mode->refreshRate);
}
}
void platform_shutdown() {
glfwDestroyWindow(window);
glfwTerminate();
}
void platform_poll() { glfwPollEvents(); }
bool platform_should_close() { return glfwWindowShouldClose(window); }
void platform_toggle_fullscreen() {
g_is_fullscreen = !g_is_fullscreen;
if (g_is_fullscreen) {
glfwGetWindowPos(window, &windowed_x, &windowed_y);
glfwGetWindowSize(window, &windowed_w, &windowed_h);
GLFWmonitor *monitor = glfwGetPrimaryMonitor();
const GLFWvidmode *mode = glfwGetVideoMode(monitor);
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height,
mode->refreshRate);
} else {
glfwSetWindowMonitor(window, nullptr, windowed_x, windowed_y, windowed_w,
windowed_h, 0);
}
}
GLFWwindow *platform_get_window() { return window; }
double platform_get_time() { return glfwGetTime(); }
WGPUSurface platform_create_wgpu_surface(WGPUInstance instance) {
return glfwCreateWindowWGPUSurface(instance, window);
}
|