diff -ruN xosd-2.2.14/src/libxosd/intern.h xosd-2.2.14-xft-new/src/libxosd/intern.h --- xosd-2.2.14/src/libxosd/intern.h 2004-11-05 03:50:45.000000000 +0800 +++ xosd-2.2.14-xft-new/src/libxosd/intern.h 2009-09-21 15:56:28.000000000 +0800 @@ -26,6 +26,14 @@ #include #include #include + +/*For pango xft support*/ +#include +#include +#include +#include +#include + #ifdef HAVE_XINERAMA # include #endif @@ -144,6 +152,28 @@ int timeout; /* CONF delta time */ struct timeval timeout_start; /* DYN Absolute start of timeout */ + +/*For pango xft support*/ +// XftColor xftnorm[ColLast]; + XftColor xftcolour; + XftColor outline_xftcolour; + XftColor shadow_xftcolour; + XftColor * draw_xftcolour; + enum { + XOSD_XFT_NORM = 0, + XOSD_XFT_OUTLINE, + XOSD_XFT_SHADOW, + } xft_font_colour; + XftDraw *xftdrawable; + XftDraw *xftdrawable_msk; + PangoContext *pgc; + PangoLayout *plo; + PangoFontDescription *pfd; + int xftascent; + int xftdescent; + int xftheight; + int x; + int y; }; static const int XOSD_MAX_PRINTF_BUF_SIZE=2000; diff -ruN xosd-2.2.14/src/libxosd/Makefile.am xosd-2.2.14-xft-new/src/libxosd/Makefile.am --- xosd-2.2.14/src/libxosd/Makefile.am 2004-08-20 06:39:33.000000000 +0800 +++ xosd-2.2.14-xft-new/src/libxosd/Makefile.am 2009-09-21 16:19:09.000000000 +0800 @@ -1,4 +1,4 @@ -AM_CFLAGS = -I$(top_srcdir)/src +AM_CFLAGS = -I$(top_srcdir)/src `pkg-config --cflags xft pango pangoxft` # Library lib_LTLIBRARIES = libxosd.la libxosd_la_SOURCES = xosd.c intern.h diff -ruN xosd-2.2.14/src/libxosd/Makefile.in xosd-2.2.14-xft-new/src/libxosd/Makefile.in --- xosd-2.2.14/src/libxosd/Makefile.in 2004-11-18 03:30:23.000000000 +0800 +++ xosd-2.2.14-xft-new/src/libxosd/Makefile.in 2009-09-21 16:18:42.000000000 +0800 @@ -210,7 +210,7 @@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ -AM_CFLAGS = -I$(top_srcdir)/src +AM_CFLAGS = -I$(top_srcdir)/src `pkg-config --cflags xft pango pangoxft` # Library lib_LTLIBRARIES = libxosd.la libxosd_la_SOURCES = xosd.c intern.h diff -ruN xosd-2.2.14/src/libxosd/xosd.c xosd-2.2.14-xft-new/src/libxosd/xosd.c --- xosd-2.2.14/src/libxosd/xosd.c 2004-11-18 03:27:11.000000000 +0800 +++ xosd-2.2.14-xft-new/src/libxosd/xosd.c 2009-09-21 15:56:34.000000000 +0800 @@ -24,12 +24,17 @@ #define XOFFSET 10 const char *osd_default_font = - "-misc-fixed-medium-r-semicondensed--*-*-*-*-c-*-*-*"; + "Sans 8"; +/* "-misc-fixed-medium-r-semicondensed--*-*-*-*-c-*-*-*";*/ #if 0 "-adobe-helvetica-bold-r-*-*-10-*"; #endif const char *osd_default_colour = "green"; +const char *osd_default_shadow_colour = "black"; + +const char *osd_default_outline_colour = "black"; + /** Global error string. */ char *xosd_error; @@ -45,6 +50,28 @@ pthread_mutex_unlock(&osd->mutex_sync); } + +static Pixmap +take_snapshot(xosd *osd) { + Pixmap pixmap; + GC gc; + + /* create a pixmap to hold the screenshot. */ + pixmap = XCreatePixmap(osd->display, osd->window, + osd->screen_width, osd->height, + osd->depth); + + /* then copy the screen into the pixmap. */ + gc = XCreateGC(osd->display, pixmap, 0, NULL); + XSetSubwindowMode(osd->display, gc, IncludeInferiors); + XCopyArea(osd->display, DefaultRootWindow(osd->display), pixmap, gc, + osd->x, osd->y, osd->screen_width, osd->height, + 0, 0); + XSetSubwindowMode(osd->display, gc, ClipByChildren); + XFreeGC(osd->display, gc); + + return pixmap; +} /* }}} */ /* Serialize access to the X11 connection. {{{ @@ -110,7 +137,7 @@ rs[1].height = mod->height + p->height; for (i = 0; i < nbars; i++, rs[0].x = rs[1].x += p->width) { XRectangle *r = &(rs[is_slider ? (i == on) : (i < on)]); - XFillRectangles(osd->display, osd->mask_bitmap, osd->mask_gc, r, 1); +// XFillRectangles(osd->display, osd->mask_bitmap, osd->mask_gc, r, 1); XFillRectangles(osd->display, osd->line_bitmap, osd->gc, r, 1); } FUNCTION_END(Dfunction); @@ -123,9 +150,10 @@ XRectangle p, m; p.x = XOFFSET; p.y = osd->line_height * line; - p.width = -osd->extent->y / 2; - p.height = -osd->extent->y; - +// p.width = -osd->extent->y / 2; +// p.height = -osd->extent->y; + p.width = osd->xftheight / 2; + p.height = osd->xftheight; assert(osd); FUNCTION_START(Dfunction); @@ -181,22 +209,46 @@ /* }}} */ + void +set_xft_font_colour(xosd * osd, int ind) +{ + switch (ind) { + case XOSD_XFT_NORM: + osd->draw_xftcolour= & (osd ->xftcolour); + break; + case XOSD_XFT_OUTLINE: + osd->draw_xftcolour = & (osd->outline_xftcolour); + break; + case XOSD_XFT_SHADOW: + osd->draw_xftcolour = & (osd->shadow_xftcolour); + break; + } +} + + /* Draw text. {{{ */ static void /*inline */ _draw_text(xosd * osd, char *string, int x, int y) { int len = strlen(string); FUNCTION_START(Dfunction); - XmbDrawString(osd->display, osd->mask_bitmap, osd->fontset, osd->mask_gc, x, - y, string, len); - XmbDrawString(osd->display, osd->line_bitmap, osd->fontset, osd->gc, x, y, - string, len); +// XmbDrawString(osd->display, osd->mask_bitmap, osd->fontset, osd->mask_gc, x, +// y, string, len); +// XmbDrawString(osd->display, osd->line_bitmap, osd->fontset, osd->gc, x, y, +// string, len); + +pango_layout_set_text(osd->plo, string, len); +pango_xft_render_layout(osd->xftdrawable, osd->draw_xftcolour, osd->plo, x * PANGO_SCALE, y * PANGO_SCALE); +//pango_xft_render_layout(osd->xftdrawable, &osd->xftcolour, osd->plo, x * PANGO_SCALE, y * PANGO_SCALE); + FUNCTION_END(Dfunction); } + static void draw_text(xosd * osd, int line) { - int x = XOFFSET, y = osd->line_height * line - osd->extent->y; +// int x = XOFFSET, y = osd->line_height * line - osd->extent->y; + int x = XOFFSET, y = osd->line_height * line ;//- osd->xftdescent; struct xosd_text *l = &osd->lines[line].text; assert(osd); @@ -206,9 +258,17 @@ return; if (l->width < 0) { +/* XRectangle rect; XmbTextExtents(osd->fontset, l->string, strlen(l->string), NULL, &rect); l->width = rect.width; +*/ +/*Pango XFT support*/ + PangoRectangle r; + pango_layout_set_text(osd->plo, l->string, strlen(l->string)); + pango_layout_get_extents(osd->plo, &r, 0); + l->width= r.width / PANGO_SCALE; + } switch (osd->align) { @@ -223,12 +283,14 @@ if (osd->shadow_offset) { XSetForeground(osd->display, osd->gc, osd->shadow_pixel); + set_xft_font_colour(osd, XOSD_XFT_SHADOW); _draw_text(osd, l->string, x + osd->shadow_offset, y + osd->shadow_offset); } if (osd->outline_offset) { int i, j; XSetForeground(osd->display, osd->gc, osd->outline_pixel); + set_xft_font_colour(osd, XOSD_XFT_OUTLINE); /* FIXME: echo . | osd_cat -O 50 -p middle -A center */ for (i = 1; i <= osd->outline_offset; i++) for (j = 0; j < 9; j++) @@ -238,6 +300,7 @@ } if (1) { XSetForeground(osd->display, osd->gc, osd->pixel); + set_xft_font_colour(osd, XOSD_XFT_NORM); _draw_text(osd, l->string, x, y); } } @@ -291,11 +354,16 @@ /* The font, outline or shadow was changed. Recalculate line height, * resize window and bitmaps. */ if (osd->update & UPD_size) { +/* XFontSetExtents *extents = XExtentsOfFontSet(osd->fontset); DEBUG(Dupdate, "UPD_size"); osd->extent = &extents->max_logical_extent; osd->line_height = osd->extent->height + osd->shadow_offset + 2 * + osd->outline_offset;*/ + osd->line_height = osd->xftheight + osd->shadow_offset + 2 * osd->outline_offset; + + osd->height = osd->line_height * osd->number_lines; for (line = 0; line < osd->number_lines; line++) if (osd->lines[line].type == LINE_text) @@ -303,13 +371,32 @@ XResizeWindow(osd->display, osd->window, osd->screen_width, osd->height); - XFreePixmap(osd->display, osd->mask_bitmap); - osd->mask_bitmap = XCreatePixmap(osd->display, osd->window, - osd->screen_width, osd->height, 1); +// XFreePixmap(osd->display, osd->mask_bitmap); +// osd->mask_bitmap = XCreatePixmap(osd->display, osd->window, + // osd->screen_width, osd->height, 1); XFreePixmap(osd->display, osd->line_bitmap); osd->line_bitmap = XCreatePixmap(osd->display, osd->window, osd->screen_width, osd->height, osd->depth); + xosd_xypos(osd); + //printf("osd->screen_width=%d,osd->height=%d,osd->x=%d,osd->y=%d\n",osd->screen_width,osd->height,osd->x,osd->y); + + XCopyArea(osd->display, take_snapshot(osd), osd->line_bitmap, osd->gc, + 0, 0, osd->screen_width, osd->height, 0, 0); + + + //printf("osd->screen_width=%d, osd->height=%d\n",osd->screen_width, osd->height); +/*BEGIN For pango XFT support*/ +//osd->xftdrawable_msk = XftDrawCreate(osd->display, osd->mask_bitmap, osd->visual, DefaultColormap(osd->display, osd->screen)); +//if(!osd->xftdrawable_msk) +// printf("error, cannot create drawable_msk\n"); + + osd->xftdrawable = XftDrawCreate(osd->display, osd->line_bitmap, osd->visual, DefaultColormap(osd->display, osd->screen)); + if(!osd->xftdrawable) + printf("error, cannot create drawable\n"); +/*END*/ + + } /* H/V offset or vertical positon was changed. Horizontal alignment is * handles internally as line realignment with UPD_content. */ @@ -334,6 +421,7 @@ case XOSD_top: y = osd->voffset; } + osd->x=x; osd->y=y; XMoveWindow(osd->display, osd->window, x, y); } /* If the content changed, redraw lines in background buffer. @@ -347,10 +435,10 @@ XFillRectangle(osd->display, osd->line_bitmap, osd->gc, 0, y, osd->screen_width, osd->line_height); #endif - if (osd->update & UPD_mask) { - XFillRectangle(osd->display, osd->mask_bitmap, osd->mask_gc_back, 0, - y, osd->screen_width, osd->line_height); - } + //if (osd->update & UPD_mask) { + // XFillRectangle(osd->display, osd->mask_bitmap, osd->mask_gc_back, 0, + // y, osd->screen_width, osd->line_height); + // } switch (osd->lines[line].type) { case LINE_text: draw_text(osd, line); @@ -365,11 +453,12 @@ } #ifndef DEBUG_XSHAPE /* More than colours was changed, also update XShape. */ +/* if (osd->update & UPD_mask) { DEBUG(Dupdate, "UPD_mask"); XShapeCombineMask(osd->display, osd->window, ShapeBounding, 0, 0, osd->mask_bitmap, ShapeSet); - } + }*/ #endif /* Show display requested. */ if (osd->update & UPD_show) { @@ -504,6 +593,19 @@ /* }}} */ + static int parse_xft_colour(xosd * osd, XftColor * color, unsigned long *pixel, const char *colorstr){ + Colormap cmap = DefaultColormap(osd->display, osd->screen); + int retval = 0; + + if(!XftColorAllocName(osd->display, osd->visual, cmap, colorstr, color)){ + printf("error, cannot allocate color '%s'\n", colorstr); + retval = -1; + } else + retval = 0; + *pixel = color->pixel; + return retval; + } + /* Parse textual colour value. {{{ */ static int parse_colour(xosd * osd, XColor * col, unsigned long *pixel, @@ -611,16 +713,39 @@ XRaiseWindow(dpy, win); } -/* }}} */ - + /* }}} */ +void xosd_xypos(xosd *osd) +{ + int x,y; + switch (osd->align) { + case XOSD_left: + case XOSD_center: + x = osd->screen_xpos + osd->hoffset; + break; + case XOSD_right: + x = osd->screen_xpos - osd->hoffset; + } + switch (osd->pos) { + case XOSD_bottom: + y = osd->screen_height - osd->height - osd->voffset; + break; + case XOSD_middle: + y = (osd->screen_height - osd->height) / 2 - osd->voffset; + break; + case XOSD_top: + y = osd->voffset; + } + //printf("in xosd_xypos x=%d, y=%d, osd->height =%d, osd->screen_height=%d, osd->voffset=%d \n",x,y,osd->height, osd->screen_height, osd->voffset); + osd->x=x; osd->y=y; +} /* xosd_init -- Create a new xosd "object" {{{ * Deprecated: Use xosd_create. */ xosd * xosd_init(const char *font, const char *colour, int timeout, xosd_pos pos, int voffset, int shadow_offset, int number_lines) { - xosd *osd = xosd_create(number_lines); + xosd *osd = xosd_create(number_lines); FUNCTION_START(Dfunction); if (osd == NULL) return NULL; @@ -631,19 +756,22 @@ * we do not set xosd_error, as set_font has already set it to * a sensible error message. */ + printf("xosd_set_font(osd, font) == -1\n"); return NULL; } +// xosd_xypos(osd); xosd_set_colour(osd, colour); xosd_set_timeout(osd, timeout); xosd_set_pos(osd, pos); xosd_set_vertical_offset(osd, voffset); xosd_set_shadow_offset(osd, shadow_offset); - return osd; } /* }}} */ + + /* xosd_create -- Create a new xosd "object" {{{ */ xosd * xosd_create(int number_lines) @@ -658,7 +786,6 @@ int dummy_a, dummy_b; XineramaScreenInfo *screeninfo = NULL; #endif - FUNCTION_START(Dfunction); DEBUG(Dtrace, "getting display"); display = getenv("DISPLAY"); @@ -730,13 +857,13 @@ DEBUG(Dtrace, "font selection info"); xosd_set_font(osd, osd_default_font); - if (osd->fontset == NULL) { + //if (osd->fontset == NULL) { /* * if we still don't have a fontset, then abort */ - xosd_error = "Default font not found"; - goto error3; - } + // xosd_error = "Default font not found"; + // goto error3; + //} DEBUG(Dtrace, "width and height initialization"); #ifdef HAVE_XINERAMA @@ -772,16 +899,22 @@ CopyFromParent, osd->visual, CWOverrideRedirect, &setwinattr); XStoreName(osd->display, osd->window, "XOSD"); - +/* osd->mask_bitmap = XCreatePixmap(osd->display, osd->window, osd->screen_width, - osd->height, 1); + osd->height, 1);*/ osd->line_bitmap = XCreatePixmap(osd->display, osd->window, osd->screen_width, osd->line_height, osd->depth); osd->gc = XCreateGC(osd->display, osd->window, GCGraphicsExposures, &xgcv); - osd->mask_gc = XCreateGC(osd->display, osd->mask_bitmap, GCGraphicsExposures, &xgcv); + //xosd_xypos(osd); + /*copy back ground to the image*/ + //printf("1 osd->screen_width=%d,osd->height=%d,osd->x=%d,osd->y=%d\n",osd->screen_width,osd->height,osd->x,osd->y); + //XCopyArea(osd->display, take_snapshot(osd), osd->line_bitmap, osd->gc, + // 0, 0, osd->screen_width, osd->height, 0, 0); + +/* osd->mask_gc = XCreateGC(osd->display, osd->mask_bitmap, GCGraphicsExposures, &xgcv); osd->mask_gc_back = XCreateGC(osd->display, osd->mask_bitmap, GCGraphicsExposures, &xgcv); XSetBackground(osd->display, osd->gc, @@ -796,10 +929,22 @@ WhitePixel(osd->display, osd->screen)); XSetBackground(osd->display, osd->mask_gc, BlackPixel(osd->display, osd->screen)); +*/ +/*BEGIN For pango XFT support*/ +//osd->xftdrawable_msk = XftDrawCreate(osd->display, osd->mask_bitmap, osd->visual, DefaultColormap(osd->display, osd->screen)); +//if(!osd->xftdrawable_msk) +// printf("error, cannot create drawable_msk\n"); +osd->xftdrawable = XftDrawCreate(osd->display, osd->line_bitmap, osd->visual, DefaultColormap(osd->display, osd->screen)); +if(!osd->xftdrawable) + printf("error, cannot create drawable\n"); +/*END*/ + DEBUG(Dtrace, "setting colour"); xosd_set_colour(osd, osd_default_colour); + xosd_set_shadow_colour(osd, osd_default_shadow_colour); + xosd_set_outline_colour(osd, osd_default_outline_colour); DEBUG(Dtrace, "stay on top"); stay_on_top(osd->display, osd->window); @@ -859,11 +1004,11 @@ DEBUG(Dtrace, "freeing X resources"); XFreeGC(osd->display, osd->gc); - XFreeGC(osd->display, osd->mask_gc); - XFreeGC(osd->display, osd->mask_gc_back); +// XFreeGC(osd->display, osd->mask_gc); +// XFreeGC(osd->display, osd->mask_gc_back); XFreePixmap(osd->display, osd->line_bitmap); - XFreeFontSet(osd->display, osd->fontset); - XFreePixmap(osd->display, osd->mask_bitmap); +// XFreeFontSet(osd->display, osd->fontset); +// XFreePixmap(osd->display, osd->mask_bitmap); XDestroyWindow(osd->display, osd->window); XCloseDisplay(osd->display); @@ -1036,8 +1181,9 @@ return -1; _xosd_lock(osd); + retval = parse_xft_colour(osd, &osd->xftcolour, &osd->pixel, colour); retval = parse_colour(osd, &osd->colour, &osd->pixel, colour); - osd->update |= UPD_lines; + osd->update |= UPD_lines; _xosd_unlock(osd); return retval; @@ -1056,6 +1202,8 @@ return -1; _xosd_lock(osd); + //printf("xosd_set_shadow_colour %s\n",colour); + retval = parse_xft_colour(osd, &osd->shadow_xftcolour, &osd->shadow_pixel, colour); retval = parse_colour(osd, &osd->shadow_colour, &osd->shadow_pixel, colour); osd->update |= UPD_lines; _xosd_unlock(osd); @@ -1076,6 +1224,7 @@ return -1; _xosd_lock(osd); + retval = parse_xft_colour(osd, &osd->outline_xftcolour, &osd->pixel, colour); retval = parse_colour(osd, &osd->outline_colour, &osd->outline_pixel, colour); osd->update |= UPD_lines; @@ -1107,6 +1256,8 @@ * Try to create the new font. If it doesn't succeed, keep old font. */ _xosd_lock(osd); +/*Mod by Waspee, for pango xft font*/ +/* fontset2 = XCreateFontSet(osd->display, font, &missing, &nmissing, &defstr); XFreeStringList(missing); if (fontset2 == NULL) { @@ -1118,6 +1269,26 @@ osd->fontset = fontset2; osd->update |= UPD_font; } +*/ +PangoFontMetrics *metrics; +osd->pgc = pango_xft_get_context(osd->display, osd->screen); +osd->pfd = pango_font_description_from_string(font); +osd->update |= UPD_font; + +metrics = pango_context_get_metrics(osd->pgc, osd->pfd, pango_language_from_string(setlocale(LC_CTYPE, ""))); +// +//dc.font.ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE; +//dc.font.descent = pango_font_metrics_get_descent(metrics) / PANGO_SCALE; + +// pango_font_metrics_unref(metrics); + +osd->plo = pango_layout_new(osd->pgc); +pango_layout_set_font_description(osd->plo, osd->pfd); + +osd->xftascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE ; +osd->xftdescent = pango_font_metrics_get_descent(metrics) / PANGO_SCALE ; +osd->xftheight = osd->xftascent + osd->xftdescent; +//printf("osd->xftheight=%d\n",osd->xftheight); _xosd_unlock(osd); return ret; diff -ruN xosd-2.2.14/src/Makefile.am xosd-2.2.14-xft-new/src/Makefile.am --- xosd-2.2.14/src/Makefile.am 2004-11-09 04:03:23.000000000 +0800 +++ xosd-2.2.14-xft-new/src/Makefile.am 2009-09-21 16:05:29.000000000 +0800 @@ -5,8 +5,8 @@ osd_cat_SOURCES = osd_cat.c testprog_SOURCES = testprog.c -osd_cat_LDADD = libxosd/libxosd.la -testprog_LDADD = libxosd/libxosd.la +osd_cat_LDADD = libxosd/libxosd.la `pkg-config --libs xft pango pangoxft` +testprog_LDADD = libxosd/libxosd.la `pkg-config --libs xft pango pangoxft` include_HEADERS = xosd.h diff -ruN xosd-2.2.14/src/Makefile.in xosd-2.2.14-xft-new/src/Makefile.in --- xosd-2.2.14/src/Makefile.in 2004-11-18 03:30:22.000000000 +0800 +++ xosd-2.2.14-xft-new/src/Makefile.in 2009-09-21 16:17:57.000000000 +0800 @@ -140,7 +140,7 @@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ +LIBS = @LIBS@ `pkg-config --libs xft pango pangoxft` LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@