Add 'ext type that creates generic icons.

Requires gimp, FontAwesome and Haettenschweiler to generate
This commit is contained in:
Matthew Fidler 2016-04-04 12:35:54 -05:00
parent 6ebd76ab71
commit d31b9283ff
2 changed files with 163 additions and 2 deletions

77
icons/ext-tex.xpm Normal file
View file

@ -0,0 +1,77 @@
/* XPM */
static char * ext_tex_xpm[] = {
"17 21 53 1",
" c #F5F5F5",
". c #DBDBDB",
"+ c #F8F8F8",
"@ c #FFFFFF",
"# c #2A2A2A",
"$ c #000000",
"% c #070707",
"& c #7C7C7C",
"* c #FDFDFD",
"= c #9A9A9A",
"- c #B7B7B7",
"; c #525252",
"> c #636363",
", c #D7D7D7",
"' c #999999",
") c #020202",
"! c #616161",
"~ c #FCFCFC",
"{ c #ADADAD",
"] c #060606",
"^ c #5F5F5F",
"/ c #BFBFBF",
"( c #0E0E0E",
"_ c #828282",
": c #7B7B7B",
"< c #939393",
"[ c #545454",
"} c #181818",
"| c #555555",
"1 c #0B0B0B",
"2 c #A9A9A9",
"3 c #6A6A6A",
"4 c #A0A0A0",
"5 c #2B2B2B",
"6 c #B1B1B1",
"7 c #050505",
"8 c #F4F4F4",
"9 c #818181",
"0 c #808080",
"a c #D8D8D8",
"b c #D5D5D5",
"c c #010101",
"d c #EEEEEE",
"e c #EDEDED",
"f c #9D9D9D",
"g c #A4A4A4",
"h c #656565",
"i c #969696",
"j c #5A5A5A",
"k c #6B6B6B",
"l c #676767",
"m c #232323",
"n c #666666",
" ..........+@@@@@",
"#$$$$$$$$$$%&*@@@",
"$=--------$;$>*@@",
"$,@@@@@@@@$,')!~@",
"$,@@@@@@@@$,@{]^~",
"$,@@@@@@@@$,@@/(_",
"$,@@@@@@@@$:<<<[}",
"$,@@@@@@@@|$$$$$$",
"$,@@@@@@@@@@@@@,$",
"$,@$@@@@@@@@@@@,$",
"$,@$1@234@565@@,$",
"$,@$@@78)@9}0@@,$",
"$,@$@@$$$@a$b@@,$",
"$,@$@@$@@@a$b@@,$",
"$,@cd@7ec@9}0@@,$",
"$,@f7@ghi@565@@,$",
"$,@@@@@@@@@@@@@,$",
"$,@@@@@@@@@@@@@,$",
"$,@@@@@@@@@@@@@,$",
"$jkkkkkkkkkkkkkjc",
"lmmmmmmmmmmmmmmmn"};

View file

