first commit
This commit is contained in:
+206
@@ -0,0 +1,206 @@
|
||||
;;; 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
|
||||
Reference in New Issue
Block a user