Skip to content

Commit 0b5e020

Browse files
committed
exit app after shell exited
1 parent df51d52 commit 0b5e020

File tree

3 files changed

+49
-10
lines changed

3 files changed

+49
-10
lines changed

entry/src/main/cpp/napi_init.cpp

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ static napi_value resize(napi_env env, napi_callback_info info) {
6363
return nullptr;
6464
}
6565

66-
napi_threadsafe_function registered_callback = nullptr;
66+
napi_threadsafe_function on_data_callback = nullptr;
67+
napi_threadsafe_function on_exit_callback = nullptr;
6768

6869
struct data_buffer {
6970
char *buf;
@@ -96,19 +97,23 @@ static void *terminal_worker(void *) {
9697
}
9798

9899
// call callback registered by ArkTS
99-
if (hex.length() > 0 && registered_callback != nullptr) {
100+
if (hex.length() > 0 && on_data_callback != nullptr) {
100101
data_buffer *pbuf = new data_buffer{.buf = new char[hex.length()], .size = (size_t)hex.length()};
101102
memcpy(pbuf->buf, &hex[0], hex.length());
102-
napi_call_threadsafe_function(registered_callback, pbuf, napi_tsfn_nonblocking);
103+
napi_call_threadsafe_function(on_data_callback, pbuf, napi_tsfn_nonblocking);
103104
}
104105

105106
OH_LOG_INFO(LOG_APP, "Got: %{public}s", hex.c_str());
106107
} else if (r < 0) {
107108

108109
OH_LOG_INFO(LOG_APP, "Program exited: %{public}ld %{public}d", r, errno);
110+
break;
109111
}
110112
}
111113
}
114+
115+
napi_call_threadsafe_function(on_exit_callback, nullptr, napi_tsfn_nonblocking);
116+
return nullptr;
112117
}
113118

114119
static napi_value run(napi_env env, napi_callback_info info) {
@@ -142,7 +147,7 @@ static napi_value run(napi_env env, napi_callback_info info) {
142147
// termios
143148
struct termios t {};
144149
struct termios *term = &t;
145-
150+
146151
term->c_iflag = ICRNL | IXON | IUTF8;
147152
term->c_oflag = NL0 | CR0 | TAB0 | BS0 | VT0 | FF0 | OPOST | ONLCR;
148153
term->c_cflag = B38400 | CS8 | CREAD;
@@ -233,7 +238,7 @@ static napi_value send(napi_env env, napi_callback_info info) {
233238
return nullptr;
234239
}
235240

236-
void real_func_call_js(napi_env env, napi_value js_callback, void *context, void *data) {
241+
void call_on_data_callback(napi_env env, napi_value js_callback, void *context, void *data) {
237242

238243
data_buffer *buffer = static_cast<data_buffer *>(data);
239244

@@ -253,7 +258,17 @@ void real_func_call_js(napi_env env, napi_value js_callback, void *context, void
253258
delete buffer;
254259
}
255260

256-
static napi_value register_callback(napi_env env, napi_callback_info info) {
261+
void call_on_exit_callback(napi_env env, napi_value js_callback, void *context, void *data) {
262+
263+
napi_value global;
264+
napi_get_global(env, &global);
265+
266+
napi_value result;
267+
napi_value args[1] = {};
268+
napi_call_function(env, global, js_callback, 0, args, &result);
269+
}
270+
271+
static napi_value register_on_data_callback(napi_env env, napi_callback_info info) {
257272

258273
size_t argc = 1;
259274
napi_value args[1];
@@ -263,7 +278,22 @@ static napi_value register_callback(napi_env env, napi_callback_info info) {
263278
napi_create_string_utf8(env, "data_callback", NAPI_AUTO_LENGTH, &src_cb_name);
264279

265280
napi_create_threadsafe_function(env, args[0], nullptr, src_cb_name, 0, 1, nullptr, nullptr, nullptr,
266-
real_func_call_js, &registered_callback);
281+
call_on_data_callback, &on_data_callback);
282+
283+
return nullptr;
284+
}
285+
286+
static napi_value register_on_exit_callback(napi_env env, napi_callback_info info) {
287+
288+
size_t argc = 1;
289+
napi_value args[1];
290+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
291+
292+
napi_value src_cb_name;
293+
napi_create_string_utf8(env, "exit_callback", NAPI_AUTO_LENGTH, &src_cb_name);
294+
295+
napi_create_threadsafe_function(env, args[0], nullptr, src_cb_name, 0, 1, nullptr, nullptr, nullptr,
296+
call_on_exit_callback, &on_exit_callback);
267297

268298
return nullptr;
269299
}
@@ -274,7 +304,8 @@ static napi_value Init(napi_env env, napi_value exports) {
274304
{"resize", nullptr, resize, nullptr, nullptr, nullptr, napi_default, nullptr},
275305
{"run", nullptr, run, nullptr, nullptr, nullptr, napi_default, nullptr},
276306
{"send", nullptr, send, nullptr, nullptr, nullptr, napi_default, nullptr},
277-
{"subscribe", nullptr, register_callback, nullptr, nullptr, nullptr, napi_default, nullptr}};
307+
{"onData", nullptr, register_on_data_callback, nullptr, nullptr, nullptr, napi_default, nullptr},
308+
{"onExit", nullptr, register_on_exit_callback, nullptr, nullptr, nullptr, napi_default, nullptr}};
278309
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
279310
return exports;
280311
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export const run: (w: number, h: number) => void;
22
export const send: (content: ArrayBuffer) => void;
3-
export const subscribe: (cb: (ArrayBuffer) => void) => void;
3+
export const onData: (cb: (ArrayBuffer) => void) => void;
4+
export const onExit: (cb: () => void) => void;
45
export const resize: (w: number, h: number) => void;

entry/src/main/ets/pages/Index.ets

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import util from '@ohos.util';
22
import { buffer } from '@kit.ArkTS';
33
import { webview } from '@kit.ArkWeb';
44
import { hilog } from '@kit.PerformanceAnalysisKit';
5+
import { common } from '@kit.AbilityKit';
56
import napi from 'libentry.so';
67

78
const DOMAIN = 0x0001;
@@ -65,7 +66,7 @@ class NativeProxy {
6566

6667
const s: Size = await this.getSize();
6768

68-
napi.subscribe((a: ArrayBuffer) => {
69+
napi.onData((a: ArrayBuffer) => {
6970
let dec = util.TextDecoder.create('utf-8', { ignoreBOM: true })
7071
let s: string = dec.decodeToString(new Uint8Array(a))
7172

@@ -101,6 +102,12 @@ struct Index {
101102
src: $rawfile('term.html'),
102103
controller: this.webviewController
103104
})
105+
.onPageBegin(() => {
106+
napi.onExit(() => {
107+
(this.getUIContext().getHostContext() as common.UIAbilityContext)?.terminateSelf()
108+
hilog.info(DOMAIN, 'WebTerminal', '%{public}s', 'onExit')
109+
})
110+
})
104111
.javaScriptProxy({
105112
object: this.native,
106113
name: 'native',

0 commit comments

Comments
 (0)