draw.c
changeset 342 a1901753deef
parent 340 ae0affabdc02
child 344 93192711a36a
equal deleted inserted replaced
341:e4dad4635250 342:a1901753deef
    20 	}
    20 	}
    21 	return XTextWidth(dc.font.xfont, text, len);
    21 	return XTextWidth(dc.font.xfont, text, len);
    22 }
    22 }
    23 
    23 
    24 static void
    24 static void
    25 drawtext(const char *text, Bool invert)
    25 drawborder()
    26 {
    26 {
    27 	int x, y, w, h;
       
    28 	static char buf[256];
       
    29 	unsigned int len, olen;
       
    30 	XGCValues gcv;
       
    31 	XPoint points[5];
    27 	XPoint points[5];
    32 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
       
    33 
       
    34 	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
       
    35 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       
    36 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
       
    37 	XSetForeground(dpy, dc.gc, dc.border);
       
    38 	points[0].x = dc.x;
    28 	points[0].x = dc.x;
    39 	points[0].y = dc.y;
    29 	points[0].y = dc.y;
    40 	points[1].x = dc.w - 1;
    30 	points[1].x = dc.w - 1;
    41 	points[1].y = 0;
    31 	points[1].y = 0;
    42 	points[2].x = 0;
    32 	points[2].x = 0;
    44 	points[3].x = -(dc.w - 1);
    34 	points[3].x = -(dc.w - 1);
    45 	points[3].y = 0;
    35 	points[3].y = 0;
    46 	points[4].x = 0;
    36 	points[4].x = 0;
    47 	points[4].y = -(dc.h - 1);
    37 	points[4].y = -(dc.h - 1);
    48 	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
    38 	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
       
    39 }
       
    40 
       
    41 static void
       
    42 drawtext(const char *text, Bool invert, Bool highlight)
       
    43 {
       
    44 	int x, y, w, h;
       
    45 	static char buf[256];
       
    46 	unsigned int len, olen;
       
    47 	DC tmp;
       
    48 	XGCValues gcv;
       
    49 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
       
    50 
       
    51 	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
       
    52 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       
    53 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
       
    54 	XSetForeground(dpy, dc.gc, dc.border);
       
    55 	drawborder();
    49 
    56 
    50 	if(!text)
    57 	if(!text)
    51 		return;
    58 		return;
    52 
    59 
    53 	w = 0;
    60 	w = 0;
    73 			buf[len - 3] = '.';
    80 			buf[len - 3] = '.';
    74 	}
    81 	}
    75 
    82 
    76 	if(w > dc.w)
    83 	if(w > dc.w)
    77 		return; /* too long */
    84 		return; /* too long */
    78 
       
    79 	gcv.foreground = invert ? dc.bg : dc.fg;
    85 	gcv.foreground = invert ? dc.bg : dc.fg;
    80 	gcv.background = invert ? dc.fg : dc.bg;
    86 	gcv.background = invert ? dc.fg : dc.bg;
    81 	if(dc.font.set) {
    87 	if(dc.font.set) {
    82 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
    88 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
    83 		XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc,
    89 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
    84 				x, y, buf, len);
       
    85 	}
    90 	}
    86 	else {
    91 	else {
    87 		gcv.font = dc.font.xfont->fid;
    92 		gcv.font = dc.font.xfont->fid;
    88 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
    93 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
    89 		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
    94 		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
       
    95 	}
       
    96 	if(highlight) {
       
    97 		tmp = dc;
       
    98 		dc.x += 2;
       
    99 		dc.y += 2;
       
   100 		dc.w -= 4;
       
   101 		dc.h -= 4;
       
   102 		drawborder();
       
   103 		dc = tmp;
    90 	}
   104 	}
    91 }
   105 }
    92 
   106 
    93 /* extern */
   107 /* extern */
    94 
   108 
   108 	int i, x;
   122 	int i, x;
   109 	Bool istile = arrange == dotile;
   123 	Bool istile = arrange == dotile;
   110 
   124 
   111 	dc.x = dc.y = 0;
   125 	dc.x = dc.y = 0;
   112 	dc.w = bw;
   126 	dc.w = bw;
   113 	drawtext(NULL, !istile);
   127 	drawtext(NULL, !istile, False);
   114 
   128 
   115 	dc.w = 0;
   129 	dc.w = 0;
   116 	for(i = 0; i < ntags; i++) {
   130 	for(i = 0; i < ntags; i++) {
   117 		dc.x += dc.w;
   131 		dc.x += dc.w;
   118 		dc.w = textw(tags[i]);
   132 		dc.w = textw(tags[i]);
   119 		if(istile)
   133 		if(istile)
   120 			drawtext(tags[i], seltag[i]);
   134 			drawtext(tags[i], seltag[i], sel && sel->tags[i]);
   121 		else
   135 		else
   122 			drawtext(tags[i], !seltag[i]);
   136 			drawtext(tags[i], !seltag[i], sel && sel->tags[i]);
   123 	}
   137 	}
   124 	x = dc.x + dc.w;
   138 	x = dc.x + dc.w;
   125 	dc.w = textw(stext);
   139 	dc.w = textw(stext);
   126 	dc.x = bx + bw - dc.w;
   140 	dc.x = bx + bw - dc.w;
   127 	drawtext(stext, !istile);
   141 	if(dc.x < x) {
   128 
   142 		dc.x = x;
   129 	if(sel) {
   143 		dc.w = bw - x;
   130 		for(i = 0; i < ntags; i++)
   144 	}
   131 			if(sel->tags[i]) {
   145 	drawtext(stext, !istile, False);
   132 				dc.w = textw(tags[i]);
   146 
   133 				dc.x -= dc.w;
   147 	if(sel && ((dc.w = dc.x - x) > bh)) {
   134 				if(dc.x < x)
   148 		dc.x = x;
   135 					break;
   149 		drawtext(sel->name, istile, False);
   136 				drawtext(tags[i], istile);
       
   137 			}
       
   138 		if(dc.x > x && (dc.x - x) > bh) {
       
   139 			dc.w = dc.x - x;
       
   140 			dc.x = x;
       
   141 			drawtext(sel->name, istile);
       
   142 		}
       
   143 	}
   150 	}
   144 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
   151 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
   145 	XSync(dpy, False);
   152 	XSync(dpy, False);
   146 }
   153 }
   147 
   154 
   151 	int i;
   158 	int i;
   152 	Bool istile = arrange == dotile;
   159 	Bool istile = arrange == dotile;
   153 
   160 
   154 	if(c == sel && issel) {
   161 	if(c == sel && issel) {
   155 		drawstatus();
   162 		drawstatus();
   156 		XUnmapWindow(dpy, c->title);
   163 		XUnmapWindow(dpy, c->twin);
   157 		XSetWindowBorder(dpy, c->win, dc.fg);
   164 		XSetWindowBorder(dpy, c->win, dc.fg);
   158 		return;
   165 		return;
   159 	}
   166 	}
   160 
   167 
   161 	XSetWindowBorder(dpy, c->win, dc.bg);
   168 	XSetWindowBorder(dpy, c->win, dc.bg);
   162 	XMapWindow(dpy, c->title);
   169 	XMapWindow(dpy, c->twin);
   163 
   170 	dc.x = dc.y = 0;
   164 	dc.y = dc.w = 0;
   171 	dc.w = c->tw;
   165 	dc.x = c->tw;
   172 	drawtext(c->name, !istile, False);
   166 	for(i = 0; i < ntags; i++)
   173 	XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0);
   167 		if(c->tags[i]) {
       
   168 			dc.w = textw(tags[i]);
       
   169 			dc.x -= dc.w;
       
   170 			drawtext(tags[i], !istile);
       
   171 		}
       
   172 	dc.w = dc.x;
       
   173 	dc.x = 0;
       
   174 	drawtext(c->name, !istile);
       
   175 	XCopyArea(dpy, dc.drawable, c->title, dc.gc, 0, 0, c->tw, c->th, 0, 0);
       
   176 	XSync(dpy, False);
   174 	XSync(dpy, False);
   177 }
   175 }
   178 
   176 
   179 unsigned long
   177 unsigned long
   180 getcolor(const char *colstr)
   178 getcolor(const char *colstr)