summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Hodgetts2018-04-17 16:26:44 +0100
committerBenjamin Hodgetts2018-04-17 16:26:44 +0100
commitb5f28309232a33ce2fadfde7cfcae252623e084b (patch)
tree2d9fe484c7c9e68e3a01285dd3f2586191991b2b
downloadaur-b5f28309232a33ce2fadfde7cfcae252623e084b.tar.gz
Initial commit
-rw-r--r--.SRCINFO22
-rw-r--r--PKGBUILD32
-rw-r--r--xosd-2.2.14-xft.patch593
3 files changed, 647 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 00000000000..f31fb2e0613
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,22 @@
+pkgbase = xosd-ex
+ pkgdesc = Displays text on your screen. On-Screen-Display-libs for some tools (with XFT patch)
+ pkgver = 2.2.14
+ pkgrel = 8
+ url = http://sourceforge.net/projects/libxosd/
+ arch = i686
+ arch = x86_64
+ license = GPL2
+ depends = libxt
+ depends = libxinerama
+ depends = sh
+ provides = xosd
+ conflicts = xosd
+ source = http://downloads.sourceforge.net/libxosd/xosd-ex-2.2.14.tar.gz
+ source = http://ftp.de.debian.org/debian/pool/main/x/xosd/xosd_2.2.14-2.debian.tar.gz
+ source = xosd-2.2.14-xft.patch
+ md5sums = 4b349fe930e4eee2f504d6c02673e24d
+ md5sums = cd3c37f4e4bbfba6f3ffd7ec43256cc2
+ md5sums = 5e525d29876a6936b11f20a6c3e2ddcc
+
+pkgname = xosd-ex
+
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 00000000000..e3f86b6102e
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,32 @@
+# Maintainer: Benjamin Hodgetts <ben@xnode.org>
+# Contributor: Sergej Pupykin <pupykin.s+arch@gmail.com>
+# Contributor: Damir Perisa <damir.perisa@bluewin.ch>
+
+pkgname=xosd-ex
+pkgver=2.2.14
+pkgrel=8
+pkgdesc="Displays text on your screen. On-Screen-Display-libs for some tools (with XFT patch)"
+arch=('i686' 'x86_64')
+license=('GPL2')
+url="http://sourceforge.net/projects/libxosd/"
+depends=('libxt' 'libxinerama' 'sh')
+provides=('xosd')
+conflicts=('xosd')
+source=("http://downloads.sourceforge.net/libxosd/${pkgname}-${pkgver}.tar.gz" "http://ftp.de.debian.org/debian/pool/main/x/xosd/xosd_$pkgver-2.debian.tar.gz" "xosd-2.2.14-xft.patch")
+md5sums=('4b349fe930e4eee2f504d6c02673e24d' 'cd3c37f4e4bbfba6f3ffd7ec43256cc2' '5e525d29876a6936b11f20a6c3e2ddcc')
+
+build() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+ patch -p1 <"${srcdir}"/debian/patches/25_fix_mangapges.diff
+ patch -p1 <"${srcdir}"/debian/patches/328676.diff
+ patch -p1 <"${srcdir}"/xosd-2.2.14-xft.patch
+ ./configure --prefix=/usr --mandir=/usr/share/man
+ make
+}
+
+package() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+ make DESTDIR="${pkgdir}" install
+ sed -i 's/AC_DEFUN(AM_PATH_LIBXOSD,/AC_DEFUN([AM_PATH_LIBXOSD],/' \
+ "${pkgdir}/usr/share/aclocal/libxosd.m4"
+}
diff --git a/xosd-2.2.14-xft.patch b/xosd-2.2.14-xft.patch
new file mode 100644
index 00000000000..ba4f5a529c0
--- /dev/null
+++ b/xosd-2.2.14-xft.patch
@@ -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 <X11/Xutil.h>
+ #include <X11/extensions/shape.h>
+ #include <X11/Xatom.h>
++
++/*For pango xft support*/
++#include <X11/Xft/Xft.h>
++#include <pango/pango.h>
++#include <pango/pangoxft.h>
++#include <pango/pango-font.h>
++#include <locale.h>
++
+ #ifdef HAVE_XINERAMA
+ # include <X11/extensions/Xinerama.h>
+ #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@