draw.c
changeset 76 4bd49f404f10
parent 75 f08271b7cb20
child 77 38c8f7f7d401
equal deleted inserted replaced
75:f08271b7cb20 76:4bd49f404f10
     1 /*
     1 /*
     2  * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
     2  * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
     3  * See LICENSE file for license details.
     3  * See LICENSE file for license details.
     4  */
     4  */
       
     5 #include "dwm.h"
     5 
     6 
     6 #include <stdio.h>
     7 #include <stdio.h>
     7 #include <string.h>
     8 #include <string.h>
     8 
       
     9 #include <X11/Xlocale.h>
     9 #include <X11/Xlocale.h>
    10 
    10 
    11 #include "dwm.h"
    11 /* static functions */
    12 
       
    13 void
       
    14 drawall()
       
    15 {
       
    16 	Client *c;
       
    17 
       
    18 	for(c = clients; c; c = getnext(c->next))
       
    19 		drawtitle(c);
       
    20 	drawstatus();
       
    21 }
       
    22 
       
    23 void
       
    24 drawstatus()
       
    25 {
       
    26 	int i;
       
    27 	Bool istile = arrange == dotile;
       
    28 
       
    29 	dc.x = dc.y = 0;
       
    30 	dc.w = bw;
       
    31 	drawtext(NULL, !istile, False);
       
    32 
       
    33 	dc.w = 0;
       
    34 	for(i = 0; i < TLast; i++) {
       
    35 		dc.x += dc.w;
       
    36 		dc.w = textw(tags[i]);
       
    37 		if(istile)
       
    38 			drawtext(tags[i], (i == tsel), True);
       
    39 		else
       
    40 			drawtext(tags[i], (i != tsel), True);
       
    41 	}
       
    42 	if(sel) {
       
    43 		dc.x += dc.w;
       
    44 		dc.w = textw(sel->name);
       
    45 		drawtext(sel->name, istile, True);
       
    46 	}
       
    47 	dc.w = textw(stext);
       
    48 	dc.x = bx + bw - dc.w;
       
    49 	drawtext(stext, !istile, False);
       
    50 
       
    51 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
       
    52 	XFlush(dpy);
       
    53 }
       
    54 
       
    55 void
       
    56 drawtitle(Client *c)
       
    57 {
       
    58 	int i;
       
    59 	Bool istile = arrange == dotile;
       
    60 
       
    61 	if(c == sel) {
       
    62 		drawstatus();
       
    63 		XUnmapWindow(dpy, c->title);
       
    64 		XSetWindowBorder(dpy, c->win, dc.fg);
       
    65 		return;
       
    66 	}
       
    67 
       
    68 	XSetWindowBorder(dpy, c->win, dc.bg);
       
    69 	XMapWindow(dpy, c->title);
       
    70 
       
    71 	dc.x = dc.y = 0;
       
    72 
       
    73 	dc.w = 0;
       
    74 	for(i = 0; i < TLast; i++) {
       
    75 		if(c->tags[i]) {
       
    76 			dc.x += dc.w;
       
    77 			dc.w = textw(c->tags[i]);
       
    78 			drawtext(c->tags[i], !istile, True);
       
    79 		}
       
    80 	}
       
    81 	dc.x += dc.w;
       
    82 	dc.w = textw(c->name);
       
    83 	drawtext(c->name, !istile, True);
       
    84 	XCopyArea(dpy, dc.drawable, c->title, dc.gc,
       
    85 			0, 0, c->tw, c->th, 0, 0);
       
    86 	XFlush(dpy);
       
    87 }
       
    88 
    12 
    89 static void
    13 static void
    90 drawborder(void)
    14 drawborder(void)
    91 {
    15 {
    92 	XPoint points[5];
    16 	XPoint points[5];
   103 	points[4].x = 0;
    27 	points[4].x = 0;
   104 	points[4].y = -(dc.h - 1);
    28 	points[4].y = -(dc.h - 1);
   105 	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
    29 	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
   106 }
    30 }
   107 
    31 
       
    32 /* extern functions */
       
    33 
       
    34 void
       
    35 drawall()
       
    36 {
       
    37 	Client *c;
       
    38 
       
    39 	for(c = clients; c; c = getnext(c->next))
       
    40 		drawtitle(c);
       
    41 	drawstatus();
       
    42 }
       
    43 
       
    44 void
       
    45 drawstatus()
       
    46 {
       
    47 	int i;
       
    48 	Bool istile = arrange == dotile;
       
    49 
       
    50 	dc.x = dc.y = 0;
       
    51 	dc.w = bw;
       
    52 	drawtext(NULL, !istile, False);
       
    53 
       
    54 	dc.w = 0;
       
    55 	for(i = 0; i < TLast; i++) {
       
    56 		dc.x += dc.w;
       
    57 		dc.w = textw(tags[i]);
       
    58 		if(istile)
       
    59 			drawtext(tags[i], (i == tsel), True);
       
    60 		else
       
    61 			drawtext(tags[i], (i != tsel), True);
       
    62 	}
       
    63 	if(sel) {
       
    64 		dc.x += dc.w;
       
    65 		dc.w = textw(sel->name);
       
    66 		drawtext(sel->name, istile, True);
       
    67 	}
       
    68 	dc.w = textw(stext);
       
    69 	dc.x = bx + bw - dc.w;
       
    70 	drawtext(stext, !istile, False);
       
    71 
       
    72 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
       
    73 	XFlush(dpy);
       
    74 }
       
    75 
   108 void
    76 void
   109 drawtext(const char *text, Bool invert, Bool border)
    77 drawtext(const char *text, Bool invert, Bool border)
   110 {
    78 {
   111 	int x, y, w, h;
    79 	int x, y, w, h;
   112 	unsigned int len;
    80 	unsigned int len;
   153 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
   121 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
   154 		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
   122 		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
   155 	}
   123 	}
   156 }
   124 }
   157 
   125 
       
   126 void
       
   127 drawtitle(Client *c)
       
   128 {
       
   129 	int i;
       
   130 	Bool istile = arrange == dotile;
       
   131 
       
   132 	if(c == sel) {
       
   133 		drawstatus();
       
   134 		XUnmapWindow(dpy, c->title);
       
   135 		XSetWindowBorder(dpy, c->win, dc.fg);
       
   136 		return;
       
   137 	}
       
   138 
       
   139 	XSetWindowBorder(dpy, c->win, dc.bg);
       
   140 	XMapWindow(dpy, c->title);
       
   141 
       
   142 	dc.x = dc.y = 0;
       
   143 
       
   144 	dc.w = 0;
       
   145 	for(i = 0; i < TLast; i++) {
       
   146 		if(c->tags[i]) {
       
   147 			dc.x += dc.w;
       
   148 			dc.w = textw(c->tags[i]);
       
   149 			drawtext(c->tags[i], !istile, True);
       
   150 		}
       
   151 	}
       
   152 	dc.x += dc.w;
       
   153 	dc.w = textw(c->name);
       
   154 	drawtext(c->name, !istile, True);
       
   155 	XCopyArea(dpy, dc.drawable, c->title, dc.gc,
       
   156 			0, 0, c->tw, c->th, 0, 0);
       
   157 	XFlush(dpy);
       
   158 }
       
   159 
   158 unsigned long
   160 unsigned long
   159 getcolor(const char *colstr)
   161 getcolor(const char *colstr)
   160 {
   162 {
   161 	XColor color;
   163 	XColor color;
   162 	Colormap cmap = DefaultColormap(dpy, screen);
   164 	Colormap cmap = DefaultColormap(dpy, screen);
   163 
   165 
   164 	XAllocNamedColor(dpy, cmap, colstr, &color, &color);
   166 	XAllocNamedColor(dpy, cmap, colstr, &color, &color);
   165 	return color.pixel;
   167 	return color.pixel;
   166 }
       
   167 
       
   168 unsigned int
       
   169 textnw(char *text, unsigned int len)
       
   170 {
       
   171 	XRectangle r;
       
   172 	if(dc.font.set) {
       
   173 		XmbTextExtents(dc.font.set, text, len, NULL, &r);
       
   174 		return r.width;
       
   175 	}
       
   176 	return XTextWidth(dc.font.xfont, text, len);
       
   177 }
       
   178 
       
   179 unsigned int
       
   180 textw(char *text)
       
   181 {
       
   182 	return textnw(text, strlen(text)) + dc.font.height;
       
   183 }
   168 }
   184 
   169 
   185 void
   170 void
   186 setfont(const char *fontstr)
   171 setfont(const char *fontstr)
   187 {
   172 {
   230 		dc.font.ascent = dc.font.xfont->ascent;
   215 		dc.font.ascent = dc.font.xfont->ascent;
   231 		dc.font.descent = dc.font.xfont->descent;
   216 		dc.font.descent = dc.font.xfont->descent;
   232 	}
   217 	}
   233 	dc.font.height = dc.font.ascent + dc.font.descent;
   218 	dc.font.height = dc.font.ascent + dc.font.descent;
   234 }
   219 }
       
   220 
       
   221 unsigned int
       
   222 textnw(char *text, unsigned int len)
       
   223 {
       
   224 	XRectangle r;
       
   225 	if(dc.font.set) {
       
   226 		XmbTextExtents(dc.font.set, text, len, NULL, &r);
       
   227 		return r.width;
       
   228 	}
       
   229 	return XTextWidth(dc.font.xfont, text, len);
       
   230 }
       
   231 
       
   232 unsigned int
       
   233 textw(char *text)
       
   234 {
       
   235 	return textnw(text, strlen(text)) + dc.font.height;
       
   236 }