From owner-svn-ports-all@FreeBSD.ORG Sat Nov 10 16:30:46 2012 Return-Path: Delivered-To: svn-ports-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id E147AD23; Sat, 10 Nov 2012 16:30:46 +0000 (UTC) (envelope-from danfe@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id C6D8B8FC0C; Sat, 10 Nov 2012 16:30:46 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id qAAGUkHP057299; Sat, 10 Nov 2012 16:30:46 GMT (envelope-from danfe@svn.freebsd.org) Received: (from danfe@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id qAAGUkah057296; Sat, 10 Nov 2012 16:30:46 GMT (envelope-from danfe@svn.freebsd.org) Message-Id: <201211101630.qAAGUkah057296@svn.freebsd.org> From: Alexey Dokuchaev Date: Sat, 10 Nov 2012 16:30:46 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r307291 - in head/misc/xosd: . files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the ports tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Nov 2012 16:30:47 -0000 Author: danfe Date: Sat Nov 10 16:30:46 2012 New Revision: 307291 URL: http://svnweb.freebsd.org/changeset/ports/307291 Log: - Allow to build with unofficial Xft support - Rebase existing milliseconds timeout patch up to -p1 so we can have Xft patch unmodified to avoid gratuitous differences with various GNU/Linux distributions out there Obtained from: Puppy Linux Discussion Forum Feature safe: yes Added: head/misc/xosd/files/extra-patch-xft (contents, props changed) Modified: head/misc/xosd/Makefile Modified: head/misc/xosd/Makefile ============================================================================== --- head/misc/xosd/Makefile Sat Nov 10 15:58:37 2012 (r307290) +++ head/misc/xosd/Makefile Sat Nov 10 16:30:46 2012 (r307291) @@ -12,6 +12,7 @@ COMMENT= X11 on-screen-display program a LICENSE= GPLv2 +PATCH_STRIP= -p1 USE_AUTOTOOLS= libtool USE_CSTD= gnu89 USE_GMAKE= yes @@ -32,10 +33,11 @@ MAN3= xosd.3 xosd_create.3 xosd_destroy xosd_show.3 xosd_uninit.3 PORTDOCS= AUTHORS ChangeLog TODO -OPTIONS_DEFINE= XMMS MSEC +OPTIONS_DEFINE= XMMS MSEC XFT OPTIONS_DEFAULT= XMMS XMMS_DESC= Build and install XMMS-OSD plugin MSEC_DESC= Use milliseconds timeout (breaks compatibility!) +XFT_DESC= Unofficial Xft support .include @@ -52,12 +54,18 @@ PLIST_SUB= XMMS="@comment " .endif .if ${PORT_OPTIONS:MMSEC} -DELAY_UNITS= milliseconds EXTRA_PATCHES= ${FILESDIR}/extra-patch-msec-timeout +DELAY_UNITS= milliseconds .else DELAY_UNITS= seconds .endif +.if ${PORT_OPTIONS:MXFT} +EXTRA_PATCHES+= ${FILESDIR}/extra-patch-xft +USE_GNOME= pango +USE_XORG+= xft +.endif + post-patch: @${REINPLACE_CMD} -e 's,-lc_r,-lblahblah,' ${WRKSRC}/ltmain.sh @${REINPLACE_CMD} -e 's,-lpthread,${PTHREAD_LIBS}, ; \ Added: head/misc/xosd/files/extra-patch-xft ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/misc/xosd/files/extra-patch-xft Sat Nov 10 16:30:46 2012 (r307291) @@ -0,0 +1,593 @@ +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@