summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--icons/demo.cfg32
-rwxr-xr-xicons/mkicons302
-rw-r--r--icons/ni.cfg6
3 files changed, 340 insertions, 0 deletions
diff --git a/icons/demo.cfg b/icons/demo.cfg
new file mode 100644
index 0000000..c1b095c
--- /dev/null
+++ b/icons/demo.cfg
@@ -0,0 +1,32 @@
+# Demo configuration for mkicons.
+#
+# Montage: montage -background '#444444' -geometry '32x32>+4+4' -tile 12x \
+# demo*/**/*.png demo.png
+
+[DEFAULT]
+fg = #aaaaaa
+bg = black
+output_dir = %(__name__)s
+
+[demo08]
+size = 8x8
+too_small = 3
+
+[demo11]
+size = 11x11
+
+[demo16]
+size = 16x16
+
+[demo32]
+size = 32x32
+
+[demo_zenburn]
+fg = trans
+bg = #dcdccc
+size = 12x12
+margin_top = 1
+margin_right = 2
+margin_left = -1
+too_small = 3
+
diff --git a/icons/mkicons b/icons/mkicons
new file mode 100755
index 0000000..cadda6d
--- /dev/null
+++ b/icons/mkicons
@@ -0,0 +1,302 @@
+#!/usr/bin/python
+#
+# This program copyright (C) 2011 Nicolas Schodet
+#
+# All 'awesome' original icons generated by this program were created by
+# Adrian C. (anrxc). They are licensed under the same terms as the awesome
+# distribution itself - GNU General Public License version 2. They can be
+# generated with the options:
+#
+# --fg trans --bg '#dcdccc' --size 12x12 --margin_top 1 --margin_right 2 \
+# --margin_left -1 --too_small 3
+#
+# Icons generated with other parameters are inspired by those icons.
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Contact :
+# Web: http://ni.fr.eu.org/
+# Email: <nico at ni.fr.eu.org>
+#
+"""Generate a set of icons to be used with the Awesome Window Manager."""
+import optparse
+import ConfigParser
+import Image, ImageDraw
+import os, os.path
+from fnmatch import fnmatch
+
+class Params(object):
+ """Parameters for icons generation, can be loaded with config file or
+ command line arguments."""
+ def __init__ (self, size, fg, bg,
+ margin_top = 0, margin_bottom = 0, margin_left = 0, margin_right = 0,
+ too_small = 0):
+ """Initialize with provided default values."""
+ self.size = size
+ self.fg = fg
+ self.bg = bg
+ self.margin_top = margin_top
+ self.margin_bottom = margin_bottom
+ self.margin_left = margin_left
+ self.margin_right = margin_right
+ self.too_small = too_small
+
+ @property
+ def coords (self):
+ """Get coordinates of the corner points."""
+ return (self.margin_left, self.margin_top,
+ self.size[0] - self.margin_right - 1,
+ self.size[1] - self.margin_bottom - 1)
+
+ def update (self, d):
+ """Update from dictionary."""
+ if 'size' in d and d['size'] is not None:
+ w, h = d['size'].split ('x')
+ self.size = (int (w), int (h))
+ for n in ('fg', 'bg'):
+ if n in d and d[n] is not None:
+ color = d[n]
+ if color == 'trans':
+ color = (0, 0, 0, 0)
+ setattr (self, n, color)
+ for n in ('margin_top', 'margin_bottom', 'margin_left',
+ 'margin_right', 'too_small'):
+ if n in d and d[n] is not None:
+ setattr (self, n, int (d[n]))
+
+def part (a, b, i, n, rounding = 'nearest'):
+ """Return the ith separator position when partitioning the space between
+ a and b. Rounding methods:
+ - nearest: pixel nearest the real value,
+ - down: pixel to the left/above the real value,
+ - up: pixel to the right/below the real value,
+ - center: pixel toward center,
+ - edge: pixel toward edge
+ """
+ if rounding == 'nearest':
+ offset = n / 2
+ elif rounding == 'down':
+ offset = 0
+ elif rounding == 'up':
+ offset = n - 1
+ elif rounding == 'center':
+ if i <= n / 2:
+ offset = n - 1
+ else:
+ offset = 0
+ elif rounding == 'edge':
+ if i <= n / 2:
+ offset = 0
+ else:
+ offset = n - 1
+ return a + (i * (b - a) + offset) / n
+
+def draw_grid (draw, (x1, y1, x2, y2), nx, ny, rounding, p):
+ """Draw a grid with nx column and ny lines."""
+ for xi in xrange (0, nx + 1):
+ x = part (x1, x2, xi, nx, rounding)
+ draw.line ((x, y1, x, y2), fill = p.fg)
+ for yi in xrange (0, ny + 1):
+ y = part (y1, y2, yi, ny, rounding)
+ draw.line ((x1, y, x2, y), fill = p.fg)
+
+def icon_layouts_max (icon, draw, p):
+ draw.rectangle (p.coords, outline = p.fg, fill = p.bg)
+ x1, y1, x2, y2 = p.coords
+ draw.line ((x1, y1, x2, y2), fill = p.fg)
+ draw.line ((x1, y2, x2, y1), fill = p.fg)
+
+def icon_layouts_dwindle (icon, draw, p):
+ x1, y1, x2, y2 = p.coords
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+ x1 = (x1 + x2) / 2
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+ y1 = (y1 + y2) / 2
+ if (y2 - y1) % 2:
+ y1 += 1
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+ x1 = (x1 + x2) / 2
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+ y1 = (y1 + y2) / 2
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+
+def icon_layouts_spiral (icon, draw, p):
+ x1, y1, x2, y2 = p.coords
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+ x1 = (x1 + x2) / 2
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+ y1 = (y1 + y2) / 2
+ if (y2 - y1) % 2:
+ y1 += 1
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+ x2 = (x1 + x2 + 1) / 2
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+ y2 = (y1 + y2) / 2
+ draw.rectangle ((x1, y1, x2, y2), outline = p.fg, fill = p.bg)
+
+def icon_layouts_fairh (icon, draw, p):
+ draw.rectangle (p.coords, outline = p.fg, fill = p.bg)
+ x1, y1, x2, y2 = p.coords
+ y3 = part (y1, y2, 2, 3, 'nearest')
+ ny = 2 if (y3 - y1) / 2 - 1 > p.too_small else 1
+ draw_grid (draw, (x1, y1, x2, y3), 3, ny, 'nearest', p)
+ draw_grid (draw, (x1, y3, x2, y2), 2, 1, 'nearest', p)
+
+def icon_layouts_fairv (icon, draw, p):
+ draw.rectangle (p.coords, outline = p.fg, fill = p.bg)
+ x1, y1, x2, y2 = p.coords
+ x3 = part (x1, x2, 2, 3, 'nearest')
+ nx = 2 if (x3 - x1) / 2 - 1 > p.too_small else 1
+ draw_grid (draw, (x1, y1, x3, y2), nx, 3, 'nearest', p)
+ draw_grid (draw, (x3, y1, x2, y2), 1, 2, 'nearest', p)
+
+def icon_layouts_floating (icon, draw, p):
+ x1, y1, x2, y2 = p.coords
+ xl = part (x1, x2, 2, 10, 'down')
+ yl = part (y1, y2, 8, 10, 'up')
+ xs = part (x1, x2, 1, 2, 'up')
+ ys = part (y1, y2, 1, 2, 'down')
+ draw.rectangle ((xl, y1, x2, yl), outline = p.fg, fill = p.bg)
+ draw.rectangle ((x1, ys, xs, y2), outline = p.fg, fill = p.bg)
+
+def icon_layouts_fullscreen (icon, draw, p):
+ draw.rectangle (p.coords, outline = p.fg, fill = p.bg)
+ x1, y1, x2, y2 = p.coords
+ xl = part (x1, x2, 3, 10, 'down')
+ xr = part (x1, x2, 7, 10, 'up')
+ yt = part (y1, y2, 2, 10, 'down')
+ ym = part (y1, y2, 5, 10, 'down')
+ yb = part (y1, y2, 8, 10, 'up')
+ draw.line ((xl, yb, xl, yt, xr, yt), fill = p.fg)
+ draw.line ((xl, ym, xr, ym), fill = p.fg)
+
+def icon_layouts_magnifier (icon, draw, p):
+ draw.rectangle (p.coords, outline = p.fg, fill = p.bg)
+ x1, y1, x2, y2 = p.coords
+ xl = part (x1, x2, 2, 10, 'edge')
+ xr = part (x1, x2, 8, 10, 'edge')
+ yt = part (y1, y2, 3, 10, 'edge')
+ yb = part (y1, y2, 7, 10, 'edge')
+ ny = 2 if xl - x1 > p.too_small else 1
+ nx = 2 if yt - y1 > p.too_small else 1
+ draw_grid (draw, p.coords, nx, ny, 'nearest', p)
+ draw.rectangle ((xl, yt, xr, yb), outline = p.fg, fill = p.bg)
+
+def icon_layouts_tilebottom (icon, draw, p):
+ draw.rectangle (p.coords, outline = p.fg, fill = p.bg)
+ x1, y1, x2, y2 = p.coords
+ ym = part (y1, y2, 1, 2, 'up')
+ draw_grid (draw, (x1, ym, x2, y2), 3, 1, 'nearest', p)
+
+def icon_layouts_tileleft (icon, draw, p):
+ draw.rectangle (p.coords, outline = p.fg, fill = p.bg)
+ x1, y1, x2, y2 = p.coords
+ xm = part (x1, x2, 1, 2, 'down')
+ draw_grid (draw, (x1, y1, xm, y2), 1, 3, 'nearest', p)
+
+def icon_layouts_tile (icon, draw, p):
+ draw.rectangle (p.coords, outline = p.fg, fill = p.bg)
+ x1, y1, x2, y2 = p.coords
+ xm = part (x1, x2, 1, 2, 'up')
+ draw_grid (draw, (xm, y1, x2, y2), 1, 3, 'nearest', p)
+
+def icon_layouts_tiletop (icon, draw, p):
+ draw.rectangle (p.coords, outline = p.fg, fill = p.bg)
+ x1, y1, x2, y2 = p.coords
+ ym = part (y1, y2, 1, 2, 'down')
+ draw_grid (draw, (x1, y1, x2, ym), 3, 1, 'nearest', p)
+
+icons = dict((f[5:].replace ('_', '/'), globals ()[f])
+ for f in dir () if f.startswith ('icon_'))
+
+parser = optparse.OptionParser (description = __doc__)
+parser.add_option ('-c', '--config', metavar = 'FILE', action = 'append',
+ help = "generate for all configurations read from config FILE, if"
+ " given, other options will override values from config file")
+parser.add_option ('-O', '--output-dir', metavar = 'DIR',
+ help = "generate icons below given directory")
+parser.add_option ('-f', '--fg', metavar = 'COLOR',
+ help = "use COLOR as foreground color")
+parser.add_option ('-b', '--bg', metavar = 'COLOR',
+ help = "use COLOR as background color")
+parser.add_option ('-i', '--include', metavar = 'PATTERN', action = 'append',
+ help = 'only include icons matching given shell PATTERN')
+parser.add_option ('-s', '--size', metavar = 'WIDTHxHEIGHT',
+ help = "use specified size for icons")
+parser.add_option ('--margin-top', metavar = 'PIXELS', type = 'int',
+ help = "keep a margin, define y1")
+parser.add_option ('--margin-bottom', metavar = 'PIXELS', type = 'int',
+ help = "keep a margin, define y2")
+parser.add_option ('--margin-left', metavar = 'PIXELS', type = 'int',
+ help = "keep a margin, define x1")
+parser.add_option ('--margin-right', metavar = 'PIXELS', type = 'int',
+ help = "keep a margin, define x2")
+parser.add_option ('-S', '--too-small', metavar = 'PIXELS', type = 'int',
+ help = "do not draw some details smaller than a number of PIXELS")
+parser.add_option ('--list', action = 'store_true',
+ help = "instead of generating icons, print a list of available icons")
+parser.add_option ('-q', '--quiet', action = 'store_true',
+ help = "suppress verbose messages")
+(options, args) = parser.parse_args ()
+if args:
+ parser.error ('no argument expected')
+if options.list:
+ print "\n".join (icons.keys())
+else:
+ configs = options.config or [ None ]
+ for config in configs:
+ # Get sections from configuration file, or use dummy section.
+ if config is not None:
+ cp = ConfigParser.SafeConfigParser ()
+ cp.readfp (open (config))
+ sections = cp.sections ()
+ else:
+ sections = [ None ]
+ # Output icons for every sections.
+ for section in sections:
+ p = Params ((12, 12), 'white', 'black')
+ output_dir = '.'
+ include = [ '*' ]
+ # Merge config and command line.
+ if section is not None:
+ p.update (dict (cp.items (section)))
+ if cp.has_option (section, 'output_dir'):
+ output_dir = cp.get (section, 'output_dir')
+ if cp.has_option (section, 'include'):
+ include = cp.get (section, 'include').split ()
+ p.update (options.__dict__)
+ if options.output_dir is not None:
+ output_dir = options.output_dir
+ if options.include is not None:
+ include = options.include
+ # Generate matching icons.
+ for name, func in icons.iteritems():
+ for pattern in include:
+ if fnmatch (name, pattern):
+ icon = Image.new ('RGBA', p.size, (0, 0, 0, 0))
+ draw = ImageDraw.Draw (icon)
+ if not options.quiet:
+ print "Generating %s..." % name
+ func (icon, draw, p)
+ del draw
+ filename = os.path.join (output_dir, name + '.png')
+ try:
+ os.makedirs (os.path.dirname (filename))
+ except OSError:
+ pass
+ icon.save (filename)
+ break
+
diff --git a/icons/ni.cfg b/icons/ni.cfg
new file mode 100644
index 0000000..42cd17d
--- /dev/null
+++ b/icons/ni.cfg
@@ -0,0 +1,6 @@
+[ni]
+fg = trans
+bg = #aaaaaa
+output_dir = ../ni/icons
+size = 12x12
+