Browse Source

added new stuff

Anselm R. Garbe 20 năm trước cách đây
mục cha
commit
8a34fa50f7
11 tập tin đã thay đổi với 328 bổ sung và 36 xóa
  1. 6 6
      Makefile
  2. 9 0
      config.h
  3. 1 3
      config.mk
  4. 163 0
      draw.c
  5. 6 0
      draw.h
  6. 81 0
      font.c
  7. 0 16
      gridmenu.1
  8. 18 0
      util.c
  9. 41 0
      util.h
  10. 0 9
      wm.c
  11. 3 2
      wm.h

+ 6 - 6
Makefile

@@ -3,8 +3,8 @@
 
 include config.mk
 
-SRC = wm.c
-OBJ = ${SRC:.c=.o}
+WMSRC = wm.c draw.c util.c
+WMOBJ = ${WMSRC:.c=.o}
 MAN = gridwm.1
 BIN = gridwm gridmenu     
 
@@ -22,18 +22,18 @@ config:
 	@echo CC $<
 	@${CC} -c ${CFLAGS} $<
 
-${OBJ}: wm.h
+${WMOBJ}: wm.h draw.h config.h
 
-gridwm: ${OBJ}
+gridwm: ${WMOBJ}
 	@echo LD $@
-	@${CC} -o $@ ${OBJ} ${X11LDFLAGS}
+	@${CC} -o $@ ${WMOBJ} ${LDFLAGS}
 
 clean:
 	rm -f gridwm *.o
 
 dist: clean
 	mkdir -p gridwm-${VERSION}
-	cp -R Makefile README LICENSE config.mk ${SRC} ${MAN} gridwm-${VERSION}
+	cp -R Makefile README LICENSE config.mk ${WMSRC} ${MAN} gridwm-${VERSION}
 	tar -cf gridwm-${VERSION}.tar gridwm-${VERSION}
 	gzip gridwm-${VERSION}.tar
 	rm -rf gridwm-${VERSION}

+ 9 - 0
config.h

