about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAnselm R Garbe <garbeam@gmail.com>2008-03-06 18:53:15 +0000
committerAnselm R Garbe <garbeam@gmail.com>2008-03-06 18:53:15 +0000
commitc9170189bf0d0234f8d97fd7b717f859b7242674 (patch)
tree1904400db20a9b645925ac65299bb049bb8412ce
parentf7a45ff28bcf1d88f9268e3c1f1000df28f0cd08 (diff)
downloaddwm-c9170189bf0d0234f8d97fd7b717f859b7242674.tar.gz
implemented setlayout in the way proposed on the ml, split tile() into two functions, a third will follow soon
-rw-r--r--config.def.h34
-rw-r--r--dwm.c178
2 files changed, 109 insertions, 103 deletions
diff --git a/config.def.h b/config.def.h
index d1d884e..1268e4f 100644
--- a/config.def.h
+++ b/config.def.h
@@ -13,31 +13,31 @@
 /* bar position */
 #define BX sx
 #define BY sy
-#define BW MW
+#define BW sw
 
 /* window area */
 #define WX 0
 #define WY bh
 #define WW sw
-#define WH sh
+#define WH sh - bh
 
 /* master area */
-#define MX sx
-#define MY sy + bh
+#define MX WX
+#define MY WY
 #define MW ((int)(((float)sw) * 0.6))
-#define MH sh - bh
+#define MH WH
 
 /* tile area, might be on a different screen */
-#define TX sx + MW
-#define TY sy
-#define TW sw - MW
-#define TH sh
+#define TX MX + MW
+#define TY WY
+#define TW WW - MW
+#define TH WH
 
 /* monocle area, might be restricted to a specific screen */
-#define MOX sx
-#define MOY MY
-#define MOW sw
-#define MOH MH
+#define MOX WX
+#define MOY WY
+#define MOW WW
+#define MOH WH
 
 /* tagging */
 const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
