v0.0.21 - Settings page cleanup: default new tab URL blank, remove all dimmed descriptions, fix garbled text at bottom (missing foot argument in printf), theme toggle as link instead of onclick div

This commit is contained in:
Laan Tungir
2026-07-13 07:19:34 -04:00
parent a4b4c52a91
commit 31195c4fe2
4 changed files with 34 additions and 64 deletions
+1 -1
View File
@@ -1 +1 @@
0.0.20
0.0.21
+30 -60
View File
@@ -473,6 +473,7 @@ static const char *sovereign_page_css(void) {
" border-radius: 4px; }\n"
" .theme-toggle { position: fixed; top: 20px; right: 20px;\n"
" display: flex; align-items: center; gap: 8px; cursor: pointer;\n"
" text-decoration: none; user-select: none;\n"
" font-size: 12px; color: var(--muted); user-select: none;\n"
" border: 1px solid var(--border); border-radius: var(--radius);\n"
" padding: 4px 10px; background: var(--bg); z-index: 10; }\n"
@@ -507,11 +508,10 @@ static char *sovereign_page_head(const char *title) {
* Returns a newly-allocated string (g_free). */
static char *sovereign_page_foot(void) {
return g_strdup_printf(
"<div class='theme-toggle' onclick='document.location.href="
"\"sovereign://settings/set?feature=theme_dark\"'>"
"%s &#9728;&#9790;</div>\n"
"<a class='theme-toggle' href='sovereign://settings/set?feature=theme_dark'>"
"%s</a>\n"
"</body></html>\n",
settings_get()->theme_dark ? "Day" : "Night");
settings_get()->theme_dark ? "Day Mode" : "Night Mode");
}
/* ── Settings page ─────────────────────────────────────────────── */
@@ -585,35 +585,29 @@ static void handle_settings_page(WebKitURISchemeRequest *request) {
/* Build the keyboard shortcuts section HTML. One row per action. */
GString *shortcuts_html = g_string_new(NULL);
g_string_append(shortcuts_html,
"<h2>Keyboard Shortcuts</h2>\n"
"<p class='note'>Click <b>Change</b> then press the key combination "
"you want. Press <b>Escape</b> to cancel.</p>\n");
"<h2>Keyboard Shortcuts</h2>\n");
for (int i = 0; i < SHORTCUT_COUNT; i++) {
const shortcut_meta_t *m = shortcuts_meta((shortcut_action_t)i);
const char *accel = shortcuts_get((shortcut_action_t)i);
char *label_esc = g_markup_escape_text(m->label, -1);
char *desc_esc = g_markup_escape_text(m->desc, -1);
char *accel_esc = g_markup_escape_text(accel ? accel : "", -1);
g_string_append_printf(shortcuts_html,
"<div class='field shortcut-row' data-action='%s' data-accel='%s'>\n"
" <div><div class='setting-name'>%s</div>\n"
" <div class='setting-desc'>%s</div></div>\n"
" <div><div class='setting-name'>%s</div></div>\n"
" <div><span class='shortcut-display' id='sc_%s'>%s</span>\n"
" <button class='save-btn sc-change' data-action='%s'>Change</button>\n"
" <button class='save-btn sc-reset' data-action='%s'>Reset</button></div>\n"
"</div>\n",
m->id, accel ? accel : "",
label_esc, desc_esc,
label_esc,
m->id, accel_esc,
m->id, m->id);
g_free(label_esc);
g_free(desc_esc);
g_free(accel_esc);
}
g_string_append(shortcuts_html,
"<div class='field'>"
"<div><div class='setting-name'>Reset all shortcuts</div>"
"<div class='setting-desc'>Restore all bindings to defaults</div></div>"
"<div><div class='setting-name'>Reset all shortcuts</div></div>"
"<div><button class='save-btn' id='sc-reset-all'>Reset All</button></div>"
"</div>\n");
@@ -627,29 +621,25 @@ static void handle_settings_page(WebKitURISchemeRequest *request) {
"<h2>Appearance</h2>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>Dark mode (Night)</div>\n"
" <div class='setting-desc'>Black background, white text. Toggle for Day mode.</div></div>\n"
" <div><div class='setting-name'>Dark mode (Night)</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"theme_dark\")'></div>\n"
"</div>\n"
"\n"
"<h2>Tabs</h2>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>Restore session on startup</div>\n"
" <div class='setting-desc'>Reopen tabs from the previous session</div></div>\n"
" <div><div class='setting-name'>Restore session on startup</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"restore_session\")'></div>\n"
"</div>\n"
"\n"
"<div class='field'>\n"
" <div><div class='setting-name'>New tab URL</div>\n"
" <div class='setting-desc'>Page loaded when opening a new tab</div></div>\n"
" <div><div class='setting-name'>New tab URL</div></div>\n"
" <div><input type='text' id='new_tab_url' value='%s'>\n"
" <button class='save-btn' onclick=\"save('new_tab_url')\">Save</button></div>\n"
"</div>\n"
"\n"
"<div class='field'>\n"
" <div><div class='setting-name'>Tab bar position</div>\n"
" <div class='setting-desc'>Where the tab strip appears</div></div>\n"
" <div><div class='setting-name'>Tab bar position</div></div>\n"
" <div><select id='tab_bar_position'>\n"
" <option value='top'%s>Top</option>\n"
" <option value='bottom'%s>Bottom</option>\n"
@@ -660,32 +650,27 @@ static void handle_settings_page(WebKitURISchemeRequest *request) {
"</div>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>Show tab close buttons</div>\n"
" <div class='setting-desc'>Per-tab close button in the tab strip</div></div>\n"
" <div><div class='setting-name'>Show tab close buttons</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"show_tab_close_buttons\")'></div>\n"
"</div>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>Middle-click to close tab</div>\n"
" <div class='setting-desc'>Middle-click on a tab closes it</div></div>\n"
" <div><div class='setting-name'>Middle-click to close tab</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"middle_click_close\")'></div>\n"
"</div>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>Ctrl+Tab to switch tabs</div>\n"
" <div class='setting-desc'>Cycle tabs with Ctrl+Tab / Ctrl+Shift+Tab</div></div>\n"
" <div><div class='setting-name'>Ctrl+Tab to switch tabs</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"ctrl_tab_switch\")'></div>\n"
"</div>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>Allow drag to reorder tabs</div>\n"
" <div class='setting-desc'>Drag tabs in the strip to reorder them</div></div>\n"
" <div><div class='setting-name'>Allow drag to reorder tabs</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"tab_drag_reorder\")'></div>\n"
"</div>\n"
"\n"
"<div class='field'>\n"
" <div><div class='setting-name'>Maximum tabs</div>\n"
" <div class='setting-desc'>Hard limit on simultaneous tabs</div></div>\n"
" <div><div class='setting-name'>Maximum tabs</div></div>\n"
" <div><input type='number' id='max_tabs' value='%d' min='1' max='999'>\n"
" <button class='save-btn' onclick=\"save('max_tabs')\">Save</button></div>\n"
"</div>\n"
@@ -695,38 +680,31 @@ static void handle_settings_page(WebKitURISchemeRequest *request) {
"<h2>Agent Server</h2>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>Enable agent server</div>\n"
" <div class='setting-desc'>MCP server for automation (takes effect on next launch)</div></div>\n"
" <div><div class='setting-name'>Enable agent server</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"agent_server_enabled\")'></div>\n"
"</div>\n"
"\n"
"<div class='field'>\n"
" <div><div class='setting-name'>Agent server port</div>\n"
" <div class='setting-desc'>TCP port for the MCP server (next launch)</div></div>\n"
" <div><div class='setting-name'>Agent server port</div></div>\n"
" <div><input type='number' id='agent_server_port' value='%d' min='1' max='65535'>\n"
" <button class='save-btn' onclick=\"save('agent_server_port')\">Save</button></div>\n"
"</div>\n"
"\n"
"<div class='field'>\n"
" <div><div class='setting-name'>Allowed origins</div>\n"
" <div class='setting-desc'>Comma-separated CORS origins (* for any)</div></div>\n"
" <div><div class='setting-name'>Allowed origins</div></div>\n"
" <div><input type='text' id='agent_allowed_origins' value='%s'>\n"
" <button class='save-btn' onclick=\"save('agent_allowed_origins')\">Save</button></div>\n"
"</div>\n"
"\n"
"<div class='field'>\n"
" <div><div class='setting-name'>Login timeout (ms)</div>\n"
" <div class='setting-desc'>Wait for agent login before GTK dialog</div></div>\n"
" <div><div class='setting-name'>Login timeout (ms)</div></div>\n"
" <div><input type='number' id='agent_login_timeout_ms' value='%d' min='0' max='300000'>\n"
" <button class='save-btn' onclick=\"save('agent_login_timeout_ms')\">Save</button></div>\n"
"</div>\n"
"\n"
"<h2>Bootstrap Relays</h2>\n"
"<p class='note'>Relays queried after login to fetch your profile (kind 0),\n"
"contacts (kind 3), and relay list (kind 10002). One wss:// URL per line.</p>\n"
"<div class='field'>\n"
" <div><div class='setting-name'>Relay URLs</div>\n"
" <div class='setting-desc'>One wss:// URL per line</div></div>\n"
" <div><div class='setting-name'>Relay URLs</div></div>\n"
" <div><textarea id='bootstrap_relays' rows='4' cols='40'>%s</textarea>\n"
" <button class='save-btn' onclick=\"save('bootstrap_relays')\">Save</button></div>\n"
"</div>\n"
@@ -734,8 +712,7 @@ static void handle_settings_page(WebKitURISchemeRequest *request) {
"<h2>Search</h2>\n"
"\n"
"<div class='field'>\n"
" <div><div class='setting-name'>Search engine</div>\n"
" <div class='setting-desc'>Engine used when typing a query in the URL bar</div></div>\n"
" <div><div class='setting-name'>Search engine</div></div>\n"
" <div><select id='search_engine'>\n"
"%s"
" </select>\n"
@@ -743,37 +720,29 @@ static void handle_settings_page(WebKitURISchemeRequest *request) {
"</div>\n"
"\n"
"<h2>Security</h2>\n"
"<p class='note'>The 'reckless browser' thesis: identity and transport are handled\n"
"at a different layer (Nostr keys + FIPS mesh), so the browser's own security\n"
"sandbox is deliberately stripped. Toggle features on if you need them.</p>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>Developer Tools (Inspector)</div>\n"
" <div class='setting-desc'>Enable WebKit Web Inspector for JS debugging</div></div>\n"
" <div><div class='setting-name'>Developer Tools (Inspector)</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"dev_extras\")'></div>\n"
"</div>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>File Access from file://</div>\n"
" <div class='setting-desc'>Allow file:// pages to access other file:// resources</div></div>\n"
" <div><div class='setting-name'>File Access from file://</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"file_access\")'></div>\n"
"</div>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>Universal Access from file://</div>\n"
" <div class='setting-desc'>Allow file:// pages to make cross-origin requests (needed for sovereign:// bridge)</div></div>\n"
" <div><div class='setting-name'>Universal Access from file://</div></div>\n"
" <div class='toggle %s' onclick='toggle(\"universal_access\")'></div>\n"
"</div>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>CORS Enforcement</div>\n"
" <div class='setting-desc'>Block cross-origin requests without CORS headers (currently always off)</div></div>\n"
" <div><div class='setting-name'>CORS Enforcement</div></div>\n"
" <div class='toggle off' style='opacity:0.5'></div>\n"
"</div>\n"
"\n"
"<div class='setting'>\n"
" <div><div class='setting-name'>TLS Certificate Check</div>\n"
" <div class='setting-desc'>Reject invalid/self-signed certificates (currently always off — FIPS uses Noise IK)</div></div>\n"
" <div><div class='setting-name'>TLS Certificate Check</div></div>\n"
" <div class='toggle off' style='opacity:0.5'></div>\n"
"</div>\n"
"\n"
@@ -996,7 +965,8 @@ static void handle_settings_page(WebKitURISchemeRequest *request) {
search_engine_options->str,
dev_extras ? "on" : "off",
file_access ? "on" : "off",
universal_access ? "on" : "off"
universal_access ? "on" : "off",
foot
);
respond_html(request, html);
+1 -1
View File
@@ -15,7 +15,7 @@
extern "C" {
#endif
#define SETTINGS_NEW_TAB_URL_DEFAULT "https://example.com"
#define SETTINGS_NEW_TAB_URL_DEFAULT ""
#define SETTINGS_NEW_TAB_URL_MAX 512
#define SETTINGS_MAX_TABS_DEFAULT 50
#define SETTINGS_AGENT_PORT_DEFAULT 17777
+2 -2
View File
@@ -11,9 +11,9 @@
#ifndef SOVEREIGN_BROWSER_VERSION_H
#define SOVEREIGN_BROWSER_VERSION_H
#define SB_VERSION "v0.0.20"
#define SB_VERSION "v0.0.21"
#define SB_VERSION_MAJOR 0
#define SB_VERSION_MINOR 0
#define SB_VERSION_PATCH 20
#define SB_VERSION_PATCH 21
#endif /* SOVEREIGN_BROWSER_VERSION_H */