summaryrefslogtreecommitdiff
path: root/wifi-bluetooth-conf.el
diff options
context:
space:
mode:
authorJSDurand <mmemmew@gmail.com>2021-05-20 11:41:32 +0800
committerJSDurand <mmemmew@gmail.com>2021-05-20 11:41:32 +0800
commit4ad81530200d2a82f29ca265c0cccb45b769a498 (patch)
tree280c592705d28db9b9112f3d4e289363106a798c /wifi-bluetooth-conf.el
parentc1862c35c090d328ed107dfbf7b7fcf42ec6f492 (diff)
Refactor wifi and bluetooth settings to a separate file
* view-conf.el (durand-wifi-on-p): (durand-bluetooth-on-p): (durand-wifi-filter): (durand-bluetooth-filter): (durand-wifi-or-bluetooth): (global-map): These are moved to wifi-bluetooth-conf.el now. * wifi-bluetooth-conf.el (durand-wifi-on-p): (durand-bluetooth-on-p): (durand-wifi-filter): (durand-bluetooth-filter): (durand-wifi-toggle): (durand-bluetooth-toggle): These are old functions. (durand-wifi-executable): The name of an executable to manage wifis. (durand-wifi-bluetooth-buffer): A shared buffer for wifi-related commands. (durand-wifi-list-ports): List all available WIFI ports or the currently connected one, if the optional argument is non-nil. (durand-wifi-join-port): Join a port. This is still buggy. (durand-wifi-list-sentinel): The sentinel for the list-port function. (durand-wifi-join-filter): The filter to inform the user of the output of the command. This is important since currently the command will only error out for some reason. (global-map): Bind the functions to appropriate key sequences.
Diffstat (limited to 'wifi-bluetooth-conf.el')
-rw-r--r--wifi-bluetooth-conf.el246
1 files changed, 246 insertions, 0 deletions
diff --git a/wifi-bluetooth-conf.el b/wifi-bluetooth-conf.el
new file mode 100644
index 0000000..d02bb77
--- /dev/null
+++ b/wifi-bluetooth-conf.el
@@ -0,0 +1,246 @@
+;;; wifi-bluetooth-conf.el --- Configuration to manage wifi and bluetooth -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021 李俊緯
+
+;; Author: 李俊緯 <mmemmew@gmail.com>
+;; Keywords: comm, hardware, games, unix
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Configuration to manage wifi and bluetooth.
+
+;;; Code:
+
+;;;###autoload
+(defvar durand-wifi-on-p nil
+ "If WIFI is on or not.
+This is defined in \"/Users/durand/.emacs.d/view-conf.el\"")
+
+;;;###autoload
+(defvar durand-bluetooth-on-p nil
+ "If BLUETOOTH is on or not.
+This is defined in \"/Users/durand/.emacs.d/view-conf.el\"")
+
+;;;###autoload
+(defun durand-wifi-filter (proc output)
+ "Filter function to set the wifi variable.
+This should only be used for the process \"durand-wifi\".
+This is defined in \"/Users/durand/.emacs.d/view-conf.el\""
+ (cond
+ ((string= (process-name proc) "durand-wifi"))
+ ((user-error "Filter function associated with a wrong process.")))
+ (setq durand-wifi-on-p (string-match "On$" output)))
+
+;;;###autoload
+(defun durand-bluetooth-filter (proc output)
+ "Filter function to set the bluetooth variable.
+This should only be used for the process \"durand-bluetooth\".
+This is defined in \"/Users/durand/.emacs.d/view-conf.el\""
+ (cond
+ ((string= (process-name proc) "durand-bluetooth"))
+ ((user-error "Filter function associated with a wrong process.")))
+ (setq durand-bluetooth-on-p (string-match "1" output)))
+
+;;;###autoload
+(defun durand-wifi-toggle ()
+ "Check if WIFI is enabled, then ask to toggle WIFI."
+ (interactive)
+ (make-process
+ :name "durand-wifi"
+ :buffer nil
+ :command '("networksetup" "-getairportpower" "en0")
+ :filter #'durand-wifi-filter
+ :sentinel #'ignore)
+ (accept-process-output (get-process "durand-wifi"))
+ (let* ((prompt (format "WIFI is %s. Do you want to turn WIFI %s"
+ (cond (durand-wifi-on-p "on")
+ ("off"))
+ (cond (durand-wifi-on-p "off?")
+ ("on?"))))
+ (decision (y-or-n-p prompt)))
+ (cond
+ (decision
+ (let ((new-state (cond (durand-wifi-on-p "off")
+ ("on"))))
+ (make-process
+ :name "durand-toggle-wifi"
+ :buffer nil
+ :command (list
+ "networksetup" "-setairportpower"
+ "en0" new-state)
+ :sentinel #'ignore
+ :filter #'ignore)
+ (message "WIFI turned %s" new-state))))))
+
+;;;###autoload
+(defun durand-bluetooth-toggle ()
+ "Check if BLUETOOTH is enabled, then ask to toggle BLUETOOTH."
+ (interactive)
+ (make-process
+ :name "durand-bluetooth"
+ :buffer nil
+ :command '("blueutil" "-p")
+ :filter #'durand-bluetooth-filter
+ :sentinel 'ignore)
+ (accept-process-output (get-process "durand-bluetooth"))
+ (let* ((prompt (format "BLUETOOTH is %s. Do you want to turn BLUETOOTH %s"
+ (cond (durand-bluetooth-on-p "on")
+ ("off"))
+ (cond (durand-bluetooth-on-p "off?")
+ ("on?"))))
+ (decision (y-or-n-p prompt)))
+ (cond
+ (decision
+ (let ((new-state (cond (durand-bluetooth-on-p "0")
+ ("1"))))
+ (make-process
+ :name "durand-toggle-bluetooth"
+ :buffer nil
+ :command (list "blueutil" "-p" new-state)
+ :sentinel 'ignore
+ :filter 'ignore)
+ (message "BLUETOOTH turned %s"
+ (cond (durand-bluetooth-on-p "off")
+ ("on"))))))))
+
+;;;###autoload
+(defconst durand-wifi-executable
+ "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport"
+ "The executable to manage some WIFI settings.")
+
+;;;###autoload
+(defconst durand-wifi-bluetooth-buffer
+ "*durand-wifi-bluetooth*"
+ "The buffer to accept outputs from commands managing WIFI or BLUETOOTH.")
+
+;;;###autoload
+(defun durand-wifi-list-ports (&optional arg)
+ "List available wifi networks.
+If ARG is non-nil, then list the currently connected port."
+ (interactive "P")
+ (cond
+ ((and (get-buffer durand-wifi-bluetooth-buffer)
+ (buffer-live-p (get-buffer durand-wifi-bluetooth-buffer)))
+ (kill-buffer durand-wifi-bluetooth-buffer)))
+ (cond ((null arg)
+ (make-process
+ :name "durand-wifi-list-ports"
+ :buffer durand-wifi-bluetooth-buffer
+ :command (list durand-wifi-executable "-s")
+ :sentinel #'durand-wifi-list-sentinel))
+ ((make-process
+ :name "durand-wifi-list-ports"
+ :buffer durand-wifi-bluetooth-buffer
+ :command (list durand-wifi-executable "-I")
+ :sentinel #'durand-wifi-list-sentinel))))
+
+;;;###autoload
+(defun durand-wifi-join-port (port &optional pwd)
+ "Join PORT.
+If PWD is non-nil, use that as the password."
+ (interactive (let ((po (read-string "Port to join: "))
+ (pwd (read-string "Password: ")))
+ (cond ((and pwd (not (string= pwd "")))
+ (list po pwd))
+ ((list po)))))
+ (make-process
+ :name "durand-wifi-join-port"
+ :buffer durand-wifi-bluetooth-buffer
+ :command (append
+ (list "networksetup" "setairportnetwork" "en0"
+ port)
+ (cond ((and pwd (not (string= pwd "")))
+ (list pwd))))
+ :filter #'durand-wifi-join-filter))
+
+;;;###autoload
+(defun durand-wifi-list-sentinel (process status)
+ "Extract and message the information about available WIFI's SSID's.
+PROCESS should have the name \"durand-wifi-list-ports\".
+
+This only does something when STATUS is the string \"finished\\n\"."
+ (cond ((string-equal (process-name process) "durand-wifi-list-ports"))
+ ((error "The list sentinel is applied to a wrong process: %S"
+ process)))
+ (let (first-var)
+ (cond ((string-equal status "finished\n")
+ (with-current-buffer durand-wifi-bluetooth-buffer
+ (goto-char (point-min))
+ (cond ((re-search-forward "\\s-+SSID" (line-end-position) t)
+ (setq first-var t)
+ (forward-line 1)
+ (let ((start 0) list-of-ssids)
+ (while (re-search-forward "\\S-" (line-end-position) t)
+ (forward-char -1)
+ (setq start (point))
+ (re-search-forward "\\s-" (line-end-position) t)
+ (forward-char -1)
+ (setq list-of-ssids
+ (cons (buffer-substring-no-properties
+ start (point))
+ list-of-ssids))
+ (forward-line 1))
+ (erase-buffer)
+ (goto-char (point-min))
+ (insert (string-join list-of-ssids (string 10)))
+ (goto-char (point-min))))
+ ((re-search-forward "\\s-+SSID: " nil t)
+ (message (buffer-substring-no-properties
+ (point) (line-end-position))))))
+ (cond (first-var
+ (display-buffer durand-wifi-bluetooth-buffer
+ '((display-buffer-in-side-window)
+ (side . bottom)
+ (window-height . #'durand-fit-window-to-buffer-with-max)))
+ (with-current-buffer durand-wifi-bluetooth-buffer
+ (fit-window-to-buffer
+ (get-buffer-window (current-buffer))
+ (floor (* durand-window-max-height
+ (frame-height
+ (window-frame
+ (get-buffer-window (current-buffer))))))))))))))
+
+;;;###autoload
+(defun durand-wifi-join-filter (proc output)
+ "Message the OUTPUT of the PROCESS."
+ (cond ((string= (process-name proc) "durand-wifi-join-port"))
+ ((error "The join filter is applied to a wrong process: %S"
+ proc)))
+ (message output))
+
+(define-key global-map (vector 3 ?w ?w) #'durand-wifi-toggle)
+(define-key global-map (vector 3 ?w ?b) #'durand-bluetooth-toggle)
+(define-key global-map (vector 3 ?w ?l) #'durand-wifi-list-ports)
+(define-key global-map (vector 3 ?w ?j) #'durand-wifi-join-port)
+
+;; Control the display of the buffer
+;; (setq display-buffer-alist
+;; (delete (assoc durand-wifi-bluetooth-buffer display-buffer-alist #'string-match)
+;; display-buffer-alist))
+;; (cond
+;; ((assoc durand-wifi-bluetooth-buffer display-buffer-alist #'string-match)
+;; (setcdr (assoc durand-wifi-bluetooth-buffer
+;; display-buffer-alist #'string-match)
+;; '((display-buffer-at-bottom)
+;; (window-height . #'durand-fit-window-to-buffer-with-max))))
+;; (t
+;; (add-to-list 'display-buffer-alist
+;; `(,(rx-to-string `(seq bos ,durand-wifi-bluetooth-buffer eos))
+;; (display-buffer-at-bottom)
+;; (window-height . #'durand-fit-window-to-buffer-with-max)))))
+
+(provide 'wifi-bluetooth-conf)
+;;; wifi-bluetooth-conf.el ends here