Files
my-lisp/my-qrcode.el
T
2026-07-03 09:04:08 +09:00

207 lines
4.2 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 100
"QR frame left position."
:type 'integer)
(defcustom my-qrcode-frame-top 100
"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)))))
;; 正方形サイズ(ピクセル単位)
(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-region-to-qrcode)
(provide 'my-qrcode)
;;; my-qrcode.el ends here