From f4e66f1fc61da2387d72e1c24a8068d5a215eba1 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Tue, 24 Oct 2006 20:41:25 +0200 Subject: [PATCH] ECMAScript: added writeonly property window.status --- src/dialogs/status.c | 8 +++++++- src/ecmascript/see/strings.c | 2 ++ src/ecmascript/see/strings.h | 1 + src/ecmascript/see/window.c | 14 ++++++++++++-- src/ecmascript/spidermonkey/window.c | 6 ++++++ src/session/session.c | 3 +++ src/session/session.h | 3 +++ src/viewer/text/view.c | 5 +++++ 8 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/dialogs/status.c b/src/dialogs/status.c index d5ffc48f..3c37acef 100644 --- a/src/dialogs/status.c +++ b/src/dialogs/status.c @@ -194,7 +194,13 @@ display_status_bar(struct session *ses, struct terminal *term, int tabs_count) if (ses->kbdprefix.repeat_count) { msg = msg_text(term, N_("Keyboard prefix: %d"), ses->kbdprefix.repeat_count); - } else if (download) { + } +#ifdef CONFIG_ECMASCRIPT + else if (ses->status.window_status) { + msg = stracpy(ses->status.window_status); + } +#endif + else if (download) { struct document_view *doc_view = current_frame(ses); /* Show S_INTERRUPTED message *once* but then show links diff --git a/src/ecmascript/see/strings.c b/src/ecmascript/see/strings.c index 4967b7a6..cdfec845 100644 --- a/src/ecmascript/see/strings.c +++ b/src/ecmascript/see/strings.c @@ -96,6 +96,7 @@ struct SEE_string *s_hidden; struct SEE_string *s_timeout; struct SEE_string *s_setTimeout; +struct SEE_string *s_status; void init_intern_strings(void) @@ -195,4 +196,5 @@ init_intern_strings(void) s_timeout = SEE_intern_global("timeout"); s_setTimeout = SEE_intern_global("setTimeout"); + s_status = SEE_intern_global("status"); } diff --git a/src/ecmascript/see/strings.h b/src/ecmascript/see/strings.h index 0ae058c1..5bce77f8 100644 --- a/src/ecmascript/see/strings.h +++ b/src/ecmascript/see/strings.h @@ -101,4 +101,5 @@ extern struct SEE_string *s_hidden; extern struct SEE_string *s_timeout; extern struct SEE_string *s_setTimeout; +extern struct SEE_string *s_status; #endif diff --git a/src/ecmascript/see/window.c b/src/ecmascript/see/window.c index efbac2c2..361be6ea 100644 --- a/src/ecmascript/see/window.c +++ b/src/ecmascript/see/window.c @@ -103,7 +103,7 @@ window_get(struct SEE_interpreter *interp, struct SEE_object *o, if (p == s_closed) { SEE_SET_BOOLEAN(res, 0); - } else if (p == s_self || p == s_parent || p == s_top) { + } else if (p == s_self || p == s_parent || p == s_top || p == s_status) { SEE_SET_OBJECT(res, o); #if 0 } else if (p == s_parent || p == s_top) { @@ -169,6 +169,16 @@ window_put(struct SEE_interpreter *interp, struct SEE_object *o, location_goto(doc_view, str); mem_free(str); } + } else if (p == s_status) { + struct global_object *g = (struct global_object *)interp; + struct js_window_object *win = g->win; + struct view_state *vs = win->vs; + struct document_view *doc_view = vs->doc_view; + struct session *ses = doc_view->session; + unsigned char *stat = SEE_value_to_unsigned_char(interp, val); + + mem_free_set(&ses->status.window_status, stat); + print_screen_status(ses); } } @@ -176,7 +186,7 @@ static int window_canput(struct SEE_interpreter *interp, struct SEE_object *o, struct SEE_string *p) { - if (p == s_location) + if (p == s_location || p == s_status) return 1; return 0; } diff --git a/src/ecmascript/spidermonkey/window.c b/src/ecmascript/spidermonkey/window.c index 380511f7..4c218fc7 100644 --- a/src/ecmascript/spidermonkey/window.c +++ b/src/ecmascript/spidermonkey/window.c @@ -60,6 +60,7 @@ enum window_prop { JSP_WIN_CLOSED, JSP_WIN_PARENT, JSP_WIN_SELF, + JSP_WIN_STATUS, JSP_WIN_TOP, }; /* "location" is special because we need to simulate "location.href" @@ -72,6 +73,7 @@ const JSPropertySpec window_props[] = { { "closed", JSP_WIN_CLOSED, JSPROP_ENUMERATE | JSPROP_READONLY }, { "parent", JSP_WIN_PARENT, JSPROP_ENUMERATE | JSPROP_READONLY }, { "self", JSP_WIN_SELF, JSPROP_ENUMERATE | JSPROP_READONLY }, + { "status", JSP_WIN_STATUS, JSPROP_ENUMERATE }, { "top", JSP_WIN_TOP, JSPROP_ENUMERATE | JSPROP_READONLY }, { "window", JSP_WIN_SELF, JSPROP_ENUMERATE | JSPROP_READONLY }, { NULL } @@ -251,6 +253,10 @@ window_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) return JS_TRUE; switch (JSVAL_TO_INT(id)) { + case JSP_WIN_STATUS: + mem_free_set(&vs->doc_view->session->status.window_status, stracpy(jsval_to_string(ctx, vp))); + print_screen_status(vs->doc_view->session); + return JS_TRUE; default: INTERNAL("Invalid ID %d in window_set_property().", JSVAL_TO_INT(id)); return JS_TRUE; diff --git a/src/session/session.c b/src/session/session.c index 2dc95d52..383b7374 100644 --- a/src/session/session.c +++ b/src/session/session.c @@ -1171,6 +1171,9 @@ destroy_session(struct session *ses) mem_free_if(ses->search_word); mem_free_if(ses->last_search_word); mem_free_if(ses->status.last_title); +#ifdef CONFIG_ECMASCRIPT + mem_free_if(ses->status.window_status); +#endif del_from_list(ses); } diff --git a/src/session/session.h b/src/session/session.h index 697cb7f6..55d37d9f 100644 --- a/src/session/session.h +++ b/src/session/session.h @@ -92,6 +92,9 @@ struct session_status { unsigned int set_window_title:1; unsigned char *last_title; +#ifdef CONFIG_ECMASCRIPT + unsigned char *window_status; +#endif #ifdef CONFIG_LEDS unsigned int show_leds:1; diff --git a/src/viewer/text/view.c b/src/viewer/text/view.c index 1b610466..dc418487 100644 --- a/src/viewer/text/view.c +++ b/src/viewer/text/view.c @@ -67,6 +67,11 @@ detach_formatted(struct document_view *doc_view) assert(doc_view); if_assert_failed return; +#ifdef CONFIG_ECMASCRIPT + if (doc_view->session) { + mem_free_set(&doc_view->session->status.window_status, NULL); + } +#endif if (doc_view->document) { release_document(doc_view->document); doc_view->document = NULL;