xbintsc 0.3.61 → 0.3.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tests/e2e/gui-events.test.js +32 -0
- package/dist/tests/e2e/gui-events.test.js.map +1 -1
- package/dist/tests/e2e/gui-example-browser.test.js +19 -15
- package/dist/tests/e2e/gui-example-browser.test.js.map +1 -1
- package/doc/gui.md +8 -3
- package/doc/zh-CN/gui.md +5 -2
- package/package.json +1 -1
- package/runtime/ext_gui/gui_events.cpp +3 -0
- package/runtime/ext_gui/window.cpp +32 -0
- package/runtime/xt_io/console.inc +15 -3
|
@@ -56,5 +56,37 @@ describe.skipIf(!guiAvailable)("gui extension — events", () => {
|
|
|
56
56
|
expect(stdout).toContain("event=wheel:1,2");
|
|
57
57
|
expect(stdout).toContain("event=key:a:false");
|
|
58
58
|
});
|
|
59
|
+
it("exposes the Web window spellings (addEventListener/removeEventListener/closed)", () => {
|
|
60
|
+
const { value, stdout } = harness.compileAndRun("web-window", [
|
|
61
|
+
'import { createWindow, run } from "gui";',
|
|
62
|
+
"",
|
|
63
|
+
'const win = createWindow({ title: "web", width: 200, height: 150 });',
|
|
64
|
+
"const log = [];",
|
|
65
|
+
'const onClick = (e) => log.push("click:" + e.target);',
|
|
66
|
+
'const onKey = (e) => log.push("key:" + e.key);',
|
|
67
|
+
'win.addEventListener("click", onClick);',
|
|
68
|
+
'win.addEventListener("keydown", onKey);',
|
|
69
|
+
'win.removeEventListener("click", onClick);',
|
|
70
|
+
"",
|
|
71
|
+
'win.addEventListener("close", () => console.log("closed-in-handler=" + win.closed));',
|
|
72
|
+
'win.addEventListener("ready", () => {',
|
|
73
|
+
' console.log("closed-before=" + win.closed);',
|
|
74
|
+
' win.sendEvent("click", { x: 1, y: 1, button: 0 });',
|
|
75
|
+
' win.sendEvent("keydown", { key: "a", code: "KeyA" });',
|
|
76
|
+
' for (const line of log) console.log("web-event=" + line);',
|
|
77
|
+
" win.close();",
|
|
78
|
+
"});",
|
|
79
|
+
'win.loadHTML("<div id=\'box\'>x</div>");',
|
|
80
|
+
"run();",
|
|
81
|
+
'console.log("closed-after=" + win.closed);',
|
|
82
|
+
].join("\n"));
|
|
83
|
+
// `closed` is the Web spelling of `isOpen()`.
|
|
84
|
+
expect(value("closed-before")).toBe("false");
|
|
85
|
+
expect(value("closed-after")).toBe("true");
|
|
86
|
+
expect(stdout).toContain("closed-in-handler=true");
|
|
87
|
+
// `removeEventListener` dropped the click listener; the key listener stayed.
|
|
88
|
+
expect(stdout).not.toContain("web-event=click:");
|
|
89
|
+
expect(stdout).toContain("web-event=key:a");
|
|
90
|
+
});
|
|
59
91
|
});
|
|
60
92
|
//# sourceMappingURL=gui-events.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui-events.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-events.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;AAEnC,QAAQ,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,wBAAwB,EAAE,GAAG,EAAE;IAC5D,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAElC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAC7C,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCC,CACF,CAAC;QAEF,2DAA2D;QAC3D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,2EAA2E;QAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"gui-events.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-events.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;AAEnC,QAAQ,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,wBAAwB,EAAE,GAAG,EAAE;IAC5D,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAElC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAC7C,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCC,CACF,CAAC;QAEF,2DAA2D;QAC3D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,2EAA2E;QAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAC7C,YAAY,EACZ;YACE,0CAA0C;YAC1C,EAAE;YACF,sEAAsE;YACtE,iBAAiB;YACjB,uDAAuD;YACvD,gDAAgD;YAChD,yCAAyC;YACzC,yCAAyC;YACzC,4CAA4C;YAC5C,EAAE;YACF,sFAAsF;YACtF,uCAAuC;YACvC,+CAA+C;YAC/C,sDAAsD;YACtD,yDAAyD;YACzD,6DAA6D;YAC7D,gBAAgB;YAChB,KAAK;YACL,0CAA0C;YAC1C,QAAQ;YACR,4CAA4C;SAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,8CAA8C;QAC9C,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACnD,6EAA6E;QAC7E,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -58,11 +58,14 @@ function runBrowserBranch(framesToDrive) {
|
|
|
58
58
|
querySelector: (selector) => selector === ".title" ? { textContent: "鹈鹕骑自行车" } : null,
|
|
59
59
|
createElement: (tag) => element(tag, { x: 0, y: 0, width: 0, height: 0 }),
|
|
60
60
|
};
|
|
61
|
-
// The browser `window
|
|
62
|
-
//
|
|
61
|
+
// The browser `window`, spelled the way the game expects: the same
|
|
62
|
+
// `addEventListener`/`requestAnimationFrame`/`closed`/`close` surface the
|
|
63
|
+
// engine now provides, so the script needs no host branch to pick.
|
|
63
64
|
const windowStub = {
|
|
64
65
|
innerWidth: 1200,
|
|
65
66
|
innerHeight: 800,
|
|
67
|
+
closed: false,
|
|
68
|
+
close: () => { },
|
|
66
69
|
addEventListener: (type, handler) => {
|
|
67
70
|
(listeners[type] ??= []).push(handler);
|
|
68
71
|
},
|
|
@@ -106,12 +109,11 @@ function runBrowserBranch(framesToDrive) {
|
|
|
106
109
|
describe("gui example — pelican bike in a browser", () => {
|
|
107
110
|
it("runs the inline script against a browser-like host", () => {
|
|
108
111
|
const { hooks, scheduled, logs } = runBrowserBranch(120);
|
|
109
|
-
// It
|
|
112
|
+
// It started a frame loop in this host.
|
|
110
113
|
expect(scheduled).toBeGreaterThan(50);
|
|
111
114
|
expect(logs.join("\n")).not.toContain("Uncaught");
|
|
112
115
|
// The game logic advanced (the autopilot reports a distance > 0).
|
|
113
116
|
const info = hooks.info();
|
|
114
|
-
expect(info.host).toBe("browser");
|
|
115
117
|
expect(info.ground).toBe(450);
|
|
116
118
|
expect(String(info.hud)).toMatch(/\d{4} \d+ \d+ [▮▯]{7} \d+/);
|
|
117
119
|
// The published hooks work, which is how a browser console drives it.
|
|
@@ -119,7 +121,6 @@ describe("gui example — pelican bike in a browser", () => {
|
|
|
119
121
|
hooks.jump();
|
|
120
122
|
hooks.step(0.016);
|
|
121
123
|
const after = hooks.info();
|
|
122
|
-
expect(after.host).toBe("browser");
|
|
123
124
|
expect(String(after.player)).toBe("420,416");
|
|
124
125
|
});
|
|
125
126
|
it("jumps from a real Space key event, the way a browser spells it", () => {
|
|
@@ -146,17 +147,20 @@ describe("gui example — pelican bike in a browser", () => {
|
|
|
146
147
|
hooks.step(0.016);
|
|
147
148
|
expect(bottom()).not.toBe(grounded);
|
|
148
149
|
});
|
|
149
|
-
it("
|
|
150
|
+
it("uses only Web window APIs, never the engine-only spellings", () => {
|
|
150
151
|
const script = inlineScript();
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
expect(
|
|
156
|
-
expect(
|
|
157
|
-
expect(
|
|
158
|
-
expect(
|
|
159
|
-
|
|
152
|
+
// The engine now offers the browser names, so the game can avoid every
|
|
153
|
+
// engine-only API and the `inGui` branch that used to select between them.
|
|
154
|
+
expect(script).not.toContain("window.on(");
|
|
155
|
+
expect(script).not.toContain('window["on"]');
|
|
156
|
+
expect(script).not.toContain("window.isOpen");
|
|
157
|
+
expect(script).not.toContain("window.off(");
|
|
158
|
+
expect(script).not.toContain("window.driver");
|
|
159
|
+
expect(script).not.toContain("inGui");
|
|
160
|
+
// It does use the browser API, which is what makes one script correct in
|
|
161
|
+
// both hosts.
|
|
162
|
+
expect(script).toContain("window.addEventListener");
|
|
163
|
+
expect(script).toContain("window.closed");
|
|
160
164
|
// And nothing may cast through `any`, which the engine's parser rejects.
|
|
161
165
|
expect(script).not.toContain("as any");
|
|
162
166
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui-example-browser.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-example-browser.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"gui-example-browser.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-example-browser.test.ts"],"names":[],"mappings":"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"}
|
package/doc/gui.md
CHANGED
|
@@ -116,9 +116,14 @@ run(); // drives the main loop until all windows
|
|
|
116
116
|
Methods implemented on a window handle: `setTitle` / `setSize` / `loadHTML` /
|
|
117
117
|
`getHTML` / `setBackground` / `close` / `isOpen` / `on` / `off`, plus `driver()`,
|
|
118
118
|
which reports the SDL_GPU backend in use (`"vulkan"`, `"direct3d12"`, `"metal"`,
|
|
119
|
-
… — SDL picks the best one the device supports).
|
|
120
|
-
`
|
|
121
|
-
`
|
|
119
|
+
… — SDL picks the best one the device supports). The Web spellings are available
|
|
120
|
+
too: `addEventListener` / `removeEventListener` are aliases of `on` / `off` (their
|
|
121
|
+
`options` argument is accepted and ignored) and the `closed` getter mirrors
|
|
122
|
+
`isOpen()`, so a document written against the browser API runs unchanged.
|
|
123
|
+
Events emitted:
|
|
124
|
+
`ready` (after the first presented frame), `load`, `close`, `resize` and the
|
|
125
|
+
input events `mousemove`, `mousedown`, `mouseup`, `click`, `wheel`, `keydown`,
|
|
126
|
+
`keyup`.
|
|
122
127
|
|
|
123
128
|
On Windows a GUI program is linked as a **Windows-subsystem** executable, so
|
|
124
129
|
launching it does not flash a console window. That also means stdout/stderr go
|
package/doc/zh-CN/gui.md
CHANGED
|
@@ -90,14 +90,17 @@ run(); // 驱动主循环,直到所有窗口
|
|
|
90
90
|
窗口句柄上已实现的方法:`setTitle` / `setSize` / `loadHTML` /
|
|
91
91
|
`getHTML` / `setBackground` / `close` / `isOpen` / `on` / `off`,以及
|
|
92
92
|
`driver()`——它报告当前使用的 SDL_GPU 后端(`"vulkan"`、`"direct3d12"`、
|
|
93
|
-
`"metal"` 等,由 SDL
|
|
93
|
+
`"metal"` 等,由 SDL 挑选设备支持的最佳后端)。同时也提供 Web 写法:
|
|
94
|
+
`addEventListener` / `removeEventListener` 是 `on` / `off` 的别名(其
|
|
95
|
+
`options` 参数会被接受并忽略),`closed` getter 对应 `isOpen()`,因此按浏览器
|
|
96
|
+
API 编写的文档可以原样运行。
|
|
94
97
|
|
|
95
98
|
在 Windows 上,GUI 程序会被链接为 **Windows 子系统**可执行文件,因此启动时不会闪出控制台
|
|
96
99
|
窗口;这也意味着从资源管理器启动时 stdout/stderr 无处可去,调试时可在
|
|
97
100
|
`xbintsc.config.json` 里设置 `app.console: true` 保留控制台子系统。
|
|
98
101
|
|
|
99
102
|
触发的事件:
|
|
100
|
-
`ready`(首个呈现帧之后)、`load`、`close`,以及输入事件
|
|
103
|
+
`ready`(首个呈现帧之后)、`load`、`close`、`resize`,以及输入事件
|
|
101
104
|
`mousemove`、`mousedown`、`mouseup`、`click`、`wheel`、`keydown`、`keyup`。
|
|
102
105
|
|
|
103
106
|
输入处理器接收单个负载对象(生命周期处理器不接收任何参数):
|
package/package.json
CHANGED
|
@@ -165,6 +165,9 @@ void handle_event(const SDL_Event *event) {
|
|
|
165
165
|
win->height = event->window.data2;
|
|
166
166
|
if (win->document != NULL) win->document->restyle((float)win->width, (float)win->height);
|
|
167
167
|
win->geometry.dirty = 1;
|
|
168
|
+
/* Web 'resize', so a document can re-measure on a window change in every
|
|
169
|
+
* host (a browser already fires one). */
|
|
170
|
+
xt_gui_emit(win, "resize");
|
|
168
171
|
return;
|
|
169
172
|
}
|
|
170
173
|
|
|
@@ -283,6 +283,17 @@ static xt_value win_is_open(xt_value self, xt_value env, int32_t argc, xt_value
|
|
|
283
283
|
return (win != NULL && win->open) ? XT_TRUE : XT_FALSE;
|
|
284
284
|
}
|
|
285
285
|
|
|
286
|
+
/** Web 'window.closed': true once the window has been closed. The browser
|
|
287
|
+
* spelling of 'isOpen()', so a document can stop its frame loop with
|
|
288
|
+
* 'if (window.closed) return;' in every host. */
|
|
289
|
+
static xt_value win_closed_get(xt_value self, xt_value env, int32_t argc, xt_value *argv) {
|
|
290
|
+
(void)env;
|
|
291
|
+
(void)argc;
|
|
292
|
+
(void)argv;
|
|
293
|
+
XtGuiWindow *win = xt_gui_window_from_this(self);
|
|
294
|
+
return (win != NULL && win->open) ? XT_FALSE : XT_TRUE;
|
|
295
|
+
}
|
|
296
|
+
|
|
286
297
|
/** `/driver`: which SDL_GPU backend the device is running (`"vulkan"`,
|
|
287
298
|
* `"direct3d12"`, `"metal"`, …). The engine asks SDL for the best available
|
|
288
299
|
* one, so this is how a program (or a test) confirms the path in use. */
|
|
@@ -366,6 +377,22 @@ static xt_value win_off(xt_value self, xt_value env, int32_t argc, xt_value *arg
|
|
|
366
377
|
return self;
|
|
367
378
|
}
|
|
368
379
|
|
|
380
|
+
/** Web spelling of 'on': 'window.addEventListener(type, fn, options?)'. The
|
|
381
|
+
* optional 'options' argument ('capture'/'once') is accepted and ignored —
|
|
382
|
+
* window-level delivery has no capture phase — so a document written against
|
|
383
|
+
* the browser API compiles and behaves the same here. */
|
|
384
|
+
static xt_value win_add_event_listener(xt_value self, xt_value env, int32_t argc, xt_value *argv) {
|
|
385
|
+
win_on(self, env, argc, argv);
|
|
386
|
+
return XT_UNDEFINED;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/** Web spelling of 'off': 'window.removeEventListener(type, fn, options?)'. */
|
|
390
|
+
static xt_value win_remove_event_listener(xt_value self, xt_value env, int32_t argc,
|
|
391
|
+
xt_value *argv) {
|
|
392
|
+
win_off(self, env, argc, argv);
|
|
393
|
+
return XT_UNDEFINED;
|
|
394
|
+
}
|
|
395
|
+
|
|
369
396
|
/* -- input diagnostics ---------------------------------------------------- */
|
|
370
397
|
|
|
371
398
|
static double xt_gui_number_or(xt_value value, double fallback) {
|
|
@@ -466,11 +493,16 @@ xt_value xt_gui_window_proto(void) {
|
|
|
466
493
|
define_method(proto, "fontMetrics", (void *)win_font_metrics);
|
|
467
494
|
define_method(proto, "close", (void *)win_close);
|
|
468
495
|
define_method(proto, "isOpen", (void *)win_is_open);
|
|
496
|
+
define_getter(proto, "closed", (void *)win_closed_get);
|
|
469
497
|
define_method(proto, "driver", (void *)win_driver);
|
|
470
498
|
define_method(proto, "requestAnimationFrame", (void *)win_request_animation_frame);
|
|
471
499
|
define_method(proto, "cancelAnimationFrame", (void *)win_cancel_animation_frame);
|
|
472
500
|
define_method(proto, "on", (void *)win_on);
|
|
473
501
|
define_method(proto, "off", (void *)win_off);
|
|
502
|
+
/* Web spellings, so a document written against the browser API runs
|
|
503
|
+
* unchanged under the engine. */
|
|
504
|
+
define_method(proto, "addEventListener", (void *)win_add_event_listener);
|
|
505
|
+
define_method(proto, "removeEventListener", (void *)win_remove_event_listener);
|
|
474
506
|
define_method(proto, "hitTest", (void *)win_hit_test);
|
|
475
507
|
define_method(proto, "sendEvent", (void *)win_send_event);
|
|
476
508
|
g_window_proto = proto;
|
|
@@ -38,6 +38,11 @@ xt_value xt_console_assert(int32_t argc, xt_value *argv) {
|
|
|
38
38
|
static char *xt_console_labels[XT_CONSOLE_MAX_LABELS];
|
|
39
39
|
static long xt_console_counts[XT_CONSOLE_MAX_LABELS];
|
|
40
40
|
static clock_t xt_console_timers[XT_CONSOLE_MAX_LABELS];
|
|
41
|
+
/* A running timer is tracked by its own flag: clock() legitimately returns 0
|
|
42
|
+
(notably on Windows, where its resolution is one millisecond and a process
|
|
43
|
+
started less than a millisecond ago reports 0), so the timestamp itself
|
|
44
|
+
cannot serve as the "no timer running" sentinel. */
|
|
45
|
+
static unsigned char xt_console_timer_active[XT_CONSOLE_MAX_LABELS];
|
|
41
46
|
static int xt_console_label_count = 0;
|
|
42
47
|
static int xt_console_depth = 0;
|
|
43
48
|
|
|
@@ -51,6 +56,7 @@ static int xt_console_find_label(const char *label) {
|
|
|
51
56
|
memcpy(xt_console_labels[index], label, strlen(label) + 1);
|
|
52
57
|
xt_console_counts[index] = 0;
|
|
53
58
|
xt_console_timers[index] = 0;
|
|
59
|
+
xt_console_timer_active[index] = 0;
|
|
54
60
|
return index;
|
|
55
61
|
}
|
|
56
62
|
|
|
@@ -96,14 +102,17 @@ xt_value xt_console_table(int32_t argc, xt_value *argv) {
|
|
|
96
102
|
xt_value xt_console_time(int32_t argc, xt_value *argv) {
|
|
97
103
|
const char *label = xt_console_label(argc, argv);
|
|
98
104
|
int index = xt_console_find_label(label ? label : "default");
|
|
99
|
-
if (index >= 0)
|
|
105
|
+
if (index >= 0) {
|
|
106
|
+
xt_console_timers[index] = clock();
|
|
107
|
+
xt_console_timer_active[index] = 1;
|
|
108
|
+
}
|
|
100
109
|
return XT_UNDEFINED;
|
|
101
110
|
}
|
|
102
111
|
|
|
103
112
|
xt_value xt_console_time_log(int32_t argc, xt_value *argv) {
|
|
104
113
|
const char *label = xt_console_label(argc, argv);
|
|
105
114
|
int index = xt_console_find_label(label ? label : "default");
|
|
106
|
-
if (index >= 0 &&
|
|
115
|
+
if (index >= 0 && xt_console_timer_active[index]) {
|
|
107
116
|
double ms = (double)(clock() - xt_console_timers[index]) * 1000.0 / CLOCKS_PER_SEC;
|
|
108
117
|
printf("%s: %.3fms\n", xt_console_labels[index], ms);
|
|
109
118
|
}
|
|
@@ -114,6 +123,9 @@ xt_value xt_console_time_end(int32_t argc, xt_value *argv) {
|
|
|
114
123
|
xt_console_time_log(argc, argv);
|
|
115
124
|
const char *label = xt_console_label(argc, argv);
|
|
116
125
|
int index = xt_console_find_label(label ? label : "default");
|
|
117
|
-
if (index >= 0)
|
|
126
|
+
if (index >= 0) {
|
|
127
|
+
xt_console_timers[index] = 0;
|
|
128
|
+
xt_console_timer_active[index] = 0;
|
|
129
|
+
}
|
|
118
130
|
return XT_UNDEFINED;
|
|
119
131
|
}
|