draw.c
changeset 352 5a8bdc3b37cb
parent 351 d822b5fbe11e
child 353 8a06efe5b563
equal deleted inserted replaced
351:d822b5fbe11e 352:5a8bdc3b37cb
    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, unsigned int colidx, Bool highlight)
    25 drawtext(const char *text, Bool invert, Bool highlight)
    26 {
    26 {
    27 	int x, y, w, h;
    27 	int x, y, w, h;
    28 	static char buf[256];
    28 	static char buf[256];
    29 	unsigned int len, olen;
    29 	unsigned int len, olen;
       
    30 	XGCValues gcv;
    30 	XPoint points[5];
    31 	XPoint points[5];
    31 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
    32 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
    32 
    33 
    33 	XSetForeground(dpy, dc.gc, dc.bg[colidx]);
    34 	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
    34 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
    35 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
    35 	points[0].x = dc.x;
    36 	points[0].x = dc.x;
    36 	points[0].y = dc.y;
    37 	points[0].y = dc.y;
    37 	points[1].x = dc.w - 1;
    38 	points[1].x = dc.w - 1;
    38 	points[1].y = 0;
    39 	points[1].y = 0;
    40 	points[2].y = dc.h - 1;
    41 	points[2].y = dc.h - 1;
    41 	points[3].x = -(dc.w - 1);
    42 	points[3].x = -(dc.w - 1);
    42 	points[3].y = 0;
    43 	points[3].y = 0;
    43 	points[4].x = 0;
    44 	points[4].x = 0;
    44 	points[4].y = -(dc.h - 1);
    45 	points[4].y = -(dc.h - 1);
    45 	XSetForeground(dpy, dc.gc, dc.fg[colidx]);
    46 	XSetForeground(dpy, dc.gc, dc.border);
    46 	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
    47 	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
    47 
    48 
    48 	if(!text)
    49 	if(!text)
    49 		return;
    50 		return;
    50 
    51 
    71 			buf[len - 3] = '.';
    72 			buf[len - 3] = '.';
    72 	}
    73 	}
    73 
    74 
    74 	if(w > dc.w)
    75 	if(w > dc.w)
    75 		return; /* too long */
    76 		return; /* too long */
    76 	if(dc.font.set)
    77 	gcv.foreground = invert ? dc.bg : dc.fg;
       
    78 	gcv.background = invert ? dc.fg : dc.bg;
       
    79 	if(dc.font.set) {
       
    80 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
    77 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
    81 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
       
    82 	}
    78 	else {
    83 	else {
    79 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
    84 		gcv.font = dc.font.xfont->fid;
       
    85 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
    80 		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
    86 		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
    81 	}
    87 	}
    82 	if(highlight) {
    88 	if(highlight) {
    83 		points[0].x = dc.x + 1;
    89 		r.x = dc.x + 2;
    84 		points[0].y = dc.y + 1;
    90 		r.y = dc.y + 2;
    85 		points[1].x = dc.w - 3;
    91 		r.width = r.height = 3;
    86 		points[1].y = 0;
    92 		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
    87 		points[2].x = 0;
       
    88 		points[2].y = dc.h - 3;
       
    89 		points[3].x = -(dc.w - 3);
       
    90 		points[3].y = 0;
       
    91 		points[4].x = 0;
       
    92 		points[4].y = -(dc.h - 3);
       
    93 		XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
       
    94 	}
    93 	}
    95 }
    94 }
    96 
    95 
    97 /* extern */
    96 /* extern */
    98 
    97 
   112 	int i, x;
   111 	int i, x;
   113 	Bool istile = arrange == dotile;
   112 	Bool istile = arrange == dotile;
   114 
   113 
   115 	dc.x = dc.y = 0;
   114 	dc.x = dc.y = 0;
   116 	dc.w = bw;
   115 	dc.w = bw;
   117 	drawtext(NULL, istile ? 1 : 0, False);
   116 	drawtext(NULL, !istile, False);
   118 
   117 
   119 	dc.w = 0;
   118 	dc.w = 0;
   120 	for(i = 0; i < ntags; i++) {
   119 	for(i = 0; i < ntags; i++) {
   121 		dc.x += dc.w;
   120 		dc.x += dc.w;
   122 		dc.w = textw(tags[i]);
   121 		dc.w = textw(tags[i]);
   123 		if(istile)
   122 		if(istile)
   124 			drawtext(tags[i], seltag[i] ? 0 : 1, sel && sel->tags[i]);
   123 			drawtext(tags[i], seltag[i], sel && sel->tags[i]);
   125 		else
   124 		else
   126 			drawtext(tags[i], seltag[i] ? 1 : 0, sel && sel->tags[i]);
   125 			drawtext(tags[i], !seltag[i], sel && sel->tags[i]);
   127 	}
   126 	}
   128 	x = dc.x + dc.w;
   127 	x = dc.x + dc.w;
   129 	dc.w = textw(stext);
   128 	dc.w = textw(stext);
   130 	dc.x = bx + bw - dc.w;
   129 	dc.x = bx + bw - dc.w;
   131 	if(dc.x < x) {
   130 	if(dc.x < x) {
   132 		dc.x = x;
   131 		dc.x = x;
   133 		dc.w = bw - x;
   132 		dc.w = bw - x;
   134 	}
   133 	}
   135 	drawtext(stext, istile ? 1 : 0, False);
   134 	drawtext(stext, !istile, False);
   136 
   135 
   137 	if(sel && ((dc.w = dc.x - x) > bh)) {
   136 	if(sel && ((dc.w = dc.x - x) > bh)) {
   138 		dc.x = x;
   137 		dc.x = x;
   139 		drawtext(sel->name, istile ? 0 : 1, False);
   138 		drawtext(sel->name, istile, False);
   140 	}
   139 	}
   141 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
   140 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
   142 	XSync(dpy, False);
   141 	XSync(dpy, False);
   143 }
   142 }
   144 
   143 
   149 	Bool istile = arrange == dotile;
   148 	Bool istile = arrange == dotile;
   150 
   149 
   151 	if(c == sel && issel) {
   150 	if(c == sel && issel) {
   152 		drawstatus();
   151 		drawstatus();
   153 		XUnmapWindow(dpy, c->twin);
   152 		XUnmapWindow(dpy, c->twin);
   154 		XSetWindowBorder(dpy, c->win, dc.fg[1]);
   153 		XSetWindowBorder(dpy, c->win, dc.fg);
   155 		return;
   154 		return;
   156 	}
   155 	}
   157 
   156 
   158 	XSetWindowBorder(dpy, c->win, dc.bg[0]);
   157 	XSetWindowBorder(dpy, c->win, dc.bg);
   159 	XMapWindow(dpy, c->twin);
   158 	XMapWindow(dpy, c->twin);
   160 	dc.x = dc.y = 0;
   159 	dc.x = dc.y = 0;
   161 	dc.w = c->tw;
   160 	dc.w = c->tw;
   162 	drawtext(c->name, istile ? 1 : 0, False);
   161 	drawtext(c->name, !istile, False);
   163 	XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0);
   162 	XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0);
   164 	XSync(dpy, False);
   163 	XSync(dpy, False);
   165 }
   164 }
   166 
   165 
   167 unsigned long
   166 unsigned long