@@ -0,0 +1,9 @@
+/*
+ * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#define FONT	"fixed"
+#define FGCOLOR	"#000000"
+#define BGCOLOR	"#ffaa00"
+#define BOCOLOR	"#000000"

+ 1 - 3
config.mk

@@ -11,14 +11,12 @@ X11LIB = /usr/X11R6/lib
 VERSION = 0.0
 
 # includes and libs
-LIBS = -L${PREFIX}/lib -L/usr/lib -lc
-X11LIBS = -L${X11LIB} -lX11
+LIBS = -L${PREFIX}/lib -L/usr/lib -lc -L${X11LIB} -lX11
 
 # Linux/BSD
 CFLAGS = -g -Wall -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
 	-DVERSION=\"${VERSION}\"
 LDFLAGS = -g ${LIBS}
-X11LDFLAGS = ${LDFLAGS} ${X11LIBS}
 
 # Solaris
 #CFLAGS = -fast -xtarget=ultra ${INCLUDES} -DVERSION=\"${VERSION}\"

+ 163 - 0
draw.c

@@ -0,0 +1,163 @@
+/*
+ * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "draw.h"
+#include "util.h"
+
+static void
+drawborder(Display *dpy, Brush *b)
+{
+	XPoint points[5];
+	XSetLineAttributes(dpy, b->gc, 1, LineSolid, CapButt, JoinMiter);
+	XSetForeground(dpy, b->gc, b->color.border);
+	points[0].x = b->rect.x;
+	points[0].y = b->rect.y;
+	points[1].x = b->rect.width - 1;
+	points[1].y = 0;
+	points[2].x = 0;
+	points[2].y = b->rect.height - 1;
+	points[3].x = -(b->rect.width - 1);
+	points[3].y = 0;
+	points[4].x = 0;
+	points[4].y = -(b->rect.height - 1);
+	XDrawLines(dpy, b->drawable, b->gc, points, 5, CoordModePrevious);
+}
+
+void
+draw(Display *dpy, Brush *b)
+{
+	unsigned int x, y, w, h, len;
+	static char buf[256];
+	XGCValues gcv;
+
+	XSetForeground(dpy, b->gc, b->color.bg);
+	XFillRectangles(dpy, b->drawable, b->gc, &b->rect, 1);
+
+	if(b->border)
+		drawborder(dpy, b);
+
+	if(!b->text)
+		return;
+
+	len = strlen(b->text);
+	if(len >= sizeof(buf))
+		len = sizeof(buf) - 1;
+	memcpy(buf, b->text, len);
+	buf[len] = 0;
+
+	h = b->font->ascent + b->font->descent;
+	y = b->rect.y + (b->rect.height / 2) - (h / 2) + b->font->ascent;
+	x = b->rect.x + (h / 2);
+
+	/* shorten text if necessary */
+	while(len && (w = textwidth_l(b->font, buf, len)) > b->rect.width - h)
+		buf[--len] = 0;
+
+	if(w > b->rect.width)
+		return; /* too long */
+
+	gcv.foreground = b->color.fg;
+	gcv.background = b->color.bg;
+	if(b->font->set) {
+		XChangeGC(dpy, b->gc, GCForeground | GCBackground, &gcv);
+		XmbDrawImageString(dpy, b->drawable, b->font->set, b->gc,
+				x, y, buf, len);
+	}
+	else {
+		gcv.font = b->font->xfont->fid;
+		XChangeGC(dpy, b->gc, GCForeground | GCBackground | GCFont, &gcv);
+		XDrawImageString(dpy, b->drawable, b->gc, x, y, buf, len);
+	}
+}
+
+static unsigned long
+xloadcolor(Display *dpy, Colormap cmap, const char *colstr)
+{
+	XColor color;
+	XAllocNamedColor(dpy, cmap, colstr, &color, &color);
+	return color.pixel;
+}
+
+void
+loadcolor(Display *dpy, int screen, Color *c,
+		const char *bg, const char *fg, const char *border)
+{
+	Colormap cmap = DefaultColormap(dpy, screen);
+	c->bg = xloadcolor(dpy, cmap, bg);
+	c->fg = xloadcolor(dpy, cmap, fg);
+	c->border = xloadcolor(dpy, cmap, border);
+}
+
+unsigned int
+textwidth_l(Fnt *font, char *text, unsigned int len)
+{
+	if(font->set) {
+		XRectangle r;
+		XmbTextExtents(font->set, text, len, 0, &r);
+		return r.width;
+	}
+	return XTextWidth(font->xfont, text, len);
+}
+
+unsigned int
+textwidth(Fnt *font, char *text)
+{
+	return textwidth_l(font, text, strlen(text));
+}
+
+void
+loadfont(Display *dpy, Fnt *font, const char *fontstr)
+{
+	char **missing, *def;
+	int n;
+
+	missing = 0;
+	def = "?";
+	setlocale(LC_ALL, "");
+	if(font->set)
+		XFreeFontSet(dpy, font->set);
+	font->set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
+	if(missing) {
+		while(n--)
+			fprintf(stderr, "missing fontset: %s\n", missing[n]);
+		XFreeStringList(missing);
+		if(font->set) {
+			XFreeFontSet(dpy, font->set);
+			font->set = 0;
+		}
+	}
+	if(font->set) {
+		XFontSetExtents *font_extents;
+		XFontStruct **xfonts;
+		char **font_names;
+		unsigned int i;
+
+		font->ascent = font->descent = 0;
+		font_extents = XExtentsOfFontSet(font->set);
+		n = XFontsOfFontSet(font->set, &xfonts, &font_names);
+		for(i = 0, font->ascent = 0, font->descent = 0; i < n; i++) {
+			if(font->ascent < (*xfonts)->ascent)
+				font->ascent = (*xfonts)->ascent;
+			if(font->descent < (*xfonts)->descent)
+				font->descent = (*xfonts)->descent;
+			xfonts++;
+		}
+	}
+	else {
+		if(font->xfont)
+			XFreeFont(dpy, font->xfont);
+		font->xfont = 0;
+		font->xfont = XLoadQueryFont(dpy, fontstr);
+		if (!font->xfont)
+			font->xfont = XLoadQueryFont(dpy, "fixed");
+		if (!font->xfont)
+			error("error, cannot load 'fixed' font\n");
+		font->ascent = font->xfont->ascent;
+		font->descent = font->xfont->descent;
+	}
+}

+ 6 - 0
draw.h

