# DNS Switcher — switch the system DNS (NetworkManager) from the bar. # Based on Ronin-CK's v4 "DNS Switcher", rebuilt on the v5 Luau API: the bar # widget shows the active provider and toggles a panel listing the configured # providers; picking one applies it immediately via `nmcli con mod` + # `nmcli device reapply` (no reactivation, the connection never drops). id = "nightwatch75/dns-switcher" name = "DNS Switcher" version = "0.1.1" plugin_api = 17 author = "nightwatch75" license = "MIT" # dig (bind-tools/dnsutils) is preferred for the panel's lookup tester; # nslookup is the fallback when dig is missing. Neither is required for the # core switch/apply feature, only for that one panel section. dependencies = ["networkmanager", "dig", "nslookup"] tags = ["bar", "panel", "service", "network", "privacy"] icon = "world" description = "Switch the system DNS between popular providers, custom servers, or the ISP default (NetworkManager)." # Plugin-level settings: shared by the widget engine (detection/apply) and # the panel (provider list). Custom servers are five `Name = 1.2.3.4 5.6.7.8` # string fields, custom_1..custom_5; see the comment on them for why. [[setting]] key = "providers" type = "string" label_key = "settings.providers.label" description_key = "settings.providers.description" default = "google,cloudflare,opendns,adguard,quad9" # Five separate string settings rather than one list, because Noctalia's list # editor shows an existing row as a static label with remove/up/down buttons: a # typo means deleting the row and typing it again. A string renders as a text # field, so each server can be corrected in place. Five covers any realistic # number of custom resolvers. # # The keys are new names on purpose, not a retyped custom_dns. A stored value # whose type no longer matches its declaration makes Noctalia reject every # settings write, so the whole file stops saving; a key that simply no longer # exists is just a warning. That is what 0.0.8 was released to fix. [[setting]] key = "custom_1" type = "string" label_key = "settings.custom_1.label" description_key = "settings.custom.description" default = "" [[setting]] key = "custom_2" type = "string" label_key = "settings.custom_2.label" description_key = "settings.custom.description" default = "" [[setting]] key = "custom_3" type = "string" label_key = "settings.custom_3.label" description_key = "settings.custom.description" default = "" [[setting]] key = "custom_4" type = "string" label_key = "settings.custom_4.label" description_key = "settings.custom.description" default = "" [[setting]] key = "custom_5" type = "string" label_key = "settings.custom_5.label" description_key = "settings.custom.description" default = "" [[setting]] key = "poll_seconds" type = "int" label_key = "settings.poll_seconds.label" description_key = "settings.poll_seconds.description" default = 10 min = 2 max = 120 [[setting]] key = "privilege_command" type = "string" label_key = "settings.privilege_command.label" description_key = "settings.privilege_command.description" default = "" advanced = true [[service]] id = "service" entry = "service.luau" [[panel]] id = "panel" entry = "panel.luau" # Wide enough for the longest built-in row, "OpenDNS · 208.67.222.222 # 208.67.220.220", without eliding the addresses. Height grew in 0.0.13 to # fit the lookup tester below the provider list without starving it. width = 430 height = 460 placement = "attached" open_near_click = true [[widget]] id = "dns-switcher" entry = "dns-switcher.luau" # Declared here rather than hard-coded in onClick/onRightClick, so the user # can remap any of them from the bar's own gesture settings. "right"/ # "scroll_*" are the exact IPC lines service.luau's onIpc documents. [widget.actions] left = "panel-toggle nightwatch75/dns-switcher:panel" right = "plugin nightwatch75/dns-switcher:service all apply default" scroll_up = "plugin nightwatch75/dns-switcher:service all cycle next" scroll_down = "plugin nightwatch75/dns-switcher:service all cycle prev" [[widget.setting]] key = "show_label" type = "bool" label_key = "settings.show_label.label" description_key = "settings.show_label.description" default = true