@ -191,7 +191,7 @@ This was stole/modified from `c-save-buffer-state'"
("\\` Rbow\\'" "rainbow" xpm) ("\\` Rbow\\'" "rainbow" xpm)
("\\` ICY\\'" "icy" xpm) ;; http://www.clipartpal.com/clipart_pd/weather/ice_10206.html ("\\` ICY\\'" "icy" xpm) ;; http://www.clipartpal.com/clipart_pd/weather/ice_10206.html
("\\` Golden\\'" "golden" xpm-bw) ;; Icon created by Arthur Shlain from Noun Project ("\\` Golden\\'" "golden" xpm-bw) ;; Icon created by Arthur Shlain from Noun Project
("\\`BibTeX\\'\\'" "bibtex" xpm) ("\\`BibTeX\\'\\'" "bibtex" xpm-bw)
("\\`C[+][+]\\(/.*\\|\\)\\'" #xf10c font-mfizz) ("\\`C[+][+]\\(/.*\\|\\)\\'" #xf10c font-mfizz)
("\\`C[#]\\(/.*\\|\\)\\'" #xf10d font-mfizz) ("\\`C[#]\\(/.*\\|\\)\\'" #xf10d font-mfizz)
("\\`Elixir\\'" #xf115 font-mfizz) ("\\`Elixir\\'" #xf115 font-mfizz)
@ -234,6 +234,7 @@ This was stole/modified from `c-save-buffer-state'"
("\\`Fundamental\\'" #xf016 FontAwesome) ("\\`Fundamental\\'" #xf016 FontAwesome)
("\\`Javascript-IDE\\'" "js" xpm) ("\\`Javascript-IDE\\'" "js" xpm)
("\\` Undo-Tree\\'" ":palm_tree:" emoji) ("\\` Undo-Tree\\'" ":palm_tree:" emoji)
("\\`LaTeX\\'" "tex" ext)
;; Diminished modes ;; Diminished modes
("\\` \\(?:ElDoc\\|Anzu\\|SP\\|Guide\\|PgLn\\|Undo-Tree\\|Ergo.*\\|,\\|Isearch\\|Ind\\)\\'" nil nil)) ("\\` \\(?:ElDoc\\|Anzu\\|SP\\|Guide\\|PgLn\\|Undo-Tree\\|Ergo.*\\|,\\|Isearch\\|Ind\\)\\'" nil nil))
"Icons for major and minor modes. "Icons for major and minor modes.
@ -271,7 +272,8 @@ without the extension. And the third being the type of icon."
(const :tag "xbm" xbm) (const :tag "xbm" xbm)
(const :tag "xpm" xpm) (const :tag "xpm" xpm)
(const :tag "Black and White xpm that changes color to match the mode-line face" xpm-bw) (const :tag "Black and White xpm that changes color to match the mode-line face" xpm-bw)
(const :tag "Emoji" emoji)))) (const :tag "Emoji" emoji)
(const :tag "Mode Icons Generated file-type" ext))))
:group 'mode-icons) :group 'mode-icons)
(defvar mode-icons-get-xpm-string (make-hash-table :test 'equal)) (defvar mode-icons-get-xpm-string (make-hash-table :test 'equal))
@ -598,6 +600,8 @@ everywhere else."
(file-exists-p (mode-icons--get-emoji-xpm-file icon-spec))))) (file-exists-p (mode-icons--get-emoji-xpm-file icon-spec)))))
(and (eq (nth 2 icon-spec) 'jpg) (image-type-available-p 'jpeg)) (and (eq (nth 2 icon-spec) 'jpg) (image-type-available-p 'jpeg))
(and (eq (nth 2 icon-spec) 'xpm-bw) (image-type-available-p 'xpm)) (and (eq (nth 2 icon-spec) 'xpm-bw) (image-type-available-p 'xpm))
(and (eq (nth 2 icon-spec) 'ext) (image-type-available-p 'xpm)
(mode-icons--ext-available-p icon-spec))
(or (mode-icons-supported-font-p (nth 1 icon-spec) (nth 2 icon-spec)) (or (mode-icons-supported-font-p (nth 1 icon-spec) (nth 2 icon-spec))
(and (image-type-available-p 'xpm) (and (image-type-available-p 'xpm)
(mode-icons--get-font-xpm-file icon-spec) (mode-icons--get-font-xpm-file icon-spec)
@ -678,6 +682,53 @@ When nil, don't stop the gimp inferior mode.")
(setq mode-icons--stop-gimp-timer (run-with-timer mode-icons--stop-gimp-after nil #'mode-icons--stop-gimp-inferior)))) (setq mode-icons--stop-gimp-timer (run-with-timer mode-icons--stop-gimp-after nil #'mode-icons--stop-gimp-inferior))))
(run-with-idle-timer 1 nil #'mode-icons--process-gimp scm)))) (run-with-idle-timer 1 nil #'mode-icons--process-gimp scm))))
(defvar mode-icons--generic-type-to-xpm-gimp-script
(replace-regexp-in-string
"[ \n\t]+" " "
"(let* ((image-width 1024)
(image-height 20)
(buffer-image 1)
(text \"%s\")
(font-size 20)
(font-name \"FontAwesome\")
(xpm-image \"%s\")
(font-size-2 10)
(text-2 \"%s\")
(font-name-2 \"Haettenschweiler\")
(bg-color '(255 255 255))
(fg-color '(0 0 0))
(image (car (gimp-image-new 1024 16 0)))
(layer (car (gimp-layer-new image image-width image-height RGB-IMAGE \"layer 1\" 100 NORMAL)))
(layer2 (car (gimp-layer-new image image-width image-height RGB-IMAGE \"layer 2\" 100 NORMAL)))
(out-text)
(out-width)
(out-height)
(out-buffer)
(drawable))
(gimp-image-add-layer image layer 0)
(gimp-context-set-background bg-color)
(gimp-context-set-foreground fg-color)
(gimp-layer-add-alpha layer)
(gimp-drawable-fill layer TRANSPARENT-FILL)
(gimp-image-add-layer image layer2 0)
(gimp-layer-add-alpha layer2)
(gimp-drawable-fill layer2 TRANSPARENT-FILL)
(gimp-text-fontname image layer2 3 7 text-2 0 TRUE font-size-2 PIXELS font-name-2)
(set! out-text (car (gimp-text-fontname image layer 0 0 text 0 TRUE font-size PIXELS font-name)))
(set! out-width (car (gimp-drawable-width out-text)))
(set! out-height (car (gimp-drawable-height out-text)))
(set! out-buffer (* out-height (/ buffer-image 100)))
(set! out-height (+ out-height out-buffer out-buffer))
(set! out-width (+ out-width out-buffer out-buffer))
(gimp-image-resize image out-width out-height 0 0)
(gimp-layer-resize layer out-width out-height 0 0)
(gimp-layer-set-offsets out-text out-buffer out-buffer)
(gimp-image-flatten image)
(set! drawable (car (gimp-image-get-active-layer image)))
(file-xpm-save RUN-NONINTERACTIVE image drawable xpm-image xpm-image 127)
(gimp-image-delete image))")
"Generic Type script.")
(defvar mode-icons--font-to-xpm-gimp-script (defvar mode-icons--font-to-xpm-gimp-script
(replace-regexp-in-string (replace-regexp-in-string
"[ \n\t]+" " " "[ \n\t]+" " "
@ -718,6 +769,28 @@ When nil, don't stop the gimp inferior mode.")
(gimp-image-delete image))") (gimp-image-delete image))")
"Gimp scheme script to convert a font character to xpm file.") "Gimp scheme script to convert a font character to xpm file.")
(defvar mode-icons--convert-ext-to-xpm (make-hash-table :test 'equal))
(defun mode-icons--convert-ext-to-xpm (ext)
"Convert EXT to a xpm file."
(let ((xpm (mode-icons-get-icon-file (concat "ext-" (downcase ext) ".xpm"))))
(when (and mode-icons--gimp (file-exists-p mode-icons--gimp)
xpm (not (gethash xpm mode-icons--convert-ext-to-xpm))
(not (file-exists-p xpm)))
(puthash xpm t mode-icons--convert-ext-to-xpm)
(mode-icons--process-gimp
(format mode-icons--generic-type-to-xpm-gimp-script (make-string 1 #xf016) xpm
(downcase ext))))))
(defun mode-icons--ext-available-p (icon-spec)
"Determine if ICON-SPEC's ext is availble for display.
If not, try `mode-icons--convert-ext-to-xpm'."
(when (eq (nth 2 icon-spec) 'ext)
(let ((xpm (mode-icons-get-icon-file (concat "ext-" (downcase (nth 1 icon-spec)) ".xpm"))))
(if (file-exists-p xpm)
t
(mode-icons--convert-ext-to-xpm (nth 1 icon-spec))
nil))))
(defcustom mode-icons-generate-font-grayscale nil (defcustom mode-icons-generate-font-grayscale nil
"Generate grayscale images for font icons. "Generate grayscale images for font icons.
This is used instead of transparancy to capure the font's This is used instead of transparancy to capure the font's
@ -1028,6 +1101,17 @@ FACE is the face to match when a xpm-bw image is used."
(mode-icons--get-emoji mode icon-spec face)) (mode-icons--get-emoji mode icon-spec face))
((and (stringp (nth 1 icon-spec)) (eq (nth 2 icon-spec) 'png)) ((and (stringp (nth 1 icon-spec)) (eq (nth 2 icon-spec) 'png))
(mode-icons--get-png mode icon-spec face)) (mode-icons--get-png mode icon-spec face))
((and (stringp (nth 1 icon-spec)) (eq (nth 2 icon-spec) 'ext))
(propertize (format "%s" mode) 'display
(mode-icons-get-icon-display
(concat "ext-" (nth 1 icon-spec)) 'xpm-bw
(or face
(and (mode-icons--selected-window-active)
'mode-line)
'mode-line-inactive))
'mode-icons-p (list (nth 0 icon-spec)
(concat "ext-" (nth 1 icon-spec))
'xpm-bw)))
(t (propertize (format "%s" mode) 'display (t (propertize (format "%s" mode) 'display
(mode-icons-get-icon-display (nth 1 icon-spec) (nth 2 icon-spec) (mode-icons-get-icon-display (nth 1 icon-spec) (nth 2 icon-spec)
(or face (or face