@@ -0,0 +1,6 @@
+/*
+ * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+extern void error(char *errstr, ...);

+ 81 - 0
font.c

@@ -0,0 +1,81 @@
+/*
+ * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+
+unsigned int
+textwidth_l(BlitzFont *font, char *text, unsigned int len)
+{
+	if(font->set) {
+		XRectangle r;
+		XmbTextExtents(font->set, text, len, nil, &r);
+		return r.width;
+	}
+	return XTextWidth(font->xfont, text, len);
+}
+
+unsigned int
+textwidth(BlitzFont *font, char *text)
+{
+	return blitz_textwidth_l(font, text, strlen(text));
+}
+
+void
+loadfont(Blitz *blitz, BlitzFont *font)
+{
+	char *fontname = font->fontstr;
+	char **missing = nil, *def = "?";
+	int n;
+
+	setlocale(LC_ALL, "");
+	if(font->set)
+		XFreeFontSet(blitz->dpy, font->set);
+	font->set = XCreateFontSet(blitz->dpy, fontname, &missing, &n, &def);
+	if(missing) {
+		while(n--)
+			fprintf(stderr, "liblitz: missing fontset: %s\n", missing[n]);
+		XFreeStringList(missing);
+		if(font->set) {
+			XFreeFontSet(blitz->dpy, font->set);
+			font->set = nil;
+		}
+	}
+	if(font->set) {
+		XFontSetExtents *font_extents;
+		XFontStruct **xfonts;
+		char **font_names;
+		unsigned int i;
+
+		font->ascent = font->descent = 0;
+		font_extents = XExtentsOfFontSet(font->set);
+		n = XFontsOfFontSet(font->set, &xfonts, &font_names);
+		for(i = 0, font->ascent = 0, font->descent = 0; i < n; i++) {
+			if(font->ascent < (*xfonts)->ascent)
+				font->ascent = (*xfonts)->ascent;
+			if(font->descent < (*xfonts)->descent)
+				font->descent = (*xfonts)->descent;
+			xfonts++;
+		}
+	}
+	else {
+		if(font->xfont)
+			XFreeFont(blitz->dpy, font->xfont);
+		font->xfont = nil;
+		font->xfont = XLoadQueryFont(blitz->dpy, fontname);
+		if (!font->xfont) {
+			fontname = "fixed";
+			font->xfont = XLoadQueryFont(blitz->dpy, fontname);
+		}
+		if (!font->xfont) {
+			fprintf(stderr, "%s", "liblitz: error, cannot load 'fixed' font\n");
+			exit(1);
+		}
+		font->ascent = font->xfont->ascent;
+		font->descent = font->xfont->descent;
+	}
+}

+ 0 - 16
gridmenu.1

@@ -64,21 +64,5 @@ returns
 if Enter is pressed on termination,
 .B 1
 if Escape is pressed.
-.SH ENVIRONMENT
-.TP
-GRID_FONT
-The X11 font used to display each item in the menu.
-.br
-Default: fixed
-.TP
-GRID_NORMCOLORS
-The foreground, background, and border colors of a label. Syntactically, three blank-separated color values of the form #RRGGBB are expected.
-.br
-Default: #222222 #eeeeee #666666
-.TP
-GRID_SELCOLORS
-Like GRID_NORMCOLORS, but for the selected label.
-.br
-Default: #ffffff #335577 #447799
 .SH SEE ALSO
 .BR gridwm (1)

+ 18 - 0
util.c

@@ -0,0 +1,18 @@
+/*
+ * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+void
+error(char *errstr, ...) {
+	va_list ap;
+	va_start(ap, errstr);
+	vfprintf(stderr, errstr, ap);
+	va_end(ap);
+	exit(1);
+}
+

+ 41 - 0
util.h

@@ -0,0 +1,41 @@
+/*
+ * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xlocale.h>
+
+typedef struct Brush Brush;
+typedef struct Color Color;
+typedef struct Fnt Fnt;
+
+struct Color {
+	unsigned long bg;
+	unsigned long fg;
+	unsigned long border;
+};
+
+struct Fnt {
+	XFontStruct *xfont;
+	XFontSet set;
+	int ascent;
+	int descent;
+};
+
+struct Brush {
+	GC gc;
+	Drawable drawable;
+	XRectangle rect;
+	Bool border;
+	Fnt *font;
+	Color color;
+	const char *text;
+};
+
+extern void draw(Display *dpy, Brush *b);
+extern void loadcolor(Display *dpy, int screen, Color *c,
+		const char *bg, const char *fg, const char *bo);
+extern unsigned int textwidth_l(Fnt *font, char *text, unsigned int len);
+extern unsigned int textwidth(Fnt *font, char *text);
+extern void loadfont(Display *dpy, Fnt *font, const char *fontstr);

+ 0 - 9
wm.c

@@ -36,15 +36,6 @@ usage()
 	exit(1);
 }
 
-void
-error(char *errstr, ...) {
-	va_list ap;
-	va_start(ap, errstr);
-	vfprintf(stderr, errstr, ap);
-	va_end(ap);
-	exit(1);
-}
-
 static void
 scan_wins()
 {

+ 3 - 2
wm.h

@@ -3,7 +3,9 @@
  * See LICENSE file for license details.
  */
 
-#include <X11/Xlib.h>
+#include "draw.h"
+#include "util.h"
+
 #include <X11/Xutil.h>
 
 /* WM atoms */
@@ -54,4 +56,3 @@ extern Cursor cursor[CurLast];
 extern Pixmap pmap;
 
 /* wm.c */
-extern void error(char *errstr, ...);