static int xsetcolorname(int, const char *);
static int xloadfont(Font *, FcPattern *);
static void xloadfonts(char *, int);
+static int xloadfontset(Font *);
static void xsettitle(char *);
static void xresettitle(void);
static void xseturgency(int);
static void xsetsel(char*);
static void xtermclear(int, int, int, int);
+static void xunloadfont(Font *f);
static void xunloadfonts(void);
static void xresize(int, int);
}
}
- if(term.line[*y][*x + direction].c[0] == ' ')
+ if(strchr(worddelimiters,
+ term.line[*y][*x + direction].c[0])) {
break;
+ }
*x += direction;
}
void
selcopy(void) {
char *str, *ptr;
- int x, y, bufsize, size;
+ int x, y, bufsize, size, i, ex;
Glyph *gp, *last;
if(sel.bx == -1) {
*/
if(y < sel.e.y && !((gp-1)->mode & ATTR_WRAP))
*ptr++ = '\n';
+
+ /*
+ * If the last selected line expands in the selection
+ * after the visible text '\n' is appended.
+ */
+ if(y == sel.e.y) {
+ i = term.col;
+ while(--i > 0 && term.line[y][i].c[0] == ' ')
+ /* nothing */;
+ ex = sel.e.x;
+ if(sel.b.y == sel.e.y && sel.e.x < sel.b.x)
+ ex = sel.b.x;
+ if(i < ex)
+ *ptr++ = '\n';
+ }
}
*ptr = 0;
}
if(!match)
return 1;
- if(!(f->set = FcFontSort(0, match, FcTrue, 0, &result))) {
- FcPatternDestroy(match);
- return 1;
- }
-
if(!(f->match = XftFontOpenPattern(xw.dpy, match))) {
FcPatternDestroy(match);
return 1;
}
+ f->set = NULL;
f->pattern = FcPatternDuplicate(pattern);
f->ascent = f->match->ascent;
FcPatternDestroy(pattern);
}
+int
+xloadfontset(Font *f) {
+ FcResult result;
+
+ if(!(f->set = FcFontSort(0, f->pattern, FcTrue, 0, &result)))
+ return 1;
+ return 0;
+}
+
+void
+xunloadfont(Font *f) {
+ XftFontClose(xw.dpy, f->match);
+ FcPatternDestroy(f->pattern);
+ if(f->set)
+ FcFontSetDestroy(f->set);
+}
+
void
xunloadfonts(void) {
int i, ip;
frccur = -1;
frclen = 0;
- XftFontClose(xw.dpy, dc.font.match);
- FcPatternDestroy(dc.font.pattern);
- FcFontSetDestroy(dc.font.set);
- XftFontClose(xw.dpy, dc.bfont.match);
- FcPatternDestroy(dc.bfont.pattern);
- FcFontSetDestroy(dc.bfont.set);
- XftFontClose(xw.dpy, dc.ifont.match);
- FcPatternDestroy(dc.ifont.pattern);
- FcFontSetDestroy(dc.ifont.set);
- XftFontClose(xw.dpy, dc.ibfont.match);
- FcPatternDestroy(dc.ibfont.pattern);
- FcFontSetDestroy(dc.ibfont.set);
+ xunloadfont(&dc.font);
+ xunloadfont(&dc.bfont);
+ xunloadfont(&dc.ifont);
+ xunloadfont(&dc.ibfont);
}
void
r.width = width;
XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1);
- fcsets[0] = font->set;
for(xp = winx; bytelen > 0;) {
/*
* Search for the range in the to be printed string of glyphs
/* Nothing was found. */
if(i >= frclen) {
+ if(!font->set)
+ xloadfontset(font);
+ fcsets[0] = font->set;
+
/*
* Nothing was found in the cache. Now use
* some dozen of Fontconfig calls to get the
FD_SET(cmdfd, &rfd);
FD_SET(xfd, &rfd);
- switch(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, tv) < 0) {
- case -1:
+ if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, tv) < 0) {
if(errno == EINTR)
continue;
die("select failed: %s\n", SERRNO);
- default:
- if(FD_ISSET(cmdfd, &rfd)) {
- ttyread();
- if(blinktimeout) {
- blinkset = tattrset(ATTR_BLINK);
- if(!blinkset && term.mode & ATTR_BLINK)
- term.mode &= ~(MODE_BLINK);
- }
+ }
+ if(FD_ISSET(cmdfd, &rfd)) {
+ ttyread();
+ if(blinktimeout) {
+ blinkset = tattrset(ATTR_BLINK);
+ if(!blinkset && term.mode & ATTR_BLINK)
+ term.mode &= ~(MODE_BLINK);
}
-
- if(FD_ISSET(xfd, &rfd))
- xev = actionfps;
- break;
}
+
+ if(FD_ISSET(xfd, &rfd))
+ xev = actionfps;
+
gettimeofday(&now, NULL);
drawtimeout.tv_sec = 0;
drawtimeout.tv_usec = (1000/xfps) * 1000;