diff --git a/src/ecmascript/mujs.cpp b/src/ecmascript/mujs.cpp index e195506a1..9819e9ede 100644 --- a/src/ecmascript/mujs.cpp +++ b/src/ecmascript/mujs.cpp @@ -26,6 +26,7 @@ #include "ecmascript/ecmascript.h" #include "ecmascript/mujs.h" #include "ecmascript/mujs/screen.h" +#include "ecmascript/mujs/unibar.h" #include "ecmascript/mujs/window.h" #include "intl/libintl.h" #include "main/select.h" @@ -78,6 +79,7 @@ mujs_get_interpreter(struct ecmascript_interpreter *interpreter) interpreter->backend_data = J; mjs_window_init(interpreter, J); mjs_screen_init(interpreter, J); + mjs_unibar_init(interpreter, J); return J; #if 0 diff --git a/src/ecmascript/mujs/meson.build b/src/ecmascript/mujs/meson.build index 620f9677d..6f4b1c2e4 100644 --- a/src/ecmascript/mujs/meson.build +++ b/src/ecmascript/mujs/meson.build @@ -1,3 +1,3 @@ #srcs += files('attr.cpp', 'attributes.cpp', 'collection.cpp', 'console.cpp', 'document.cpp', 'element.cpp', 'form.cpp', 'forms.cpp', 'heartbeat.cpp', 'history.cpp', 'implementation.cpp', #'input.cpp', 'localstorage.cpp', 'location.cpp', 'navigator.cpp', 'nodelist.cpp', 'screen.cpp', 'unibar.cpp', 'window.cpp') -srcs += files('screen.cpp', 'window.cpp') +srcs += files('screen.cpp', 'unibar.cpp', 'window.cpp') diff --git a/src/ecmascript/mujs/unibar.cpp b/src/ecmascript/mujs/unibar.cpp new file mode 100644 index 000000000..9e03620ec --- /dev/null +++ b/src/ecmascript/mujs/unibar.cpp @@ -0,0 +1,190 @@ +/* The quickjs unibar objects implementation. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "elinks.h" + +#include "bfu/dialog.h" +#include "cache/cache.h" +#include "cookies/cookies.h" +#include "dialogs/menu.h" +#include "dialogs/status.h" +#include "document/html/frames.h" +#include "document/document.h" +#include "document/forms.h" +#include "document/view.h" +#include "ecmascript/ecmascript.h" +#include "ecmascript/mujs.h" +#include "ecmascript/mujs/unibar.h" +#include "intl/libintl.h" +#include "main/select.h" +#include "osdep/newwin.h" +#include "osdep/sysname.h" +#include "protocol/http/http.h" +#include "protocol/uri.h" +#include "session/history.h" +#include "session/location.h" +#include "session/session.h" +#include "session/task.h" +#include "terminal/tab.h" +#include "terminal/terminal.h" +#include "util/conv.h" +#include "util/memory.h" +#include "util/string.h" +#include "viewer/text/draw.h" +#include "viewer/text/form.h" +#include "viewer/text/link.h" +#include "viewer/text/vs.h" + +static void +mjs_menubar_get_property_visible(js_State *J) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)js_touserdata(J, 0, "menubar"); + + assert(interpreter); + struct view_state *vs = interpreter->vs; + struct document_view *doc_view = vs->doc_view; + + if (!doc_view) { + js_pushundefined(J); + return; + } + struct session_status *status = &doc_view->session->status; + + js_pushboolean(J, status->force_show_title_bar >= 0 + ? status->force_show_title_bar + : status->show_title_bar); +} + +static void +mjs_statusbar_get_property_visible(js_State *J) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)js_touserdata(J, 0, "statusbar"); + + assert(interpreter); + struct view_state *vs = interpreter->vs; + struct document_view *doc_view = vs->doc_view; + + if (!doc_view) { + js_pushundefined(J); + return; + } + struct session_status *status = &doc_view->session->status; + + js_pushboolean(J, status->force_show_status_bar >= 0 + ? status->force_show_status_bar + : status->show_status_bar); +} + +static void +mjs_menubar_set_property_visible(js_State *J) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)js_touserdata(J, 0, "menubar"); + struct view_state *vs = interpreter->vs; + struct document_view *doc_view = vs->doc_view; + int val = js_toboolean(J, 1); + + if (!doc_view) { + js_pushundefined(J); + return; + } + struct session_status *status = &doc_view->session->status; + status->force_show_title_bar = val; + + register_bottom_half(update_status, NULL); + + js_pushundefined(J); +} + +static void +mjs_statusbar_set_property_visible(js_State *J) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)js_touserdata(J, 0, "statusbar"); + struct view_state *vs = interpreter->vs; + struct document_view *doc_view = vs->doc_view; + int val = js_toboolean(J, 1); + + if (!doc_view) { + js_pushundefined(J); + return; + } + struct session_status *status = &doc_view->session->status; + status->force_show_status_bar = val; + + register_bottom_half(update_status, NULL); + + js_pushundefined(J); +} + +static void +mjs_menubar_toString(js_State *J) +{ + js_pushstring(J, "[menubar object]"); +} + +static void +mjs_statusbar_toString(js_State *J) +{ + js_pushstring(J, "[statusbar object]"); +} + +static void +mjs_menubar_init(struct ecmascript_interpreter *interpreter, js_State *J) +{ + js_getglobal(J, "Object"); + js_getproperty(J, -1, "prototype"); + js_newuserdata(J, "menubar", interpreter, NULL); + + js_newcfunction(J, mjs_menubar_toString, "menubar.prototype.toString", 0); + js_defproperty(J, -2, "toString", JS_DONTENUM); + + js_newcfunction(J, mjs_menubar_get_property_visible, "menubar.prototype.visible", 0); + js_newcfunction(J, mjs_menubar_set_property_visible, "menubar.prototype.visible", 1); + js_defaccessor(J, -3, "visible", JS_DONTENUM | JS_DONTCONF); + + js_defglobal(J, "menubar", JS_DONTENUM); +} + +static void +mjs_statusbar_init(struct ecmascript_interpreter *interpreter, js_State *J) +{ + js_getglobal(J, "Object"); + js_getproperty(J, -1, "prototype"); + js_newuserdata(J, "statusbar", interpreter, NULL); + + js_newcfunction(J, mjs_statusbar_toString, "statusbar.prototype.toString", 0); + js_defproperty(J, -2, "toString", JS_DONTENUM); + + js_newcfunction(J, mjs_statusbar_get_property_visible, "statusbar.prototype.visible", 0); + js_newcfunction(J, mjs_statusbar_set_property_visible, "statusbar.prototype.visible", 1); + js_defaccessor(J, -3, "visible", JS_DONTENUM | JS_DONTCONF); + + js_defglobal(J, "statusbar", JS_DONTENUM); +} + +int +mjs_unibar_init(struct ecmascript_interpreter *interpreter, js_State *J) +{ + mjs_menubar_init(interpreter, J); + mjs_statusbar_init(interpreter, J); + + return 0; +} diff --git a/src/ecmascript/mujs/unibar.h b/src/ecmascript/mujs/unibar.h new file mode 100644 index 000000000..62224c0fd --- /dev/null +++ b/src/ecmascript/mujs/unibar.h @@ -0,0 +1,10 @@ +#ifndef EL__ECMASCRIPT_MUJS_UNIBAR_H +#define EL__ECMASCRIPT_MUJS_UNIBAR_H + +#include + +struct ecmascript_interpreter; + +int mjs_unibar_init(struct ecmascript_interpreter *interpreter, js_State *J); + +#endif