208 lines
4.3 KiB
EmacsLisp
208 lines
4.3 KiB
EmacsLisp
;;; 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
|