commit 2965d18e689adf194dedbac89d9a627865b8daf8
parent 36eaf6748060dbec05f3f630dfa9d4bb7adcb18a
Author: vin <vin@vineetk.net>
Date: Wed, 8 Jan 2025 23:47:30 -0500
add qutebrowser config
Diffstat:
| M | home.nix | | | 269 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- |
1 file changed, 268 insertions(+), 1 deletion(-)
diff --git a/home.nix b/home.nix
@@ -20,7 +20,6 @@ in {
neofetch
oathToolkit
profanity
- qutebrowser
rclone
transmission_4
tree
@@ -334,6 +333,90 @@ in {
};
};
+ qutebrowser = {
+ enable = true;
+
+ quickmarks = {
+ canvas = "https://floridapolytechnic.instructure.com";
+ cams = "https://cams.floridapoly.org/student/login.asp";
+ weather = "https://forecast.weather.gov/MapClick.php***REMOVED***";
+ };
+
+ searchEngines = {
+ DEFAULT = "https://searx.demiurge.vpn/search?q={}";
+ ddg = "https://lite.duckduckgo.com/?q={}";
+ nw = "https://wiki.nixos.org/index.php?search={}";
+ aw = "https://wiki.archlinux.org/?search={}";
+ gw = "https://wiki.gentoo.org/?search={}";
+ };
+
+ settings = {
+ content.javascript.enabled = false;
+
+ url = {
+ default_page = "about:blank";
+ start_pages = [
+ "about:blank"
+ ];
+ };
+
+ colors.webpage = {
+ preferred_color_scheme = "dark";
+ darkmode = {
+ enabled = true;
+ policy.images = "never";
+ };
+ };
+
+ zoom.default = "133%";
+ };
+
+ extraConfig = ''
+# javascript
+config.set('content.javascript.enabled', True, 'chrome-devtools://*')
+config.set('content.javascript.enabled', True, 'devtools://*')
+config.set('content.javascript.enabled', True, 'chrome://*/*')
+config.set('content.javascript.enabled', True, 'qute://*/*')
+
+config.set('content.javascript.enabled', True, 'floridapolytechnic.instructure.com')
+config.set('content.javascript.enabled', True, '*.floridapoly.edu')
+config.set('content.javascript.enabled', True, 'login.microsoftonline.com')
+config.set('content.javascript.enabled', True, 'www.microsoft365.com')
+config.set('content.javascript.enabled', True, 'flpoly-my.sharepoint.com')
+config.set('content.javascript.enabled', True, 'flpoly.sharepoint.com')
+config.set('content.javascript.enabled', True, 'teams.microsoft.com')
+config.set('content.javascript.enabled', True, 'ieeexplore.ieee.org')
+
+config.set('content.javascript.enabled', True, 'gitlab.com')
+config.set('content.javascript.enabled', True, 'cloud.binary.ninja')
+config.set('content.javascript.enabled', True, 'console.hetzner.cloud')
+config.set('content.javascript.enabled', True, '*.hetzner.com')
+config.set('content.javascript.enabled', True, '*.digikey.com')
+config.set('content.javascript.enabled', True, '*.demiurge.vpn')
+
+# Allow locally loaded documents to access remote URLs.
+config.set('content.local_content_can_access_remote_urls', True, 'file:///home/vin/.local/share/qutebrowser/userscripts/*')
+config.set('content.local_content_can_access_file_urls', False, 'file:///home/vin/.local/share/qutebrowser/userscripts/*')
+
+# disable dark mode for some sites
+config.set('colors.webpage.darkmode.enabled', False, 'flpoly-my.sharepoint.com')
+config.set('colors.webpage.darkmode.enabled', False, 'flpoly.sharepoint.com')
+config.set('colors.webpage.darkmode.enabled', False, 'teams.microsoft.com')
+
+config.set('colors.webpage.darkmode.enabled', False, 'cloud.binary.ninja')
+config.set('colors.webpage.darkmode.enabled', False, 'git.vineetk.net')
+
+# prevent accidental exiting
+config.unbind("<Ctrl+q>", mode="normal")
+
+# source theme from nixos
+config.source("theme.py")
+
+# source redirectors
+config.source("redirectors.py")
+'';
+ };
+
tmux = {
enable = true;
@@ -469,6 +552,189 @@ set-option -sa terminal-features ',*:RGB'
xdg = {
enable = true;
+
+ configFile = {
+ "qutebrowser/theme.py".text = ''
+# Colors.
+bg0 = "${colors.current.primary.background}"
+bg1 = "${colors.current.normal.black}"
+bg2 = "${colors.current.bright.black}"
+fg0 = "${colors.current.primary.foreground}"
+fg1 = "${colors.current.normal.white}"
+red = "${colors.current.normal.red}"
+blue = "${colors.current.normal.blue}"
+green = "${colors.current.normal.green}"
+yellow = "${colors.current.normal.yellow}"
+cyan = "${colors.current.normal.cyan}"
+magenta = "${colors.current.normal.magenta}"
+
+# --- Applying colors --- #
+
+# Completion menu.
+c.colors.completion.category.bg = bg1
+c.colors.completion.category.border.top = bg0
+c.colors.completion.category.border.bottom = bg0
+c.colors.completion.category.fg = fg0
+c.colors.completion.even.bg = bg1
+c.colors.completion.odd.bg = bg1
+c.colors.completion.item.selected.bg = bg2
+c.colors.completion.item.selected.border.bottom = bg2
+c.colors.completion.item.selected.border.top = bg2
+c.colors.completion.item.selected.fg = blue
+c.colors.completion.item.selected.match.fg = blue
+c.colors.completion.match.fg = red
+c.colors.completion.odd.bg = bg1
+c.colors.completion.scrollbar.fg = fg0
+c.colors.completion.scrollbar.bg = bg1
+
+# Statusline.
+c.colors.statusbar.caret.bg = bg0
+c.colors.statusbar.caret.fg = magenta
+c.colors.statusbar.caret.selection.bg = bg0
+c.colors.statusbar.caret.selection.fg = red
+c.colors.statusbar.command.bg = bg0
+c.colors.statusbar.command.fg = fg0
+c.colors.statusbar.insert.bg = bg0
+c.colors.statusbar.insert.fg = green
+c.colors.statusbar.normal.bg = bg0
+c.colors.statusbar.normal.fg = fg0
+c.colors.statusbar.passthrough.bg = bg0
+c.colors.statusbar.passthrough.fg = blue
+c.colors.statusbar.private.bg = bg0
+c.colors.statusbar.private.fg = fg0
+c.colors.statusbar.progress.bg = green
+c.colors.statusbar.url.error.fg = red
+c.colors.statusbar.url.fg = fg0
+c.colors.statusbar.url.hover.fg = cyan
+c.colors.statusbar.url.success.http.fg = green
+c.colors.statusbar.url.success.https.fg = green
+c.colors.statusbar.url.warn.fg = yellow
+
+# Tabline.
+c.colors.tabs.bar.bg = bg0
+c.colors.tabs.even.bg = bg1
+c.colors.tabs.even.fg = fg1
+c.colors.tabs.indicator.error = red
+c.colors.tabs.indicator.start = blue
+c.colors.tabs.indicator.stop = green
+c.colors.tabs.indicator.system = "rgb"
+c.colors.tabs.odd.bg = bg1
+c.colors.tabs.odd.fg = fg1
+c.colors.tabs.pinned.even.bg = bg2
+c.colors.tabs.pinned.even.fg = fg1
+c.colors.tabs.pinned.odd.bg = bg2
+c.colors.tabs.pinned.odd.fg = fg1
+c.colors.tabs.pinned.selected.even.bg = bg0
+c.colors.tabs.pinned.selected.even.fg = green
+c.colors.tabs.pinned.selected.odd.bg = bg0
+c.colors.tabs.pinned.selected.odd.fg = green
+c.colors.tabs.pinned.selected.even.bg = bg0
+c.colors.tabs.pinned.selected.even.fg = blue
+c.colors.tabs.selected.odd.bg = bg0
+c.colors.tabs.selected.odd.fg = fg0
+c.colors.tabs.selected.even.bg = bg0
+c.colors.tabs.selected.even.fg = fg0
+
+# Hints.
+c.colors.hints.bg = bg2
+c.colors.hints.fg = fg0
+c.colors.hints.match.fg = red
+c.hints.border = "2px solid " + bg1
+
+# Messages.
+c.colors.messages.error.bg = bg1
+c.colors.messages.error.border = bg1
+c.colors.messages.error.fg = red
+c.colors.messages.info.bg = bg1
+c.colors.messages.info.border = bg1
+c.colors.messages.info.fg = blue
+c.colors.messages.warning.bg = bg1
+c.colors.messages.warning.border = bg1
+c.colors.messages.warning.fg = yellow
+
+# Download bar.
+c.colors.downloads.bar.bg = bg0
+c.colors.downloads.error.bg = bg2
+c.colors.downloads.error.fg = red
+c.colors.downloads.start.bg = bg2
+c.colors.downloads.start.fg = blue
+c.colors.downloads.stop.bg = bg2
+c.colors.downloads.stop.fg = green
+
+# Keyhints.
+c.colors.keyhint.bg = bg0
+c.colors.keyhint.fg = fg0
+c.colors.keyhint.suffix.fg = yellow
+
+# Default color for about:blank pages (or if the css didn't specify)
+#c.colors.webpage.bg = bg1
+
+# Context menu.
+c.colors.contextmenu.disabled.bg = bg1
+c.colors.contextmenu.disabled.fg = fg1
+c.colors.contextmenu.menu.bg = bg1
+c.colors.contextmenu.menu.fg = fg0
+c.colors.contextmenu.selected.bg = bg2
+c.colors.contextmenu.selected.fg = blue
+
+# Prompts.
+c.colors.prompts.bg = bg1
+c.colors.prompts.border = "2px solid " + bg0
+c.colors.prompts.fg = fg0
+c.colors.prompts.selected.bg = bg2
+c.colors.prompts.selected.fg = blue
+ '';
+
+ "qutebrowser/redirectors.py".text = ''
+# I don't remember who I took this from. probably in qutebrowser m$hub issues
+
+import operator, re, typing
+from urllib.parse import urljoin
+
+from qutebrowser.api import interceptor, message
+from PyQt6.QtCore import QUrl
+
+def _pastebin_redir(url: QUrl) -> bool:
+ p = url.path().strip('/')
+ if p.isalnum():
+ url.setPath(urljoin("/raw/", p))
+ return True
+ return False
+
+# Any return value other than a literal 'False' means we redirected
+REDIRECT_MAP = {
+ "new.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.vpn'),
+ "np.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.vpn'),
+ "old.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.vpn'),
+ "reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.vpn'),
+ "www.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.vpn'),
+
+ "www.youtube.com": operator.methodcaller('setHost', 'invidious.demiurge.vpn'),
+ "youtube.com": operator.methodcaller('setHost', 'invidious.demiurge.vpn'),
+ "youtu.be": operator.methodcaller('setHost', 'invidious.demiurge.vpn'),
+
+ "imgur.com": operator.methodcaller('setHost', 'rimgo.bloat.cat'),
+ "i.imgur.com": operator.methodcaller('setHost', 'rimgo.bloat.cat'),
+
+ # Causes an infinite loop if the paste does not exist...
+ "pastebin.com": _pastebin_redir,
+} # type: typing.Dict[str, typing.Callable[..., typing.Optional[bool]]]
+
+def int_fn(info: interceptor.Request):
+ """Block the given request if necessary."""
+ if (info.resource_type != interceptor.ResourceType.main_frame or
+ info.request_url.scheme() in {"data", "blob"}):
+ return
+ url = info.request_url
+ redir = REDIRECT_MAP.get(url.host())
+ if redir is not None and redir(url) is not False:
+ message.info("Redirecting to " + url.toString())
+ info.redirect(url)
+
+interceptor.register(int_fn)
+ '';
+ };
+
mimeApps = {
enable = true;
defaultApplications = {
@@ -478,6 +744,7 @@ set-option -sa terminal-features ',*:RGB'
"text/xml" = [ "qutebrowser.desktop" "librewolf.desktop" ];
};
};
+
userDirs = {
createDirectories = false;
desktop = "$HOME/";