@@ -55,10 +55,10 @@ Rule rules[] = {
 #define SNAP			32	/* snap pixel */
 
 Layout layouts[] = {
-	/* symbol		function */
-	{ "[]=",		tile }, /* first entry is default */
-	{ "><>",		floating },
-	{ "[M]",		monocle },
+	/* symbol		function	isfloating */
+	{ "[]=",		tile,		False }, /* first entry is default */
+	{ "><>",		floating	True },
+	{ "[M]",		monocle		True },
 };
 
 /* key definitions */
diff --git a/dwm.c b/dwm.c
index 564714f..2985cea 100644
--- a/dwm.c
+++ b/dwm.c
@@ -1,9 +1,4 @@
 /**
- * TODO
- * - treat monocle as floating layout, actually otherwise certain monocled windows don't get raised
- * - use WX, WY, WW, WH for window snapping/resizing/mouse
- * - MOX, MOY, MOW, MOH should only be used in the case of monocle layout and of n==1 in tiled
- * - simplify tile()
  * - allow for vstack
  */
 /* See LICENSE file for copyright and license details.
@@ -67,7 +62,6 @@ typedef struct Client Client;
 struct Client {
 	char name[256];
 	int x, y, w, h;
-	int rx, ry, rw, rh;
 	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
 	int minax, maxax, minay, maxay;
 	long flags;
@@ -105,6 +99,7 @@ typedef struct {
 typedef struct {
 	const char *symbol;
 	void (*arrange)(void);
+	Bool isfloating;
 } Layout;
 
 typedef struct {
@@ -176,6 +171,8 @@ void tag(const char *arg);
 unsigned int textnw(const char *text, unsigned int len);
 unsigned int textw(const char *text);
 void tile(void);
+unsigned int tilemaster(void);
+void tilevstack(unsigned int n);
 void togglefloating(const char *arg);
 void toggletag(const char *arg);
 void toggleview(const char *arg);
@@ -213,7 +210,6 @@ void (*handler[LASTEvent]) (XEvent *) = {
 	[UnmapNotify] = unmapnotify
 };
 Atom wmatom[WMLast], netatom[NetLast];
-Bool dozoom = True;
 Bool otherwm, readin;
 Bool running = True;
 Bool *prevtags;
@@ -297,7 +293,7 @@ void
 ban(Client *c) {
 	if(c->isbanned)
 		return;
-	XMoveWindow(dpy, c->win, c->x + 3 * sw, c->y);
+	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
 	c->isbanned = True;
 }
 
@@ -428,7 +424,7 @@ configurerequest(XEvent *e) {
 	if((c = getclient(ev->window))) {
 		if(ev->value_mask & CWBorderWidth)
 			c->border = ev->border_width;
-		if(c->isfixed || c->isfloating || (floating == lt->arrange)) {
+		if(c->isfixed || c->isfloating || lt->isfloating) {
 			if(ev->value_mask & CWX)
 				c->x = sx + ev->x;
 			if(ev->value_mask & CWY)
@@ -637,7 +633,6 @@ void
 floating(void) { /* default floating layout */
 	Client *c;
 
-	dozoom = False;
 	for(c = clients; c; c = c->next)
 		if(isvisible(c))
 			resize(c, c->x, c->y, c->w, c->h, True);
@@ -650,22 +645,11 @@ focus(Client *c) {
 	if(sel && sel != c) {
 		grabbuttons(sel, False);
 		XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
-		if(lt->arrange == monocle)
-			resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
 	}
 	if(c) {
 		detachstack(c);
 		attachstack(c);
 		grabbuttons(c, True);
-		if(lt->arrange == monocle) {
-			if(sel != c) {
-				c->rx = c->x;
-				c->ry = c->y;
-				c->rw = c->w;
-				c->rh = c->h;
-			}
-			resize(c, MOX, MOY, MOW, MOH, RESIZEHINTS);
-		}
 	}
 	sel = c;
 	if(c) {
@@ -987,28 +971,29 @@ manage(Window w, XWindowAttributes *wa) {
 	c->tags = emallocz(TAGSZ);
 	c->win = w;
 
-	c->x = c->rx = wa->x + sx;
-	c->y = c->ry = wa->y + sy;
-	c->w = c->rw = wa->width;
-	c->h = c->rh = wa->height;
+	/* geometry */
+	c->x = wa->x;
+	c->y = wa->y;
+	c->w = wa->width;
+	c->h = wa->height;
 	c->oldborder = wa->border_width;
-
 	if(c->w == sw && c->h == sh) {
 		c->x = sx;
 		c->y = sy;
 		c->border = wa->border_width;
 	}
 	else {
-		if(c->x + c->w + 2 * c->border > sx + sw)
-			c->x = sx + sw - c->w - 2 * c->border;
-		if(c->y + c->h + 2 * c->border > sy + sh)
-			c->y = sy + sh - c->h - 2 * c->border;
-		if(c->x < sx)
-			c->x = sx;
-		if(c->y < sy)
-			c->y = sy;
+		if(c->x + c->w + 2 * c->border > WX + WW)
+			c->x = WX + WW - c->w - 2 * c->border;
+		if(c->y + c->h + 2 * c->border > WY + WH)
+			c->y = WY + WH - c->h - 2 * c->border;
+		if(c->x < WX)
+			c->x = WX;
+		if(c->y < WY)
+			c->y = WY;
 		c->border = BORDERPX;
 	}
+
 	wc.border_width = c->border;
 	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
 	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
@@ -1057,8 +1042,12 @@ maprequest(XEvent *e) {
 }
 
 void
-monocle(void) {
-	dozoom = False;
+monocle(void) { 
+	Client *c;
+
+	for(c = clients; c; c = c->next)
+		if(isvisible(c))
+			resize(c, MOX, MOY, MOW, MOH, RESIZEHINTS);
 }
 
 void
@@ -1089,17 +1078,17 @@ movemouse(Client *c) {
 			XSync(dpy, False);
 			nx = ocx + (ev.xmotion.x - x1);
 			ny = ocy + (ev.xmotion.y - y1);
-			if(abs(sx - nx) < SNAP)
-				nx = sx;
-			else if(abs((sx + sw) - (nx + c->w + 2 * c->border)) < SNAP)
-				nx = sx + sw - c->w - 2 * c->border;
-			if(abs(sy - ny) < SNAP)
-				ny = sy;
-			else if(abs((sy + sh) - (ny + c->h + 2 * c->border)) < SNAP)
-				ny = sy + sh - c->h - 2 * c->border;
-			if(!c->isfloating && (lt->arrange != floating) && (abs(nx - c->x) > SNAP || abs(ny - c->y) > SNAP))
+			if(abs(WX - nx) < SNAP)
+				nx = WX;
+			else if(abs((WX + WW) - (nx + c->w + 2 * c->border)) < SNAP)
+				nx = WX + WW - c->w - 2 * c->border;
+			if(abs(WY - ny) < SNAP)
+				ny = WY;
+			else if(abs((WY + WH) - (ny + c->h + 2 * c->border)) < SNAP)
+				ny = WY + WH - c->h - 2 * c->border;
+			if(!c->isfloating && !lt->isfloating && (abs(nx - c->x) > SNAP || abs(ny - c->y) > SNAP))
 				togglefloating(NULL);
-			if((lt->arrange == floating) || c->isfloating)
+			if((lt->isfloating) || c->isfloating)
 				resize(c, nx, ny, c->w, c->h, False);
 			break;
 		}
@@ -1258,9 +1247,9 @@ resizemouse(Client *c) {
 				nw = 1;
 			if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0)
 				nh = 1;
-			if(!c->isfloating && (lt->arrange != floating) && (abs(nw - c->w) > SNAP || abs(nh - c->h) > SNAP))
+			if(!c->isfloating && !lt->isfloating && (abs(nw - c->w) > SNAP || abs(nh - c->h) > SNAP))
 				togglefloating(NULL);
-			if((lt->arrange == floating) || c->isfloating)
+			if((lt->isfloating) || c->isfloating)
 				resize(c, c->x, c->y, nw, nh, True);
 			break;
 		}
@@ -1276,9 +1265,9 @@ restack(void) {
 	drawbar();
 	if(!sel)
 		return;
-	if(sel->isfloating || (lt->arrange == floating))
+	if(sel->isfloating || lt->isfloating)
 		XRaiseWindow(dpy, sel->win);
-	if(lt->arrange != floating) {
+	if(!lt->isfloating) {
 		wc.stack_mode = Below;
 		wc.sibling = barwin;
 		if(!sel->isfloating) {
@@ -1393,6 +1382,7 @@ setclientstate(Client *c, long state) {
 
 void
 setlayout(const char *arg) {
+	static Layout *revert = 0;
 	unsigned int i;
 
 	if(!arg)
@@ -1402,7 +1392,12 @@ setlayout(const char *arg) {
 			break;
 	if(i == LENGTH(layouts))
 		return;
-	lt = &layouts[i];
+	if(revert && &layouts[i] == lt)
+		lt = revert;
+	else {
+		revert = lt;
+		lt = &layouts[i];
+	}
 	if(sel)
 		arrange();
 	else
@@ -1545,47 +1540,58 @@ textw(const char *text) {
 }
 
 void
-tile(void) {
-	unsigned int i, n, nx, ny, nw, nh, mw, th;
+tileresize(Client *c, int x, int y, int w, int h) {
+	resize(c, x, y, w, h, RESIZEHINTS);
+	if((RESIZEHINTS) && ((c->h < bh) || (c->h > h) || (c->w < bh) || (c->w > w)))
+		/* client doesn't accept size constraints */
+		resize(c, x, y, w, h, False);
+}
+
+unsigned int
+tilemaster(void) {
+	unsigned int n;
 	Client *c, *mc;
 
-	dozoom = True;
-	nx = MX;
-	ny = MY;
-	nw = 0;
-	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
+	for(n = 0, mc = c = nexttiled(clients); c; c = nexttiled(c->next))
 		n++;
+	if(n == 0)
+		return 0;
+	if(n == 1)
+		tileresize(mc, MOX, MOY, (MOW) - 2 * mc->border, (MOH) - 2 * mc->border);
+	else
+		tileresize(mc, MX, MY, (MW) - 2 * mc->border, (MH) - 2 * mc->border);
+	return n - 1;
+}
 
-	/* window geoms */
-	mw = (n == 1) ? MOW : MW;
-	th = (n > 1) ? TH / (n - 1) : 0;
-	if(n > 1 && th < bh)
-		th = TH;
+void
+tilevstack(unsigned int n) {
+	int i, y, h;
+	Client *c;
 
-	for(i = 0, c = mc = nexttiled(clients); c; c = nexttiled(c->next)) {
-		if(i == 0) { /* master */
-			nw = mw - 2 * c->border;
-			nh = MH - 2 * c->border;
-		}
-		else {  /* tile window */
-			if(i == 1) {
-				ny = TY;
-				nx = TX;
-				nw = TW - 2 * c->border;
-			}
-			if(i + 1 == n) /* remainder */
-				nh = (TY + TH) - ny - 2 * c->border;
+	if(n == 0)
+		return;
+
+	y = TY;
+	h = (TH) / n;
+	if(h < bh)
+		h = TH;
+
+	for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++)
+		if(i > 0) {
+			if(i > 1 && i == n) /* remainder */
+				tileresize(c, TX, y, (TW) - 2 * c->border,
+				              ((TY) + (TH)) - y - 2 * c->border);
 			else
-				nh = th - 2 * c->border;
+				tileresize(c, TX, y, (TW) - 2 * c->border,
+				              h - 2 * c->border);
+			if(h != TH)
+				y = c->y + c->h + 2 * c->border;
 		}
-		resize(c, nx, ny, nw, nh, RESIZEHINTS);
-		if((RESIZEHINTS) && ((c->h < bh) || (c->h > nh) || (c->w < bh) || (c->w > nw)))
-			/* client doesn't accept size constraints */
-			resize(c, nx, ny, nw, nh, False);
-		if(n > 1 && th != TH)
-			ny = c->y + c->h + 2 * c->border;
-		i++;
-	}
+}
+
+void
+tile(void) {
+	tilevstack(tilemaster());
 }
 
 void
@@ -1796,7 +1802,7 @@ void
 zoom(const char *arg) {
 	Client *c = sel;
 
-	if(!sel || !dozoom || sel->isfloating)
+	if(!sel || lt->isfloating || sel->isfloating)
 		return;
 	if(c == nexttiled(clients))
 		if(!(c = nexttiled(c->next)))
ose images are of family groups. So, while these are multiple-original works, to call them "prints" suggests an image that doesn't do them justice. Lebadang also did paint-on-canvas works, sculptures, and rugs (as shown below) in the same 3-D style. <P><IMG LENGTH=30% SRC="art/LebaTall.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/LebaBlue.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/LebaRed.jpg"> <P><IMG LENGTH=30% SRC="art/Leblitho.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Leboffice.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Lebrug.jpg"> <P>To see more: <A HREF="http://viettouch.com/lebadang/">http://viettouch.com/lebadang/</A> <P>&#160; &#160; &#160; <P><A NAME="RIFE">&#160; &#160; &#160; <P><B>Jon Rife</B> is a San Francisco artist. He's very interested in textures, and I'm fascinated by the way he can represent textures in a flat monoprint, most of which is lost on you in these bad reproductions. (A monoprint is made by painting onto a smooth surface, glass or metal, and then transferring the paint onto paper in a press.) Rife's more recent works include both direct paint-to-canvas and the integration of digital imagery with his painting. The <A HREF="index.html#CSLS">covers</A> of my <CITE>Computer Science Logo Style</CITE> books are taken from three of his works. <P><IMG LENGTH=30% SRC="art/RifeOil.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/RifeLeft.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/RifeRight.jpg"> <P><IMG LENGTH=30% SRC="art/RifeOld.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Rife3474.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Rife3603.jpg"> <P>To see more: <A HREF="http://www.jonrife.com/">http://www.jonrife.com/</A> <P>&#160; &#160; &#160; <P><A NAME="FARB">&#160; &#160; &#160; <P><B>Gerta Farber</B> is a local artist, living in Oakland, who does mostly watercolors on a range of subjects: landscapes, portraits, and abstracts. Here we see a California mission church (the first original artwork I ever bought!), a house, and some semi-abstract trees. <P><IMG LENGTH=30% SRC="art/FarbMiss.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/FarbHouse.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/FarbTrees.jpg"> <P>Alas, her artwork seems to have disappeared from the Web since she retired, so I can't give a link. <P>&#160; &#160; &#160; <P><A NAME="VOIGT">&#160; &#160; &#160; <P><B>David Voigt</B> is an Australian artist whose work I find interesting partly because of the way he depicts motion (the birds' flight, the wind, the river). He mostly does landscapes from nature. These are watercolors; he also does even more dramatic acrylic paintings. <P><IMG LENGTH=30% SRC="art/VoigtDry.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/VoigtHills.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/VoigtTree.jpg"> <P>To see more: <A HREF="http://www.davidvoigt.com/">http://www.davidvoigt.com/</A> <!-- <A HREF="http://www.breewood.com.au/exhibition4/firstEX4.htm">http://www.breewood.com.au/exhibition4/firstEX4.htm</A> --> <P>&#160; &#160; &#160; <P><A NAME="HOLDSWORTH">&#160; &#160; &#160; <P><B>Anthony Holdsworth</B> is a local artist, living in Oakland, who does very realistic acrylic paintings. My favorites are his urban landscapes featuring careful attention to the actual street surfaces, but he also loves to paint the Italian countryside. <P><IMG LENGTH=30% SRC="art/Holdsworth1.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Holdsworth2.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Holdsworth3.jpg"> <P>To see more: <A HREF="http://www.anthonyholdsworth.com/">http://www.anthonyholdsworth.com/</A> <P>&#160; &#160; &#160; <P><A NAME="AVERELL">&#160; &#160; &#160; <P><B>Sue Averell</B> is a local Marin County artist who paints very dramatic acrylic semi-realistic works. I love the freedom in her style, and the bold, thick blocks of color. <P><IMG LENGTH=30% SRC="art/Averell1.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Averell2.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Averell3.jpg"> <P>To see more: <A HREF="http://www.sueaverell.com/">http://www.sueaverell.com/</A> <P>&#160; &#160; &#160; <P><A NAME="HARCOS">&#160; &#160; &#160; <P><B>Bela Harcos</B> is a San Francisco artist who paints very vibrant abstract acrylics. I love the colors and the textures! He's also a sculptor. <P><IMG LENGTH=30% SRC="art/Harcos1.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Harcos2.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Harcos3.jpg"> <P>To see more: <A HREF="http://www.evolvingartgallery.com/artist_harcos_bela.htm">http://www.evolvingartgallery.com/artist_harcos_bela.htm</A> <P>&#160; &#160; &#160; <P><A NAME="DION">&#160; &#160; &#160; <P><B>David Dion</B> is a San Francisco sculptor who works in wood and plastics. He makes tabletop-sized fantasy buildings, boats, and things I'm not sure about! <P><IMG LENGTH=30% SRC="art/Dion1.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Dion2.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Dion3.jpg"> <P>To see more: <A HREF="http://www.mesart.com/artworks.jsp.que.artist.eq.987.shtml">http://www.mesart.com/artworks.jsp.que.artist.eq.987.shtml</A> <P>&#160; &#160; &#160; <P><A NAME="PETYARRE">&#160; &#160; &#160; <P><B>Kathleen Petyarre</B> is one of the most famous living Australian Aboriginal artists. I confess that most Aboriginal art leaves me cold, but the artists in the Utopia region are an exception, and the greatest of those (imho) is Kathleen Petyarre. Her work has a depth that I can stare at for hours. The pictures tell stories at several levels, but I know next to nothing about that, I'm afraid. <P><IMG LENGTH=30% SRC="art/Kathleen1.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Kathleen2.jpg">&#160; &#160; &#160; <P>To see more: <A HREF="http://www.gallerieaustralis.com/aspx/kathleen_petyarre.aspx">http://www.gallerieaustralis.com/aspx/kathleen_petyarre.aspx</A> <BR><A HREF="http://www.aboriginalartstore.com.au/artists/kathleen-petyarre.php">http://www.aboriginalartstore.com.au/artists/kathleen-petyarre.php</A> <BR><A HREF="http://www.aboriginalartdirectory.com/artists/slideshow/kathleen-petyarre/">http://www.aboriginalartdirectory.com/artists/slideshow/kathleen-petyarre/</A> <P>&#160; &#160; &#160; <P><A NAME="REYES">&#160; &#160; &#160; <P><B>Fernando Reyes</B> is an Oakland artist who does landscapes and thoughtful portraits in addition to his works in the style shown here, my favorites, featuring parts of people's bodies overlayed in interesting patterns. <P><IMG LENGTH=30% SRC="art/Reyes5.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Reyes6.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Reyes1.jpg">&#160; &#160; &#160; <P>To see more: <A HREF="http://www.freyesart.com">http://www.freyesart.com</A> <P>&#160; &#160; &#160; <P><A NAME="CORNING">&#160; &#160; &#160; <P><B>Judith Corning</B> lives a block away from me! She does these gorgeous, detailed nature paintings in acrylic, among other styles. <P><IMG LENGTH=30% SRC="art/Corning1.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Corning2.jpg">&#160; &#160; &#160; <P>To see more: <A HREF="http://judithcorning.com/">http://judithcorning.com/</A> <P>&#160; &#160; &#160; <P><A NAME="WEBER">&#160; &#160; &#160; <P><B>Kay Weber</B> is in San Francisco. He does these very intricate paper cutouts; the ones in these pictures are made from gift wrap paper. He also volunteers some of his time teaching art to teenagers, several of whom tend to pop in during his Open Studios stints, which is fun. <P><IMG LENGTH=30% SRC="art/Weber1.jpg">&#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Weber2.jpg">&#160; &#160; &#160; <P>To see more: <A HREF="http://www.kayweberartstudio.com">http://www.kayweberartstudio.com/</A> <P>&#160; &#160; &#160; <P><A NAME="SOUVENIRS">&#160; &#160; &#160; <H2>Souvenirs of exotic places</H2> <P>The cities mentioned below are where I bought the artworks, which may not be exactly where the artist lives and works. (For example, Jan Neil's studio is in Melbourne, but I bought this piece at a gallery in Darwin.) In a couple of cases I was unable to find a web link. <P>&#160; &#160; &#160; <P>From Bratislava, Slovakia (artist: Igor Piacka) <P><IMG LENGTH=30% SRC="art/Piacka.jpg"> <P>To see more: <A HREF="http://piacka.com/igor/malba_2008.php">http://piacka.com/igor/malba_2008.php</A> <P>&#160; &#160; &#160; <P>From Berlin, Germany (artist: Falko Behrendt) <P><IMG LENGTH=30% SRC="art/Behrendt.jpg"> <P>To see more: <A HREF="http://www.kunstmarkt.de/pagesjob/falko_behrendt/_i74070-/kunst_kaufen.html?words=Behrendt,+Falko">http://www.kunstmarkt.de/pagesjob/falko_behrendt/_i74070-/kunst_kaufen.html?words=Behrendt,+Falko</A> <P>&#160; &#160; &#160; <P>From Birmingham, England (artist: M. Hazel Mason) <P><IMG LENGTH=30% SRC="art/Mason.jpg"> <P>&#160; &#160; &#160; <P>From Darwin, Australia (artist: Jan Neil) <P><IMG LENGTH=30% SRC="art/Neil.jpg"> <P>To see more: <A HREF="http://www.janneilozimages.com.au/gallery.htm">http://www.janneilozimages.com.au/gallery.htm</A> <P>&#160; &#160; &#160; <P>From Reykjavik, Iceland (artist: Sigrun Eldjarn) <P><IMG LENGTH=30% SRC="art/Eldjarn.jpg"> <P>To see more (but in a very different style): <A HREF="http://www.sim.is/Index/Islenska/Artotek/Listamadur/110">http://www.sim.is/Index/Islenska/Artotek/Listamadur/110</A> <P>&#160; &#160; &#160; <P>From Toronto, Canada (artist: Gino Hollander) <P><IMG LENGTH=30% SRC="art/Hollander.jpg"> <P>To see more: <A HREF="http://www.hollanderart.com/sitepages/pid14.php">http://www.hollanderart.com/sitepages/pid14.php</A> <P>&#160; &#160; &#160; <P>From Warsaw, Poland (artist: A. Urbaniak) <P><IMG LENGTH=30% SRC="art/Urbaniak.jpg"> <P>&#160; &#160; &#160; <P>From Bergen, Norway (artists: Kristian Finborud, Svein Bolling) <P><IMG LENGTH=60% SRC="art/Finborud.jpg"> &#160; &#160; &#160; <IMG LENGTH=30% SRC="art/Bolling.jpg"> <P>To see more: <A HREF="http://www.finborud.no/">http://www.finborud.no/</A><br> <A HREF="http://www.artnet.com/artists/svein-bolling/">http://www.artnet.com/artists/svein-bolling/</A> <P>&#160; &#160; &#160; <P>From Vilnius, Lithuania (artist: Valentinas Ajauskas) <P><IMG SRC="art/Ajauskas.jpg"> <P>To see more: <A HREF="https://www.paveikslai.lt/en/416_valentinas-ajauskas">https://www.paveikslai.lt/en/416_valentinas-ajauskas</A> <P>&#160; &#160; &#160; <P><ADDRESS> <A HREF="index.html"><CODE>www.cs.berkeley.edu/~bh</CODE></A> </ADDRESS> </BODY> </HTML>