;;; my-qrcode.el --- QR Code Viewer -*- lexical-binding:t; -*- (require 'image-mode) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; configuration ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar my-qrcode-buffer-name "*QR Code*") (defcustom my-qrcode-frame-pixel-size 500 "QR frame size in pixels." :type 'integer) (defcustom my-qrcode-frame-left 0 "QR frame left position." :type 'integer) (defcustom my-qrcode-frame-top 0 "QR frame top position." :type 'integer) (defvar-local my-qrcode-image-file nil) (defvar-local my-qrcode-scale 1.0) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; redraw ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun my-qrcode-redraw () (interactive) (unless my-qrcode-image-file (error "No QR image")) (let ((inhibit-read-only t)) (erase-buffer) (insert-image (create-image my-qrcode-image-file 'png nil :scale my-qrcode-scale)) (goto-char (point-min)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; zoom ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun my-qrcode-zoom-in () (interactive) (setq my-qrcode-scale (* my-qrcode-scale 1.25)) (my-qrcode-redraw) (message "QR scale %.2f" my-qrcode-scale)) (defun my-qrcode-zoom-out () (interactive) (setq my-qrcode-scale (/ my-qrcode-scale 1.25)) (my-qrcode-redraw) (message "QR scale %.2f" my-qrcode-scale)) (defun my-qrcode-zoom-reset () (interactive) (setq my-qrcode-scale 1.0) (my-qrcode-redraw) (message "QR scale reset")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar my-qrcode-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "+") #'my-qrcode-zoom-in) (define-key map (kbd "=") #'my-qrcode-zoom-in) (define-key map (kbd "-") #'my-qrcode-zoom-out) (define-key map (kbd "0") #'my-qrcode-zoom-reset) (define-key map (kbd "q") #'quit-window) map)) (define-derived-mode my-qrcode-mode special-mode "QRCode" "QR Code Viewer") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; region -> qrcode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun my-qrcode-from-region (beg end) "Convert region text to QR code." (interactive "r") (unless (use-region-p) (user-error "Region is not active")) (unless (executable-find "qrencode") (user-error "qrencode command not found")) (let* ((text (buffer-substring-no-properties beg end)) (png-file (make-temp-file "qrcode-" nil ".png")) (coding-system-for-write 'utf-8-unix)) (with-temp-buffer (insert text) (unless (eq (call-process-region (point-min) (point-max) "qrencode" nil nil nil "-o" png-file "-t" "PNG" "-s" "8" "-m" "2") 0) (delete-file png-file) (error "qrencode failed"))) (let ((buf (get-buffer-create my-qrcode-buffer-name))) (with-current-buffer buf (my-qrcode-mode) (setq my-qrcode-image-file png-file) (setq my-qrcode-scale 1.0) (my-qrcode-redraw)) (let ((frame (make-frame `((name . "QR Code") (left . ,my-qrcode-frame-left) (top . ,my-qrcode-frame-top) (user-position . t))))) ;; 正方形サイズ(ピクセル単位) (set-frame-size frame my-qrcode-frame-pixel-size my-qrcode-frame-pixel-size t) (set-window-buffer (frame-root-window frame) buf) (select-frame-set-input-focus frame))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; key binding example ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; (global-set-key ;; (kbd "C-c q") ;; #'my-qrcode-from-region) (provide 'my-qrcode) ;;; my-qrcode.el ends here