From d31b9283ff1356da8b96709f28fc74a5a6503965 Mon Sep 17 00:00:00 2001 From: Matthew Fidler Date: Mon, 4 Apr 2016 12:35:54 -0500 Subject: [PATCH] Add 'ext type that creates generic icons. Requires gimp, FontAwesome and Haettenschweiler to generate --- icons/ext-tex.xpm | 77 +++++++++++++++++++++++++++++++++++++++++ mode-icons.el | 88 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 icons/ext-tex.xpm diff --git a/icons/ext-tex.xpm b/icons/ext-tex.xpm new file mode 100644 index 0000000..53be473 --- /dev/null +++ b/icons/ext-tex.xpm @@ -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"}; diff --git a/mode-icons.el b/mode-icons.el index eb0f94b..fc20b2f 100644 --- a/mode-icons.el +++ b/mode-icons.el @@ -191,7 +191,7 @@ This was stole/modified from `c-save-buffer-state'" ("\\` Rbow\\'" "rainbow" xpm) ("\\` 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 - ("\\`BibTeX\\'\\'" "bibtex" xpm) + ("\\`BibTeX\\'\\'" "bibtex" xpm-bw) ("\\`C[+][+]\\(/.*\\|\\)\\'" #xf10c font-mfizz) ("\\`C[#]\\(/.*\\|\\)\\'" #xf10d font-mfizz) ("\\`Elixir\\'" #xf115 font-mfizz) @@ -234,6 +234,7 @@ This was stole/modified from `c-save-buffer-state'" ("\\`Fundamental\\'" #xf016 FontAwesome) ("\\`Javascript-IDE\\'" "js" xpm) ("\\` Undo-Tree\\'" ":palm_tree:" emoji) + ("\\`LaTeX\\'" "tex" ext) ;; Diminished modes ("\\` \\(?:ElDoc\\|Anzu\\|SP\\|Guide\\|PgLn\\|Undo-Tree\\|Ergo.*\\|,\\|Isearch\\|Ind\\)\\'" nil nil)) "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 "xpm" xpm) (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) (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))))) (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) '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)) (and (image-type-available-p 'xpm) (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)))) (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 (replace-regexp-in-string "[ \n\t]+" " " @@ -718,6 +769,28 @@ When nil, don't stop the gimp inferior mode.") (gimp-image-delete image))") "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 "Generate grayscale images for font icons. 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)) ((and (stringp (nth 1 icon-spec)) (eq (nth 2 icon-spec) 'png)) (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 (mode-icons-get-icon-display (nth 1 icon-spec) (nth 2 icon-spec) (or face